@helpwave/hightide-native 0.0.7 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. package/README.md +4 -4
  2. package/package.json +8 -19
  3. package/src/components/card/Card.tsx +41 -0
  4. package/src/components/card/index.ts +1 -0
  5. package/src/components/chat/ChatAttachmentMessageBubble.tsx +246 -0
  6. package/src/components/chat/ChatConversationRow.tsx +21 -16
  7. package/src/components/chat/ChatDateDivider.tsx +2 -2
  8. package/src/components/chat/ChatMessageBubble.tsx +62 -52
  9. package/src/components/chat/ChatMessageComposer.tsx +16 -14
  10. package/src/components/chat/ChatQuickReplyChip.tsx +41 -43
  11. package/src/components/chat/ChatSystemLine.tsx +14 -7
  12. package/src/components/chat/ChatThreadHeader.tsx +60 -6
  13. package/src/components/chat/index.ts +1 -2
  14. package/src/components/index.ts +3 -1
  15. package/src/components/layout/Divider.tsx +60 -0
  16. package/src/components/layout/index.ts +1 -0
  17. package/src/components/list/ListActionItem.tsx +99 -0
  18. package/src/components/list/ListItem.tsx +96 -0
  19. package/src/components/list/ListNavigationItem.tsx +102 -0
  20. package/src/components/list/index.ts +3 -0
  21. package/src/components/user-interaction/Button.tsx +80 -31
  22. package/src/components/user-interaction/Checkbox.tsx +72 -32
  23. package/src/components/user-interaction/IconButton.tsx +68 -30
  24. package/src/components/user-interaction/Input.tsx +61 -14
  25. package/src/components/user-interaction/MultiSelect.tsx +142 -75
  26. package/src/components/user-interaction/SearchBar.tsx +222 -0
  27. package/src/components/user-interaction/Select.tsx +129 -58
  28. package/src/components/user-interaction/Switch.tsx +207 -0
  29. package/src/components/user-interaction/ThemedPressable.tsx +136 -0
  30. package/src/components/user-interaction/index.ts +3 -0
  31. package/src/components/visualization-and-display/Avatar.tsx +112 -93
  32. package/src/components/visualization-and-display/Chip.tsx +22 -22
  33. package/src/components/visualization-and-display/ThemedIcon.tsx +72 -0
  34. package/src/components/visualization-and-display/ThemedText.tsx +38 -0
  35. package/src/components/visualization-and-display/index.ts +2 -1
  36. package/src/global-contexts/HightideProvider.tsx +19 -10
  37. package/src/global-contexts/content-theme/ContentThemeContext.ts +22 -0
  38. package/src/global-contexts/content-theme/ContentThemeProvider.tsx +32 -0
  39. package/src/global-contexts/content-theme/index.ts +2 -0
  40. package/src/global-contexts/debug/forward-exports.ts +10 -0
  41. package/src/global-contexts/debug/index.ts +1 -0
  42. package/src/global-contexts/index.ts +2 -0
  43. package/src/global-contexts/theme/ThemeProvider.tsx +7 -1
  44. package/src/icons/HightideIconRegistry.ts +33 -0
  45. package/src/icons/index.ts +2 -0
  46. package/src/icons/types.ts +11 -0
  47. package/src/theme/adapters/container-adapter.ts +323 -0
  48. package/src/theme/adapters/defined.ts +11 -0
  49. package/src/theme/adapters/icon-style-adapter.ts +10 -0
  50. package/src/theme/adapters/index.ts +4 -0
  51. package/src/theme/adapters/text-style-adapter.ts +16 -0
  52. package/src/theme/index.ts +1 -0
  53. package/src/theme/resolvers/avatar.ts +385 -186
  54. package/src/theme/resolvers/button.ts +50 -82
  55. package/src/theme/resolvers/card.ts +27 -0
  56. package/src/theme/resolvers/chat/attachment-message-bubble.ts +163 -0
  57. package/src/theme/resolvers/chat/chat-theme.ts +69 -0
  58. package/src/theme/resolvers/chat/conversation-list.ts +35 -0
  59. package/src/theme/resolvers/chat/conversation-row.ts +64 -0
  60. package/src/theme/resolvers/chat/date-divider.ts +31 -0
  61. package/src/theme/resolvers/chat/index.ts +11 -0
  62. package/src/theme/resolvers/chat/message-bubble.ts +57 -0
  63. package/src/theme/resolvers/chat/message-composer.ts +38 -0
  64. package/src/theme/resolvers/chat/message-list.ts +27 -0
  65. package/src/theme/resolvers/chat/quick-reply-chip.ts +80 -0
  66. package/src/theme/resolvers/chat/system-line.ts +41 -0
  67. package/src/theme/resolvers/chat/thread-header.ts +85 -0
  68. package/src/theme/resolvers/checkbox.ts +87 -74
  69. package/src/theme/resolvers/chip.ts +30 -67
  70. package/src/theme/resolvers/colorScheme.ts +136 -0
  71. package/src/theme/resolvers/divider.ts +34 -0
  72. package/src/theme/resolvers/icon.ts +21 -0
  73. package/src/theme/resolvers/iconButton.ts +45 -61
  74. package/src/theme/resolvers/index.ts +8 -2
  75. package/src/theme/resolvers/input.ts +64 -42
  76. package/src/theme/resolvers/listItem.ts +115 -0
  77. package/src/theme/resolvers/multiSelect.ts +159 -84
  78. package/src/theme/resolvers/searchBar.ts +121 -0
  79. package/src/theme/resolvers/select.ts +141 -66
  80. package/src/theme/resolvers/switch.ts +71 -0
  81. package/src/theme/resolvers/themedPressable.ts +54 -0
  82. package/src/theme/themes/createHightideTheme.ts +214 -49
  83. package/src/theme/themes/hightideThemes.ts +10 -6
  84. package/src/theme/types/color.ts +2 -59
  85. package/src/theme/types/components/avatar.ts +37 -36
  86. package/src/theme/types/components/button.ts +13 -14
  87. package/src/theme/types/components/card.ts +9 -0
  88. package/src/theme/types/components/chat.ts +124 -103
  89. package/src/theme/types/components/checkbox.ts +11 -12
  90. package/src/theme/types/components/chip.ts +8 -14
  91. package/src/theme/types/components/divider.ts +18 -0
  92. package/src/theme/types/components/hightide.ts +41 -40
  93. package/src/theme/types/components/iconButton.ts +19 -14
  94. package/src/theme/types/components/index.ts +6 -1
  95. package/src/theme/types/components/input.ts +17 -8
  96. package/src/theme/types/components/listItem.ts +86 -0
  97. package/src/theme/types/components/multiSelect.ts +14 -12
  98. package/src/theme/types/components/searchBar.ts +28 -0
  99. package/src/theme/types/components/select.ts +21 -9
  100. package/src/theme/types/components/switch.ts +22 -0
  101. package/src/theme/types/components/themedPressable.ts +31 -0
  102. package/src/theme/types/decoration.ts +1 -11
  103. package/src/theme/types/icongraphy.ts +8 -0
  104. package/src/theme/types/index.ts +2 -0
  105. package/src/theme/types/layout.ts +25 -57
  106. package/src/theme/types/resolver.ts +54 -1
  107. package/src/theme/types/semantics.ts +72 -0
  108. package/src/theme/types/theme.ts +26 -13
  109. package/src/theme/types/typography.ts +16 -17
  110. package/src/utils/hitBoxOverlay.ts +44 -0
  111. package/src/utils/index.ts +2 -0
  112. package/src/utils/minimumTouchTargetHitSlop.ts +68 -0
  113. package/src/components/chat/ChatAttachmentCard.tsx +0 -110
  114. package/src/components/chat/ChatMessageCard.tsx +0 -118
  115. package/src/components/menu/Menu.tsx +0 -61
  116. package/src/components/menu/MenuActionItem.tsx +0 -90
  117. package/src/components/menu/MenuItem.tsx +0 -73
  118. package/src/components/menu/MenuNavigationItem.tsx +0 -90
  119. package/src/components/menu/index.ts +0 -4
  120. package/src/components/visualization-and-display/Icon.tsx +0 -27
  121. package/src/storybook/helper.tsx +0 -36
  122. package/src/theme/resolvers/chat.ts +0 -418
  123. package/src/theme/resolvers/coloring.ts +0 -94
  124. package/src/theme/resolvers/menu.ts +0 -120
  125. package/src/theme/types/components/menu.ts +0 -57
