@helpwave/hightide-native 0.5.0 → 0.7.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 (92) hide show
  1. package/package.json +3 -3
  2. package/src/components/card/Card.tsx +2 -4
  3. package/src/components/chat/ChatAttachmentMessageBubble.tsx +155 -94
  4. package/src/components/chat/ChatConversationList.tsx +4 -12
  5. package/src/components/chat/ChatConversationRow.tsx +159 -164
  6. package/src/components/chat/ChatDateDivider.tsx +3 -8
  7. package/src/components/chat/ChatMessageBubble.tsx +54 -52
  8. package/src/components/chat/ChatMessageComposer.tsx +4 -12
  9. package/src/components/chat/ChatMessageList.tsx +3 -9
  10. package/src/components/chat/ChatQuickReplyChip.tsx +41 -27
  11. package/src/components/chat/ChatSystemLine.tsx +4 -12
  12. package/src/components/chat/ChatThreadHeader.tsx +136 -101
  13. package/src/components/layout/Divider.tsx +2 -4
  14. package/src/components/list/ListActionItem.tsx +57 -65
  15. package/src/components/list/ListItem.tsx +8 -28
  16. package/src/components/list/ListItemTextContent.tsx +4 -2
  17. package/src/components/list/ListNavigationItem.tsx +55 -63
  18. package/src/components/user-interaction/Button.tsx +43 -49
  19. package/src/components/user-interaction/Checkbox.tsx +47 -48
  20. package/src/components/user-interaction/IconButton.tsx +40 -42
  21. package/src/components/user-interaction/Input.tsx +70 -67
  22. package/src/components/user-interaction/MultiSelect/MultiSelect.tsx +40 -0
  23. package/src/components/user-interaction/MultiSelect/MultiSelectContext.tsx +70 -0
  24. package/src/components/user-interaction/MultiSelect/MultiSelectMenu.tsx +87 -0
  25. package/src/components/user-interaction/MultiSelect/MultiSelectOption.tsx +87 -0
  26. package/src/components/user-interaction/MultiSelect/MultiSelectRoot.tsx +194 -0
  27. package/src/components/user-interaction/MultiSelect/MultiSelectTrigger.tsx +123 -0
  28. package/src/components/user-interaction/MultiSelect/index.ts +6 -0
  29. package/src/components/user-interaction/SearchBar.tsx +11 -17
  30. package/src/components/user-interaction/Select/Select.tsx +40 -0
  31. package/src/components/user-interaction/Select/SelectContext.tsx +69 -0
  32. package/src/components/user-interaction/Select/SelectMenu.tsx +87 -0
  33. package/src/components/user-interaction/Select/SelectOption.tsx +77 -0
  34. package/src/components/user-interaction/Select/SelectRoot.tsx +186 -0
  35. package/src/components/user-interaction/Select/SelectTrigger.tsx +92 -0
  36. package/src/components/user-interaction/Select/index.ts +6 -0
  37. package/src/components/user-interaction/Switch.tsx +46 -98
  38. package/src/components/user-interaction/Textarea.tsx +179 -0
  39. package/src/components/user-interaction/ThemedPressable.tsx +48 -49
  40. package/src/components/user-interaction/index.ts +1 -0
  41. package/src/components/visualization-and-display/Avatar.tsx +19 -17
  42. package/src/components/visualization-and-display/Chip.tsx +4 -12
  43. package/src/components/visualization-and-display/ThemedText.tsx +12 -5
  44. package/src/enums/chatMessageDirection.ts +18 -0
  45. package/src/enums/chatMessageStatus.ts +18 -0
  46. package/src/enums/hightideThemeModes.ts +18 -0
  47. package/src/enums/index.ts +7 -0
  48. package/src/enums/listItemContentOrder.ts +18 -0
  49. package/src/enums/themedTextAppearance.ts +18 -0
  50. package/src/enums/useMultiSelectFirstHighlightBehavior.ts +18 -0
  51. package/src/enums/useSelectFirstHighlightBehavior.ts +18 -0
  52. package/src/global-contexts/content-theme/ContentThemeProvider.tsx +9 -5
  53. package/src/global-contexts/theme/ThemeProvider.tsx +4 -1
  54. package/src/hooks/index.ts +2 -0
  55. package/src/hooks/useAnimatedStyleTransition.ts +460 -0
  56. package/src/hooks/useMemoizedTheme.ts +23 -0
  57. package/src/hooks/useMultiSelect.ts +3 -1
  58. package/src/hooks/useSelect.ts +3 -1
  59. package/src/icons/HightideIconRegistry.ts +2 -0
  60. package/src/theme/adapters/style-adapter-utils.ts +121 -27
  61. package/src/theme/resolvers/avatar.ts +48 -39
  62. package/src/theme/resolvers/button.ts +7 -17
  63. package/src/theme/resolvers/chat/attachment-message-bubble.ts +5 -6
  64. package/src/theme/resolvers/chat/conversation-row.ts +4 -6
  65. package/src/theme/resolvers/chat/message-bubble.ts +1 -2
  66. package/src/theme/resolvers/chat/message-composer.ts +1 -2
  67. package/src/theme/resolvers/chat/quick-reply-chip.ts +2 -3
  68. package/src/theme/resolvers/chat/system-line.ts +1 -2
  69. package/src/theme/resolvers/chat/thread-header.ts +3 -4
  70. package/src/theme/resolvers/checkbox.ts +2 -2
  71. package/src/theme/resolvers/chip.ts +1 -2
  72. package/src/theme/resolvers/iconButton.ts +4 -13
  73. package/src/theme/resolvers/index.ts +1 -0
  74. package/src/theme/resolvers/input.ts +30 -14
  75. package/src/theme/resolvers/listItem.ts +2 -3
  76. package/src/theme/resolvers/multiSelect.ts +1 -3
  77. package/src/theme/resolvers/searchBar.ts +1 -2
  78. package/src/theme/resolvers/select.ts +1 -2
  79. package/src/theme/resolvers/textarea.ts +14 -0
  80. package/src/theme/resolvers/themedPressable.ts +4 -15
  81. package/src/theme/themes/createHightideTheme.ts +6 -0
  82. package/src/theme/themes/hightideThemes.ts +3 -1
  83. package/src/theme/types/components/chat.ts +6 -21
  84. package/src/theme/types/components/hightide.ts +2 -0
  85. package/src/theme/types/components/index.ts +1 -0
  86. package/src/theme/types/components/input.ts +3 -0
  87. package/src/theme/types/components/textarea.ts +9 -0
  88. package/src/theme/types/resolver.ts +4 -27
  89. package/src/utils/index.ts +1 -0
  90. package/src/utils/pressableInteraction.ts +7 -0
  91. package/src/components/user-interaction/MultiSelect.tsx +0 -281
  92. package/src/components/user-interaction/Select.tsx +0 -242
