diff --git a/package/src/components/AttachmentPicker/components/AttachmentPickerContent.tsx b/package/src/components/AttachmentPicker/components/AttachmentPickerContent.tsx
index 639751e1e6..1eedaf2351 100644
--- a/package/src/components/AttachmentPicker/components/AttachmentPickerContent.tsx
+++ b/package/src/components/AttachmentPicker/components/AttachmentPickerContent.tsx
@@ -175,8 +175,10 @@ const useCommandPickerStyle = () => {
flexGrow: 1,
paddingHorizontal: primitives.spacingXxs,
paddingBottom: primitives.spacing2xl,
+ backgroundColor: semantics.composerBg,
},
title: {
+ backgroundColor: semantics.composerBg,
fontWeight: primitives.typographyFontWeightSemiBold,
fontSize: primitives.typographyFontSizeMd,
color: semantics.textPrimary,
@@ -184,7 +186,7 @@ const useCommandPickerStyle = () => {
paddingBottom: primitives.spacingMd,
},
}),
- [semantics.textPrimary],
+ [semantics.composerBg, semantics.textPrimary],
);
};
diff --git a/package/src/components/AutoCompleteInput/AutoCompleteSuggestionItem.tsx b/package/src/components/AutoCompleteInput/AutoCompleteSuggestionItem.tsx
index 24511820ae..7abe829c14 100644
--- a/package/src/components/AutoCompleteInput/AutoCompleteSuggestionItem.tsx
+++ b/package/src/components/AutoCompleteInput/AutoCompleteSuggestionItem.tsx
@@ -73,7 +73,7 @@ export const CommandSuggestionItem = (item: CommandSuggestion) => {
const { args, name } = item;
const {
theme: {
- colors: { black, grey },
+ semantics,
messageInput: {
suggestions: {
command: { args: argsStyle, container: commandContainer, title },
@@ -86,10 +86,16 @@ export const CommandSuggestionItem = (item: CommandSuggestion) => {
return (
{name ? : null}
-
+
{(name || '').replace(/^\w/, (char) => char.toUpperCase())}
-
+
{`/${name} ${args}`}
diff --git a/package/src/components/AutoCompleteInput/AutoCompleteSuggestionList.tsx b/package/src/components/AutoCompleteInput/AutoCompleteSuggestionList.tsx
index feee1fe678..56b0226ca0 100644
--- a/package/src/components/AutoCompleteInput/AutoCompleteSuggestionList.tsx
+++ b/package/src/components/AutoCompleteInput/AutoCompleteSuggestionList.tsx
@@ -62,7 +62,6 @@ export const AutoCompleteSuggestionList = ({
const {
theme: {
- colors: { black, white },
messageInput: {
container: { maxHeight },
},
@@ -106,7 +105,7 @@ export const AutoCompleteSuggestionList = ({
onEndReached={loadMore}
onEndReachedThreshold={0.1}
renderItem={renderItem}
- style={[styles.flatlist, { backgroundColor: white, maxHeight, shadowColor: black }]}
+ style={[styles.flatlist, { maxHeight }]}
testID={'auto-complete-suggestion-list'}
/>
@@ -132,6 +131,8 @@ const useStyles = () => {
borderColor: semantics.borderCoreDefault,
},
flatlist: {
+ backgroundColor: semantics.composerBg,
+ shadowColor: semantics.accentBlack,
borderRadius: 8,
elevation: 3,
marginHorizontal: 8,
diff --git a/package/src/components/Message/MessageSimple/__tests__/__snapshots__/MessageAvatar.test.js.snap b/package/src/components/Message/MessageSimple/__tests__/__snapshots__/MessageAvatar.test.js.snap
index 3356718c66..9599074cc2 100644
--- a/package/src/components/Message/MessageSimple/__tests__/__snapshots__/MessageAvatar.test.js.snap
+++ b/package/src/components/Message/MessageSimple/__tests__/__snapshots__/MessageAvatar.test.js.snap
@@ -22,7 +22,7 @@ exports[`MessageAvatar should render message avatar 1`] = `
"width": 32,
},
{
- "backgroundColor": "#003a3f",
+ "backgroundColor": "#006970",
},
{
"borderColor": "rgba(255, 255, 255, 0.2)",
diff --git a/package/src/components/Message/MessageSimple/__tests__/__snapshots__/MessageTextContainer.test.tsx.snap b/package/src/components/Message/MessageSimple/__tests__/__snapshots__/MessageTextContainer.test.tsx.snap
index 3f3a5a8efc..95f08ee3e1 100644
--- a/package/src/components/Message/MessageSimple/__tests__/__snapshots__/MessageTextContainer.test.tsx.snap
+++ b/package/src/components/Message/MessageSimple/__tests__/__snapshots__/MessageTextContainer.test.tsx.snap
@@ -29,7 +29,7 @@ exports[`MessageTextContainer should render message text container 1`] = `
"alignItems": "flex-start",
"flexDirection": "row",
"flexWrap": "wrap",
- "fontSize": 15,
+ "fontSize": 17,
"justifyContent": "flex-start",
"lineHeight": 20,
"marginBottom": 8,
@@ -41,7 +41,7 @@ exports[`MessageTextContainer should render message text container 1`] = `
style={
{
"color": "#000000",
- "fontSize": 15,
+ "fontSize": 17,
"lineHeight": 20,
}
}
diff --git a/package/src/components/MessageInput/MessageInput.tsx b/package/src/components/MessageInput/MessageInput.tsx
index 0e6035cb47..eb93768733 100644
--- a/package/src/components/MessageInput/MessageInput.tsx
+++ b/package/src/components/MessageInput/MessageInput.tsx
@@ -418,10 +418,12 @@ const MessageInputWithContext = (props: MessageInputPropsWithContext) => {
<>
-
+
+
+
>
)}
diff --git a/package/src/components/MessageInput/MessageInputLeadingView.tsx b/package/src/components/MessageInput/MessageInputLeadingView.tsx
index a4e837a3d9..f28230c516 100644
--- a/package/src/components/MessageInput/MessageInputLeadingView.tsx
+++ b/package/src/components/MessageInput/MessageInputLeadingView.tsx
@@ -1,5 +1,7 @@
import React, { useEffect } from 'react';
-import { StyleSheet, View } from 'react-native';
+import { StyleSheet } from 'react-native';
+
+import Animated, { ZoomIn, ZoomOut } from 'react-native-reanimated';
import { AttachmentManagerState } from 'stream-chat';
@@ -31,9 +33,13 @@ export const MessageInputLeadingView = () => {
}, [textComposer, hasAttachments]);
return command && !hasAttachments ? (
-
+
-
+
) : null;
};
diff --git a/package/src/components/Poll/CreatePollContent.tsx b/package/src/components/Poll/CreatePollContent.tsx
index 6e2c9e532d..75eb97e370 100644
--- a/package/src/components/Poll/CreatePollContent.tsx
+++ b/package/src/components/Poll/CreatePollContent.tsx
@@ -157,7 +157,7 @@ export const CreatePollContent = () => {
- {t('Anonymous poll')}
+ {t('Anonymous voting')}
Hide who voted
@@ -273,14 +273,14 @@ const useStyles = () => {
alignItems: 'center',
justifyContent: 'space-between',
flexDirection: 'row',
- backgroundColor: semantics.inputOptionCardBg,
+ backgroundColor: semantics.backgroundCoreSurfaceCard,
padding: primitives.spacingMd,
borderRadius: primitives.radiusLg,
},
optionCardWrapper: {
gap: primitives.spacingMd,
},
- optionCardSwitch: {},
+ optionCardSwitch: { width: 64 },
});
}, [semantics]);
};
diff --git a/package/src/components/Poll/Poll.tsx b/package/src/components/Poll/Poll.tsx
index 6493d069c5..b0e63bbd20 100644
--- a/package/src/components/Poll/Poll.tsx
+++ b/package/src/components/Poll/Poll.tsx
@@ -32,7 +32,7 @@ export const PollHeader = () => {
const subtitle = useMemo(() => {
if (isClosed) {
- return t('Vote ended');
+ return t('Poll has ended');
}
if (enforceUniqueVote) {
return t('Select one');
diff --git a/package/src/components/Poll/components/CreatePollHeader.tsx b/package/src/components/Poll/components/CreatePollHeader.tsx
index 0b011f679c..c0e662c09a 100644
--- a/package/src/components/Poll/components/CreatePollHeader.tsx
+++ b/package/src/components/Poll/components/CreatePollHeader.tsx
@@ -1,9 +1,9 @@
-import React, { useMemo } from 'react';
+import React, { useCallback, useMemo } from 'react';
import { StyleSheet, Text, View } from 'react-native';
import { useTheme } from '../../../contexts/themeContext/ThemeContext';
import { useTranslationContext } from '../../../contexts/translationContext/TranslationContext';
-import { IconProps, SendPoll } from '../../../icons';
+import { Check, IconProps } from '../../../icons';
import { NewCross } from '../../../icons/NewCross';
import { primitives } from '../../../theme';
import { Button } from '../../ui';
@@ -41,18 +41,12 @@ export const CreatePollHeader = ({
} = useTheme();
const styles = useStyles();
- const renderSendPollIcon = (props: IconProps) => {
- return (
-
- );
- };
+ const renderSendPollIcon = useCallback(
+ (props: IconProps) => {
+ return ;
+ },
+ [semantics.textOnAccent],
+ );
return (
diff --git a/package/src/components/Poll/components/MultipleAnswersField.tsx b/package/src/components/Poll/components/MultipleAnswersField.tsx
index 5c3809f57c..2d28921637 100644
--- a/package/src/components/Poll/components/MultipleAnswersField.tsx
+++ b/package/src/components/Poll/components/MultipleAnswersField.tsx
@@ -122,7 +122,7 @@ const useStyles = () => {
optionCardWrapper: {
gap: primitives.spacingMd,
},
- optionCardSwitch: {},
+ optionCardSwitch: { width: 64 },
});
}, [semantics]);
};
diff --git a/package/src/components/Poll/components/PollAnswersList.tsx b/package/src/components/Poll/components/PollAnswersList.tsx
index e6c290985d..12ab7c1f89 100644
--- a/package/src/components/Poll/components/PollAnswersList.tsx
+++ b/package/src/components/Poll/components/PollAnswersList.tsx
@@ -1,5 +1,5 @@
import React, { useCallback, useMemo, useState } from 'react';
-import { FlatList, type FlatListProps, Pressable, StyleSheet, Text, View } from 'react-native';
+import { FlatList, type FlatListProps, StyleSheet, Text, View } from 'react-native';
import { PollAnswer, VotingVisibility } from 'stream-chat';
@@ -13,7 +13,9 @@ import {
useTheme,
useTranslationContext,
} from '../../../contexts';
+import { primitives } from '../../../theme';
import { getDateString } from '../../../utils/i18n/getDateString';
+import { Button } from '../../ui';
import { UserAvatar } from '../../ui/Avatar/UserAvatar';
import { usePollAnswersPagination } from '../hooks/usePollAnswersPagination';
import { usePollState } from '../hooks/usePollState';
@@ -34,31 +36,15 @@ export const AnswerListAddCommentButton = (props: PollButtonProps) => {
setShowAddCommentDialog(true);
}, [message, onPress, poll]);
- const {
- theme: {
- colors: { accent_dark_blue, bg_user },
- poll: {
- answersList: { buttonContainer },
- button: { text },
- },
- },
- } = useTheme();
-
return (
<>
- [
- { opacity: pressed ? 0.5 : 1 },
- styles.addCommentButtonContainer,
- { backgroundColor: bg_user },
- buttonContainer,
- ]}
- >
-
- {ownAnswer ? t('Update your comment') : t('Add a comment')}
-
-
+ />
{showAddCommentDialog ? (
setShowAddCommentDialog(false)}
@@ -83,12 +69,12 @@ export const PollAnswerListItem = ({ answer }: { answer: PollAnswer }) => {
const {
theme: {
- colors: { bg_user, black },
poll: {
answersList: { item: itemStyle },
},
},
} = useTheme();
+ const styles = useStyles();
const dateString = useMemo(
() =>
@@ -107,20 +93,18 @@ export const PollAnswerListItem = ({ answer }: { answer: PollAnswer }) => {
);
return (
-
-
- {answer.answer_text}
-
+
+ {answer.answer_text}
{!isAnonymous && answer.user?.image ? (
-
+
) : null}
-
+
{isAnonymous ? t('Anonymous') : answer.user?.name}
- {dateString}
+ {dateString}
);
@@ -136,18 +120,19 @@ export const PollAnswersListContent = ({
const { hasNextPage, loadMore, pollAnswers } = usePollAnswersPagination();
const {
theme: {
- colors: { white },
poll: {
- answersList: { container },
+ answersList: { container, contentContainer },
},
},
} = useTheme();
+ const styles = useStyles();
return (
-
+
`poll_answer_${item.id}`}
+ contentContainerStyle={[styles.contentContainer, contentContainer]}
onEndReached={() => hasNextPage && loadMore()}
renderItem={renderPollAnswerListItem}
{...additionalFlatListProps}
@@ -172,23 +157,54 @@ export const PollAnswersList = ({
);
-const styles = StyleSheet.create({
- addCommentButtonContainer: {
- alignItems: 'center',
- borderRadius: 12,
- paddingHorizontal: 16,
- paddingVertical: 18,
- },
- addCommentButtonText: { fontSize: 16 },
- container: { flex: 1, margin: 16 },
- listItemAnswerText: { fontSize: 16, fontWeight: '500' },
- listItemContainer: {
- borderRadius: 12,
- marginBottom: 8,
- paddingBottom: 20,
- paddingHorizontal: 16,
- paddingTop: 12,
- },
- listItemInfoContainer: { flexDirection: 'row', justifyContent: 'space-between', marginTop: 24 },
- listItemUserInfoContainer: { alignItems: 'center', flexDirection: 'row' },
-});
+const useStyles = () => {
+ const {
+ theme: { semantics },
+ } = useTheme();
+ return useMemo(
+ () =>
+ StyleSheet.create({
+ addCommentButtonContainer: {
+ alignItems: 'center',
+ borderRadius: 12,
+ paddingHorizontal: 16,
+ paddingVertical: 18,
+ },
+ contentContainer: { gap: primitives.spacingMd },
+ addCommentButtonText: { fontSize: 16 },
+ container: {
+ flex: 1,
+ padding: primitives.spacingMd,
+ backgroundColor: semantics.backgroundElevationElevation1,
+ },
+ listItemAnswerText: {
+ fontSize: primitives.typographyFontSizeMd,
+ lineHeight: primitives.typographyLineHeightRelaxed,
+ fontWeight: primitives.typographyFontWeightSemiBold,
+ color: semantics.textPrimary,
+ },
+ listItemContainer: {
+ borderRadius: primitives.radiusLg,
+ padding: primitives.spacingMd,
+ backgroundColor: semantics.backgroundCoreSurfaceCard,
+ },
+ listItemInfoContainer: {
+ flexDirection: 'row',
+ justifyContent: 'space-between',
+ alignItems: 'center',
+ marginTop: 24,
+ },
+ listItemInfoUserName: {
+ color: semantics.textPrimary,
+ fontSize: primitives.typographyFontSizeSm,
+ marginLeft: primitives.spacingXxs,
+ },
+ listItemInfoDate: {
+ fontSize: primitives.typographyFontSizeSm,
+ color: semantics.textTertiary,
+ },
+ listItemUserInfoContainer: { alignItems: 'center', flexDirection: 'row' },
+ }),
+ [semantics],
+ );
+};
diff --git a/package/src/components/Poll/components/PollButtons.tsx b/package/src/components/Poll/components/PollButtons.tsx
index 20b3dfbbb3..aa30911df2 100644
--- a/package/src/components/Poll/components/PollButtons.tsx
+++ b/package/src/components/Poll/components/PollButtons.tsx
@@ -29,11 +29,6 @@ export const ViewResultsButton = (props: PollButtonProps) => {
setShowResults(true);
}, [message, onPress, poll]);
- const {
- theme: {
- colors: { white },
- },
- } = useTheme();
const styles = useStyles();
const onRequestClose = useCallback(() => {
@@ -50,7 +45,7 @@ export const ViewResultsButton = (props: PollButtonProps) => {
/>
{showResults ? (
-
+
@@ -80,11 +75,7 @@ export const ShowAllOptionsButton = (props: PollButtonProps) => {
setShowAllOptions(false);
}, []);
- const {
- theme: {
- colors: { white },
- },
- } = useTheme();
+ const styles = useStyles();
return (
<>
@@ -96,7 +87,7 @@ export const ShowAllOptionsButton = (props: PollButtonProps) => {
) : null}
{showAllOptions ? (
-
+
@@ -122,11 +113,7 @@ export const ShowAllCommentsButton = (props: PollButtonProps) => {
setShowAnswers(true);
}, [message, onPress, poll]);
- const {
- theme: {
- colors: { white },
- },
- } = useTheme();
+ const styles = useStyles();
const onRequestClose = useCallback(() => {
setShowAnswers(false);
@@ -142,7 +129,7 @@ export const ShowAllCommentsButton = (props: PollButtonProps) => {
) : null}
{showAnswers ? (
-
+
@@ -275,6 +262,10 @@ const useStyles = () => {
? semantics.chatBorderOnChatOutgoing
: semantics.chatBorderOnChatIncoming,
},
+ safeArea: {
+ backgroundColor: semantics.backgroundElevationElevation1,
+ flex: 1,
+ },
});
}, [semantics, isPollCreatedByClient]);
};
diff --git a/package/src/components/Poll/components/PollInputDialog.tsx b/package/src/components/Poll/components/PollInputDialog.tsx
index 602e782542..b6e761bbcc 100644
--- a/package/src/components/Poll/components/PollInputDialog.tsx
+++ b/package/src/components/Poll/components/PollInputDialog.tsx
@@ -10,6 +10,8 @@ import {
View,
} from 'react-native';
+import Animated, { LinearTransition, ZoomIn } from 'react-native-reanimated';
+
import { useTheme, useTranslationContext } from '../../../contexts';
export type PollInputDialogProps = {
@@ -52,7 +54,11 @@ export const PollInputDialog = ({
behavior={Platform.OS === 'ios' ? 'padding' : 'height'}
style={[styles.transparentContainer, transparentContainer]}
>
-
+
{title}
{t('SEND')}
-
+
);
diff --git a/package/src/components/Poll/components/PollModalHeader.tsx b/package/src/components/Poll/components/PollModalHeader.tsx
index 9b8486a148..4e274d6852 100644
--- a/package/src/components/Poll/components/PollModalHeader.tsx
+++ b/package/src/components/Poll/components/PollModalHeader.tsx
@@ -1,8 +1,10 @@
-import React from 'react';
-import { Pressable, StyleSheet, Text, View } from 'react-native';
+import React, { useMemo } from 'react';
+import { StyleSheet, Text, View } from 'react-native';
import { useTheme } from '../../../contexts';
-import { Back } from '../../../icons';
+import { NewCross } from '../../../icons/NewCross';
+import { primitives } from '../../../theme';
+import { Button } from '../../ui';
export type PollModalHeaderProps = {
onPress: () => void;
@@ -12,31 +14,70 @@ export type PollModalHeaderProps = {
export const PollModalHeader = ({ onPress, title }: PollModalHeaderProps) => {
const {
theme: {
- colors: { black, text_high_emphasis, white },
poll: {
modalHeader: { container, title: titleStyle },
},
},
} = useTheme();
+ const styles = useStyles();
return (
-
- ({ opacity: pressed ? 0.5 : 1 })}>
-
-
-
- {title}
-
+
+
+
+
+
+
+ {title}
+
+
+
);
};
-const styles = StyleSheet.create({
- container: {
- alignItems: 'center',
- flexDirection: 'row',
- paddingHorizontal: 16,
- paddingVertical: 18,
- },
- title: { fontSize: 16, fontWeight: '500', marginLeft: 32 },
-});
+const useStyles = () => {
+ const {
+ theme: { semantics },
+ } = useTheme();
+ return useMemo(
+ () =>
+ StyleSheet.create({
+ container: {
+ alignItems: 'center',
+ flexDirection: 'row',
+ justifyContent: 'space-between',
+ paddingHorizontal: primitives.spacingMd,
+ paddingVertical: 10,
+ backgroundColor: semantics.backgroundElevationElevation1,
+ },
+ centerContainer: {
+ alignItems: 'center',
+ flex: 2,
+ justifyContent: 'center',
+ },
+ sideContainer: {
+ flex: 1,
+ justifyContent: 'center',
+ },
+ sideContainerRight: {
+ alignItems: 'flex-end',
+ },
+ title: {
+ fontSize: 17,
+ lineHeight: 22,
+ fontWeight: primitives.typographyFontWeightSemiBold,
+ color: semantics.textPrimary,
+ },
+ }),
+ [semantics],
+ );
+};
diff --git a/package/src/components/Poll/components/PollOption.tsx b/package/src/components/Poll/components/PollOption.tsx
index 9673b5ddac..83dac6f79d 100644
--- a/package/src/components/Poll/components/PollOption.tsx
+++ b/package/src/components/Poll/components/PollOption.tsx
@@ -40,25 +40,21 @@ export const PollAllOptionsContent = ({
const {
theme: {
- colors: { bg_user, black, white },
poll: {
allOptions: { listContainer, titleContainer, titleText, wrapper },
},
},
} = useTheme();
+ const styles = useAllOptionStyles();
return (
-
-
- {name}
+
+
+ {name}
-
+
{options?.map((option: PollOptionClass) => (
-
+
))}
@@ -134,15 +130,15 @@ export const PollOption = ({ option, showProgressBar = true }: PollOptionProps)
{voteCountsByOption[option.id] || 0}
-
- {showProgressBar ? (
+ {showProgressBar ? (
+
- ) : null}
-
+
+ ) : null}
);
@@ -256,18 +252,39 @@ const useStyles = () => {
}, [semantics]);
};
-const styles = StyleSheet.create({
- allOptionsListContainer: {
- borderRadius: 12,
- marginTop: 32,
- paddingBottom: 18,
- paddingHorizontal: 16,
- },
- allOptionsTitleContainer: {
- borderRadius: 12,
- paddingHorizontal: 16,
- paddingVertical: 18,
- },
- allOptionsTitleText: { fontSize: 16, fontWeight: '500' },
- allOptionsWrapper: { flex: 1, marginBottom: 16, padding: 16 },
-});
+const useAllOptionStyles = () => {
+ const {
+ theme: { semantics },
+ } = useTheme();
+ return useMemo(
+ () =>
+ StyleSheet.create({
+ allOptionsListContainer: {
+ borderRadius: primitives.radiusLg,
+ padding: primitives.spacingMd,
+ backgroundColor: semantics.backgroundCoreSurfaceCard,
+ marginTop: primitives.spacing2xl,
+ },
+ allOptionsTitleContainer: {
+ borderRadius: primitives.radiusLg,
+ padding: primitives.spacingMd,
+ backgroundColor: semantics.backgroundCoreSurfaceCard,
+ },
+ allOptionsTitleText: {
+ fontSize: primitives.typographyFontSizeLg,
+ lineHeight: primitives.typographyLineHeightRelaxed,
+ fontWeight: primitives.typographyFontWeightSemiBold,
+ color: semantics.textPrimary,
+ },
+ allOptionsWrapper: {
+ flex: 1,
+ padding: primitives.spacingMd,
+ backgroundColor: semantics.backgroundElevationElevation1,
+ },
+ optionWrapper: {
+ paddingVertical: primitives.spacingMd,
+ },
+ }),
+ [semantics],
+ );
+};
diff --git a/package/src/components/Poll/components/PollResults/PollOptionFullResults.tsx b/package/src/components/Poll/components/PollResults/PollOptionFullResults.tsx
index 0b81cb2bbc..372af40a76 100644
--- a/package/src/components/Poll/components/PollResults/PollOptionFullResults.tsx
+++ b/package/src/components/Poll/components/PollResults/PollOptionFullResults.tsx
@@ -1,4 +1,4 @@
-import React, { useCallback } from 'react';
+import React, { useCallback, useMemo } from 'react';
import { FlatList, type FlatListProps, StyleSheet, Text, View } from 'react-native';
import { PollOption, PollVote as PollVoteClass } from 'stream-chat';
@@ -12,6 +12,7 @@ import {
useTranslationContext,
} from '../../../../contexts';
+import { primitives } from '../../../../theme';
import { usePollOptionVotesPagination } from '../../hooks/usePollOptionVotesPagination';
import { usePollState } from '../../hooks/usePollState';
@@ -35,32 +36,40 @@ export const PollOptionFullResultsContent = ({
const {
theme: {
- colors: { bg_user, black, white },
poll: {
- fullResults: { container, contentContainer, headerContainer, headerText },
+ fullResults: { container, contentContainer, headerContainer, headerText, headerTitle },
},
},
} = useTheme();
+ const styles = useStyles();
const PollOptionFullResultsHeader = useCallback(
() => (
-
+ {option.text}
+
{t('{{count}} votes', { count: voteCountsByOption[option.id] ?? 0 })}
),
- [black, headerContainer, headerText, option.id, t, voteCountsByOption],
+ [
+ headerContainer,
+ headerText,
+ headerTitle,
+ option.id,
+ option.text,
+ styles.headerContainer,
+ styles.headerText,
+ styles.headerTitle,
+ t,
+ voteCountsByOption,
+ ],
);
return (
-
+
`option_full_results_${item.id}`}
ListHeaderComponent={PollOptionFullResultsHeader}
@@ -91,16 +100,42 @@ export const PollOptionFullResults = ({
);
-const styles = StyleSheet.create({
- container: { flex: 1 },
- contentContainer: {
- borderRadius: 12,
- marginBottom: 8,
- marginHorizontal: 16,
- marginTop: 16,
- paddingHorizontal: 16,
- paddingVertical: 12,
- },
- headerContainer: { flexDirection: 'row', justifyContent: 'flex-end', marginBottom: 8 },
- headerText: { fontSize: 16, marginLeft: 16 },
-});
+const useStyles = () => {
+ const {
+ theme: { semantics },
+ } = useTheme();
+ return useMemo(
+ () =>
+ StyleSheet.create({
+ container: { flex: 1, padding: primitives.spacingMd },
+ contentContainer: {
+ backgroundColor: semantics.backgroundCoreSurfaceCard,
+ borderRadius: primitives.radiusLg,
+ marginBottom: primitives.spacingMd,
+ padding: primitives.spacingMd,
+ },
+ headerContainer: {
+ flexDirection: 'row',
+ justifyContent: 'space-between',
+ alignItems: 'center',
+ paddingBottom: primitives.spacingXs,
+ },
+ headerTitle: {
+ flex: 1,
+ fontSize: primitives.typographyFontSizeLg,
+ lineHeight: primitives.typographyLineHeightRelaxed,
+ fontWeight: primitives.typographyFontWeightSemiBold,
+ color: semantics.textPrimary,
+ paddingTop: primitives.spacingXs,
+ },
+ headerText: {
+ fontSize: primitives.typographyFontSizeMd,
+ lineHeight: primitives.typographyLineHeightNormal,
+ fontWeight: primitives.typographyFontWeightSemiBold,
+ color: semantics.textPrimary,
+ marginLeft: primitives.spacingMd,
+ },
+ }),
+ [semantics.backgroundCoreSurfaceCard, semantics.textPrimary],
+ );
+};
diff --git a/package/src/components/Poll/components/PollResults/PollResultItem.tsx b/package/src/components/Poll/components/PollResults/PollResultItem.tsx
index 994ece5de8..61c92aa364 100644
--- a/package/src/components/Poll/components/PollResults/PollResultItem.tsx
+++ b/package/src/components/Poll/components/PollResults/PollResultItem.tsx
@@ -1,4 +1,4 @@
-import React, { useCallback, useState } from 'react';
+import React, { useCallback, useMemo, useState } from 'react';
import { Modal, StyleSheet, Text, View } from 'react-native';
import { LocalMessage, Poll, PollOption, PollVote as PollVoteClass } from 'stream-chat';
@@ -13,6 +13,7 @@ import {
useTranslationContext,
} from '../../../../contexts';
+import { primitives } from '../../../../theme';
import { SafeAreaViewWrapper } from '../../../UIComponents/SafeAreaViewWrapper';
import { usePollState } from '../../hooks/usePollState';
import { GenericPollButton } from '../Button';
@@ -48,11 +49,7 @@ export const ShowAllVotesButton = (props: ShowAllVotesButtonProps) => {
setShowAllVotes(true);
}, [message, onPress, option, poll]);
- const {
- theme: {
- colors: { white },
- },
- } = useTheme();
+ const styles = useStyles();
return (
<>
@@ -67,8 +64,8 @@ export const ShowAllVotesButton = (props: ShowAllVotesButtonProps) => {
onRequestClose={() => setShowAllVotes(false)}
visible={showAllVotes}
>
-
- setShowAllVotes(false)} title={option.text} />
+
+ setShowAllVotes(false)} title={t('Votes')} />
@@ -79,53 +76,92 @@ export const ShowAllVotesButton = (props: ShowAllVotesButtonProps) => {
export type PollResultItemProps = {
option: PollOption;
+ index: number;
};
const PollResultsVoteItem = (vote: PollVoteClass) => (
);
-export const PollResultsItem = ({ option }: PollResultItemProps) => {
+export const PollResultsItem = ({ option, index }: PollResultItemProps) => {
const { t } = useTranslationContext();
const { latestVotesByOption, voteCountsByOption } = usePollState();
const {
theme: {
- colors: { bg_user, black },
poll: {
results: {
- item: { container, headerContainer, title, voteCount },
+ item: { container, headerContainer, title, titleMeta, voteCount },
},
},
},
} = useTheme();
+ const styles = useStyles();
return (
-
+
+
+ {t('Option {{count}}', { count: index + 1 })}
+
- {option.text}
-
+ {option.text}
+
{t('{{count}} votes', { count: voteCountsByOption[option.id] ?? 0 })}
- {latestVotesByOption?.[option.id]?.length > 0 ? (
-
- {(latestVotesByOption?.[option.id] ?? []).slice(0, 5).map(PollResultsVoteItem)}
-
- ) : null}
+ {latestVotesByOption?.[option.id]?.length > 0
+ ? (latestVotesByOption?.[option.id] ?? []).slice(0, 5).map(PollResultsVoteItem)
+ : null}
);
};
-const styles = StyleSheet.create({
- container: {
- borderRadius: 12,
- marginBottom: 8,
- paddingHorizontal: 16,
- paddingVertical: 12,
- },
- headerContainer: { flexDirection: 'row', justifyContent: 'space-between' },
- title: { flex: 1, fontSize: 16, fontWeight: '500' },
- voteCount: { fontSize: 16, marginLeft: 16 },
-});
+const useStyles = () => {
+ const {
+ theme: { semantics },
+ } = useTheme();
+ return useMemo(
+ () =>
+ StyleSheet.create({
+ container: {
+ backgroundColor: semantics.backgroundCoreSurfaceCard,
+ borderRadius: primitives.radiusLg,
+ marginBottom: primitives.spacingMd,
+ padding: primitives.spacingMd,
+ },
+ headerContainer: {
+ flexDirection: 'row',
+ justifyContent: 'space-between',
+ alignItems: 'center',
+ paddingBottom: primitives.spacingXs,
+ },
+ title: {
+ flex: 1,
+ fontSize: primitives.typographyFontSizeLg,
+ lineHeight: primitives.typographyLineHeightRelaxed,
+ fontWeight: primitives.typographyFontWeightSemiBold,
+ color: semantics.textPrimary,
+ paddingTop: primitives.spacingXs,
+ },
+ titleMeta: {
+ fontSize: primitives.typographyFontSizeSm,
+ color: semantics.textTertiary,
+ lineHeight: primitives.typographyLineHeightNormal,
+ fontWeight: primitives.typographyFontWeightMedium,
+ },
+ voteCount: {
+ fontSize: primitives.typographyFontSizeMd,
+ lineHeight: primitives.typographyLineHeightNormal,
+ fontWeight: primitives.typographyFontWeightSemiBold,
+ color: semantics.textPrimary,
+ marginLeft: primitives.spacingMd,
+ },
+ safeArea: {
+ backgroundColor: semantics.backgroundElevationElevation1,
+ flex: 1,
+ },
+ }),
+ [semantics],
+ );
+};
diff --git a/package/src/components/Poll/components/PollResults/PollResults.tsx b/package/src/components/Poll/components/PollResults/PollResults.tsx
index 277812a7ac..8a6d5e0905 100644
--- a/package/src/components/Poll/components/PollResults/PollResults.tsx
+++ b/package/src/components/Poll/components/PollResults/PollResults.tsx
@@ -5,7 +5,13 @@ import { ScrollView } from 'react-native-gesture-handler';
import { PollResultsItem } from './PollResultItem';
-import { PollContextProvider, PollContextValue, useTheme } from '../../../../contexts';
+import {
+ PollContextProvider,
+ PollContextValue,
+ useTheme,
+ useTranslationContext,
+} from '../../../../contexts';
+import { primitives } from '../../../../theme';
import { usePollState } from '../../hooks/usePollState';
export type PollResultsProps = PollContextValue & {
@@ -26,26 +32,26 @@ export const PollResultsContent = ({
[voteCountsByOption, options],
);
+ const { t } = useTranslationContext();
+
const {
theme: {
- colors: { bg_user, black, white },
poll: {
- results: { container, scrollView, title },
+ results: { container, scrollView, title, titleMeta },
},
},
} = useTheme();
+ const styles = useStyles();
return (
-
-
- {name}
+
+
+ {t('Question')}
+ {name}
-
- {sortedOptions.map((option) => (
-
+
+ {sortedOptions.map((option, index) => (
+
))}
@@ -67,13 +73,40 @@ export const PollResults = ({
);
-const styles = StyleSheet.create({
- container: {
- borderRadius: 12,
- marginTop: 16,
- paddingHorizontal: 16,
- paddingVertical: 18,
- },
- scrollView: { flex: 1, marginHorizontal: 16 },
- title: { fontSize: 16, fontWeight: '500' },
-});
+const useStyles = () => {
+ const {
+ theme: { semantics },
+ } = useTheme();
+ return useMemo(
+ () =>
+ StyleSheet.create({
+ container: {
+ borderRadius: primitives.radiusLg,
+ padding: primitives.spacingMd,
+ backgroundColor: semantics.backgroundCoreSurfaceCard,
+ },
+ scrollView: {
+ flex: 1,
+ padding: primitives.spacingMd,
+ backgroundColor: semantics.backgroundElevationElevation1,
+ },
+ resultsContainer: {
+ paddingVertical: primitives.spacing2xl,
+ },
+ title: {
+ fontSize: primitives.typographyFontSizeLg,
+ lineHeight: primitives.typographyLineHeightRelaxed,
+ fontWeight: primitives.typographyFontWeightSemiBold,
+ color: semantics.textPrimary,
+ paddingTop: primitives.spacingXs,
+ },
+ titleMeta: {
+ fontSize: primitives.typographyFontSizeSm,
+ color: semantics.textTertiary,
+ lineHeight: primitives.typographyLineHeightNormal,
+ fontWeight: primitives.typographyFontWeightMedium,
+ },
+ }),
+ [semantics],
+ );
+};
diff --git a/package/src/components/Poll/components/PollResults/PollVote.tsx b/package/src/components/Poll/components/PollResults/PollVote.tsx
index d2c19a2ed0..c389ca65a2 100644
--- a/package/src/components/Poll/components/PollResults/PollVote.tsx
+++ b/package/src/components/Poll/components/PollResults/PollVote.tsx
@@ -5,6 +5,7 @@ import { StyleSheet, Text, View } from 'react-native';
import { PollVote as PollVoteClass, VotingVisibility } from 'stream-chat';
import { useTheme, useTranslationContext } from '../../../../contexts';
+import { primitives } from '../../../../theme';
import { getDateString } from '../../../../utils/i18n/getDateString';
import { UserAvatar } from '../../../ui/Avatar/UserAvatar';
@@ -15,7 +16,6 @@ export const PollVote = ({ vote }: { vote: PollVoteClass }) => {
const { votingVisibility } = usePollState();
const {
theme: {
- colors: { black, text_low_emphasis },
poll: {
results: {
vote: { container, dateText, userName },
@@ -23,6 +23,7 @@ export const PollVote = ({ vote }: { vote: PollVoteClass }) => {
},
},
} = useTheme();
+ const styles = useStyles();
const dateString = useMemo(
() =>
@@ -43,28 +44,45 @@ export const PollVote = ({ vote }: { vote: PollVoteClass }) => {
return (
- {!isAnonymous && vote.user ? : null}
-
+ {!isAnonymous && vote.user ? : null}
+
{isAnonymous ? t('Anonymous') : (vote.user?.name ?? vote.user?.id)}
- {dateString}
+ {dateString}
);
};
-const styles = StyleSheet.create({
- voteContainer: {
- flexDirection: 'row',
- justifyContent: 'space-between',
- marginBottom: 8,
- paddingVertical: 8,
- },
- voteCount: { fontSize: 16, marginLeft: 16 },
- voteDate: { fontSize: 14 },
- voteUserName: { fontSize: 14, marginLeft: 4 },
- userContainer: {
- flexDirection: 'row',
- alignItems: 'center',
- },
-});
+const useStyles = () => {
+ const {
+ theme: { semantics },
+ } = useTheme();
+ return useMemo(
+ () =>
+ StyleSheet.create({
+ voteContainer: {
+ flexDirection: 'row',
+ justifyContent: 'space-between',
+ alignItems: 'center',
+ paddingVertical: primitives.spacingXs,
+ },
+ voteDate: {
+ fontSize: primitives.typographyFontSizeMd,
+ lineHeight: primitives.typographyLineHeightNormal,
+ color: semantics.textTertiary,
+ },
+ voteUserName: {
+ fontSize: primitives.typographyFontSizeMd,
+ lineHeight: primitives.typographyLineHeightNormal,
+ color: semantics.textPrimary,
+ paddingLeft: primitives.spacingXs,
+ },
+ userContainer: {
+ flexDirection: 'row',
+ alignItems: 'center',
+ },
+ }),
+ [semantics],
+ );
+};
diff --git a/package/src/components/Thread/__tests__/__snapshots__/Thread.test.js.snap b/package/src/components/Thread/__tests__/__snapshots__/Thread.test.js.snap
index f7a2683ad1..ff582aaea3 100644
--- a/package/src/components/Thread/__tests__/__snapshots__/Thread.test.js.snap
+++ b/package/src/components/Thread/__tests__/__snapshots__/Thread.test.js.snap
@@ -413,7 +413,7 @@ exports[`Thread should match thread snapshot 1`] = `
"width": 32,
},
{
- "backgroundColor": "#fcedb9",
+ "backgroundColor": "#fcd579",
},
{
"borderColor": "rgba(0, 0, 0, 0.1)",
@@ -619,7 +619,7 @@ exports[`Thread should match thread snapshot 1`] = `
"alignItems": "flex-start",
"flexDirection": "row",
"flexWrap": "wrap",
- "fontSize": 15,
+ "fontSize": 17,
"justifyContent": "flex-start",
"lineHeight": 20,
"marginBottom": 8,
@@ -631,7 +631,7 @@ exports[`Thread should match thread snapshot 1`] = `
style={
{
"color": "#000000",
- "fontSize": 15,
+ "fontSize": 17,
"lineHeight": 20,
}
}
@@ -675,7 +675,7 @@ exports[`Thread should match thread snapshot 1`] = `
[
{
"color": "#687385",
- "fontSize": 12,
+ "fontSize": 13,
"fontWeight": 400,
"lineHeight": 16,
},
@@ -780,7 +780,7 @@ exports[`Thread should match thread snapshot 1`] = `
"width": 32,
},
{
- "backgroundColor": "#bdfcdb",
+ "backgroundColor": "#8febbd",
},
{
"borderColor": "rgba(0, 0, 0, 0.1)",
@@ -986,7 +986,7 @@ exports[`Thread should match thread snapshot 1`] = `
"alignItems": "flex-start",
"flexDirection": "row",
"flexWrap": "wrap",
- "fontSize": 15,
+ "fontSize": 17,
"justifyContent": "flex-start",
"lineHeight": 20,
"marginBottom": 8,
@@ -998,7 +998,7 @@ exports[`Thread should match thread snapshot 1`] = `
style={
{
"color": "#000000",
- "fontSize": 15,
+ "fontSize": 17,
"lineHeight": 20,
}
}
@@ -1042,7 +1042,7 @@ exports[`Thread should match thread snapshot 1`] = `
[
{
"color": "#687385",
- "fontSize": 12,
+ "fontSize": 13,
"fontWeight": 400,
"lineHeight": 16,
},
@@ -1113,7 +1113,7 @@ exports[`Thread should match thread snapshot 1`] = `
style={
{
"color": "#414552",
- "fontSize": 12,
+ "fontSize": 13,
"fontWeight": 600,
"lineHeight": 16,
}
@@ -1183,7 +1183,7 @@ exports[`Thread should match thread snapshot 1`] = `
"width": 32,
},
{
- "backgroundColor": "#fcedb9",
+ "backgroundColor": "#fcd579",
},
{
"borderColor": "rgba(0, 0, 0, 0.1)",
@@ -1389,7 +1389,7 @@ exports[`Thread should match thread snapshot 1`] = `
"alignItems": "flex-start",
"flexDirection": "row",
"flexWrap": "wrap",
- "fontSize": 15,
+ "fontSize": 17,
"justifyContent": "flex-start",
"lineHeight": 20,
"marginBottom": 8,
@@ -1401,7 +1401,7 @@ exports[`Thread should match thread snapshot 1`] = `
style={
{
"color": "#000000",
- "fontSize": 15,
+ "fontSize": 17,
"lineHeight": 20,
}
}
@@ -1445,7 +1445,7 @@ exports[`Thread should match thread snapshot 1`] = `
[
{
"color": "#687385",
- "fontSize": 12,
+ "fontSize": 13,
"fontWeight": 400,
"lineHeight": 16,
},
@@ -1552,7 +1552,7 @@ exports[`Thread should match thread snapshot 1`] = `
"width": 32,
},
{
- "backgroundColor": "#bdfcdb",
+ "backgroundColor": "#8febbd",
},
{
"borderColor": "rgba(0, 0, 0, 0.1)",
@@ -1758,7 +1758,7 @@ exports[`Thread should match thread snapshot 1`] = `
"alignItems": "flex-start",
"flexDirection": "row",
"flexWrap": "wrap",
- "fontSize": 15,
+ "fontSize": 17,
"justifyContent": "flex-start",
"lineHeight": 20,
"marginBottom": 8,
@@ -1770,7 +1770,7 @@ exports[`Thread should match thread snapshot 1`] = `
style={
{
"color": "#000000",
- "fontSize": 15,
+ "fontSize": 17,
"lineHeight": 20,
}
}
@@ -1814,7 +1814,7 @@ exports[`Thread should match thread snapshot 1`] = `
[
{
"color": "#687385",
- "fontSize": 12,
+ "fontSize": 13,
"fontWeight": 400,
"lineHeight": 16,
},
@@ -2207,39 +2207,43 @@ exports[`Thread should match thread snapshot 1`] = `
]
}
>
-
+
+
+
;
+ fontSizeSize11: NonNullable;
+ fontSizeSize12: NonNullable;
+ fontSizeSize13: NonNullable;
+ fontSizeSize14: NonNullable;
+ fontSizeSize15: NonNullable;
+ fontSizeSize16: NonNullable;
+ fontSizeSize17: NonNullable;
+ fontSizeSize18: NonNullable;
+ fontSizeSize20: NonNullable;
+ fontSizeSize22: NonNullable;
+ fontSizeSize24: NonNullable;
+ fontSizeSize28: NonNullable;
+ fontSizeSize32: NonNullable;
+ fontSizeSize40: NonNullable;
+ fontSizeSize48: NonNullable;
+ fontSizeSize64: NonNullable;
+ fontSizeSize8: NonNullable;
fontWeightW400: TextStyle['fontWeight'];
fontWeightW500: TextStyle['fontWeight'];
fontWeightW600: TextStyle['fontWeight'];
fontWeightW700: TextStyle['fontWeight'];
lineHeightLineHeight10: TextStyle['lineHeight'];
lineHeightLineHeight12: TextStyle['lineHeight'];
+ lineHeightLineHeight13: TextStyle['lineHeight'];
lineHeightLineHeight14: TextStyle['lineHeight'];
lineHeightLineHeight15: TextStyle['lineHeight'];
lineHeightLineHeight16: TextStyle['lineHeight'];
@@ -260,6 +264,11 @@ export interface ChatComponents {
deviceRadius: number;
deviceSafeAreaBottom: number;
deviceSafeAreaTop: number;
+ emoji2xl: number;
+ emojiLg: number;
+ emojiMd: number;
+ emojiSm: number;
+ emojiXl: number;
iconSizeLg: number;
iconSizeMd: number;
iconSizeSm: number;
@@ -309,14 +318,14 @@ export interface ChatPrimitives {
spacingXxxs: number;
typographyFontFamilyMono: TextStyle['fontFamily'];
typographyFontFamilySans: TextStyle['fontFamily'];
- typographyFontSize2xl: TextStyle['fontSize'];
- typographyFontSizeLg: TextStyle['fontSize'];
- typographyFontSizeMd: TextStyle['fontSize'];
- typographyFontSizeMicro: TextStyle['fontSize'];
- typographyFontSizeSm: TextStyle['fontSize'];
- typographyFontSizeXl: TextStyle['fontSize'];
- typographyFontSizeXs: TextStyle['fontSize'];
- typographyFontSizeXxs: TextStyle['fontSize'];
+ typographyFontSize2xl: NonNullable;
+ typographyFontSizeLg: NonNullable;
+ typographyFontSizeMd: NonNullable;
+ typographyFontSizeMicro: NonNullable;
+ typographyFontSizeSm: NonNullable;
+ typographyFontSizeXl: NonNullable;
+ typographyFontSizeXs: NonNullable;
+ typographyFontSizeXxs: NonNullable;
typographyFontWeightBold: TextStyle['fontWeight'];
typographyFontWeightMedium: TextStyle['fontWeight'];
typographyFontWeightRegular: TextStyle['fontWeight'];
@@ -359,6 +368,7 @@ export interface ChatSemantics {
backgroundCoreScrim: ColorValue;
backgroundCoreSelected: ColorValue;
backgroundCoreSurface: ColorValue;
+ backgroundCoreSurfaceCard: ColorValue;
backgroundCoreSurfaceStrong: ColorValue;
backgroundCoreSurfaceSubtle: ColorValue;
backgroundElevationElevation0: ColorValue;
@@ -442,6 +452,7 @@ export interface ChatSemantics {
chatTextMention: ColorValue;
chatTextOutgoing: ColorValue;
chatTextReaction: ColorValue;
+ chatTextRead: ColorValue;
chatTextSystem: ColorValue;
chatTextTimestamp: ColorValue;
chatTextUsername: ColorValue;
@@ -487,10 +498,8 @@ export interface ChatSemantics {
reactionBorder: ColorValue;
reactionEmoji: ColorValue;
reactionText: ColorValue;
- skeletonGradientAccentBase: ColorValue;
- skeletonGradientAccentHighlight: ColorValue;
- skeletonGradientDefaultBase: ColorValue;
- skeletonGradientDefaultHighlight: ColorValue;
+ skeletonLoadingBase: ColorValue;
+ skeletonLoadingHighlight: ColorValue;
systemBgBlur: ColorValue;
systemCaret: ColorValue;
systemScrollbar: ColorValue;
diff --git a/package/src/theme/generated/dark/StreamTokens.android.ts b/package/src/theme/generated/dark/StreamTokens.android.ts
index 0ade4cacf6..7110cd1d32 100644
--- a/package/src/theme/generated/dark/StreamTokens.android.ts
+++ b/package/src/theme/generated/dark/StreamTokens.android.ts
@@ -193,24 +193,28 @@ export const foundations: IStreamTokens['foundations'] = {
fontWeightW500: '500',
fontWeightW600: '600',
fontWeightW700: '700',
+ fontSizeSize8: 8,
fontSizeSize10: 10,
+ fontSizeSize11: 11,
fontSizeSize12: 12,
+ fontSizeSize13: 13,
fontSizeSize14: 14,
fontSizeSize16: 16,
fontSizeSize15: 15,
fontSizeSize17: 17,
fontSizeSize18: 18,
fontSizeSize20: 20,
+ fontSizeSize22: 22,
fontSizeSize24: 24,
fontSizeSize28: 28,
fontSizeSize32: 32,
fontSizeSize40: 40,
fontSizeSize48: 48,
- fontSizeSize13: 13,
- fontSizeSize8: 8,
+ fontSizeSize64: 64,
lineHeightLineHeight8: 8,
lineHeightLineHeight10: 10,
lineHeightLineHeight12: 12,
+ lineHeightLineHeight13: 13,
lineHeightLineHeight14: 14,
lineHeightLineHeight15: 15,
lineHeightLineHeight16: 16,
@@ -394,6 +398,11 @@ export const components: IStreamTokens['components'] = {
deviceRadius: primitives.radius4xl,
deviceSafeAreaBottom: foundations.spacing.space40,
deviceSafeAreaTop: 52,
+ emoji2xl: foundations.typography.fontSizeSize64,
+ emojiLg: foundations.typography.fontSizeSize32,
+ emojiMd: foundations.typography.fontSizeSize24,
+ emojiSm: primitives.typographyFontSizeMd,
+ emojiXl: foundations.typography.fontSizeSize48,
iconSizeLg: foundations.layout.size32,
iconSizeMd: foundations.layout.size20,
iconSizeSm: foundations.layout.size16,
@@ -412,17 +421,17 @@ export const components: IStreamTokens['components'] = {
export const semantics: IStreamTokens['semantics'] = {
accentBlack: foundations.colors.baseBlack,
accentError: foundations.colors.red400,
- accentNeutral: foundations.colors.neutral600,
+ accentNeutral: foundations.colors.neutral300,
accentPrimary: '$brand500',
- accentSuccess: foundations.colors.green400,
- accentWarning: foundations.colors.yellow400,
+ accentSuccess: foundations.colors.green300,
+ accentWarning: foundations.colors.yellow300,
avatarBgDefault: '$avatarPaletteBg1',
avatarBgPlaceholder: foundations.colors.neutral700,
- avatarPaletteBg1: foundations.colors.blue800,
- avatarPaletteBg2: foundations.colors.cyan800,
- avatarPaletteBg3: foundations.colors.green800,
- avatarPaletteBg4: foundations.colors.purple800,
- avatarPaletteBg5: foundations.colors.yellow800,
+ avatarPaletteBg1: foundations.colors.blue600,
+ avatarPaletteBg2: foundations.colors.cyan600,
+ avatarPaletteBg3: foundations.colors.green600,
+ avatarPaletteBg4: foundations.colors.purple600,
+ avatarPaletteBg5: foundations.colors.yellow600,
avatarPaletteText1: foundations.colors.blue100,
avatarPaletteText2: foundations.colors.cyan100,
avatarPaletteText3: foundations.colors.green100,
@@ -442,6 +451,7 @@ export const semantics: IStreamTokens['semantics'] = {
backgroundCoreScrim: 'rgba(0, 0, 0, 0.75)',
backgroundCoreSelected: 'rgba(255, 255, 255, 0.25)',
backgroundCoreSurface: foundations.colors.neutral800,
+ backgroundCoreSurfaceCard: foundations.colors.neutral800,
backgroundCoreSurfaceStrong: foundations.colors.neutral700,
backgroundCoreSurfaceSubtle: foundations.colors.neutral900,
backgroundElevationElevation0: foundations.colors.baseBlack,
@@ -525,6 +535,7 @@ export const semantics: IStreamTokens['semantics'] = {
chatTextMention: '$textLink',
chatTextOutgoing: '$brand900',
chatTextReaction: '$textSecondary',
+ chatTextRead: '$accentPrimary',
chatTextSystem: '$textSecondary',
chatTextTimestamp: '$textTertiary',
chatTextUsername: '$textSecondary',
@@ -539,15 +550,15 @@ export const semantics: IStreamTokens['semantics'] = {
controlPlaybackToggleText: '$textPrimary',
controlPlayControlBg: '$accentBlack',
controlPlayControlIcon: '$textOnAccent',
- controlProgressBarFill: foundations.colors.neutral50,
- controlProgressBarTrack: foundations.colors.neutral600,
+ controlProgressBarFill: '$accentNeutral',
+ controlProgressBarTrack: '$backgroundCoreSurfaceStrong',
controlRadiocheckBg: foundations.colors.baseTransparent0,
controlRadiocheckBgSelected: foundations.colors.baseWhite,
controlRadiocheckBorder: '$borderCoreDefault',
controlRadiocheckIconSelected: '$textOnDark',
- controlRemoveControlBg: '$accentBlack',
+ controlRemoveControlBg: '$backgroundCoreInverse',
controlRemoveControlBorder: '$borderCoreOnDark',
- controlRemoveControlIcon: '$textOnAccent',
+ controlRemoveControlIcon: '$textOnDark',
controlToggleSwitchBg: '$backgroundCoreSurfaceStrong',
controlToggleSwitchBgDisabled: '$backgroundCoreDisabled',
controlToggleSwitchBgSelected: '$accentPrimary',
@@ -570,17 +581,15 @@ export const semantics: IStreamTokens['semantics'] = {
reactionBorder: '$borderCoreDefault',
reactionEmoji: '$textPrimary',
reactionText: '$textPrimary',
- skeletonGradientAccentBase: '$brand150',
- skeletonGradientAccentHighlight: '$brand200',
- skeletonGradientDefaultBase: foundations.colors.neutral800,
- skeletonGradientDefaultHighlight: foundations.colors.neutral600,
+ skeletonLoadingBase: foundations.colors.baseTransparent0,
+ skeletonLoadingHighlight: foundations.colors.baseTransparentWhite20,
systemBgBlur: 'rgba(0, 0, 0, 0.01)',
systemCaret: foundations.colors.baseWhite,
systemScrollbar: 'rgba(255, 255, 255, 0.5)',
systemText: foundations.colors.baseWhite,
textDisabled: foundations.colors.neutral500,
textInverse: foundations.colors.baseBlack,
- textLink: foundations.colors.baseWhite,
+ textLink: '$accentPrimary',
textOnAccent: foundations.colors.baseWhite,
textOnDark: foundations.colors.neutral900,
textPrimary: foundations.colors.baseWhite,
diff --git a/package/src/theme/generated/dark/StreamTokens.ios.ts b/package/src/theme/generated/dark/StreamTokens.ios.ts
index 698d0f79ae..b9c71e177d 100644
--- a/package/src/theme/generated/dark/StreamTokens.ios.ts
+++ b/package/src/theme/generated/dark/StreamTokens.ios.ts
@@ -193,24 +193,28 @@ export const foundations: IStreamTokens['foundations'] = {
fontWeightW500: '500',
fontWeightW600: '600',
fontWeightW700: '700',
+ fontSizeSize8: 8,
fontSizeSize10: 10,
+ fontSizeSize11: 11,
fontSizeSize12: 12,
+ fontSizeSize13: 13,
fontSizeSize14: 14,
fontSizeSize16: 16,
fontSizeSize15: 15,
fontSizeSize17: 17,
fontSizeSize18: 18,
fontSizeSize20: 20,
+ fontSizeSize22: 22,
fontSizeSize24: 24,
fontSizeSize28: 28,
fontSizeSize32: 32,
fontSizeSize40: 40,
fontSizeSize48: 48,
- fontSizeSize13: 13,
- fontSizeSize8: 8,
+ fontSizeSize64: 64,
lineHeightLineHeight8: 8,
lineHeightLineHeight10: 10,
lineHeightLineHeight12: 12,
+ lineHeightLineHeight13: 13,
lineHeightLineHeight14: 14,
lineHeightLineHeight15: 15,
lineHeightLineHeight16: 16,
@@ -350,13 +354,13 @@ export const primitives: IStreamTokens['primitives'] = {
typographyFontFamilyMono: foundations.typography.fontFamilySfMono,
typographyFontFamilySans: foundations.typography.fontFamilySfPro,
typographyFontSize2xl: foundations.typography.fontSizeSize24,
- typographyFontSizeLg: foundations.typography.fontSizeSize17,
- typographyFontSizeMd: foundations.typography.fontSizeSize15,
+ typographyFontSizeLg: foundations.typography.fontSizeSize20,
+ typographyFontSizeMd: foundations.typography.fontSizeSize17,
typographyFontSizeMicro: foundations.typography.fontSizeSize8,
- typographyFontSizeSm: foundations.typography.fontSizeSize13,
- typographyFontSizeXl: foundations.typography.fontSizeSize20,
- typographyFontSizeXs: foundations.typography.fontSizeSize12,
- typographyFontSizeXxs: foundations.typography.fontSizeSize10,
+ typographyFontSizeSm: foundations.typography.fontSizeSize15,
+ typographyFontSizeXl: foundations.typography.fontSizeSize22,
+ typographyFontSizeXs: foundations.typography.fontSizeSize13,
+ typographyFontSizeXxs: foundations.typography.fontSizeSize12,
typographyFontWeightBold: 700,
typographyFontWeightMedium: 500,
typographyFontWeightRegular: 400,
@@ -393,7 +397,12 @@ export const components: IStreamTokens['components'] = {
composerRadiusFloating: primitives.radius3xl,
deviceRadius: 62,
deviceSafeAreaBottom: foundations.spacing.space32,
- deviceSafeAreaTop: 62,
+ deviceSafeAreaTop: 50,
+ emoji2xl: foundations.typography.fontSizeSize64,
+ emojiLg: foundations.typography.fontSizeSize32,
+ emojiMd: foundations.typography.fontSizeSize24,
+ emojiSm: primitives.typographyFontSizeMd,
+ emojiXl: foundations.typography.fontSizeSize48,
iconSizeLg: foundations.layout.size32,
iconSizeMd: foundations.layout.size20,
iconSizeSm: foundations.layout.size16,
@@ -412,17 +421,17 @@ export const components: IStreamTokens['components'] = {
export const semantics: IStreamTokens['semantics'] = {
accentBlack: foundations.colors.baseBlack,
accentError: foundations.colors.red400,
- accentNeutral: foundations.colors.neutral600,
+ accentNeutral: foundations.colors.neutral300,
accentPrimary: '$brand500',
- accentSuccess: foundations.colors.green400,
- accentWarning: foundations.colors.yellow400,
+ accentSuccess: foundations.colors.green300,
+ accentWarning: foundations.colors.yellow300,
avatarBgDefault: '$avatarPaletteBg1',
avatarBgPlaceholder: foundations.colors.neutral700,
- avatarPaletteBg1: foundations.colors.blue800,
- avatarPaletteBg2: foundations.colors.cyan800,
- avatarPaletteBg3: foundations.colors.green800,
- avatarPaletteBg4: foundations.colors.purple800,
- avatarPaletteBg5: foundations.colors.yellow800,
+ avatarPaletteBg1: foundations.colors.blue600,
+ avatarPaletteBg2: foundations.colors.cyan600,
+ avatarPaletteBg3: foundations.colors.green600,
+ avatarPaletteBg4: foundations.colors.purple600,
+ avatarPaletteBg5: foundations.colors.yellow600,
avatarPaletteText1: foundations.colors.blue100,
avatarPaletteText2: foundations.colors.cyan100,
avatarPaletteText3: foundations.colors.green100,
@@ -442,6 +451,7 @@ export const semantics: IStreamTokens['semantics'] = {
backgroundCoreScrim: 'rgba(0, 0, 0, 0.75)',
backgroundCoreSelected: 'rgba(255, 255, 255, 0.25)',
backgroundCoreSurface: foundations.colors.neutral800,
+ backgroundCoreSurfaceCard: foundations.colors.neutral800,
backgroundCoreSurfaceStrong: foundations.colors.neutral700,
backgroundCoreSurfaceSubtle: foundations.colors.neutral900,
backgroundElevationElevation0: foundations.colors.baseBlack,
@@ -525,6 +535,7 @@ export const semantics: IStreamTokens['semantics'] = {
chatTextMention: '$textLink',
chatTextOutgoing: '$brand900',
chatTextReaction: '$textSecondary',
+ chatTextRead: '$accentPrimary',
chatTextSystem: '$textSecondary',
chatTextTimestamp: '$textTertiary',
chatTextUsername: '$textSecondary',
@@ -539,15 +550,15 @@ export const semantics: IStreamTokens['semantics'] = {
controlPlaybackToggleText: '$textPrimary',
controlPlayControlBg: '$accentBlack',
controlPlayControlIcon: '$textOnAccent',
- controlProgressBarFill: foundations.colors.neutral50,
- controlProgressBarTrack: foundations.colors.neutral600,
+ controlProgressBarFill: '$accentNeutral',
+ controlProgressBarTrack: '$backgroundCoreSurfaceStrong',
controlRadiocheckBg: foundations.colors.baseTransparent0,
controlRadiocheckBgSelected: foundations.colors.baseWhite,
controlRadiocheckBorder: '$borderCoreDefault',
controlRadiocheckIconSelected: '$textOnDark',
- controlRemoveControlBg: '$accentBlack',
+ controlRemoveControlBg: '$backgroundCoreInverse',
controlRemoveControlBorder: '$borderCoreOnDark',
- controlRemoveControlIcon: '$textOnAccent',
+ controlRemoveControlIcon: '$textOnDark',
controlToggleSwitchBg: '$backgroundCoreSurfaceStrong',
controlToggleSwitchBgDisabled: '$backgroundCoreDisabled',
controlToggleSwitchBgSelected: '$accentPrimary',
@@ -570,17 +581,15 @@ export const semantics: IStreamTokens['semantics'] = {
reactionBorder: '$borderCoreDefault',
reactionEmoji: '$textPrimary',
reactionText: '$textPrimary',
- skeletonGradientAccentBase: '$brand150',
- skeletonGradientAccentHighlight: '$brand200',
- skeletonGradientDefaultBase: foundations.colors.neutral800,
- skeletonGradientDefaultHighlight: foundations.colors.neutral600,
+ skeletonLoadingBase: foundations.colors.baseTransparent0,
+ skeletonLoadingHighlight: foundations.colors.baseTransparentWhite20,
systemBgBlur: 'rgba(0, 0, 0, 0.01)',
systemCaret: foundations.colors.baseWhite,
systemScrollbar: 'rgba(255, 255, 255, 0.5)',
systemText: foundations.colors.baseWhite,
textDisabled: foundations.colors.neutral500,
textInverse: foundations.colors.baseBlack,
- textLink: foundations.colors.baseWhite,
+ textLink: '$accentPrimary',
textOnAccent: foundations.colors.baseWhite,
textOnDark: foundations.colors.neutral900,
textPrimary: foundations.colors.baseWhite,
diff --git a/package/src/theme/generated/dark/StreamTokens.web.ts b/package/src/theme/generated/dark/StreamTokens.web.ts
index acaa4f9b0d..e156d00f51 100644
--- a/package/src/theme/generated/dark/StreamTokens.web.ts
+++ b/package/src/theme/generated/dark/StreamTokens.web.ts
@@ -193,24 +193,28 @@ export const foundations: IStreamTokens['foundations'] = {
fontWeightW500: '500',
fontWeightW600: '600',
fontWeightW700: '700',
+ fontSizeSize8: 8,
fontSizeSize10: 10,
+ fontSizeSize11: 11,
fontSizeSize12: 12,
+ fontSizeSize13: 13,
fontSizeSize14: 14,
fontSizeSize16: 16,
fontSizeSize15: 15,
fontSizeSize17: 17,
fontSizeSize18: 18,
fontSizeSize20: 20,
+ fontSizeSize22: 22,
fontSizeSize24: 24,
fontSizeSize28: 28,
fontSizeSize32: 32,
fontSizeSize40: 40,
fontSizeSize48: 48,
- fontSizeSize13: 13,
- fontSizeSize8: 8,
+ fontSizeSize64: 64,
lineHeightLineHeight8: 8,
lineHeightLineHeight10: 10,
lineHeightLineHeight12: 12,
+ lineHeightLineHeight13: 13,
lineHeightLineHeight14: 14,
lineHeightLineHeight15: 15,
lineHeightLineHeight16: 16,
@@ -394,6 +398,11 @@ export const components: IStreamTokens['components'] = {
deviceRadius: primitives.radiusMd,
deviceSafeAreaBottom: foundations.spacing.space0,
deviceSafeAreaTop: foundations.spacing.space0,
+ emoji2xl: foundations.typography.fontSizeSize64,
+ emojiLg: foundations.typography.fontSizeSize32,
+ emojiMd: foundations.typography.fontSizeSize24,
+ emojiSm: primitives.typographyFontSizeMd,
+ emojiXl: foundations.typography.fontSizeSize48,
iconSizeLg: foundations.layout.size32,
iconSizeMd: foundations.layout.size20,
iconSizeSm: foundations.layout.size16,
@@ -412,17 +421,17 @@ export const components: IStreamTokens['components'] = {
export const semantics: IStreamTokens['semantics'] = {
accentBlack: foundations.colors.baseBlack,
accentError: foundations.colors.red400,
- accentNeutral: foundations.colors.neutral600,
+ accentNeutral: foundations.colors.neutral300,
accentPrimary: '$brand500',
- accentSuccess: foundations.colors.green400,
- accentWarning: foundations.colors.yellow400,
+ accentSuccess: foundations.colors.green300,
+ accentWarning: foundations.colors.yellow300,
avatarBgDefault: '$avatarPaletteBg1',
avatarBgPlaceholder: foundations.colors.neutral700,
- avatarPaletteBg1: foundations.colors.blue800,
- avatarPaletteBg2: foundations.colors.cyan800,
- avatarPaletteBg3: foundations.colors.green800,
- avatarPaletteBg4: foundations.colors.purple800,
- avatarPaletteBg5: foundations.colors.yellow800,
+ avatarPaletteBg1: foundations.colors.blue600,
+ avatarPaletteBg2: foundations.colors.cyan600,
+ avatarPaletteBg3: foundations.colors.green600,
+ avatarPaletteBg4: foundations.colors.purple600,
+ avatarPaletteBg5: foundations.colors.yellow600,
avatarPaletteText1: foundations.colors.blue100,
avatarPaletteText2: foundations.colors.cyan100,
avatarPaletteText3: foundations.colors.green100,
@@ -442,6 +451,7 @@ export const semantics: IStreamTokens['semantics'] = {
backgroundCoreScrim: 'rgba(0, 0, 0, 0.75)',
backgroundCoreSelected: 'rgba(255, 255, 255, 0.25)',
backgroundCoreSurface: foundations.colors.neutral800,
+ backgroundCoreSurfaceCard: foundations.colors.neutral800,
backgroundCoreSurfaceStrong: foundations.colors.neutral700,
backgroundCoreSurfaceSubtle: foundations.colors.neutral900,
backgroundElevationElevation0: foundations.colors.baseBlack,
@@ -525,6 +535,7 @@ export const semantics: IStreamTokens['semantics'] = {
chatTextMention: '$textLink',
chatTextOutgoing: '$brand900',
chatTextReaction: '$textSecondary',
+ chatTextRead: '$accentPrimary',
chatTextSystem: '$textSecondary',
chatTextTimestamp: '$textTertiary',
chatTextUsername: '$textSecondary',
@@ -539,15 +550,15 @@ export const semantics: IStreamTokens['semantics'] = {
controlPlaybackToggleText: '$textPrimary',
controlPlayControlBg: '$accentBlack',
controlPlayControlIcon: '$textOnAccent',
- controlProgressBarFill: foundations.colors.neutral50,
- controlProgressBarTrack: foundations.colors.neutral600,
+ controlProgressBarFill: '$accentNeutral',
+ controlProgressBarTrack: '$backgroundCoreSurfaceStrong',
controlRadiocheckBg: foundations.colors.baseTransparent0,
controlRadiocheckBgSelected: foundations.colors.baseWhite,
controlRadiocheckBorder: '$borderCoreDefault',
controlRadiocheckIconSelected: '$textOnDark',
- controlRemoveControlBg: '$accentBlack',
+ controlRemoveControlBg: '$backgroundCoreInverse',
controlRemoveControlBorder: '$borderCoreOnDark',
- controlRemoveControlIcon: '$textOnAccent',
+ controlRemoveControlIcon: '$textOnDark',
controlToggleSwitchBg: '$backgroundCoreSurfaceStrong',
controlToggleSwitchBgDisabled: '$backgroundCoreDisabled',
controlToggleSwitchBgSelected: '$accentPrimary',
@@ -570,17 +581,15 @@ export const semantics: IStreamTokens['semantics'] = {
reactionBorder: '$borderCoreDefault',
reactionEmoji: '$textPrimary',
reactionText: '$textPrimary',
- skeletonGradientAccentBase: '$brand150',
- skeletonGradientAccentHighlight: '$brand200',
- skeletonGradientDefaultBase: foundations.colors.neutral800,
- skeletonGradientDefaultHighlight: foundations.colors.neutral600,
+ skeletonLoadingBase: foundations.colors.baseTransparent0,
+ skeletonLoadingHighlight: foundations.colors.baseTransparentWhite20,
systemBgBlur: 'rgba(0, 0, 0, 0.01)',
systemCaret: foundations.colors.baseWhite,
systemScrollbar: 'rgba(255, 255, 255, 0.5)',
systemText: foundations.colors.baseWhite,
textDisabled: foundations.colors.neutral500,
textInverse: foundations.colors.baseBlack,
- textLink: foundations.colors.baseWhite,
+ textLink: '$accentPrimary',
textOnAccent: foundations.colors.baseWhite,
textOnDark: foundations.colors.neutral900,
textPrimary: foundations.colors.baseWhite,
diff --git a/package/src/theme/generated/high-contrast-light/StreamTokens.android.ts b/package/src/theme/generated/high-contrast-light/StreamTokens.android.ts
index 667cbacc9a..c687493303 100644
--- a/package/src/theme/generated/high-contrast-light/StreamTokens.android.ts
+++ b/package/src/theme/generated/high-contrast-light/StreamTokens.android.ts
@@ -193,24 +193,28 @@ export const foundations: IStreamTokens['foundations'] = {
fontWeightW500: '500',
fontWeightW600: '600',
fontWeightW700: '700',
+ fontSizeSize8: 8,
fontSizeSize10: 10,
+ fontSizeSize11: 11,
fontSizeSize12: 12,
+ fontSizeSize13: 13,
fontSizeSize14: 14,
fontSizeSize16: 16,
fontSizeSize15: 15,
fontSizeSize17: 17,
fontSizeSize18: 18,
fontSizeSize20: 20,
+ fontSizeSize22: 22,
fontSizeSize24: 24,
fontSizeSize28: 28,
fontSizeSize32: 32,
fontSizeSize40: 40,
fontSizeSize48: 48,
- fontSizeSize13: 13,
- fontSizeSize8: 8,
+ fontSizeSize64: 64,
lineHeightLineHeight8: 8,
lineHeightLineHeight10: 10,
lineHeightLineHeight12: 12,
+ lineHeightLineHeight13: 13,
lineHeightLineHeight14: 14,
lineHeightLineHeight15: 15,
lineHeightLineHeight16: 16,
@@ -394,6 +398,11 @@ export const components: IStreamTokens['components'] = {
deviceRadius: primitives.radius4xl,
deviceSafeAreaBottom: foundations.spacing.space40,
deviceSafeAreaTop: 52,
+ emoji2xl: foundations.typography.fontSizeSize64,
+ emojiLg: foundations.typography.fontSizeSize32,
+ emojiMd: foundations.typography.fontSizeSize24,
+ emojiSm: primitives.typographyFontSizeMd,
+ emojiXl: foundations.typography.fontSizeSize48,
iconSizeLg: foundations.layout.size32,
iconSizeMd: foundations.layout.size20,
iconSizeSm: foundations.layout.size16,
@@ -418,16 +427,16 @@ export const semantics: IStreamTokens['semantics'] = {
accentWarning: foundations.colors.baseBlack,
avatarBgDefault: '$avatarPaletteBg1',
avatarBgPlaceholder: '$accentBlack',
- avatarPaletteBg1: foundations.colors.blue900,
- avatarPaletteBg2: foundations.colors.cyan900,
- avatarPaletteBg3: foundations.colors.green900,
- avatarPaletteBg4: foundations.colors.purple900,
- avatarPaletteBg5: foundations.colors.yellow900,
- avatarPaletteText1: foundations.colors.blue100,
- avatarPaletteText2: foundations.colors.cyan100,
- avatarPaletteText3: foundations.colors.green100,
- avatarPaletteText4: foundations.colors.purple100,
- avatarPaletteText5: foundations.colors.yellow100,
+ avatarPaletteBg1: foundations.colors.blue150,
+ avatarPaletteBg2: foundations.colors.cyan150,
+ avatarPaletteBg3: foundations.colors.green150,
+ avatarPaletteBg4: foundations.colors.purple150,
+ avatarPaletteBg5: foundations.colors.yellow150,
+ avatarPaletteText1: foundations.colors.blue900,
+ avatarPaletteText2: foundations.colors.cyan900,
+ avatarPaletteText3: foundations.colors.green900,
+ avatarPaletteText4: foundations.colors.purple900,
+ avatarPaletteText5: foundations.colors.yellow900,
avatarTextDefault: '$avatarPaletteText1',
avatarTextPlaceholder: '$textOnDark',
backgroundCoreApp: '$backgroundElevationElevation0',
@@ -442,6 +451,7 @@ export const semantics: IStreamTokens['semantics'] = {
backgroundCoreScrim: '$backgroundCoreSurfaceStrong',
backgroundCoreSelected: 'rgba(0, 0, 0, 0.2)',
backgroundCoreSurface: foundations.colors.neutral150,
+ backgroundCoreSurfaceCard: foundations.colors.neutral100,
backgroundCoreSurfaceStrong: foundations.colors.neutral200,
backgroundCoreSurfaceSubtle: foundations.colors.neutral100,
backgroundElevationElevation0: foundations.colors.baseWhite,
@@ -525,6 +535,7 @@ export const semantics: IStreamTokens['semantics'] = {
chatTextMention: '$textLink',
chatTextOutgoing: '$brand900',
chatTextReaction: '$textSecondary',
+ chatTextRead: '$accentPrimary',
chatTextSystem: '$textSecondary',
chatTextTimestamp: '$textTertiary',
chatTextUsername: '$textSecondary',
@@ -539,13 +550,13 @@ export const semantics: IStreamTokens['semantics'] = {
controlPlaybackToggleText: '$textPrimary',
controlPlayControlBg: '$accentBlack',
controlPlayControlIcon: '$textOnAccent',
- controlProgressBarFill: '$accentBlack',
+ controlProgressBarFill: '$accentNeutral',
controlProgressBarTrack: '$backgroundCoreSurfaceStrong',
controlRadiocheckBg: foundations.colors.baseTransparent0,
controlRadiocheckBgSelected: '$accentPrimary',
controlRadiocheckBorder: '$borderCoreDefault',
controlRadiocheckIconSelected: '$textOnDark',
- controlRemoveControlBg: '$accentBlack',
+ controlRemoveControlBg: '$backgroundCoreInverse',
controlRemoveControlBorder: '$borderCoreOnDark',
controlRemoveControlIcon: '$textOnDark',
controlToggleSwitchBg: '$backgroundCoreSurfaceStrong',
@@ -570,17 +581,15 @@ export const semantics: IStreamTokens['semantics'] = {
reactionBorder: '$borderCoreDefault',
reactionEmoji: '$textPrimary',
reactionText: '$textPrimary',
- skeletonGradientAccentBase: '$brand200',
- skeletonGradientAccentHighlight: foundations.colors.baseWhite,
- skeletonGradientDefaultBase: foundations.colors.slate200,
- skeletonGradientDefaultHighlight: foundations.colors.baseWhite,
+ skeletonLoadingBase: foundations.colors.baseTransparent0,
+ skeletonLoadingHighlight: foundations.colors.baseWhite,
systemBgBlur: foundations.colors.baseWhite,
systemCaret: foundations.colors.baseBlack,
systemScrollbar: foundations.colors.baseBlack,
systemText: foundations.colors.baseBlack,
textDisabled: foundations.colors.neutral500,
textInverse: foundations.colors.baseWhite,
- textLink: foundations.colors.baseBlack,
+ textLink: '$accentPrimary',
textOnAccent: foundations.colors.baseWhite,
textOnDark: foundations.colors.baseWhite,
textPrimary: foundations.colors.baseBlack,
diff --git a/package/src/theme/generated/high-contrast-light/StreamTokens.ios.ts b/package/src/theme/generated/high-contrast-light/StreamTokens.ios.ts
index ab1b310708..70c26d120a 100644
--- a/package/src/theme/generated/high-contrast-light/StreamTokens.ios.ts
+++ b/package/src/theme/generated/high-contrast-light/StreamTokens.ios.ts
@@ -193,24 +193,28 @@ export const foundations: IStreamTokens['foundations'] = {
fontWeightW500: '500',
fontWeightW600: '600',
fontWeightW700: '700',
+ fontSizeSize8: 8,
fontSizeSize10: 10,
+ fontSizeSize11: 11,
fontSizeSize12: 12,
+ fontSizeSize13: 13,
fontSizeSize14: 14,
fontSizeSize16: 16,
fontSizeSize15: 15,
fontSizeSize17: 17,
fontSizeSize18: 18,
fontSizeSize20: 20,
+ fontSizeSize22: 22,
fontSizeSize24: 24,
fontSizeSize28: 28,
fontSizeSize32: 32,
fontSizeSize40: 40,
fontSizeSize48: 48,
- fontSizeSize13: 13,
- fontSizeSize8: 8,
+ fontSizeSize64: 64,
lineHeightLineHeight8: 8,
lineHeightLineHeight10: 10,
lineHeightLineHeight12: 12,
+ lineHeightLineHeight13: 13,
lineHeightLineHeight14: 14,
lineHeightLineHeight15: 15,
lineHeightLineHeight16: 16,
@@ -350,13 +354,13 @@ export const primitives: IStreamTokens['primitives'] = {
typographyFontFamilyMono: foundations.typography.fontFamilySfMono,
typographyFontFamilySans: foundations.typography.fontFamilySfPro,
typographyFontSize2xl: foundations.typography.fontSizeSize24,
- typographyFontSizeLg: foundations.typography.fontSizeSize17,
- typographyFontSizeMd: foundations.typography.fontSizeSize15,
+ typographyFontSizeLg: foundations.typography.fontSizeSize20,
+ typographyFontSizeMd: foundations.typography.fontSizeSize17,
typographyFontSizeMicro: foundations.typography.fontSizeSize8,
- typographyFontSizeSm: foundations.typography.fontSizeSize13,
- typographyFontSizeXl: foundations.typography.fontSizeSize20,
- typographyFontSizeXs: foundations.typography.fontSizeSize12,
- typographyFontSizeXxs: foundations.typography.fontSizeSize10,
+ typographyFontSizeSm: foundations.typography.fontSizeSize15,
+ typographyFontSizeXl: foundations.typography.fontSizeSize22,
+ typographyFontSizeXs: foundations.typography.fontSizeSize13,
+ typographyFontSizeXxs: foundations.typography.fontSizeSize12,
typographyFontWeightBold: 700,
typographyFontWeightMedium: 500,
typographyFontWeightRegular: 400,
@@ -393,7 +397,12 @@ export const components: IStreamTokens['components'] = {
composerRadiusFloating: primitives.radius3xl,
deviceRadius: 62,
deviceSafeAreaBottom: foundations.spacing.space32,
- deviceSafeAreaTop: 62,
+ deviceSafeAreaTop: 50,
+ emoji2xl: foundations.typography.fontSizeSize64,
+ emojiLg: foundations.typography.fontSizeSize32,
+ emojiMd: foundations.typography.fontSizeSize24,
+ emojiSm: primitives.typographyFontSizeMd,
+ emojiXl: foundations.typography.fontSizeSize48,
iconSizeLg: foundations.layout.size32,
iconSizeMd: foundations.layout.size20,
iconSizeSm: foundations.layout.size16,
@@ -418,16 +427,16 @@ export const semantics: IStreamTokens['semantics'] = {
accentWarning: foundations.colors.baseBlack,
avatarBgDefault: '$avatarPaletteBg1',
avatarBgPlaceholder: '$accentBlack',
- avatarPaletteBg1: foundations.colors.blue900,
- avatarPaletteBg2: foundations.colors.cyan900,
- avatarPaletteBg3: foundations.colors.green900,
- avatarPaletteBg4: foundations.colors.purple900,
- avatarPaletteBg5: foundations.colors.yellow900,
- avatarPaletteText1: foundations.colors.blue100,
- avatarPaletteText2: foundations.colors.cyan100,
- avatarPaletteText3: foundations.colors.green100,
- avatarPaletteText4: foundations.colors.purple100,
- avatarPaletteText5: foundations.colors.yellow100,
+ avatarPaletteBg1: foundations.colors.blue150,
+ avatarPaletteBg2: foundations.colors.cyan150,
+ avatarPaletteBg3: foundations.colors.green150,
+ avatarPaletteBg4: foundations.colors.purple150,
+ avatarPaletteBg5: foundations.colors.yellow150,
+ avatarPaletteText1: foundations.colors.blue900,
+ avatarPaletteText2: foundations.colors.cyan900,
+ avatarPaletteText3: foundations.colors.green900,
+ avatarPaletteText4: foundations.colors.purple900,
+ avatarPaletteText5: foundations.colors.yellow900,
avatarTextDefault: '$avatarPaletteText1',
avatarTextPlaceholder: '$textOnDark',
backgroundCoreApp: '$backgroundElevationElevation0',
@@ -442,6 +451,7 @@ export const semantics: IStreamTokens['semantics'] = {
backgroundCoreScrim: '$backgroundCoreSurfaceStrong',
backgroundCoreSelected: 'rgba(0, 0, 0, 0.2)',
backgroundCoreSurface: foundations.colors.neutral150,
+ backgroundCoreSurfaceCard: foundations.colors.neutral100,
backgroundCoreSurfaceStrong: foundations.colors.neutral200,
backgroundCoreSurfaceSubtle: foundations.colors.neutral100,
backgroundElevationElevation0: foundations.colors.baseWhite,
@@ -525,6 +535,7 @@ export const semantics: IStreamTokens['semantics'] = {
chatTextMention: '$textLink',
chatTextOutgoing: '$brand900',
chatTextReaction: '$textSecondary',
+ chatTextRead: '$accentPrimary',
chatTextSystem: '$textSecondary',
chatTextTimestamp: '$textTertiary',
chatTextUsername: '$textSecondary',
@@ -539,13 +550,13 @@ export const semantics: IStreamTokens['semantics'] = {
controlPlaybackToggleText: '$textPrimary',
controlPlayControlBg: '$accentBlack',
controlPlayControlIcon: '$textOnAccent',
- controlProgressBarFill: '$accentBlack',
+ controlProgressBarFill: '$accentNeutral',
controlProgressBarTrack: '$backgroundCoreSurfaceStrong',
controlRadiocheckBg: foundations.colors.baseTransparent0,
controlRadiocheckBgSelected: '$accentPrimary',
controlRadiocheckBorder: '$borderCoreDefault',
controlRadiocheckIconSelected: '$textOnDark',
- controlRemoveControlBg: '$accentBlack',
+ controlRemoveControlBg: '$backgroundCoreInverse',
controlRemoveControlBorder: '$borderCoreOnDark',
controlRemoveControlIcon: '$textOnDark',
controlToggleSwitchBg: '$backgroundCoreSurfaceStrong',
@@ -570,17 +581,15 @@ export const semantics: IStreamTokens['semantics'] = {
reactionBorder: '$borderCoreDefault',
reactionEmoji: '$textPrimary',
reactionText: '$textPrimary',
- skeletonGradientAccentBase: '$brand200',
- skeletonGradientAccentHighlight: foundations.colors.baseWhite,
- skeletonGradientDefaultBase: foundations.colors.slate200,
- skeletonGradientDefaultHighlight: foundations.colors.baseWhite,
+ skeletonLoadingBase: foundations.colors.baseTransparent0,
+ skeletonLoadingHighlight: foundations.colors.baseWhite,
systemBgBlur: foundations.colors.baseWhite,
systemCaret: foundations.colors.baseBlack,
systemScrollbar: foundations.colors.baseBlack,
systemText: foundations.colors.baseBlack,
textDisabled: foundations.colors.neutral500,
textInverse: foundations.colors.baseWhite,
- textLink: foundations.colors.baseBlack,
+ textLink: '$accentPrimary',
textOnAccent: foundations.colors.baseWhite,
textOnDark: foundations.colors.baseWhite,
textPrimary: foundations.colors.baseBlack,
diff --git a/package/src/theme/generated/high-contrast-light/StreamTokens.web.ts b/package/src/theme/generated/high-contrast-light/StreamTokens.web.ts
index f445fca0b4..ddcc2de26e 100644
--- a/package/src/theme/generated/high-contrast-light/StreamTokens.web.ts
+++ b/package/src/theme/generated/high-contrast-light/StreamTokens.web.ts
@@ -193,24 +193,28 @@ export const foundations: IStreamTokens['foundations'] = {
fontWeightW500: '500',
fontWeightW600: '600',
fontWeightW700: '700',
+ fontSizeSize8: 8,
fontSizeSize10: 10,
+ fontSizeSize11: 11,
fontSizeSize12: 12,
+ fontSizeSize13: 13,
fontSizeSize14: 14,
fontSizeSize16: 16,
fontSizeSize15: 15,
fontSizeSize17: 17,
fontSizeSize18: 18,
fontSizeSize20: 20,
+ fontSizeSize22: 22,
fontSizeSize24: 24,
fontSizeSize28: 28,
fontSizeSize32: 32,
fontSizeSize40: 40,
fontSizeSize48: 48,
- fontSizeSize13: 13,
- fontSizeSize8: 8,
+ fontSizeSize64: 64,
lineHeightLineHeight8: 8,
lineHeightLineHeight10: 10,
lineHeightLineHeight12: 12,
+ lineHeightLineHeight13: 13,
lineHeightLineHeight14: 14,
lineHeightLineHeight15: 15,
lineHeightLineHeight16: 16,
@@ -394,6 +398,11 @@ export const components: IStreamTokens['components'] = {
deviceRadius: primitives.radiusMd,
deviceSafeAreaBottom: foundations.spacing.space0,
deviceSafeAreaTop: foundations.spacing.space0,
+ emoji2xl: foundations.typography.fontSizeSize64,
+ emojiLg: foundations.typography.fontSizeSize32,
+ emojiMd: foundations.typography.fontSizeSize24,
+ emojiSm: primitives.typographyFontSizeMd,
+ emojiXl: foundations.typography.fontSizeSize48,
iconSizeLg: foundations.layout.size32,
iconSizeMd: foundations.layout.size20,
iconSizeSm: foundations.layout.size16,
@@ -418,16 +427,16 @@ export const semantics: IStreamTokens['semantics'] = {
accentWarning: foundations.colors.baseBlack,
avatarBgDefault: '$avatarPaletteBg1',
avatarBgPlaceholder: '$accentBlack',
- avatarPaletteBg1: foundations.colors.blue900,
- avatarPaletteBg2: foundations.colors.cyan900,
- avatarPaletteBg3: foundations.colors.green900,
- avatarPaletteBg4: foundations.colors.purple900,
- avatarPaletteBg5: foundations.colors.yellow900,
- avatarPaletteText1: foundations.colors.blue100,
- avatarPaletteText2: foundations.colors.cyan100,
- avatarPaletteText3: foundations.colors.green100,
- avatarPaletteText4: foundations.colors.purple100,
- avatarPaletteText5: foundations.colors.yellow100,
+ avatarPaletteBg1: foundations.colors.blue150,
+ avatarPaletteBg2: foundations.colors.cyan150,
+ avatarPaletteBg3: foundations.colors.green150,
+ avatarPaletteBg4: foundations.colors.purple150,
+ avatarPaletteBg5: foundations.colors.yellow150,
+ avatarPaletteText1: foundations.colors.blue900,
+ avatarPaletteText2: foundations.colors.cyan900,
+ avatarPaletteText3: foundations.colors.green900,
+ avatarPaletteText4: foundations.colors.purple900,
+ avatarPaletteText5: foundations.colors.yellow900,
avatarTextDefault: '$avatarPaletteText1',
avatarTextPlaceholder: '$textOnDark',
backgroundCoreApp: '$backgroundElevationElevation0',
@@ -442,6 +451,7 @@ export const semantics: IStreamTokens['semantics'] = {
backgroundCoreScrim: '$backgroundCoreSurfaceStrong',
backgroundCoreSelected: 'rgba(0, 0, 0, 0.2)',
backgroundCoreSurface: foundations.colors.neutral150,
+ backgroundCoreSurfaceCard: foundations.colors.neutral100,
backgroundCoreSurfaceStrong: foundations.colors.neutral200,
backgroundCoreSurfaceSubtle: foundations.colors.neutral100,
backgroundElevationElevation0: foundations.colors.baseWhite,
@@ -525,6 +535,7 @@ export const semantics: IStreamTokens['semantics'] = {
chatTextMention: '$textLink',
chatTextOutgoing: '$brand900',
chatTextReaction: '$textSecondary',
+ chatTextRead: '$accentPrimary',
chatTextSystem: '$textSecondary',
chatTextTimestamp: '$textTertiary',
chatTextUsername: '$textSecondary',
@@ -539,13 +550,13 @@ export const semantics: IStreamTokens['semantics'] = {
controlPlaybackToggleText: '$textPrimary',
controlPlayControlBg: '$accentBlack',
controlPlayControlIcon: '$textOnAccent',
- controlProgressBarFill: '$accentBlack',
+ controlProgressBarFill: '$accentNeutral',
controlProgressBarTrack: '$backgroundCoreSurfaceStrong',
controlRadiocheckBg: foundations.colors.baseTransparent0,
controlRadiocheckBgSelected: '$accentPrimary',
controlRadiocheckBorder: '$borderCoreDefault',
controlRadiocheckIconSelected: '$textOnDark',
- controlRemoveControlBg: '$accentBlack',
+ controlRemoveControlBg: '$backgroundCoreInverse',
controlRemoveControlBorder: '$borderCoreOnDark',
controlRemoveControlIcon: '$textOnDark',
controlToggleSwitchBg: '$backgroundCoreSurfaceStrong',
@@ -570,17 +581,15 @@ export const semantics: IStreamTokens['semantics'] = {
reactionBorder: '$borderCoreDefault',
reactionEmoji: '$textPrimary',
reactionText: '$textPrimary',
- skeletonGradientAccentBase: '$brand200',
- skeletonGradientAccentHighlight: foundations.colors.baseWhite,
- skeletonGradientDefaultBase: foundations.colors.slate200,
- skeletonGradientDefaultHighlight: foundations.colors.baseWhite,
+ skeletonLoadingBase: foundations.colors.baseTransparent0,
+ skeletonLoadingHighlight: foundations.colors.baseWhite,
systemBgBlur: foundations.colors.baseWhite,
systemCaret: foundations.colors.baseBlack,
systemScrollbar: foundations.colors.baseBlack,
systemText: foundations.colors.baseBlack,
textDisabled: foundations.colors.neutral500,
textInverse: foundations.colors.baseWhite,
- textLink: foundations.colors.baseBlack,
+ textLink: '$accentPrimary',
textOnAccent: foundations.colors.baseWhite,
textOnDark: foundations.colors.baseWhite,
textPrimary: foundations.colors.baseBlack,
diff --git a/package/src/theme/generated/light/StreamTokens.android.ts b/package/src/theme/generated/light/StreamTokens.android.ts
index 19a03439d8..7b0558b578 100644
--- a/package/src/theme/generated/light/StreamTokens.android.ts
+++ b/package/src/theme/generated/light/StreamTokens.android.ts
@@ -193,24 +193,28 @@ export const foundations: IStreamTokens['foundations'] = {
fontWeightW500: '500',
fontWeightW600: '600',
fontWeightW700: '700',
+ fontSizeSize8: 8,
fontSizeSize10: 10,
+ fontSizeSize11: 11,
fontSizeSize12: 12,
+ fontSizeSize13: 13,
fontSizeSize14: 14,
fontSizeSize16: 16,
fontSizeSize15: 15,
fontSizeSize17: 17,
fontSizeSize18: 18,
fontSizeSize20: 20,
+ fontSizeSize22: 22,
fontSizeSize24: 24,
fontSizeSize28: 28,
fontSizeSize32: 32,
fontSizeSize40: 40,
fontSizeSize48: 48,
- fontSizeSize13: 13,
- fontSizeSize8: 8,
+ fontSizeSize64: 64,
lineHeightLineHeight8: 8,
lineHeightLineHeight10: 10,
lineHeightLineHeight12: 12,
+ lineHeightLineHeight13: 13,
lineHeightLineHeight14: 14,
lineHeightLineHeight15: 15,
lineHeightLineHeight16: 16,
@@ -394,6 +398,11 @@ export const components: IStreamTokens['components'] = {
deviceRadius: primitives.radius4xl,
deviceSafeAreaBottom: foundations.spacing.space40,
deviceSafeAreaTop: 52,
+ emoji2xl: foundations.typography.fontSizeSize64,
+ emojiLg: foundations.typography.fontSizeSize32,
+ emojiMd: foundations.typography.fontSizeSize24,
+ emojiSm: primitives.typographyFontSizeMd,
+ emojiXl: foundations.typography.fontSizeSize48,
iconSizeLg: foundations.layout.size32,
iconSizeMd: foundations.layout.size20,
iconSizeSm: foundations.layout.size16,
@@ -418,16 +427,16 @@ export const semantics: IStreamTokens['semantics'] = {
accentWarning: foundations.colors.yellow400,
avatarBgDefault: '$avatarPaletteBg1',
avatarBgPlaceholder: foundations.colors.slate100,
- avatarPaletteBg1: foundations.colors.blue100,
- avatarPaletteBg2: foundations.colors.cyan100,
- avatarPaletteBg3: foundations.colors.green100,
- avatarPaletteBg4: foundations.colors.purple100,
- avatarPaletteBg5: foundations.colors.yellow100,
- avatarPaletteText1: foundations.colors.blue800,
- avatarPaletteText2: foundations.colors.cyan800,
- avatarPaletteText3: foundations.colors.green800,
- avatarPaletteText4: foundations.colors.purple800,
- avatarPaletteText5: foundations.colors.yellow800,
+ avatarPaletteBg1: foundations.colors.blue150,
+ avatarPaletteBg2: foundations.colors.cyan150,
+ avatarPaletteBg3: foundations.colors.green150,
+ avatarPaletteBg4: foundations.colors.purple150,
+ avatarPaletteBg5: foundations.colors.yellow150,
+ avatarPaletteText1: foundations.colors.blue900,
+ avatarPaletteText2: foundations.colors.cyan900,
+ avatarPaletteText3: foundations.colors.green900,
+ avatarPaletteText4: foundations.colors.purple900,
+ avatarPaletteText5: foundations.colors.yellow900,
avatarTextDefault: '$avatarPaletteText1',
avatarTextPlaceholder: foundations.colors.slate500,
backgroundCoreApp: '$backgroundElevationElevation0',
@@ -442,6 +451,7 @@ export const semantics: IStreamTokens['semantics'] = {
backgroundCoreScrim: 'rgba(0, 0, 0, 0.25)',
backgroundCoreSelected: 'rgba(30, 37, 43, 0.15)',
backgroundCoreSurface: foundations.colors.slate100,
+ backgroundCoreSurfaceCard: foundations.colors.slate50,
backgroundCoreSurfaceStrong: foundations.colors.slate150,
backgroundCoreSurfaceSubtle: foundations.colors.slate50,
backgroundElevationElevation0: foundations.colors.baseWhite,
@@ -525,6 +535,7 @@ export const semantics: IStreamTokens['semantics'] = {
chatTextMention: '$textLink',
chatTextOutgoing: '$brand900',
chatTextReaction: '$textSecondary',
+ chatTextRead: '$accentPrimary',
chatTextSystem: '$textSecondary',
chatTextTimestamp: '$textTertiary',
chatTextUsername: '$textSecondary',
@@ -539,15 +550,15 @@ export const semantics: IStreamTokens['semantics'] = {
controlPlaybackToggleText: '$textPrimary',
controlPlayControlBg: '$accentBlack',
controlPlayControlIcon: '$textOnAccent',
- controlProgressBarFill: foundations.colors.slate500,
- controlProgressBarTrack: foundations.colors.slate200,
+ controlProgressBarFill: '$accentNeutral',
+ controlProgressBarTrack: '$backgroundCoreSurfaceStrong',
controlRadiocheckBg: foundations.colors.baseTransparent0,
controlRadiocheckBgSelected: '$accentPrimary',
controlRadiocheckBorder: '$borderCoreDefault',
controlRadiocheckIconSelected: '$textOnDark',
- controlRemoveControlBg: '$accentBlack',
+ controlRemoveControlBg: '$backgroundCoreInverse',
controlRemoveControlBorder: '$borderCoreOnDark',
- controlRemoveControlIcon: '$textOnAccent',
+ controlRemoveControlIcon: '$textOnDark',
controlToggleSwitchBg: '$backgroundCoreSurfaceStrong',
controlToggleSwitchBgDisabled: '$backgroundCoreDisabled',
controlToggleSwitchBgSelected: '$accentPrimary',
@@ -570,10 +581,8 @@ export const semantics: IStreamTokens['semantics'] = {
reactionBorder: '$borderCoreDefault',
reactionEmoji: '$textPrimary',
reactionText: '$textPrimary',
- skeletonGradientAccentBase: '$brand50',
- skeletonGradientAccentHighlight: foundations.colors.baseWhite,
- skeletonGradientDefaultBase: foundations.colors.slate50,
- skeletonGradientDefaultHighlight: foundations.colors.baseWhite,
+ skeletonLoadingBase: foundations.colors.baseTransparent0,
+ skeletonLoadingHighlight: foundations.colors.baseWhite,
systemBgBlur: 'rgba(255, 255, 255, 0.01)',
systemCaret: '$accentPrimary',
systemScrollbar: 'rgba(0, 0, 0, 0.5)',
diff --git a/package/src/theme/generated/light/StreamTokens.ios.ts b/package/src/theme/generated/light/StreamTokens.ios.ts
index 97484fcb9c..e4873abe25 100644
--- a/package/src/theme/generated/light/StreamTokens.ios.ts
+++ b/package/src/theme/generated/light/StreamTokens.ios.ts
@@ -193,24 +193,28 @@ export const foundations: IStreamTokens['foundations'] = {
fontWeightW500: '500',
fontWeightW600: '600',
fontWeightW700: '700',
+ fontSizeSize8: 8,
fontSizeSize10: 10,
+ fontSizeSize11: 11,
fontSizeSize12: 12,
+ fontSizeSize13: 13,
fontSizeSize14: 14,
fontSizeSize16: 16,
fontSizeSize15: 15,
fontSizeSize17: 17,
fontSizeSize18: 18,
fontSizeSize20: 20,
+ fontSizeSize22: 22,
fontSizeSize24: 24,
fontSizeSize28: 28,
fontSizeSize32: 32,
fontSizeSize40: 40,
fontSizeSize48: 48,
- fontSizeSize13: 13,
- fontSizeSize8: 8,
+ fontSizeSize64: 64,
lineHeightLineHeight8: 8,
lineHeightLineHeight10: 10,
lineHeightLineHeight12: 12,
+ lineHeightLineHeight13: 13,
lineHeightLineHeight14: 14,
lineHeightLineHeight15: 15,
lineHeightLineHeight16: 16,
@@ -350,13 +354,13 @@ export const primitives: IStreamTokens['primitives'] = {
typographyFontFamilyMono: foundations.typography.fontFamilySfMono,
typographyFontFamilySans: foundations.typography.fontFamilySfPro,
typographyFontSize2xl: foundations.typography.fontSizeSize24,
- typographyFontSizeLg: foundations.typography.fontSizeSize17,
- typographyFontSizeMd: foundations.typography.fontSizeSize15,
+ typographyFontSizeLg: foundations.typography.fontSizeSize20,
+ typographyFontSizeMd: foundations.typography.fontSizeSize17,
typographyFontSizeMicro: foundations.typography.fontSizeSize8,
- typographyFontSizeSm: foundations.typography.fontSizeSize13,
- typographyFontSizeXl: foundations.typography.fontSizeSize20,
- typographyFontSizeXs: foundations.typography.fontSizeSize12,
- typographyFontSizeXxs: foundations.typography.fontSizeSize10,
+ typographyFontSizeSm: foundations.typography.fontSizeSize15,
+ typographyFontSizeXl: foundations.typography.fontSizeSize22,
+ typographyFontSizeXs: foundations.typography.fontSizeSize13,
+ typographyFontSizeXxs: foundations.typography.fontSizeSize12,
typographyFontWeightBold: 700,
typographyFontWeightMedium: 500,
typographyFontWeightRegular: 400,
@@ -393,7 +397,12 @@ export const components: IStreamTokens['components'] = {
composerRadiusFloating: primitives.radius3xl,
deviceRadius: 62,
deviceSafeAreaBottom: foundations.spacing.space32,
- deviceSafeAreaTop: 62,
+ deviceSafeAreaTop: 50,
+ emoji2xl: foundations.typography.fontSizeSize64,
+ emojiLg: foundations.typography.fontSizeSize32,
+ emojiMd: foundations.typography.fontSizeSize24,
+ emojiSm: primitives.typographyFontSizeMd,
+ emojiXl: foundations.typography.fontSizeSize48,
iconSizeLg: foundations.layout.size32,
iconSizeMd: foundations.layout.size20,
iconSizeSm: foundations.layout.size16,
@@ -418,16 +427,16 @@ export const semantics: IStreamTokens['semantics'] = {
accentWarning: foundations.colors.yellow400,
avatarBgDefault: '$avatarPaletteBg1',
avatarBgPlaceholder: foundations.colors.slate100,
- avatarPaletteBg1: foundations.colors.blue100,
- avatarPaletteBg2: foundations.colors.cyan100,
- avatarPaletteBg3: foundations.colors.green100,
- avatarPaletteBg4: foundations.colors.purple100,
- avatarPaletteBg5: foundations.colors.yellow100,
- avatarPaletteText1: foundations.colors.blue800,
- avatarPaletteText2: foundations.colors.cyan800,
- avatarPaletteText3: foundations.colors.green800,
- avatarPaletteText4: foundations.colors.purple800,
- avatarPaletteText5: foundations.colors.yellow800,
+ avatarPaletteBg1: foundations.colors.blue150,
+ avatarPaletteBg2: foundations.colors.cyan150,
+ avatarPaletteBg3: foundations.colors.green150,
+ avatarPaletteBg4: foundations.colors.purple150,
+ avatarPaletteBg5: foundations.colors.yellow150,
+ avatarPaletteText1: foundations.colors.blue900,
+ avatarPaletteText2: foundations.colors.cyan900,
+ avatarPaletteText3: foundations.colors.green900,
+ avatarPaletteText4: foundations.colors.purple900,
+ avatarPaletteText5: foundations.colors.yellow900,
avatarTextDefault: '$avatarPaletteText1',
avatarTextPlaceholder: foundations.colors.slate500,
backgroundCoreApp: '$backgroundElevationElevation0',
@@ -442,6 +451,7 @@ export const semantics: IStreamTokens['semantics'] = {
backgroundCoreScrim: 'rgba(0, 0, 0, 0.25)',
backgroundCoreSelected: 'rgba(30, 37, 43, 0.15)',
backgroundCoreSurface: foundations.colors.slate100,
+ backgroundCoreSurfaceCard: foundations.colors.slate50,
backgroundCoreSurfaceStrong: foundations.colors.slate150,
backgroundCoreSurfaceSubtle: foundations.colors.slate50,
backgroundElevationElevation0: foundations.colors.baseWhite,
@@ -525,6 +535,7 @@ export const semantics: IStreamTokens['semantics'] = {
chatTextMention: '$textLink',
chatTextOutgoing: '$brand900',
chatTextReaction: '$textSecondary',
+ chatTextRead: '$accentPrimary',
chatTextSystem: '$textSecondary',
chatTextTimestamp: '$textTertiary',
chatTextUsername: '$textSecondary',
@@ -539,15 +550,15 @@ export const semantics: IStreamTokens['semantics'] = {
controlPlaybackToggleText: '$textPrimary',
controlPlayControlBg: '$accentBlack',
controlPlayControlIcon: '$textOnAccent',
- controlProgressBarFill: foundations.colors.slate500,
- controlProgressBarTrack: foundations.colors.slate200,
+ controlProgressBarFill: '$accentNeutral',
+ controlProgressBarTrack: '$backgroundCoreSurfaceStrong',
controlRadiocheckBg: foundations.colors.baseTransparent0,
controlRadiocheckBgSelected: '$accentPrimary',
controlRadiocheckBorder: '$borderCoreDefault',
controlRadiocheckIconSelected: '$textOnDark',
- controlRemoveControlBg: '$accentBlack',
+ controlRemoveControlBg: '$backgroundCoreInverse',
controlRemoveControlBorder: '$borderCoreOnDark',
- controlRemoveControlIcon: '$textOnAccent',
+ controlRemoveControlIcon: '$textOnDark',
controlToggleSwitchBg: '$backgroundCoreSurfaceStrong',
controlToggleSwitchBgDisabled: '$backgroundCoreDisabled',
controlToggleSwitchBgSelected: '$accentPrimary',
@@ -570,10 +581,8 @@ export const semantics: IStreamTokens['semantics'] = {
reactionBorder: '$borderCoreDefault',
reactionEmoji: '$textPrimary',
reactionText: '$textPrimary',
- skeletonGradientAccentBase: '$brand50',
- skeletonGradientAccentHighlight: foundations.colors.baseWhite,
- skeletonGradientDefaultBase: foundations.colors.slate50,
- skeletonGradientDefaultHighlight: foundations.colors.baseWhite,
+ skeletonLoadingBase: foundations.colors.baseTransparent0,
+ skeletonLoadingHighlight: foundations.colors.baseWhite,
systemBgBlur: 'rgba(255, 255, 255, 0.01)',
systemCaret: '$accentPrimary',
systemScrollbar: 'rgba(0, 0, 0, 0.5)',
diff --git a/package/src/theme/generated/light/StreamTokens.web.ts b/package/src/theme/generated/light/StreamTokens.web.ts
index 950de67f7b..77bcdf92dd 100644
--- a/package/src/theme/generated/light/StreamTokens.web.ts
+++ b/package/src/theme/generated/light/StreamTokens.web.ts
@@ -193,24 +193,28 @@ export const foundations: IStreamTokens['foundations'] = {
fontWeightW500: '500',
fontWeightW600: '600',
fontWeightW700: '700',
+ fontSizeSize8: 8,
fontSizeSize10: 10,
+ fontSizeSize11: 11,
fontSizeSize12: 12,
+ fontSizeSize13: 13,
fontSizeSize14: 14,
fontSizeSize16: 16,
fontSizeSize15: 15,
fontSizeSize17: 17,
fontSizeSize18: 18,
fontSizeSize20: 20,
+ fontSizeSize22: 22,
fontSizeSize24: 24,
fontSizeSize28: 28,
fontSizeSize32: 32,
fontSizeSize40: 40,
fontSizeSize48: 48,
- fontSizeSize13: 13,
- fontSizeSize8: 8,
+ fontSizeSize64: 64,
lineHeightLineHeight8: 8,
lineHeightLineHeight10: 10,
lineHeightLineHeight12: 12,
+ lineHeightLineHeight13: 13,
lineHeightLineHeight14: 14,
lineHeightLineHeight15: 15,
lineHeightLineHeight16: 16,
@@ -394,6 +398,11 @@ export const components: IStreamTokens['components'] = {
deviceRadius: primitives.radiusMd,
deviceSafeAreaBottom: foundations.spacing.space0,
deviceSafeAreaTop: foundations.spacing.space0,
+ emoji2xl: foundations.typography.fontSizeSize64,
+ emojiLg: foundations.typography.fontSizeSize32,
+ emojiMd: foundations.typography.fontSizeSize24,
+ emojiSm: primitives.typographyFontSizeMd,
+ emojiXl: foundations.typography.fontSizeSize48,
iconSizeLg: foundations.layout.size32,
iconSizeMd: foundations.layout.size20,
iconSizeSm: foundations.layout.size16,
@@ -418,16 +427,16 @@ export const semantics: IStreamTokens['semantics'] = {
accentWarning: foundations.colors.yellow400,
avatarBgDefault: '$avatarPaletteBg1',
avatarBgPlaceholder: foundations.colors.slate100,
- avatarPaletteBg1: foundations.colors.blue100,
- avatarPaletteBg2: foundations.colors.cyan100,
- avatarPaletteBg3: foundations.colors.green100,
- avatarPaletteBg4: foundations.colors.purple100,
- avatarPaletteBg5: foundations.colors.yellow100,
- avatarPaletteText1: foundations.colors.blue800,
- avatarPaletteText2: foundations.colors.cyan800,
- avatarPaletteText3: foundations.colors.green800,
- avatarPaletteText4: foundations.colors.purple800,
- avatarPaletteText5: foundations.colors.yellow800,
+ avatarPaletteBg1: foundations.colors.blue150,
+ avatarPaletteBg2: foundations.colors.cyan150,
+ avatarPaletteBg3: foundations.colors.green150,
+ avatarPaletteBg4: foundations.colors.purple150,
+ avatarPaletteBg5: foundations.colors.yellow150,
+ avatarPaletteText1: foundations.colors.blue900,
+ avatarPaletteText2: foundations.colors.cyan900,
+ avatarPaletteText3: foundations.colors.green900,
+ avatarPaletteText4: foundations.colors.purple900,
+ avatarPaletteText5: foundations.colors.yellow900,
avatarTextDefault: '$avatarPaletteText1',
avatarTextPlaceholder: foundations.colors.slate500,
backgroundCoreApp: '$backgroundElevationElevation0',
@@ -442,6 +451,7 @@ export const semantics: IStreamTokens['semantics'] = {
backgroundCoreScrim: 'rgba(0, 0, 0, 0.25)',
backgroundCoreSelected: 'rgba(30, 37, 43, 0.15)',
backgroundCoreSurface: foundations.colors.slate100,
+ backgroundCoreSurfaceCard: foundations.colors.slate50,
backgroundCoreSurfaceStrong: foundations.colors.slate150,
backgroundCoreSurfaceSubtle: foundations.colors.slate50,
backgroundElevationElevation0: foundations.colors.baseWhite,
@@ -525,6 +535,7 @@ export const semantics: IStreamTokens['semantics'] = {
chatTextMention: '$textLink',
chatTextOutgoing: '$brand900',
chatTextReaction: '$textSecondary',
+ chatTextRead: '$accentPrimary',
chatTextSystem: '$textSecondary',
chatTextTimestamp: '$textTertiary',
chatTextUsername: '$textSecondary',
@@ -539,15 +550,15 @@ export const semantics: IStreamTokens['semantics'] = {
controlPlaybackToggleText: '$textPrimary',
controlPlayControlBg: '$accentBlack',
controlPlayControlIcon: '$textOnAccent',
- controlProgressBarFill: foundations.colors.slate500,
- controlProgressBarTrack: foundations.colors.slate200,
+ controlProgressBarFill: '$accentNeutral',
+ controlProgressBarTrack: '$backgroundCoreSurfaceStrong',
controlRadiocheckBg: foundations.colors.baseTransparent0,
controlRadiocheckBgSelected: '$accentPrimary',
controlRadiocheckBorder: '$borderCoreDefault',
controlRadiocheckIconSelected: '$textOnDark',
- controlRemoveControlBg: '$accentBlack',
+ controlRemoveControlBg: '$backgroundCoreInverse',
controlRemoveControlBorder: '$borderCoreOnDark',
- controlRemoveControlIcon: '$textOnAccent',
+ controlRemoveControlIcon: '$textOnDark',
controlToggleSwitchBg: '$backgroundCoreSurfaceStrong',
controlToggleSwitchBgDisabled: '$backgroundCoreDisabled',
controlToggleSwitchBgSelected: '$accentPrimary',
@@ -570,10 +581,8 @@ export const semantics: IStreamTokens['semantics'] = {
reactionBorder: '$borderCoreDefault',
reactionEmoji: '$textPrimary',
reactionText: '$textPrimary',
- skeletonGradientAccentBase: '$brand50',
- skeletonGradientAccentHighlight: foundations.colors.baseWhite,
- skeletonGradientDefaultBase: foundations.colors.slate50,
- skeletonGradientDefaultHighlight: foundations.colors.baseWhite,
+ skeletonLoadingBase: foundations.colors.baseTransparent0,
+ skeletonLoadingHighlight: foundations.colors.baseWhite,
systemBgBlur: 'rgba(255, 255, 255, 0.01)',
systemCaret: '$accentPrimary',
systemScrollbar: 'rgba(0, 0, 0, 0.5)',
diff --git a/package/src/utils/__tests__/Streami18n.test.js b/package/src/utils/__tests__/Streami18n.test.js
index 4ea41a955c..a3152bf09a 100644
--- a/package/src/utils/__tests__/Streami18n.test.js
+++ b/package/src/utils/__tests__/Streami18n.test.js
@@ -50,7 +50,11 @@ describe('Streami18n instance - with built-in language', () => {
it('should provide dutch translator', async () => {
const { t: _t } = await streami18n.getTranslators();
for (const key in nlTranslations) {
- if ((key.indexOf('{{') > -1 && key.indexOf('}}') > -1) || key.indexOf('duration/') > -1) {
+ const value = nlTranslations[key];
+ const hasTemplateInKey = key.indexOf('{{') > -1 && key.indexOf('}}') > -1;
+ const hasTemplateInValue =
+ typeof value === 'string' && value.indexOf('{{') > -1 && value.indexOf('}}') > -1;
+ if (hasTemplateInKey || hasTemplateInValue || key.indexOf('duration/') > -1) {
continue;
}
@@ -74,7 +78,11 @@ describe('Streami18n instance - with built-in language', () => {
it('should provide dutch translator', async () => {
const { t: _t } = await streami18n.getTranslators();
for (const key in nlTranslations) {
- if ((key.indexOf('{{') > -1 && key.indexOf('}}') > -1) || key.indexOf('duration/') > -1) {
+ const value = nlTranslations[key];
+ const hasTemplateInKey = key.indexOf('{{') > -1 && key.indexOf('}}') > -1;
+ const hasTemplateInValue =
+ typeof value === 'string' && value.indexOf('{{') > -1 && value.indexOf('}}') > -1;
+ if (hasTemplateInKey || hasTemplateInValue || key.indexOf('duration/') > -1) {
continue;
}
@@ -189,7 +197,11 @@ describe('setLanguage - switch to french', () => {
const { t: _t } = await streami18n.getTranslators();
for (const key in frTranslations) {
// Skip keys with template strings or duration keys
- if ((key.indexOf('{{') > -1 && key.indexOf('}}') > -1) || key.indexOf('duration/') > -1) {
+ const value = frTranslations[key];
+ const hasTemplateInKey = key.indexOf('{{') > -1 && key.indexOf('}}') > -1;
+ const hasTemplateInValue =
+ typeof value === 'string' && value.indexOf('{{') > -1 && value.indexOf('}}') > -1;
+ if (hasTemplateInKey || hasTemplateInValue || key.indexOf('duration/') > -1) {
continue;
}
diff --git a/package/src/utils/i18n/predefinedFormatters.ts b/package/src/utils/i18n/predefinedFormatters.ts
index 74da0b6dca..5883e55571 100644
--- a/package/src/utils/i18n/predefinedFormatters.ts
+++ b/package/src/utils/i18n/predefinedFormatters.ts
@@ -5,6 +5,8 @@ import type { Duration as DayjsDuration } from 'dayjs/plugin/duration';
import { getDateString } from './getDateString';
import { DurationFormatterOptions, PredefinedFormatters, TimestampFormatterOptions } from './types';
+import { isDayOrMoment } from '../../contexts/translationContext/isDayOrMoment';
+
export const predefinedFormatters: PredefinedFormatters = {
durationFormatter:
(streamI18n) =>
@@ -50,4 +52,37 @@ export const predefinedFormatters: PredefinedFormatters = {
}
return result;
},
+ relativeCompactDateFormatter: (streamI18n) => (value) => {
+ if (value === undefined || value === null) {
+ return JSON.stringify(value);
+ }
+ const parsedTime = streamI18n.tDateTimeParser(value);
+ const parsedNow = streamI18n.tDateTimeParser();
+
+ if (!isDayOrMoment(parsedTime) || !isDayOrMoment(parsedNow)) {
+ return JSON.stringify(value);
+ }
+
+ const oneDayInMs = 24 * 60 * 60 * 1000;
+ const startOfNowDayMs = parsedNow.startOf('day').valueOf();
+ const startOfTimeDayMs = parsedTime.startOf('day').valueOf();
+ const daysAgo = Math.floor((startOfNowDayMs - startOfTimeDayMs) / oneDayInMs);
+
+ if (daysAgo <= 0) {
+ return 'Today';
+ }
+ if (daysAgo === 1) {
+ return 'Yesterday';
+ }
+ if (daysAgo <= 6) {
+ return `${daysAgo}d ago`;
+ }
+
+ const weeksAgo = Math.floor(daysAgo / 7);
+ if (weeksAgo <= 3) {
+ return `${weeksAgo}w ago`;
+ }
+
+ return parsedTime.format('DD/MM/YY');
+ },
};
diff --git a/package/src/utils/i18n/types.ts b/package/src/utils/i18n/types.ts
index b5214c7a2e..eaa0a3b990 100644
--- a/package/src/utils/i18n/types.ts
+++ b/package/src/utils/i18n/types.ts
@@ -76,5 +76,6 @@ export type TimestampFormatterOptions = {
export type PredefinedFormatters = {
durationFormatter: FormatterFactory;
+ relativeCompactDateFormatter: FormatterFactory;
timestampFormatter: FormatterFactory;
};