@@ -1,89 +1,57 @@
1
+ import { toContainerStyle } from '../adapters/container-adapter'
2
+ import { toIconStyle } from '../adapters/icon-style-adapter'
3
+ import { toTextStyle } from '../adapters/text-style-adapter'
1
4
  import type {
2
- TextStyle,
3
- ViewStyle
4
- } from 'react-native'
5
-
6
- import {
7
- componentLayouts,
8
- fontWeights
9
- } from '@helpwave/hightide-design/tokens'
10
- import type {
11
- HightideThemeTokens as DesignTokensTheme,
12
- ElementSize
13
- } from '@helpwave/hightide-design/types'
14
-
15
- import {
16
- isOutlineColoringStyle,
17
- resolveColoringStyles
18
- } from './coloring'
19
- import type { HightideSemanticColors } from '../types/color'
20
- import type {
5
+ ButtonIconStyle,
21
6
  ButtonState,
22
- ButtonTheme
7
+ ButtonStyle,
8
+ ButtonTextStyle,
9
+ ButtonThemeResolvers
23
10
  } from '../types/components/button'
24
- import type { HightideComponentThemes } from '../types/components/hightide'
25
- import { createStyleResolver } from '../types/resolver'
26
-
27
- const buttonFontSizes: Record<ElementSize, number> = {
28
- xs: 12,
29
- sm: 14,
30
- md: 14,
31
- lg: 18,
32
- }
33
-
34
- export type CreateButtonThemeOptions = {
35
- semantic: HightideSemanticColors,
36
- coloring: HightideComponentThemes['coloring'],
37
- }
38
-
39
- export const createButtonTheme = ({
40
- semantic,
41
- coloring,
42
- }: CreateButtonThemeOptions): ButtonTheme => {
43
- const resolveState = (state: ButtonState) => {
44
- const size = state.size ?? 'md'
45
- const color = state.color ?? 'primary'
46
- const coloringStyle = state.coloringStyle ?? 'solid'
47
- const tokens = coloring[color]
48
- const resolved = resolveColoringStyles(tokens, coloringStyle, semantic, state)
49
- const padding = componentLayouts.button[size]
50
- const sizing = componentLayouts.element[size]
51
- const outlinePadding = isOutlineColoringStyle(coloringStyle)
52
-
53
- const button: ViewStyle = {
54
- flexDirection: 'row',
55
- alignItems: 'center',
56
- justifyContent: 'center',
57
- backgroundColor: resolved.backgroundColor,
58
- borderColor: resolved.borderColor,
59
- borderWidth: resolved.borderWidth,
60
- paddingVertical: outlinePadding ? padding.paddingYOutline : padding.paddingY,
61
- paddingHorizontal: outlinePadding ? padding.paddingXOutline : padding.paddingX,
62
- gap: padding.gap,
63
- minWidth: padding.minWidth,
64
- minHeight: sizing.height,
65
- borderRadius: padding.borderRadius,
66
- opacity: state.isDisabled ? 0.6 : 1,
67
- }
68
-
69
- const text: TextStyle = {
70
- color: resolved.color,
71
- fontSize: buttonFontSizes[size],
72
- fontWeight: fontWeights.semibold,
73
- }
74
-
75
- return { button, text }
76
- }
11
+ import {
12
+ createStyleResolver,
13
+ createValueResolver,
14
+ toPressableInteractionState,
15
+ type ComponentThemeResolver
16
+ } from '../types/resolver'
17
+
18
+ export const toButtonThemeResolvers: ComponentThemeResolver<ButtonThemeResolvers> = ({
19
+ themeTokens,
20
+ semanticTokens,
21
+ componentTokens,
22
+ }) => {
23
+ const resolve = (state: ButtonState) => componentTokens.button({
24
+ themeTokens,
25
+ semanticResolvers: semanticTokens,
26
+ overrides: {
27
+ size: state.size,
28
+ color: state.color,
29
+ variant: state.variant,
30
+ },
31
+ state: toPressableInteractionState(state),
32
+ })
77
33
 
78
34
  return {
79
- button: createStyleResolver((state) => resolveState(state).button),
80
- text: createStyleResolver((state) => resolveState(state).text),
35
+ container: createStyleResolver((state: ButtonState): ButtonStyle => ({
36
+ ...toContainerStyle(resolve(state).container),
37
+ alignSelf: 'flex-start',
38
+ })),
39
+ stateLayer: createStyleResolver((state: ButtonState): ButtonStyle => {
40
+ const tokens = resolve(state)
41
+ return {
42
+ ...toContainerStyle(tokens.stateLayer),
43
+ position: 'absolute',
44
+ top: 0,
45
+ right: 0,
46
+ bottom: 0,
47
+ left: 0,
48
+ }
49
+ }),
50
+ icon: createValueResolver((state: ButtonState): ButtonIconStyle => (
51
+ toIconStyle(resolve(state).icon)
52
+ )),
53
+ text: createStyleResolver((state: ButtonState): ButtonTextStyle => (
54
+ toTextStyle(resolve(state).text)
55
+ )),
81
56
  }
82
57
  }
83
-
84
- export const createButtonThemeFromDesign = (theme: DesignTokensTheme): ButtonTheme => {
85
- return createButtonTheme({
86
- semantic: theme.semanticColors,
87
- coloring: theme.coloring as HightideComponentThemes['coloring'],
88
- })
89
- }
@@ -0,0 +1,27 @@
1
+ import { toContainerStyle } from '../adapters/container-adapter'
2
+ import type {
3
+ CardStyle,
4
+ CardThemeResolvers
5
+ } from '../types/components/card'
6
+ import {
7
+ createSimpleStyleResolver,
8
+ type ComponentThemeResolver
9
+ } from '../types/resolver'
10
+
11
+ export const toCardThemeResolvers: ComponentThemeResolver<CardThemeResolvers> = ({
12
+ themeTokens,
13
+ semanticTokens,
14
+ componentTokens,
15
+ }) => {
16
+ const resolveCard = () => componentTokens.card({
17
+ themeTokens,
18
+ semanticResolvers: semanticTokens,
19
+ })
20
+
21
+ return {
22
+ container: createSimpleStyleResolver((): CardStyle => ({
23
+ ...toContainerStyle(resolveCard()),
24
+ overflow: 'hidden',
25
+ })),
26
+ }
27
+ }
@@ -0,0 +1,163 @@
1
+ import type {
2
+ ChatMessageDirection,
3
+ ContainerTokens,
4
+ IconTokens,
5
+ TextStyleTokens
6
+ } from '@helpwave/hightide-design/component-token-resolvers'
7
+
8
+ import { toContainerStyle } from '../../adapters/container-adapter'
9
+ import { toIconStyle } from '../../adapters/icon-style-adapter'
10
+ import { toTextStyle } from '../../adapters/text-style-adapter'
11
+ import type {
12
+ ChatAttachmentMessageBubbleDownloadIconContainerStyle,
13
+ ChatAttachmentMessageBubbleDownloadIconStyle,
14
+ ChatAttachmentMessageBubbleFileIconContainerStyle,
15
+ ChatAttachmentMessageBubbleFileIconStyle,
16
+ ChatAttachmentMessageBubbleFileMetadataTextStyle,
17
+ ChatAttachmentMessageBubbleFileNameTextStyle,
18
+ ChatAttachmentMessageBubbleState,
19
+ ChatAttachmentMessageBubbleThemeResolvers,
20
+ ChatMessageBubbleBodyStyle,
21
+ ChatMessageBubbleBodyTextStyle,
22
+ ChatMessageBubbleContainerStyle,
23
+ ChatMessageBubbleMetaDataContainerStyle,
24
+ ChatMessageBubbleMetaDataIconStyle,
25
+ ChatMessageBubbleMetaDataStatusContainerStyle,
26
+ ChatMessageBubbleMetaDataTextStyle,
27
+ PressableContainerStyle,
28
+ PressableState,
29
+ PressableStateLayerStyle,
30
+ PressableTextStyle
31
+ } from '../../types/components/chat'
32
+ import {
33
+ createStyleResolver,
34
+ createValueResolver,
35
+ toPressableInteractionState,
36
+ type ComponentThemeResolver
37
+ } from '../../types/resolver'
38
+
39
+ const toOptionalContainerStyle = (tokens?: ContainerTokens): ChatMessageBubbleContainerStyle => (
40
+ tokens === undefined ? {} : toContainerStyle(tokens)
41
+ )
42
+
43
+ const toOptionalTextStyle = (tokens?: TextStyleTokens): ChatMessageBubbleBodyTextStyle => (
44
+ tokens === undefined ? {} : toTextStyle(tokens)
45
+ )
46
+
47
+ const toOptionalIconStyle = (tokens?: IconTokens): ChatMessageBubbleMetaDataIconStyle => (
48
+ tokens === undefined ? {} : toIconStyle(tokens)
49
+ )
50
+
51
+ export const toChatAttachmentMessageBubbleThemeResolvers: ComponentThemeResolver<
52
+ ChatAttachmentMessageBubbleThemeResolvers
53
+ > = ({
54
+ themeTokens,
55
+ semanticTokens,
56
+ componentTokens,
57
+ }) => {
58
+ const resolve = (direction?: ChatMessageDirection) => componentTokens.chat.attachmentMessageBubble({
59
+ themeTokens,
60
+ semanticResolvers: semanticTokens,
61
+ config: { direction },
62
+ })
63
+
64
+ return {
65
+ chatMessageBubbleOverrides: {
66
+ container: createStyleResolver((state: ChatAttachmentMessageBubbleState): ChatMessageBubbleContainerStyle => (
67
+ toOptionalContainerStyle(resolve(state.direction).chatMessageBubbleOverrides.container)
68
+ )),
69
+ body: createStyleResolver((state: ChatAttachmentMessageBubbleState): ChatMessageBubbleBodyStyle => (
70
+ toOptionalContainerStyle(resolve(state.direction).chatMessageBubbleOverrides.body)
71
+ )),
72
+ bodyText: createStyleResolver((state: ChatAttachmentMessageBubbleState): ChatMessageBubbleBodyTextStyle => (
73
+ toOptionalTextStyle(resolve(state.direction).chatMessageBubbleOverrides.bodyText)
74
+ )),
75
+ metaDataContainer: createStyleResolver((
76
+ state: ChatAttachmentMessageBubbleState
77
+ ): ChatMessageBubbleMetaDataContainerStyle => (
78
+ toOptionalContainerStyle(resolve(state.direction).chatMessageBubbleOverrides.metaDataContainer)
79
+ )),
80
+ metaDataStatusContainer: createStyleResolver((
81
+ state: ChatAttachmentMessageBubbleState
82
+ ): ChatMessageBubbleMetaDataStatusContainerStyle => (
83
+ toOptionalContainerStyle(resolve(state.direction).chatMessageBubbleOverrides.metaDataStatusContainer)
84
+ )),
85
+ metaDataText: createStyleResolver((
86
+ state: ChatAttachmentMessageBubbleState
87
+ ): ChatMessageBubbleMetaDataTextStyle => (
88
+ toOptionalTextStyle(resolve(state.direction).chatMessageBubbleOverrides.metaDataText)
89
+ )),
90
+ metaDataIcon: createValueResolver((
91
+ state: ChatAttachmentMessageBubbleState
92
+ ): ChatMessageBubbleMetaDataIconStyle => (
93
+ toOptionalIconStyle(resolve(state.direction).chatMessageBubbleOverrides.metaDataIcon)
94
+ )),
95
+ },
96
+ contentContainer: createValueResolver((state: ChatAttachmentMessageBubbleState) => {
97
+ const contentContainer = resolve(state.direction).contentContainer
98
+
99
+ const resolvePressable = (pressableState: PressableState) => componentTokens.pressable({
100
+ themeTokens,
101
+ semanticResolvers: semanticTokens,
102
+ overrides: {
103
+ size: contentContainer.config.size,
104
+ color: contentContainer.config.color,
105
+ coloringStyle: contentContainer.config.coloringStyle,
106
+ coloringColorVariant: contentContainer.config.coloringColorVariant,
107
+ hasAdditionalHorizontalPadding: contentContainer.config.hasAdditionalHorizontalPadding,
108
+ },
109
+ state: toPressableInteractionState(pressableState),
110
+ })
111
+
112
+ return {
113
+ container: createStyleResolver((pressableState: PressableState): PressableContainerStyle => ({
114
+ ...toContainerStyle(resolvePressable(pressableState).container),
115
+ ...toOptionalContainerStyle(contentContainer.container),
116
+ })),
117
+ stateLayer: createStyleResolver((pressableState: PressableState): PressableStateLayerStyle => ({
118
+ ...toContainerStyle(resolvePressable(pressableState).stateLayer),
119
+ position: 'absolute',
120
+ top: 0,
121
+ right: 0,
122
+ bottom: 0,
123
+ left: 0,
124
+ ...toOptionalContainerStyle(contentContainer.stateLayer),
125
+ })),
126
+ text: createStyleResolver((pressableState: PressableState): PressableTextStyle => ({
127
+ ...toTextStyle(resolvePressable(pressableState).text),
128
+ ...toOptionalTextStyle(contentContainer.text),
129
+ })),
130
+ }
131
+ }),
132
+ fileIconContainer: createStyleResolver((
133
+ state: ChatAttachmentMessageBubbleState
134
+ ): ChatAttachmentMessageBubbleFileIconContainerStyle => (
135
+ toContainerStyle(resolve(state.direction).fileIconContainer)
136
+ )),
137
+ fileIcon: createValueResolver((
138
+ state: ChatAttachmentMessageBubbleState
139
+ ): ChatAttachmentMessageBubbleFileIconStyle => (
140
+ toIconStyle(resolve(state.direction).fileIcon)
141
+ )),
142
+ downloadIconContainer: createStyleResolver((
143
+ state: ChatAttachmentMessageBubbleState
144
+ ): ChatAttachmentMessageBubbleDownloadIconContainerStyle => (
145
+ toContainerStyle(resolve(state.direction).downloadIconContainer)
146
+ )),
147
+ downloadIcon: createValueResolver((
148
+ state: ChatAttachmentMessageBubbleState
149
+ ): ChatAttachmentMessageBubbleDownloadIconStyle => (
150
+ toIconStyle(resolve(state.direction).downloadIcon)
151
+ )),
152
+ fileNameText: createStyleResolver((
153
+ state: ChatAttachmentMessageBubbleState
154
+ ): ChatAttachmentMessageBubbleFileNameTextStyle => (
155
+ toTextStyle(resolve(state.direction).fileNameText)
156
+ )),
157
+ fileMetadataText: createStyleResolver((
158
+ state: ChatAttachmentMessageBubbleState
159
+ ): ChatAttachmentMessageBubbleFileMetadataTextStyle => (
160
+ toTextStyle(resolve(state.direction).fileMetadataText)
161
+ )),
162
+ }
163
+ }
@@ -0,0 +1,69 @@
1
+ import type { ChatThemeResolvers } from '../../types/components/chat'
2
+ import type { ComponentThemeResolver } from '../../types/resolver'
3
+ import { toChatAttachmentMessageBubbleThemeResolvers } from './attachment-message-bubble'
4
+ import { toChatConversationListThemeResolvers } from './conversation-list'
5
+ import { toChatConversationRowThemeResolvers } from './conversation-row'
6
+ import { toChatDateDividerThemeResolvers } from './date-divider'
7
+ import { toChatMessageBubbleThemeResolvers } from './message-bubble'
8
+ import { toChatMessageComposerThemeResolvers } from './message-composer'
9
+ import { toChatMessageListThemeResolvers } from './message-list'
10
+ import { toChatQuickReplyChipThemeResolvers } from './quick-reply-chip'
11
+ import { toChatSystemLineThemeResolvers } from './system-line'
12
+ import { toChatThreadHeaderThemeResolvers } from './thread-header'
13
+
14
+ export const toChatThemeResolvers: ComponentThemeResolver<ChatThemeResolvers> = ({
15
+ themeTokens,
16
+ semanticTokens,
17
+ componentTokens,
18
+ }) => ({
19
+ conversationRow: toChatConversationRowThemeResolvers({
20
+ themeTokens,
21
+ semanticTokens,
22
+ componentTokens,
23
+ }),
24
+ conversationList: toChatConversationListThemeResolvers({
25
+ themeTokens,
26
+ semanticTokens,
27
+ componentTokens,
28
+ }),
29
+ threadHeader: toChatThreadHeaderThemeResolvers({
30
+ themeTokens,
31
+ semanticTokens,
32
+ componentTokens,
33
+ }),
34
+ messageList: toChatMessageListThemeResolvers({
35
+ themeTokens,
36
+ semanticTokens,
37
+ componentTokens,
38
+ }),
39
+ messageBubble: toChatMessageBubbleThemeResolvers({
40
+ themeTokens,
41
+ semanticTokens,
42
+ componentTokens,
43
+ }),
44
+ attachmentMessageBubble: toChatAttachmentMessageBubbleThemeResolvers({
45
+ themeTokens,
46
+ semanticTokens,
47
+ componentTokens,
48
+ }),
49
+ systemLine: toChatSystemLineThemeResolvers({
50
+ themeTokens,
51
+ semanticTokens,
52
+ componentTokens,
53
+ }),
54
+ dateDivider: toChatDateDividerThemeResolvers({
55
+ themeTokens,
56
+ semanticTokens,
57
+ componentTokens,
58
+ }),
59
+ quickReplyChip: toChatQuickReplyChipThemeResolvers({
60
+ themeTokens,
61
+ semanticTokens,
62
+ componentTokens,
63
+ }),
64
+ messageComposer: toChatMessageComposerThemeResolvers({
65
+ themeTokens,
66
+ semanticTokens,
67
+ componentTokens,
68
+ }),
69
+ })
@@ -0,0 +1,35 @@
1
+ import { toContainerStyle } from '../../adapters/container-adapter'
2
+ import type {
3
+ ChatConversationListFooterStyle,
4
+ ChatConversationListHeaderStyle,
5
+ ChatConversationListStyle,
6
+ ChatConversationListThemeResolvers
7
+ } from '../../types/components/chat'
8
+ import {
9
+ createSimpleStyleResolver,
10
+ type ComponentThemeResolver
11
+ } from '../../types/resolver'
12
+
13
+ export const toChatConversationListThemeResolvers: ComponentThemeResolver<ChatConversationListThemeResolvers> = ({
14
+ themeTokens,
15
+ semanticTokens,
16
+ componentTokens,
17
+ }) => {
18
+ const resolve = () => componentTokens.chat.conversationList({
19
+ themeTokens,
20
+ semanticResolvers: semanticTokens
21
+ })
22
+
23
+ return {
24
+ container: createSimpleStyleResolver((): ChatConversationListStyle => ({
25
+ ...toContainerStyle(resolve().container),
26
+ flex: 1,
27
+ })),
28
+ header: createSimpleStyleResolver((): ChatConversationListHeaderStyle => (
29
+ toContainerStyle(resolve().header)
30
+ )),
31
+ footer: createSimpleStyleResolver((): ChatConversationListFooterStyle => (
32
+ toContainerStyle(resolve().footer)
33
+ )),
34
+ }
35
+ }
@@ -0,0 +1,64 @@
1
+ import { toContainerStyle } from '../../adapters/container-adapter'
2
+ import { toIconStyle } from '../../adapters/icon-style-adapter'
3
+ import { toTextStyle } from '../../adapters/text-style-adapter'
4
+ import type {
5
+ ChatConversationRowPreviewStyle,
6
+ ChatConversationRowState,
7
+ ChatConversationRowStyle,
8
+ ChatConversationRowThemeResolvers,
9
+ ChatConversationRowTimestampStyle,
10
+ ChatConversationRowTitleStyle,
11
+ ChatConversationRowUnreadBadgeStyle,
12
+ ChatConversationRowUnreadBadgeTextStyle,
13
+ ChatMessageBubbleMetaDataIconStyle
14
+ } from '../../types/components/chat'
15
+ import {
16
+ createSimpleStyleResolver,
17
+ createSimpleValueResolver,
18
+ createStyleResolver,
19
+ type ComponentThemeResolver
20
+ } from '../../types/resolver'
21
+
22
+ export const toChatConversationRowThemeResolvers: ComponentThemeResolver<ChatConversationRowThemeResolvers> = ({
23
+ themeTokens,
24
+ semanticTokens,
25
+ componentTokens,
26
+ }) => {
27
+ const resolve = (state: ChatConversationRowState = {}) => componentTokens.chat.conversationRow({
28
+ themeTokens,
29
+ semanticResolvers: semanticTokens,
30
+ state: {
31
+ isPressed: state.isPressed,
32
+ isHovered: state.isHovered,
33
+ isFocused: state.isFocused,
34
+ isFocusVisible: state.isFocusVisible,
35
+ isDisabled: state.isDisabled,
36
+ isUnread: state.isUnread,
37
+ isSelected: state.isSelected,
38
+ },
39
+ })
40
+
41
+ return {
42
+ container: createStyleResolver((state: ChatConversationRowState): ChatConversationRowStyle => (
43
+ toContainerStyle(resolve(state).container)
44
+ )),
45
+ title: createStyleResolver((state: ChatConversationRowState): ChatConversationRowTitleStyle => (
46
+ toTextStyle(resolve(state).title)
47
+ )),
48
+ timestamp: createStyleResolver((state: ChatConversationRowState): ChatConversationRowTimestampStyle => (
49
+ toTextStyle(resolve(state).timestamp)
50
+ )),
51
+ preview: createStyleResolver((state: ChatConversationRowState): ChatConversationRowPreviewStyle => (
52
+ toTextStyle(resolve(state).preview)
53
+ )),
54
+ unreadBadge: createSimpleStyleResolver((): ChatConversationRowUnreadBadgeStyle => (
55
+ toContainerStyle(resolve().unreadBadge)
56
+ )),
57
+ unreadBadgeText: createSimpleStyleResolver((): ChatConversationRowUnreadBadgeTextStyle => (
58
+ toTextStyle(resolve().unreadBadgeText)
59
+ )),
60
+ sentIndicator: createSimpleValueResolver((): ChatMessageBubbleMetaDataIconStyle => (
61
+ toIconStyle(resolve().sentIndicator)
62
+ )),
63
+ }
64
+ }
@@ -0,0 +1,31 @@
1
+ import { toContainerStyle } from '../../adapters/container-adapter'
2
+ import { toTextStyle } from '../../adapters/text-style-adapter'
3
+ import type {
4
+ ChatDateDividerStyle,
5
+ ChatDateDividerTextStyle,
6
+ ChatDateDividerThemeResolvers
7
+ } from '../../types/components/chat'
8
+ import {
9
+ createSimpleStyleResolver,
10
+ type ComponentThemeResolver
11
+ } from '../../types/resolver'
12
+
13
+ export const toChatDateDividerThemeResolvers: ComponentThemeResolver<ChatDateDividerThemeResolvers> = ({
14
+ themeTokens,
15
+ semanticTokens,
16
+ componentTokens,
17
+ }) => {
18
+ const resolve = () => componentTokens.chat.dateDivider({
19
+ themeTokens,
20
+ semanticResolvers: semanticTokens,
21
+ })
22
+
23
+ return {
24
+ container: createSimpleStyleResolver((): ChatDateDividerStyle => (
25
+ toContainerStyle(resolve().container)
26
+ )),
27
+ text: createSimpleStyleResolver((): ChatDateDividerTextStyle => (
28
+ toTextStyle(resolve().text)
29
+ )),
30
+ }
31
+ }
@@ -0,0 +1,11 @@
1
+ export * from './attachment-message-bubble'
2
+ export * from './chat-theme'
3
+ export * from './conversation-list'
4
+ export * from './conversation-row'
5
+ export * from './date-divider'
6
+ export * from './message-bubble'
7
+ export * from './message-composer'
8
+ export * from './message-list'
9
+ export * from './quick-reply-chip'
10
+ export * from './system-line'
11
+ export * from './thread-header'
@@ -0,0 +1,57 @@
1
+ import type { ChatMessageDirection } from '@helpwave/hightide-design/component-token-resolvers'
2
+
3
+ import { toContainerStyle } from '../../adapters/container-adapter'
4
+ import { toIconStyle } from '../../adapters/icon-style-adapter'
5
+ import { toTextStyle } from '../../adapters/text-style-adapter'
6
+ import type {
7
+ ChatMessageBubbleBodyStyle,
8
+ ChatMessageBubbleBodyTextStyle,
9
+ ChatMessageBubbleContainerStyle,
10
+ ChatMessageBubbleMetaDataContainerStyle,
11
+ ChatMessageBubbleMetaDataIconStyle,
12
+ ChatMessageBubbleMetaDataStatusContainerStyle,
13
+ ChatMessageBubbleMetaDataTextStyle,
14
+ ChatMessageBubbleState,
15
+ ChatMessageBubbleThemeResolvers
16
+ } from '../../types/components/chat'
17
+ import {
18
+ createStyleResolver,
19
+ createValueResolver,
20
+ type ComponentThemeResolver
21
+ } from '../../types/resolver'
22
+
23
+ export const toChatMessageBubbleThemeResolvers: ComponentThemeResolver<ChatMessageBubbleThemeResolvers> = ({
24
+ themeTokens,
25
+ semanticTokens,
26
+ componentTokens,
27
+ }) => {
28
+ const resolve = (direction?: ChatMessageDirection) => componentTokens.chat.messageBubble({
29
+ themeTokens,
30
+ semanticResolvers: semanticTokens,
31
+ config: { direction },
32
+ })
33
+
34
+ return {
35
+ container: createStyleResolver((state: ChatMessageBubbleState): ChatMessageBubbleContainerStyle => (
36
+ toContainerStyle(resolve(state.direction).container)
37
+ )),
38
+ body: createStyleResolver((state: ChatMessageBubbleState): ChatMessageBubbleBodyStyle => (
39
+ toContainerStyle(resolve(state.direction).body)
40
+ )),
41
+ bodyText: createStyleResolver((state: ChatMessageBubbleState): ChatMessageBubbleBodyTextStyle => (
42
+ toTextStyle(resolve(state.direction).bodyText)
43
+ )),
44
+ metaDataContainer: createStyleResolver((state: ChatMessageBubbleState): ChatMessageBubbleMetaDataContainerStyle => (
45
+ toContainerStyle(resolve(state.direction).metaDataContainer)
46
+ )),
47
+ metaDataStatusContainer: createStyleResolver((state: ChatMessageBubbleState): ChatMessageBubbleMetaDataStatusContainerStyle => (
48
+ toContainerStyle(resolve(state.direction).metaDataStatusContainer)
49
+ )),
50
+ metaDataText: createStyleResolver((state: ChatMessageBubbleState): ChatMessageBubbleMetaDataTextStyle => (
51
+ toTextStyle(resolve(state.direction).metaDataText)
52
+ )),
53
+ metaDataIcon: createValueResolver((state: ChatMessageBubbleState): ChatMessageBubbleMetaDataIconStyle => (
54
+ toIconStyle(resolve(state.direction).metaDataIcon)
55
+ )),
56
+ }
57
+ }
@@ -0,0 +1,38 @@
1
+ import { toContainerStyle } from '../../adapters/container-adapter'
2
+ import { toTextStyle } from '../../adapters/text-style-adapter'
3
+ import type { TextStyle } from 'react-native'
4
+ import type {
5
+ ChatMessageComposerInputStyle,
6
+ ChatMessageComposerStyle,
7
+ ChatMessageComposerThemeResolvers
8
+ } from '../../types/components/chat'
9
+ import {
10
+ createSimpleStyleResolver,
11
+ createSimpleValueResolver,
12
+ type ComponentThemeResolver
13
+ } from '../../types/resolver'
14
+
15
+ export const toChatMessageComposerThemeResolvers: ComponentThemeResolver<ChatMessageComposerThemeResolvers> = ({
16
+ themeTokens,
17
+ semanticTokens,
18
+ componentTokens,
19
+ }) => {
20
+ const resolve = () => componentTokens.chat.messageComposer({
21
+ themeTokens,
22
+ semanticResolvers: semanticTokens,
23
+ })
24
+
25
+ return {
26
+ container: createSimpleStyleResolver((): ChatMessageComposerStyle => (
27
+ toContainerStyle(resolve().container)
28
+ )),
29
+ input: createSimpleStyleResolver((): ChatMessageComposerInputStyle => ({
30
+ ...toContainerStyle(resolve().input),
31
+ ...toTextStyle(resolve().text),
32
+ flex: 1,
33
+ })),
34
+ placeholderColor: createSimpleValueResolver((): TextStyle => ({
35
+ color: resolve().placeholder.color
36
+ })),
37
+ }
38
+ }
@@ -0,0 +1,27 @@
1
+ import { toContainerStyle } from '../../adapters/container-adapter'
2
+ import type {
3
+ ChatMessageListStyle,
4
+ ChatMessageListThemeResolvers
5
+ } from '../../types/components/chat'
6
+ import {
7
+ createSimpleStyleResolver,
8
+ type ComponentThemeResolver
9
+ } from '../../types/resolver'
10
+
11
+ export const toChatMessageListThemeResolvers: ComponentThemeResolver<ChatMessageListThemeResolvers> = ({
12
+ themeTokens,
13
+ semanticTokens,
14
+ componentTokens,
15
+ }) => {
16
+ const resolve = () => componentTokens.chat.messageList({
17
+ themeTokens,
18
+ semanticResolvers: semanticTokens,
19
+ })
20
+
21
+ return {
22
+ container: createSimpleStyleResolver((): ChatMessageListStyle => ({
23
+ ...toContainerStyle(resolve().container),
24
+ flex: 1,
25
+ })),
26
+ }
27
+ }