@@ -1,4 +1,5 @@
1
1
  import {
2
+ PixelRatio,
2
3
  StyleSheet,
3
4
  type StyleProp,
4
5
  type TextStyle,
@@ -10,14 +11,16 @@ import type {
10
11
  BorderRadiusToken,
11
12
  BorderToken,
12
13
  ContainerTokens,
13
- CrossAxisAligmentToken,
14
+ CrossAxisAlignmentToken,
14
15
  CrossAxisLineAligmentToken,
15
16
  IconTokens,
16
17
  LayoutDirectionToken,
17
18
  MainAxisAligmentToken,
18
19
  MarginToken,
19
20
  PaddingToken,
20
- TextStyleTokens
21
+ PositioningToken,
22
+ TextStyleTokens,
23
+ TransformTokens
21
24
  } from '@helpwave/hightide-design/component-token-resolvers'
22
25
  import {
23
26
  defaultWritingMode,
@@ -25,6 +28,8 @@ import {
25
28
  } from '@helpwave/hightide-design/component-token-resolvers'
26
29
  import type { ShadowToken } from '@helpwave/hightide-design/theme-tokens'
27
30
  import type { IconStyle } from '../../icons'
31
+ import type { SingleOrArray } from '@helpwave/hightide-utils/utils'
32
+ import { ArrayUtil } from '@helpwave/hightide-utils/utils'
28
33
 
29
34
  function getStyleProperty<
30
35
  T extends ViewStyle,
@@ -87,19 +92,19 @@ const toFlexStartEnd = (
87
92
  }
88
93
 
89
94
  const shadowStyleAdapter = (
90
- shadow?: ShadowToken
95
+ shadow?: SingleOrArray<ShadowToken>
91
96
  ): ViewStyle['boxShadow'] | undefined => {
92
97
  if (shadow === undefined) {
93
98
  return undefined
94
99
  }
95
100
 
96
- return [{
101
+ return ArrayUtil.resolveSingleOrArray(shadow).map((shadow) => ({
97
102
  color: shadow.color,
98
103
  offsetX: shadow.x,
99
104
  offsetY: shadow.y,
100
105
  blurRadius: shadow.blur,
101
106
  spreadDistance: shadow.spread,
102
- }]
107
+ }))
103
108
  }
104
109
 
105
110
  const flexDirectionStyleAdapter = (
@@ -127,7 +132,7 @@ const justifyContentStyleAdapter = (
127
132
  }
128
133
 
129
134
  const alignItemsStyleAdapter = (
130
- alignment?: CrossAxisAligmentToken
135
+ alignment?: CrossAxisAlignmentToken
131
136
  ): ViewStyle['alignItems'] | undefined => {
132
137
  if (alignment === undefined) {
133
138
  return undefined
@@ -141,7 +146,7 @@ const alignItemsStyleAdapter = (
141
146
  }
142
147
 
143
148
  const alignSelfStyleAdapter = (
144
- alignment?: CrossAxisAligmentToken
149
+ alignment?: CrossAxisAlignmentToken
145
150
  ): ViewStyle['alignSelf'] | undefined => {
146
151
  if (alignment === undefined) {
147
152
  return undefined
@@ -194,12 +199,12 @@ const borderRadiusStyleAdapter = (
194
199
  }
195
200
  }
196
201
 
197
- return {
202
+ return defined({
198
203
  borderTopLeftRadius: borderRadius.topLeft,
199
204
  borderTopRightRadius: borderRadius.topRight,
200
205
  borderBottomLeftRadius: borderRadius.bottomLeft,
201
206
  borderBottomRightRadius: borderRadius.bottomRight,
202
- }
207
+ })
203
208
  }
204
209
 
205
210
  const borderWidthStyleAdapter = (
@@ -216,12 +221,12 @@ const borderWidthStyleAdapter = (
216
221
 
217
222
  const sides = resolveDirectionalTokens([width], defaultWritingMode)
218
223
 
219
- return {
224
+ return defined({
220
225
  borderTopWidth: sides.top,
221
226
  borderRightWidth: sides.right,
222
227
  borderBottomWidth: sides.bottom,
223
228
  borderLeftWidth: sides.left,
224
- }
229
+ })
225
230
  }
226
231
 
227
232
  const borderColorStyleAdapter = (
@@ -238,12 +243,12 @@ const borderColorStyleAdapter = (
238
243
 
239
244
  const sides = resolveDirectionalTokens([color], defaultWritingMode)
240
245
 
241
- return {
246
+ return defined({
242
247
  borderTopColor: sides.top,
243
248
  borderRightColor: sides.right,
244
249
  borderBottomColor: sides.bottom,
245
250
  borderLeftColor: sides.left,
246
- }
251
+ })
247
252
  }
248
253
 
249
254
  const borderStyleAdapter = (
@@ -263,11 +268,11 @@ const borderStyleAdapter = (
263
268
  return undefined
264
269
  }
265
270
 
266
- return {
271
+ return defined({
267
272
  borderStyle: border.style,
268
273
  ...borderWidthStyleAdapter(border.width),
269
274
  ...borderColorStyleAdapter(border.color),
270
- }
275
+ })
271
276
  }
272
277
 
273
278
  const paddingStyleAdapter = (
@@ -284,12 +289,12 @@ const paddingStyleAdapter = (
284
289
 
285
290
  const sides = resolveDirectionalTokens([padding], defaultWritingMode)
286
291
 
287
- return {
292
+ return defined({
288
293
  paddingTop: sides.top,
289
294
  paddingRight: sides.right,
290
295
  paddingBottom: sides.bottom,
291
296
  paddingLeft: sides.left,
292
- }
297
+ })
293
298
  }
294
299
 
295
300
  const marginStyleAdapter = (
@@ -306,12 +311,12 @@ const marginStyleAdapter = (
306
311
 
307
312
  const sides = resolveDirectionalTokens([margin], defaultWritingMode)
308
313
 
309
- return {
314
+ return defined({
310
315
  marginTop: sides.top,
311
316
  marginRight: sides.right,
312
317
  marginBottom: sides.bottom,
313
318
  marginLeft: sides.left,
314
- }
319
+ })
315
320
  }
316
321
 
317
322
  const sizeStyleAdapter = (
@@ -328,14 +333,16 @@ const sizeStyleAdapter = (
328
333
  return undefined
329
334
  }
330
335
 
331
- return {
336
+ return defined({
332
337
  width: size.width,
333
338
  height: size.height,
334
339
  minWidth: size.minWidth,
335
- minHeight: size.minHeight,
340
+ // minHeight is rounded to the nearest pixel to avoid blurry edges and gaps multiselects on certain devices.
341
+ // See https://reactnative.dev/docs/pixelratio#pixelroundtonearestpixel for more information.
342
+ minHeight: typeof size.minHeight === 'number' ? PixelRatio.roundToNearestPixel(size.minHeight) : size.minHeight,
336
343
  maxWidth: size.maxWidth,
337
344
  maxHeight: size.maxHeight,
338
- }
345
+ })
339
346
  }
340
347
 
341
348
  const outlineStyleAdapter = (
@@ -350,12 +357,12 @@ const outlineStyleAdapter = (
350
357
  return undefined
351
358
  }
352
359
 
353
- return {
360
+ return defined({
354
361
  outlineColor: outline.color,
355
362
  outlineOffset: outline.offset,
356
363
  outlineWidth: outline.width,
357
364
  outlineStyle: outline.style,
358
- }
365
+ })
359
366
  }
360
367
 
361
368
  const layoutStyleAdapter = (
@@ -376,18 +383,101 @@ const layoutStyleAdapter = (
376
383
  return undefined
377
384
  }
378
385
 
379
- return {
386
+ return defined({
380
387
  flexWrap: layout.flexWrap,
381
388
  flexGrow: layout.flexGrow,
382
389
  flexShrink: layout.flexShrink,
383
390
  flexBasis: layout.flexBasis,
384
391
  flexDirection: flexDirectionStyleAdapter(layout.direction),
385
392
  justifyContent: justifyContentStyleAdapter(layout.mainAxisAlignment),
386
- alignItems: alignItemsStyleAdapter(layout.crossAxisAligment),
387
- alignContent: alignContentStyleAdapter(layout.crossAxisLineAligment),
393
+ alignItems: alignItemsStyleAdapter(layout.crossAxisAlignment),
394
+ alignContent: alignContentStyleAdapter(layout.crossAxisLineAlignment),
388
395
  alignSelf: alignSelfStyleAdapter(layout.selfCrossAxisAlignment),
389
396
  gap: layout.gap,
397
+ })
398
+ }
399
+
400
+ const positionStyleAdapter = (
401
+ position?: PositioningToken
402
+ ): OptionalViewStyle<
403
+ | 'position'
404
+ | 'left'
405
+ | 'right'
406
+ | 'top'
407
+ | 'bottom'
408
+ | 'zIndex'
409
+ > | undefined => {
410
+ if (position === undefined) {
411
+ return undefined
390
412
  }
413
+
414
+ if (position.type === 'static') {
415
+ return defined({
416
+ position: position.type,
417
+ zIndex: position.zIndex,
418
+ })
419
+ }
420
+
421
+ return defined({
422
+ position: position.type,
423
+ left: position.left,
424
+ right: position.right,
425
+ top: position.top,
426
+ bottom: position.bottom,
427
+ zIndex: position.zIndex,
428
+ })
429
+ }
430
+
431
+ const transformStyleAdapter = (
432
+ transform?: TransformTokens
433
+ ): ViewStyle['transform'] | undefined => {
434
+ if (transform === undefined) {
435
+ return undefined
436
+ }
437
+
438
+ const transforms = []
439
+
440
+ if (transform.translate?.x !== undefined) {
441
+ transforms.push({ translateX: transform.translate.x })
442
+ }
443
+
444
+ if (transform.translate?.y !== undefined) {
445
+ transforms.push({ translateY: transform.translate.y })
446
+ }
447
+
448
+ if (transform.scale?.x !== undefined) {
449
+ transforms.push({ scaleX: transform.scale.x })
450
+ }
451
+
452
+ if (transform.scale?.y !== undefined) {
453
+ transforms.push({ scaleY: transform.scale.y })
454
+ }
455
+
456
+ if (transform.rotation?.x !== undefined) {
457
+ transforms.push({ rotateX: transform.rotation.x })
458
+ }
459
+
460
+ if (transform.rotation?.y !== undefined) {
461
+ transforms.push({ rotateY: transform.rotation.y })
462
+ }
463
+
464
+ if (transform.rotation?.z !== undefined) {
465
+ transforms.push({ rotateZ: transform.rotation.z })
466
+ }
467
+
468
+ if (transform.skew?.x !== undefined) {
469
+ transforms.push({ skewX: `${transform.skew.x}deg` })
470
+ }
471
+
472
+ if (transform.skew?.y !== undefined) {
473
+ transforms.push({ skewY: `${transform.skew.y}deg` })
474
+ }
475
+
476
+ if (transforms.length === 0) {
477
+ return undefined
478
+ }
479
+
480
+ return transforms
391
481
  }
392
482
 
393
483
  function containerStyleAdapter(tokens: ContainerTokens): ViewStyle {
@@ -401,6 +491,8 @@ function containerStyleAdapter(tokens: ContainerTokens): ViewStyle {
401
491
  backgroundColor: tokens.backgroundColor,
402
492
  opacity: tokens.opacity,
403
493
  boxShadow: shadowStyleAdapter(tokens.decoration?.shadow),
494
+ transform: transformStyleAdapter(tokens.transform),
495
+ ...positionStyleAdapter(tokens.position),
404
496
  ...layoutStyleAdapter(tokens.layout),
405
497
  ...sizeStyleAdapter(tokens.size),
406
498
  ...borderStyleAdapter(tokens.border),
@@ -454,6 +546,8 @@ export const StyleAdapterUtils = {
454
546
  size: sizeStyleAdapter,
455
547
  outline: outlineStyleAdapter,
456
548
  layout: layoutStyleAdapter,
549
+ position: positionStyleAdapter,
550
+ transform: transformStyleAdapter,
457
551
  container: containerStyleAdapter,
458
552
  text: textStyleAdapter,
459
553
  icon: iconStyleAdapter,
@@ -26,10 +26,8 @@ import type {
26
26
  } from '../types/components/avatar'
27
27
  import {
28
28
  createStyleResolver,
29
- createValueResolver,
30
29
  type ComponentThemeResolver
31
30
  } from '../types/resolver'
32
- import type { ThemeTokens } from '@helpwave/hightide-design/theme-tokens'
33
31
 
34
32
  import { StyleAdapterUtils } from '../adapters'
35
33
 
@@ -61,6 +59,28 @@ export const mergeAvatarTokens = (
61
59
  ...override?.container?.decoration,
62
60
  },
63
61
  },
62
+ image: {
63
+ ...base.image,
64
+ ...override?.image,
65
+ size: {
66
+ ...base.image.size,
67
+ ...override?.image?.size,
68
+ },
69
+ shape: {
70
+ ...base.image.shape,
71
+ ...override?.image?.shape,
72
+ },
73
+ layout: {
74
+ ...base.image.layout,
75
+ ...override?.image?.layout,
76
+ },
77
+ decoration: {
78
+ ...base.image.decoration,
79
+ ...override?.image?.decoration,
80
+ },
81
+ position: override?.image?.position ?? base.image.position,
82
+ transform: override?.image?.transform ?? base.image.transform,
83
+ },
64
84
  text: {
65
85
  ...base.text,
66
86
  ...override?.text,
@@ -94,6 +114,17 @@ export const withNumericAvatarSize = (
94
114
  borderRadius: { type: 'all', value: borderRadius },
95
115
  },
96
116
  },
117
+ image: {
118
+ ...tokens.image,
119
+ size: {
120
+ width: size,
121
+ height: size,
122
+ },
123
+ shape: {
124
+ ...tokens.image.shape,
125
+ borderRadius: { type: 'all', value: borderRadius },
126
+ },
127
+ },
97
128
  icon: {
98
129
  ...tokens.icon,
99
130
  size,
@@ -102,8 +133,7 @@ export const withNumericAvatarSize = (
102
133
  }
103
134
 
104
135
  export const createAvatarStyleResolvers = (
105
- resolveTokens: (state: AvatarState) => AvatarTokens,
106
- themeTokens: ThemeTokens
136
+ resolveTokens: (state: AvatarState) => AvatarTokens
107
137
  ): AvatarThemeResolvers => ({
108
138
  container: createStyleResolver((state: AvatarState): AvatarStyle => {
109
139
  const { container } = resolveTokens(state)
@@ -122,36 +152,15 @@ export const createAvatarStyleResolvers = (
122
152
  } : {}),
123
153
  }
124
154
  }),
125
- image: createStyleResolver((state: AvatarState): AvatarImageStyle => {
126
- const { container } = resolveTokens(state)
127
- const width = container.size?.width
128
- const height = container.size?.height
129
- const borderRadius = container.shape?.borderRadius
130
-
131
- return {
132
- position: 'absolute',
133
- left: 0,
134
- top: 0,
135
- width,
136
- height,
137
- borderRadius: borderRadius?.type === 'all'
138
- ? borderRadius.value
139
- : undefined,
140
- }
141
- }),
142
- text: createStyleResolver((state: AvatarState): AvatarTextStyle => ({
143
- ...StyleAdapterUtils.text(resolveTokens(state).text),
144
- textAlign: 'center',
145
- })),
146
- icon: createValueResolver((state: AvatarState): AvatarIconStyle => {
147
- const { icon } = resolveTokens(state)
148
-
149
- return StyleAdapterUtils.icon({
150
- size: icon.size ?? themeTokens.icongraphy.sizes.md,
151
- strokeWidth: icon.strokeWidth ?? themeTokens.icongraphy.strokeWidth,
152
- color: icon.color ?? themeTokens.color.primary.onColor,
153
- })
154
- }),
155
+ image: createStyleResolver((state: AvatarState): AvatarImageStyle => (
156
+ StyleAdapterUtils.container(resolveTokens(state).image) as AvatarImageStyle
157
+ )),
158
+ text: createStyleResolver((state: AvatarState): AvatarTextStyle => (
159
+ StyleAdapterUtils.text(resolveTokens(state).text)
160
+ )),
161
+ icon: createStyleResolver((state: AvatarState): AvatarIconStyle => (
162
+ StyleAdapterUtils.icon(resolveTokens(state).icon)
163
+ )),
155
164
  })
156
165
 
157
166
  export const toAvatarThemeResolvers: ComponentThemeResolver<AvatarThemeResolvers> = ({
@@ -180,7 +189,7 @@ export const toAvatarThemeResolvers: ComponentThemeResolver<AvatarThemeResolvers
180
189
  return tokens
181
190
  }
182
191
 
183
- return createAvatarStyleResolvers(resolveTokens, themeTokens)
192
+ return createAvatarStyleResolvers(resolveTokens)
184
193
  }
185
194
 
186
195
  export const createAvatarWithStatusThemeResolvers = (
@@ -194,7 +203,7 @@ export const createAvatarWithStatusThemeResolvers = (
194
203
  const { themeTokens, semanticTokens, componentTokens } = context
195
204
 
196
205
  return {
197
- avatar: createValueResolver((state: AvatarWithStatusState) => {
206
+ avatar: createStyleResolver((state: AvatarWithStatusState) => {
198
207
  const { avatarOverride } = resolve(state)
199
208
 
200
209
  const resolveTokens = (avatarState: AvatarState): AvatarTokens => {
@@ -222,7 +231,7 @@ export const createAvatarWithStatusThemeResolvers = (
222
231
  return tokens
223
232
  }
224
233
 
225
- return createAvatarStyleResolvers(resolveTokens, themeTokens)
234
+ return createAvatarStyleResolvers(resolveTokens)
226
235
  }),
227
236
  statusDot: createStyleResolver((state: AvatarWithStatusState): AvatarStatusDotStyle => {
228
237
  const tokens = resolve(state)
@@ -333,7 +342,7 @@ export const toAvatarGroupThemeResolvers: ComponentThemeResolver<
333
342
  })
334
343
 
335
344
  return {
336
- avatar: createValueResolver((state: AvatarGroupState) => {
345
+ avatar: createStyleResolver((state: AvatarGroupState) => {
337
346
  const { avatarOverride } = resolve(state)
338
347
 
339
348
  const resolveTokens = (avatarState: AvatarState): AvatarTokens => {
@@ -361,7 +370,7 @@ export const toAvatarGroupThemeResolvers: ComponentThemeResolver<
361
370
  return tokens
362
371
  }
363
372
 
364
- return createAvatarStyleResolvers(resolveTokens, themeTokens)
373
+ return createAvatarStyleResolvers(resolveTokens)
365
374
  }),
366
375
  container: createStyleResolver((state: AvatarGroupState): AvatarGroupContainerStyle => {
367
376
  const tokens = resolve(state)
@@ -7,7 +7,6 @@ import type {
7
7
  } from '../types/components/button'
8
8
  import {
9
9
  createStyleResolver,
10
- createValueResolver,
11
10
  toPressableInteractionState,
12
11
  type ComponentThemeResolver
13
12
  } from '../types/resolver'
@@ -31,22 +30,13 @@ export const toButtonThemeResolvers: ComponentThemeResolver<ButtonThemeResolvers
31
30
  })
32
31
 
33
32
  return {
34
- container: createStyleResolver((state: ButtonState): ButtonStyle => ({
35
- ...StyleAdapterUtils.container(resolve(state).container),
36
- alignSelf: 'flex-start',
37
- })),
38
- stateLayer: createStyleResolver((state: ButtonState): ButtonStyle => {
39
- const tokens = resolve(state)
40
- return {
41
- ...StyleAdapterUtils.container(tokens.stateLayer),
42
- position: 'absolute',
43
- top: 0,
44
- right: 0,
45
- bottom: 0,
46
- left: 0,
47
- }
48
- }),
49
- icon: createValueResolver((state: ButtonState): ButtonIconStyle => (
33
+ container: createStyleResolver((state: ButtonState): ButtonStyle => (
34
+ StyleAdapterUtils.container(resolve(state).container)
35
+ )),
36
+ stateLayer: createStyleResolver((state: ButtonState): ButtonStyle => (
37
+ StyleAdapterUtils.container(resolve(state).stateLayer)
38
+ )),
39
+ icon: createStyleResolver((state: ButtonState): ButtonIconStyle => (
50
40
  StyleAdapterUtils.icon(resolve(state).icon)
51
41
  )),
52
42
  text: createStyleResolver((state: ButtonState): ButtonTextStyle => (
@@ -26,7 +26,6 @@ import type {
26
26
  } from '../../types/components/chat'
27
27
  import {
28
28
  createStyleResolver,
29
- createValueResolver,
30
29
  toPressableInteractionState,
31
30
  type ComponentThemeResolver
32
31
  } from '../../types/resolver'
@@ -72,13 +71,13 @@ export const toChatAttachmentMessageBubbleThemeResolvers: ComponentThemeResolver
72
71
  ): ChatMessageBubbleMetaDataTextStyle => (
73
72
  StyleAdapterUtils.text(resolve(state.direction).chatMessageBubbleOverrides.metaDataText = {})
74
73
  )),
75
- metaDataIcon: createValueResolver((
74
+ metaDataIcon: createStyleResolver((
76
75
  state: ChatAttachmentMessageBubbleState
77
76
  ): ChatMessageBubbleMetaDataIconStyle => (
78
77
  StyleAdapterUtils.icon(resolve(state.direction).chatMessageBubbleOverrides.metaDataIcon = {})
79
78
  )),
80
79
  },
81
- contentContainer: createValueResolver((state: ChatAttachmentMessageBubbleState) => {
80
+ contentContainer: createStyleResolver((state: ChatAttachmentMessageBubbleState) => {
82
81
  const contentContainer = resolve(state.direction).contentContainer
83
82
 
84
83
  const resolvePressable = (pressableState: PressableState) => componentTokens.pressable({
@@ -112,7 +111,7 @@ export const toChatAttachmentMessageBubbleThemeResolvers: ComponentThemeResolver
112
111
  ...StyleAdapterUtils.text(resolvePressable(pressableState).text),
113
112
  ...StyleAdapterUtils.text(contentContainer.text = {}),
114
113
  })),
115
- icon: createValueResolver((pressableState: PressableState): PressableIconStyle => (
114
+ icon: createStyleResolver((pressableState: PressableState): PressableIconStyle => (
116
115
  StyleAdapterUtils.icon(resolvePressable(pressableState).icon)
117
116
  )),
118
117
  }
@@ -122,7 +121,7 @@ export const toChatAttachmentMessageBubbleThemeResolvers: ComponentThemeResolver
122
121
  ): ChatAttachmentMessageBubbleFileIconContainerStyle => (
123
122
  StyleAdapterUtils.container(resolve(state.direction).fileIconContainer)
124
123
  )),
125
- fileIcon: createValueResolver((
124
+ fileIcon: createStyleResolver((
126
125
  state: ChatAttachmentMessageBubbleState
127
126
  ): ChatAttachmentMessageBubbleFileIconStyle => (
128
127
  StyleAdapterUtils.icon(resolve(state.direction).fileIcon)
@@ -132,7 +131,7 @@ export const toChatAttachmentMessageBubbleThemeResolvers: ComponentThemeResolver
132
131
  ): ChatAttachmentMessageBubbleDownloadIconContainerStyle => (
133
132
  StyleAdapterUtils.container(resolve(state.direction).downloadIconContainer)
134
133
  )),
135
- downloadIcon: createValueResolver((
134
+ downloadIcon: createStyleResolver((
136
135
  state: ChatAttachmentMessageBubbleState
137
136
  ): ChatAttachmentMessageBubbleDownloadIconStyle => (
138
137
  StyleAdapterUtils.icon(resolve(state.direction).downloadIcon)
@@ -32,9 +32,7 @@ import type {
32
32
  } from '../../types/components/avatar'
33
33
  import {
34
34
  createSimpleStyleResolver,
35
- createSimpleValueResolver,
36
35
  createStyleResolver,
37
- createValueResolver,
38
36
  toPressableInteractionState,
39
37
  type ComponentThemeResolver
40
38
  } from '../../types/resolver'
@@ -61,7 +59,7 @@ export const toChatConversationRowThemeResolvers: ComponentThemeResolver<ChatCon
61
59
  })
62
60
 
63
61
  return {
64
- pressable: createValueResolver((state: ChatConversationRowState) => {
62
+ pressable: createStyleResolver((state: ChatConversationRowState) => {
65
63
  const { pressableOverrides } = resolve(state)
66
64
 
67
65
  const resolvePressable = (pressableState: PressableState) => componentTokens.pressable({
@@ -89,7 +87,7 @@ export const toChatConversationRowThemeResolvers: ComponentThemeResolver<ChatCon
89
87
  ...StyleAdapterUtils.text(resolvePressable(pressableState).text),
90
88
  ...StyleAdapterUtils.text(pressableOverrides.text ?? {}),
91
89
  })),
92
- icon: createValueResolver((pressableState: PressableState): PressableIconStyle => ({
90
+ icon: createStyleResolver((pressableState: PressableState): PressableIconStyle => ({
93
91
  ...StyleAdapterUtils.icon(resolvePressable(pressableState).icon),
94
92
  ...StyleAdapterUtils.icon(pressableOverrides.icon ?? {}),
95
93
  })),
@@ -119,10 +117,10 @@ export const toChatConversationRowThemeResolvers: ComponentThemeResolver<ChatCon
119
117
  unreadBadgeText: createSimpleStyleResolver((): ChatConversationRowUnreadBadgeTextStyle => (
120
118
  StyleAdapterUtils.text(resolve().unreadBadgeText)
121
119
  )),
122
- sentIndicator: createSimpleValueResolver((): ChatConversationRowSentIndicatorStyle => (
120
+ sentIndicator: createSimpleStyleResolver((): ChatConversationRowSentIndicatorStyle => (
123
121
  StyleAdapterUtils.icon(resolve().sentIndicator)
124
122
  )),
125
- avatar: createValueResolver((state: AvatarState): AvatarThemeResolvers => {
123
+ avatar: createStyleResolver((state: AvatarState): AvatarThemeResolvers => {
126
124
  const { avatarOverride } = resolve()
127
125
 
128
126
  const resolveTokens = (avatarState: AvatarState): AvatarTokens => {
@@ -13,7 +13,6 @@ import type {
13
13
  } from '../../types/components/chat'
14
14
  import {
15
15
  createStyleResolver,
16
- createValueResolver,
17
16
  type ComponentThemeResolver
18
17
  } from '../../types/resolver'
19
18
 
@@ -49,7 +48,7 @@ export const toChatMessageBubbleThemeResolvers: ComponentThemeResolver<ChatMessa
49
48
  metaDataText: createStyleResolver((state: ChatMessageBubbleState): ChatMessageBubbleMetaDataTextStyle => (
50
49
  StyleAdapterUtils.text(resolve(state.direction).metaDataText)
51
50
  )),
52
- metaDataIcon: createValueResolver((state: ChatMessageBubbleState): ChatMessageBubbleMetaDataIconStyle => (
51
+ metaDataIcon: createStyleResolver((state: ChatMessageBubbleState): ChatMessageBubbleMetaDataIconStyle => (
53
52
  StyleAdapterUtils.icon(resolve(state.direction).metaDataIcon)
54
53
  )),
55
54
  }
@@ -6,7 +6,6 @@ import type {
6
6
  } from '../../types/components/chat'
7
7
  import {
8
8
  createSimpleStyleResolver,
9
- createSimpleValueResolver,
10
9
  type ComponentThemeResolver
11
10
  } from '../../types/resolver'
12
11
 
@@ -30,7 +29,7 @@ export const toChatMessageComposerThemeResolvers: ComponentThemeResolver<ChatMes
30
29
  ...StyleAdapterUtils.container(resolve().input),
31
30
  ...StyleAdapterUtils.text(resolve().text),
32
31
  })),
33
- placeholderColor: createSimpleValueResolver((): TextStyle => ({
32
+ placeholderColor: createSimpleStyleResolver((): TextStyle => ({
34
33
  color: resolve().placeholder.color
35
34
  })),
36
35
  }
@@ -9,7 +9,6 @@ import type {
9
9
  } from '../../types/components/chat'
10
10
  import {
11
11
  createStyleResolver,
12
- createValueResolver,
13
12
  toPressableInteractionState,
14
13
  type ComponentThemeResolver
15
14
  } from '../../types/resolver'
@@ -28,7 +27,7 @@ export const toChatQuickReplyChipThemeResolvers: ComponentThemeResolver<ChatQuic
28
27
  })
29
28
 
30
29
  return {
31
- pressable: createValueResolver((state: ChatQuickReplyChipState) => {
30
+ pressable: createStyleResolver((state: ChatQuickReplyChipState) => {
32
31
  const tokens = resolve(state.isActive)
33
32
 
34
33
  const resolvePressable = (pressableState: PressableState) => componentTokens.pressable({
@@ -62,7 +61,7 @@ export const toChatQuickReplyChipThemeResolvers: ComponentThemeResolver<ChatQuic
62
61
  ...StyleAdapterUtils.text(resolvePressable(pressableState).text),
63
62
  ...StyleAdapterUtils.text(tokens.text = {}),
64
63
  })),
65
- icon: createValueResolver((pressableState: PressableState): PressableIconStyle => ({
64
+ icon: createStyleResolver((pressableState: PressableState): PressableIconStyle => ({
66
65
  ...StyleAdapterUtils.icon(resolvePressable(pressableState).icon),
67
66
  ...StyleAdapterUtils.icon(tokens.icon = {}),
68
67
  })),
@@ -9,7 +9,6 @@ import type {
9
9
  } from '../../types/components/chat'
10
10
  import {
11
11
  createStyleResolver,
12
- createValueResolver,
13
12
  type ComponentThemeResolver
14
13
  } from '../../types/resolver'
15
14
 
@@ -33,7 +32,7 @@ export const toChatSystemLineThemeResolvers: ComponentThemeResolver<ChatSystemLi
33
32
  text: createStyleResolver((state: ChatSystemLineState): ChatSystemLineTextStyle => (
34
33
  StyleAdapterUtils.text(resolve(state.color).text)
35
34
  )),
36
- icon: createValueResolver((state: ChatSystemLineState): ChatSystemLineIconStyle => (
35
+ icon: createStyleResolver((state: ChatSystemLineState): ChatSystemLineIconStyle => (
37
36
  StyleAdapterUtils.icon(resolve(state.color).icon)
38
37
  )),
39
38
  }