@helpwave/hightide-native 0.1.1 → 0.3.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 (65) hide show
  1. package/package.json +2 -2
  2. package/src/components/chat/ChatAttachmentMessageBubble.tsx +3 -0
  3. package/src/components/chat/ChatConversationRow.tsx +127 -27
  4. package/src/components/chat/ChatQuickReplyChip.tsx +7 -1
  5. package/src/components/chat/ChatThreadHeader.tsx +88 -48
  6. package/src/components/list/ListActionItem.tsx +60 -11
  7. package/src/components/list/ListItem.tsx +47 -21
  8. package/src/components/list/ListItemAccessory.tsx +34 -0
  9. package/src/components/list/ListItemTextContent.tsx +53 -0
  10. package/src/components/list/ListNavigationItem.tsx +60 -16
  11. package/src/components/list/index.ts +2 -0
  12. package/src/components/user-interaction/Button.tsx +6 -15
  13. package/src/components/user-interaction/IconButton.tsx +5 -7
  14. package/src/components/user-interaction/MultiSelect.tsx +72 -46
  15. package/src/components/user-interaction/Select.tsx +5 -1
  16. package/src/components/user-interaction/ThemedPressable.tsx +9 -4
  17. package/src/components/visualization-and-display/Chip.tsx +12 -5
  18. package/src/components/visualization-and-display/ThemedIcon.tsx +12 -8
  19. package/src/components/visualization-and-display/ThemedText.tsx +6 -2
  20. package/src/global-contexts/HightideProvider.tsx +9 -17
  21. package/src/global-contexts/content-theme/ContentThemeContext.ts +5 -2
  22. package/src/global-contexts/content-theme/ContentThemeProvider.tsx +64 -10
  23. package/src/global-contexts/theme/ThemeProvider.tsx +9 -4
  24. package/src/theme/adapters/index.ts +1 -4
  25. package/src/theme/adapters/style-adapter-utils.ts +433 -0
  26. package/src/theme/resolvers/avatar.ts +9 -10
  27. package/src/theme/resolvers/button.ts +6 -7
  28. package/src/theme/resolvers/card.ts +3 -2
  29. package/src/theme/resolvers/chat/attachment-message-bubble.ts +25 -37
  30. package/src/theme/resolvers/chat/conversation-list.ts +5 -4
  31. package/src/theme/resolvers/chat/conversation-row.ts +114 -14
  32. package/src/theme/resolvers/chat/date-divider.ts +4 -4
  33. package/src/theme/resolvers/chat/message-bubble.ts +9 -10
  34. package/src/theme/resolvers/chat/message-composer.ts +5 -6
  35. package/src/theme/resolvers/chat/message-list.ts +3 -2
  36. package/src/theme/resolvers/chat/quick-reply-chip.ts +12 -20
  37. package/src/theme/resolvers/chat/system-line.ts +5 -6
  38. package/src/theme/resolvers/chat/thread-header.ts +60 -12
  39. package/src/theme/resolvers/checkbox.ts +6 -6
  40. package/src/theme/resolvers/chip.ts +9 -4
  41. package/src/theme/resolvers/divider.ts +3 -3
  42. package/src/theme/resolvers/iconButton.ts +5 -10
  43. package/src/theme/resolvers/input.ts +12 -7
  44. package/src/theme/resolvers/listItem.ts +19 -16
  45. package/src/theme/resolvers/multiSelect.ts +23 -16
  46. package/src/theme/resolvers/searchBar.ts +14 -7
  47. package/src/theme/resolvers/select.ts +22 -15
  48. package/src/theme/resolvers/switch.ts +5 -4
  49. package/src/theme/resolvers/themedPressable.ts +10 -5
  50. package/src/theme/themes/createHightideTheme.ts +13 -4
  51. package/src/theme/types/components/chat.ts +63 -3
  52. package/src/theme/types/components/chip.ts +4 -0
  53. package/src/theme/types/components/iconButton.ts +1 -7
  54. package/src/theme/types/components/listItem.ts +5 -0
  55. package/src/theme/types/components/multiSelect.ts +1 -0
  56. package/src/theme/types/components/select.ts +1 -0
  57. package/src/theme/types/components/themedPressable.ts +4 -0
  58. package/src/theme/types/layout.ts +13 -7
  59. package/src/theme/types/semantics.ts +2 -1
  60. package/src/theme/types/theme.ts +40 -12
  61. package/src/theme/types/typography.ts +9 -4
  62. package/src/theme/adapters/container-adapter.ts +0 -323
  63. package/src/theme/adapters/defined.ts +0 -11
  64. package/src/theme/adapters/icon-style-adapter.ts +0 -10
  65. package/src/theme/adapters/text-style-adapter.ts +0 -16
@@ -1,4 +1,6 @@
1
- import type { AvatarTokens } from '@helpwave/hightide-design/component-token-resolvers'
1
+ import type {
2
+ AvatarTokens
3
+ } from '@helpwave/hightide-design/component-token-resolvers'
2
4
 
3
5
  import {
4
6
  createAvatarStyleResolvers,
@@ -6,14 +8,17 @@ import {
6
8
  toDesignAvatarSize,
7
9
  withNumericAvatarSize
8
10
  } from '../avatar'
9
- import { toContainerStyle } from '../../adapters/container-adapter'
10
- import { toTextStyle } from '../../adapters/text-style-adapter'
11
11
  import type {
12
12
  ChatThreadHeaderContentRowStyle,
13
13
  ChatThreadHeaderStyle,
14
14
  ChatThreadHeaderSubtitleStyle,
15
15
  ChatThreadHeaderThemeResolvers,
16
- ChatThreadHeaderTitleStyle
16
+ ChatThreadHeaderTitleStyle,
17
+ PressableContainerStyle,
18
+ PressableIconStyle,
19
+ PressableState,
20
+ PressableStateLayerStyle,
21
+ PressableTextStyle
17
22
  } from '../../types/components/chat'
18
23
  import type {
19
24
  AvatarState,
@@ -21,10 +26,14 @@ import type {
21
26
  } from '../../types/components/avatar'
22
27
  import {
23
28
  createSimpleStyleResolver,
29
+ createStyleResolver,
24
30
  createValueResolver,
31
+ toPressableInteractionState,
25
32
  type ComponentThemeResolver
26
33
  } from '../../types/resolver'
27
34
 
35
+ import { StyleAdapterUtils } from '../../adapters'
36
+
28
37
  export const toChatThreadHeaderThemeResolvers: ComponentThemeResolver<ChatThreadHeaderThemeResolvers> = ({
29
38
  themeTokens,
30
39
  semanticTokens,
@@ -37,17 +46,16 @@ export const toChatThreadHeaderThemeResolvers: ComponentThemeResolver<ChatThread
37
46
 
38
47
  return {
39
48
  container: createSimpleStyleResolver((): ChatThreadHeaderStyle => (
40
- toContainerStyle(resolve().container)
49
+ StyleAdapterUtils.container(resolve().container)
50
+ )),
51
+ contentRow: createSimpleStyleResolver((): ChatThreadHeaderContentRowStyle => (
52
+ StyleAdapterUtils.container(resolve().contentRow)
41
53
  )),
42
- contentRow: createSimpleStyleResolver((): ChatThreadHeaderContentRowStyle => ({
43
- ...toContainerStyle(resolve().contentRow),
44
- flex: 1,
45
- })),
46
54
  title: createSimpleStyleResolver((): ChatThreadHeaderTitleStyle => (
47
- toTextStyle(resolve().title)
55
+ StyleAdapterUtils.text(resolve().title)
48
56
  )),
49
57
  subtitle: createSimpleStyleResolver((): ChatThreadHeaderSubtitleStyle => (
50
- toTextStyle(resolve().subtitle)
58
+ StyleAdapterUtils.text(resolve().subtitle)
51
59
  )),
52
60
  avatar: createValueResolver((state: AvatarState): AvatarThemeResolvers => {
53
61
  const { avatarOverride } = resolve()
@@ -71,7 +79,7 @@ export const toChatThreadHeaderThemeResolvers: ComponentThemeResolver<ChatThread
71
79
  avatarOverride
72
80
  )
73
81
 
74
- const size = avatarState.size ?? state.size
82
+ const size = avatarState.size ?? state.size ?? avatarOverride.container?.size?.width
75
83
  if (typeof size === 'number') {
76
84
  return withNumericAvatarSize(tokens, size)
77
85
  }
@@ -81,5 +89,45 @@ export const toChatThreadHeaderThemeResolvers: ComponentThemeResolver<ChatThread
81
89
 
82
90
  return createAvatarStyleResolvers(resolveTokens, themeTokens)
83
91
  }),
92
+ pressable: createValueResolver(() => {
93
+ const { pressableOverwrites } = resolve()
94
+
95
+ const resolvePressable = (pressableState: PressableState) => componentTokens.pressable({
96
+ themeTokens,
97
+ semanticResolvers: semanticTokens,
98
+ overrides: {
99
+ size: pressableOverwrites.overrides?.size,
100
+ color: pressableOverwrites.overrides?.color,
101
+ coloringStyle: pressableOverwrites.overrides?.coloringStyle,
102
+ coloringColorVariant: pressableOverwrites.overrides?.coloringColorVariant,
103
+ hasAdditionalHorizontalPadding: pressableOverwrites.overrides?.hasAdditionalHorizontalPadding,
104
+ },
105
+ state: toPressableInteractionState(pressableState),
106
+ })
107
+
108
+ return {
109
+ container: createStyleResolver((pressableState: PressableState): PressableContainerStyle => ({
110
+ ...StyleAdapterUtils.container(resolvePressable(pressableState).container),
111
+ ...StyleAdapterUtils.container(pressableOverwrites.container = {}),
112
+ })),
113
+ stateLayer: createStyleResolver((pressableState: PressableState): PressableStateLayerStyle => ({
114
+ ...StyleAdapterUtils.container(resolvePressable(pressableState).stateLayer),
115
+ position: 'absolute',
116
+ top: 0,
117
+ right: 0,
118
+ bottom: 0,
119
+ left: 0,
120
+ ...StyleAdapterUtils.container(pressableOverwrites.stateLayer = {}),
121
+ })),
122
+ text: createStyleResolver((pressableState: PressableState): PressableTextStyle => ({
123
+ ...StyleAdapterUtils.text(resolvePressable(pressableState).text),
124
+ ...StyleAdapterUtils.text(pressableOverwrites.text = {}),
125
+ })),
126
+ icon: createValueResolver((pressableState: PressableState): PressableIconStyle => ({
127
+ ...StyleAdapterUtils.icon(resolvePressable(pressableState).icon),
128
+ ...StyleAdapterUtils.icon(pressableOverwrites.icon = {}),
129
+ })),
130
+ }
131
+ }),
84
132
  }
85
133
  }
@@ -2,8 +2,6 @@ import type {
2
2
  CheckboxState as DesignCheckboxState,
3
3
  CheckboxStateValue
4
4
  } from '@helpwave/hightide-design/component-token-resolvers'
5
- import { toContainerStyle } from '../adapters/container-adapter'
6
- import { toIconStyle } from '../adapters/icon-style-adapter'
7
5
  import type {
8
6
  CheckboxIconStyle,
9
7
  CheckboxState,
@@ -17,6 +15,8 @@ import {
17
15
  type ComponentThemeResolver
18
16
  } from '../types/resolver'
19
17
 
18
+ import { StyleAdapterUtils } from '../adapters'
19
+
20
20
  const toDesignCheckboxState = (state: CheckboxState): DesignCheckboxState => {
21
21
  const active = new Set<CheckboxStateValue>()
22
22
 
@@ -73,11 +73,11 @@ export const toCheckboxThemeResolvers: ComponentThemeResolver<CheckboxThemeResol
73
73
 
74
74
  return {
75
75
  container: createStyleResolver((state: CheckboxState): CheckboxStyle => (
76
- toContainerStyle(resolve(state).container)
76
+ StyleAdapterUtils.container(resolve(state).container)
77
77
  )),
78
78
  stateLayer: createStyleResolver((state: CheckboxState): CheckboxStateLayerStyle => {
79
79
  const tokens = resolve(state)
80
- const containerStyle = toContainerStyle(tokens.container)
80
+ const containerStyle = StyleAdapterUtils.container(tokens.container)
81
81
  const touchTargetSize = semanticTokens.touchTargetSize({ themeTokens })
82
82
  const width = toNumberSize(containerStyle.width as string | number | undefined)
83
83
  const height = toNumberSize(containerStyle.height as string | number | undefined)
@@ -85,7 +85,7 @@ export const toCheckboxThemeResolvers: ComponentThemeResolver<CheckboxThemeResol
85
85
  const vertical = Math.max(0, touchTargetSize - height) / 2
86
86
 
87
87
  return {
88
- ...toContainerStyle(tokens.stateLayer),
88
+ ...StyleAdapterUtils.container(tokens.stateLayer),
89
89
  position: 'absolute',
90
90
  top: 0,
91
91
  right: 0,
@@ -98,7 +98,7 @@ export const toCheckboxThemeResolvers: ComponentThemeResolver<CheckboxThemeResol
98
98
  }
99
99
  }),
100
100
  icon: createValueResolver((state: CheckboxState): CheckboxIconStyle => (
101
- toIconStyle(resolve(state).icon)
101
+ StyleAdapterUtils.icon(resolve(state).icon)
102
102
  )),
103
103
  }
104
104
  }
@@ -1,6 +1,5 @@
1
- import { toContainerStyle } from '../adapters/container-adapter'
2
- import { toTextStyle } from '../adapters/text-style-adapter'
3
1
  import type {
2
+ ChipIconStyle,
4
3
  ChipState,
5
4
  ChipStyle,
6
5
  ChipTextStyle,
@@ -8,9 +7,12 @@ import type {
8
7
  } from '../types/components/chip'
9
8
  import {
10
9
  createStyleResolver,
10
+ createValueResolver,
11
11
  type ComponentThemeResolver
12
12
  } from '../types/resolver'
13
13
 
14
+ import { StyleAdapterUtils } from '../adapters'
15
+
14
16
  export const toChipThemeResolvers: ComponentThemeResolver<ChipThemeResolvers> = ({
15
17
  themeTokens,
16
18
  semanticTokens,
@@ -28,10 +30,13 @@ export const toChipThemeResolvers: ComponentThemeResolver<ChipThemeResolvers> =
28
30
 
29
31
  return {
30
32
  chip: createStyleResolver((state: ChipState): ChipStyle => (
31
- toContainerStyle(resolve(state).container)
33
+ StyleAdapterUtils.container(resolve(state).container)
34
+ )),
35
+ icon: createValueResolver((state: ChipState): ChipIconStyle => (
36
+ StyleAdapterUtils.icon(resolve(state).icon)
32
37
  )),
33
38
  text: createStyleResolver((state: ChipState): ChipTextStyle => (
34
- toTextStyle(resolve(state).text)
39
+ StyleAdapterUtils.text(resolve(state).text)
35
40
  )),
36
41
  }
37
42
  }
@@ -1,4 +1,3 @@
1
- import { toContainerStyle } from '../adapters/container-adapter'
2
1
  import type {
3
2
  DividerState,
4
3
  DividerStyle,
@@ -9,6 +8,8 @@ import {
9
8
  type ComponentThemeResolver
10
9
  } from '../types/resolver'
11
10
 
11
+ import { StyleAdapterUtils } from '../adapters'
12
+
12
13
  export const toDividerThemeResolvers: ComponentThemeResolver<DividerThemeResolvers> = ({
13
14
  themeTokens,
14
15
  semanticTokens,
@@ -27,8 +28,7 @@ export const toDividerThemeResolvers: ComponentThemeResolver<DividerThemeResolve
27
28
 
28
29
  return {
29
30
  container: createStyleResolver((state: DividerState): DividerStyle => ({
30
- ...toContainerStyle(resolve(state)),
31
- alignSelf: 'stretch',
31
+ ...StyleAdapterUtils.container(resolve(state)),
32
32
  })),
33
33
  }
34
34
  }
@@ -1,11 +1,7 @@
1
- import { toContainerStyle } from '../adapters/container-adapter'
2
- import { toIconStyle } from '../adapters/icon-style-adapter'
3
- import { toTextStyle } from '../adapters/text-style-adapter'
4
1
  import type {
5
2
  IconButtonIconStyle,
6
3
  IconButtonState,
7
4
  IconButtonStyle,
8
- IconButtonTextStyle,
9
5
  IconButtonThemeResolvers
10
6
  } from '../types/components/iconButton'
11
7
  import {
@@ -15,6 +11,8 @@ import {
15
11
  type ComponentThemeResolver
16
12
  } from '../types/resolver'
17
13
 
14
+ import { StyleAdapterUtils } from '../adapters'
15
+
18
16
  export const toIconButtonThemeResolvers: ComponentThemeResolver<IconButtonThemeResolvers> = ({
19
17
  themeTokens,
20
18
  semanticTokens,
@@ -33,12 +31,12 @@ export const toIconButtonThemeResolvers: ComponentThemeResolver<IconButtonThemeR
33
31
 
34
32
  return {
35
33
  container: createStyleResolver((state: IconButtonState): IconButtonStyle => ({
36
- ...toContainerStyle(resolve(state).container),
34
+ ...StyleAdapterUtils.container(resolve(state).container),
37
35
  })),
38
36
  stateLayer: createStyleResolver((state: IconButtonState): IconButtonStyle => {
39
37
  const tokens = resolve(state)
40
38
  return {
41
- ...toContainerStyle(tokens.stateLayer),
39
+ ...StyleAdapterUtils.container(tokens.stateLayer),
42
40
  position: 'absolute',
43
41
  top: 0,
44
42
  right: 0,
@@ -47,10 +45,7 @@ export const toIconButtonThemeResolvers: ComponentThemeResolver<IconButtonThemeR
47
45
  }
48
46
  }),
49
47
  icon: createValueResolver((state: IconButtonState): IconButtonIconStyle => (
50
- toIconStyle(resolve(state).icon)
51
- )),
52
- text: createStyleResolver((state: IconButtonState): IconButtonTextStyle => (
53
- toTextStyle(resolve(state).text)
48
+ StyleAdapterUtils.icon(resolve(state).icon)
54
49
  )),
55
50
  }
56
51
  }
@@ -2,9 +2,6 @@ import type {
2
2
  InputState as DesignInputState,
3
3
  InputStateValue
4
4
  } from '@helpwave/hightide-design/component-token-resolvers'
5
- import { toContainerStyleWithStateLayer } from '../adapters/container-adapter'
6
- import { toIconStyle } from '../adapters/icon-style-adapter'
7
- import { toTextStyle } from '../adapters/text-style-adapter'
8
5
  import type {
9
6
  InputContainerStyle,
10
7
  InputIconStyle,
@@ -19,6 +16,9 @@ import {
19
16
  type ComponentThemeResolver
20
17
  } from '../types/resolver'
21
18
 
19
+ import { StyleAdapterUtils } from '../adapters'
20
+ import { HexColorUtils } from '@helpwave/hightide-design/utils'
21
+
22
22
  const toDesignInputState = (state: InputState = {}): DesignInputState => {
23
23
  const active = new Set<InputStateValue>()
24
24
 
@@ -64,16 +64,21 @@ export const toInputThemeResolvers: ComponentThemeResolver<InputThemeResolvers>
64
64
  return {
65
65
  container: createStyleResolver((state: InputState): InputContainerStyle => {
66
66
  const { container, stateLayer } = resolve(state)
67
- return toContainerStyleWithStateLayer(container, stateLayer)
67
+ if(container.backgroundColor && stateLayer.backgroundColor)
68
+ container.backgroundColor = HexColorUtils.blend(
69
+ HexColorUtils.resolveColorToken(container.backgroundColor),
70
+ HexColorUtils.resolveColorToken(stateLayer.backgroundColor)
71
+ )
72
+ return StyleAdapterUtils.container(container)
68
73
  }),
69
74
  text: createStyleResolver((state: InputState): InputTextStyle => (
70
- toTextStyle(resolve(state).text)
75
+ StyleAdapterUtils.text(resolve(state).text)
71
76
  )),
72
77
  placeholder: createStyleResolver((state: InputState): InputPlaceholderStyle => (
73
- toTextStyle(resolve(state).placeholder)
78
+ StyleAdapterUtils.text(resolve(state).placeholder)
74
79
  )),
75
80
  icon: createValueResolver((state: InputState): InputIconStyle => (
76
- toIconStyle(resolve(state).icon)
81
+ StyleAdapterUtils.icon(resolve(state).icon)
77
82
  )),
78
83
  }
79
84
  }
@@ -1,8 +1,6 @@
1
- import { toContainerStyle } from '../adapters/container-adapter'
2
- import { toIconStyle } from '../adapters/icon-style-adapter'
3
- import { toTextStyle } from '../adapters/text-style-adapter'
4
1
  import type {
5
2
  ListActionItemContentStyle,
3
+ ListActionItemDescriptionStyle,
6
4
  ListActionItemIconStyle,
7
5
  ListActionItemLeadingItemContainerStyle,
8
6
  ListActionItemState,
@@ -28,6 +26,8 @@ import {
28
26
  type ComponentThemeResolver
29
27
  } from '../types/resolver'
30
28
 
29
+ import { StyleAdapterUtils } from '../adapters'
30
+
31
31
  const toListItemDefaultThemeResolvers: ComponentThemeResolver<ListItemDefaultThemeResolvers> = ({
32
32
  themeTokens,
33
33
  semanticTokens,
@@ -43,26 +43,26 @@ const toListItemDefaultThemeResolvers: ComponentThemeResolver<ListItemDefaultThe
43
43
 
44
44
  return {
45
45
  container: createStyleResolver((state: ListItemState): ListItemStyle => (
46
- toContainerStyle(resolve(state).container)
46
+ StyleAdapterUtils.container(resolve(state).container)
47
47
  )),
48
48
  leadingItemContainer: createStyleResolver((state: ListItemState): ListItemLeadingItemContainerStyle => (
49
- toContainerStyle(resolve(state).leadingItemContainer)
49
+ StyleAdapterUtils.container(resolve(state).leadingItemContainer)
50
50
  )),
51
51
  content: createStyleResolver((state: ListItemState): ListItemContentStyle => ({
52
- ...toContainerStyle(resolve(state).content),
52
+ ...StyleAdapterUtils.container(resolve(state).content),
53
53
  flex: 1,
54
54
  })),
55
55
  trailingItemContainer: createStyleResolver((state: ListItemState): ListItemTrailingItemContainerStyle => (
56
- toContainerStyle(resolve(state).trailingItemContainer)
56
+ StyleAdapterUtils.container(resolve(state).trailingItemContainer)
57
57
  )),
58
58
  descriptionText: createStyleResolver((state: ListItemState): ListItemDescriptionStyle => (
59
- toTextStyle(resolve(state).descriptionText)
59
+ StyleAdapterUtils.text(resolve(state).descriptionText)
60
60
  )),
61
61
  titleText: createStyleResolver((state: ListItemState): ListItemTitleStyle => (
62
- toTextStyle(resolve(state).titleText)
62
+ StyleAdapterUtils.text(resolve(state).titleText)
63
63
  )),
64
64
  icon: createValueResolver((state: ListItemState): ListItemIconStyle => (
65
- toIconStyle(resolve(state).icon)
65
+ StyleAdapterUtils.icon(resolve(state).icon)
66
66
  )),
67
67
  }
68
68
  }
@@ -83,23 +83,26 @@ const toListActionItemThemeResolvers: ComponentThemeResolver<ListActionItemTheme
83
83
 
84
84
  return {
85
85
  container: createStyleResolver((state: ListActionItemState): ListActionItemStyle => (
86
- toContainerStyle(resolve(state).container)
86
+ StyleAdapterUtils.container(resolve(state).container)
87
87
  )),
88
88
  leadingItemContainer: createStyleResolver((state: ListActionItemState): ListActionItemLeadingItemContainerStyle => (
89
- toContainerStyle(resolve(state).leadingItemContainer)
89
+ StyleAdapterUtils.container(resolve(state).leadingItemContainer)
90
90
  )),
91
91
  content: createStyleResolver((state: ListActionItemState): ListActionItemContentStyle => ({
92
- ...toContainerStyle(resolve(state).content),
92
+ ...StyleAdapterUtils.container(resolve(state).content),
93
93
  flex: 1,
94
94
  })),
95
95
  trailingItemContainer: createStyleResolver((state: ListActionItemState): ListActionItemTrailingItemContainerStyle => (
96
- toContainerStyle(resolve(state).trailingItemContainer)
96
+ StyleAdapterUtils.container(resolve(state).trailingItemContainer)
97
97
  )),
98
98
  titleText: createStyleResolver((state: ListActionItemState): ListActionItemTitleStyle => (
99
- toTextStyle(resolve(state).titleText)
99
+ StyleAdapterUtils.text(resolve(state).titleText)
100
+ )),
101
+ descriptionText: createStyleResolver((state: ListActionItemState): ListActionItemDescriptionStyle => (
102
+ StyleAdapterUtils.text(resolve(state).descriptionText)
100
103
  )),
101
104
  icon: createValueResolver((state: ListActionItemState): ListActionItemIconStyle => (
102
- toIconStyle(resolve(state).icon)
105
+ StyleAdapterUtils.icon(resolve(state).icon)
103
106
  )),
104
107
  }
105
108
  }
@@ -2,9 +2,6 @@ import type {
2
2
  MultiSelectState as DesignMultiSelectState,
3
3
  MultiSelectStateValue
4
4
  } from '@helpwave/hightide-design/component-token-resolvers'
5
- import { toContainerStyle, toContainerStyleWithStateLayer } from '../adapters/container-adapter'
6
- import { toIconStyle } from '../adapters/icon-style-adapter'
7
- import { toTextStyle } from '../adapters/text-style-adapter'
8
5
  import type {
9
6
  MultiSelectCheckboxIconStyle,
10
7
  MultiSelectCheckboxStyle,
@@ -30,6 +27,8 @@ import {
30
27
  type ComponentThemeResolver
31
28
  } from '../types/resolver'
32
29
 
30
+ import { StyleAdapterUtils } from '../adapters'
31
+
33
32
  type MultiSelectResolveState = {
34
33
  color?: MultiSelectState['color'],
35
34
  isDisabled?: boolean,
@@ -119,25 +118,33 @@ export const toMultiSelectThemeResolvers: ComponentThemeResolver<MultiSelectThem
119
118
  })
120
119
 
121
120
  return {
122
- trigger: createStyleResolver((state: MultiSelectState): MultiSelectTriggerStyle => {
123
- const { trigger, stateLayer } = resolve(toTriggerState(state))
124
- return toContainerStyleWithStateLayer(trigger, stateLayer)
125
- }),
121
+ trigger: createStyleResolver((state: MultiSelectState): MultiSelectTriggerStyle => ({
122
+ ...StyleAdapterUtils.container(resolve(toTriggerState(state)).trigger),
123
+ overflow: 'hidden',
124
+ })),
125
+ stateLayer: createStyleResolver((state: MultiSelectState): MultiSelectTriggerStyle => ({
126
+ ...StyleAdapterUtils.container(resolve(toTriggerState(state)).stateLayer),
127
+ position: 'absolute',
128
+ top: 0,
129
+ right: 0,
130
+ bottom: 0,
131
+ left: 0,
132
+ })),
126
133
  triggerText: createStyleResolver((state: MultiSelectState): SelectTriggerTextStyle => (
127
- toTextStyle(resolve(toTriggerState(state)).triggerText)
134
+ StyleAdapterUtils.text(resolve(toTriggerState(state)).triggerText)
128
135
  )),
129
136
  overlay: createSimpleStyleResolver((): SelectOverlayStyle => ({
130
- ...toContainerStyle(resolve().overlay),
137
+ ...StyleAdapterUtils.container(resolve().overlay),
131
138
  flex: 1,
132
139
  })),
133
140
  menu: createStyleResolver((state: SelectMenuState): SelectMenuStyle => (
134
- toContainerStyle(resolve({ hasSearch: state.hasSearch }).menu)
141
+ StyleAdapterUtils.container(resolve({ hasSearch: state.hasSearch }).menu)
135
142
  )),
136
143
  header: createSimpleStyleResolver((): SelectHeaderStyle => (
137
- toContainerStyle(resolve().header)
144
+ StyleAdapterUtils.container(resolve().header)
138
145
  )),
139
146
  option: createStyleResolver((state: MultiSelectOptionState): MultiSelectOptionStyle => (
140
- toContainerStyle(resolve({
147
+ StyleAdapterUtils.container(resolve({
141
148
  color: state.color,
142
149
  isDisabled: state.isDisabled,
143
150
  isSelected: state.isSelected,
@@ -145,7 +152,7 @@ export const toMultiSelectThemeResolvers: ComponentThemeResolver<MultiSelectThem
145
152
  }).option)
146
153
  )),
147
154
  optionText: createStyleResolver((state: MultiSelectOptionState): MultiSelectOptionTextStyle => (
148
- toTextStyle(resolve({
155
+ StyleAdapterUtils.text(resolve({
149
156
  color: state.color,
150
157
  isDisabled: state.isDisabled,
151
158
  isSelected: state.isSelected,
@@ -153,10 +160,10 @@ export const toMultiSelectThemeResolvers: ComponentThemeResolver<MultiSelectThem
153
160
  }).optionText)
154
161
  )),
155
162
  emptyText: createSimpleStyleResolver((): SelectEmptyTextStyle => (
156
- toTextStyle(resolve().emptyText)
163
+ StyleAdapterUtils.text(resolve().emptyText)
157
164
  )),
158
165
  checkbox: createStyleResolver((state: MultiSelectOptionState): MultiSelectCheckboxStyle => (
159
- toContainerStyle(resolve({
166
+ StyleAdapterUtils.container(resolve({
160
167
  color: state.color,
161
168
  isDisabled: state.isDisabled,
162
169
  isSelected: state.isSelected,
@@ -164,7 +171,7 @@ export const toMultiSelectThemeResolvers: ComponentThemeResolver<MultiSelectThem
164
171
  }).checkbox)
165
172
  )),
166
173
  checkboxIcon: createValueResolver((state: MultiSelectOptionState): MultiSelectCheckboxIconStyle => (
167
- toIconStyle(resolve({
174
+ StyleAdapterUtils.icon(resolve({
168
175
  color: state.color,
169
176
  isDisabled: state.isDisabled,
170
177
  isSelected: state.isSelected,
@@ -3,8 +3,6 @@ import type {
3
3
  InputStateValue
4
4
  } from '@helpwave/hightide-design/component-token-resolvers'
5
5
  import type { ColorPairToken } from '@helpwave/hightide-design/theme-tokens'
6
- import { toContainerStyle, toContainerStyleWithStateLayer } from '../adapters/container-adapter'
7
- import { toTextStyle } from '../adapters/text-style-adapter'
8
6
  import type {
9
7
  SearchBarContainerStyle,
10
8
  SearchBarIconButtonStyle,
@@ -19,6 +17,9 @@ import {
19
17
  type ComponentThemeResolver
20
18
  } from '../types/resolver'
21
19
 
20
+ import { StyleAdapterUtils } from '../adapters'
21
+ import { HexColorUtils } from '@helpwave/hightide-design/utils'
22
+
22
23
  const toDesignSearchBarState = (state: SearchBarState = {}): DesignInputState => {
23
24
  const active = new Set<InputStateValue>()
24
25
 
@@ -63,7 +64,7 @@ export const toSearchBarThemeResolvers: ComponentThemeResolver<SearchBarThemeRes
63
64
 
64
65
  return {
65
66
  container: createStyleResolver((state: SearchBarState): SearchBarContainerStyle => ({
66
- ...toContainerStyle(resolve(state).container),
67
+ ...StyleAdapterUtils.container(resolve(state).container),
67
68
  position: 'relative',
68
69
  justifyContent: 'center',
69
70
  })),
@@ -71,7 +72,13 @@ export const toSearchBarThemeResolvers: ComponentThemeResolver<SearchBarThemeRes
71
72
  const tokens = resolve(state)
72
73
  const { container, stateLayer, text } = tokens.input
73
74
  // TODO remove this computation with a better solution
74
- const base = toContainerStyleWithStateLayer(container, stateLayer)
75
+ if(container.backgroundColor && stateLayer.backgroundColor)
76
+ container.backgroundColor = HexColorUtils.blend(
77
+ HexColorUtils.resolveColorToken(container.backgroundColor),
78
+ HexColorUtils.resolveColorToken(stateLayer.backgroundColor)
79
+ )
80
+
81
+ const base = StyleAdapterUtils.container(container)
75
82
  const horizontalPadding = typeof base.paddingLeft === 'number'
76
83
  ? base.paddingLeft
77
84
  : typeof base.paddingRight === 'number'
@@ -87,17 +94,17 @@ export const toSearchBarThemeResolvers: ComponentThemeResolver<SearchBarThemeRes
87
94
 
88
95
  return {
89
96
  ...base,
90
- ...toTextStyle(text),
97
+ ...StyleAdapterUtils.text(text),
91
98
  paddingLeft: horizontalPadding,
92
99
  paddingRight: horizontalPadding + trailingInset,
93
100
  }
94
101
  }),
95
102
  placeholder: createStyleResolver((state: SearchBarState): SearchBarPlaceholderStyle => (
96
- toTextStyle(resolve(state).input.placeholder)
103
+ StyleAdapterUtils.text(resolve(state).input.placeholder)
97
104
  )),
98
105
  iconButton: createStyleResolver((state: SearchBarState): SearchBarIconButtonStyle => {
99
106
  const { iconButton } = resolve(state)
100
- const style = toContainerStyle(iconButton)
107
+ const style = StyleAdapterUtils.container(iconButton)
101
108
 
102
109
  return {
103
110
  ...style,
@@ -2,9 +2,6 @@ import type {
2
2
  SelectState as DesignSelectState,
3
3
  SelectStateValue
4
4
  } from '@helpwave/hightide-design/component-token-resolvers'
5
- import { toContainerStyle, toContainerStyleWithStateLayer } from '../adapters/container-adapter'
6
- import { toIconStyle } from '../adapters/icon-style-adapter'
7
- import { toTextStyle } from '../adapters/text-style-adapter'
8
5
  import type {
9
6
  SelectIconStyle,
10
7
  SelectMenuStyle,
@@ -27,6 +24,8 @@ import {
27
24
  type ComponentThemeResolver
28
25
  } from '../types/resolver'
29
26
 
27
+ import { StyleAdapterUtils } from '../adapters'
28
+
30
29
  type SelectResolveState = {
31
30
  color?: SelectState['color'],
32
31
  isDisabled?: boolean,
@@ -114,28 +113,36 @@ export const toSelectThemeResolvers: ComponentThemeResolver<SelectThemeResolvers
114
113
  })
115
114
 
116
115
  return {
117
- trigger: createStyleResolver((state: SelectState): SelectTriggerStyle => {
118
- const { trigger, stateLayer } = resolve(toTriggerState(state))
119
- return toContainerStyleWithStateLayer(trigger, stateLayer)
120
- }),
116
+ trigger: createStyleResolver((state: SelectState): SelectTriggerStyle => ({
117
+ ...StyleAdapterUtils.container(resolve(toTriggerState(state)).trigger),
118
+ overflow: 'hidden',
119
+ })),
120
+ stateLayer: createStyleResolver((state: SelectState): SelectTriggerStyle => ({
121
+ ...StyleAdapterUtils.container(resolve(toTriggerState(state)).stateLayer),
122
+ position: 'absolute',
123
+ top: 0,
124
+ right: 0,
125
+ bottom: 0,
126
+ left: 0,
127
+ })),
121
128
  triggerText: createStyleResolver((state: SelectState): SelectTriggerTextStyle => (
122
- toTextStyle(resolve(toTriggerState(state)).triggerText)
129
+ StyleAdapterUtils.text(resolve(toTriggerState(state)).triggerText)
123
130
  )),
124
131
  icon: createValueResolver((state: SelectState): SelectIconStyle => (
125
- toIconStyle(resolve(toTriggerState(state)).icon)
132
+ StyleAdapterUtils.icon(resolve(toTriggerState(state)).icon)
126
133
  )),
127
134
  overlay: createSimpleStyleResolver((): SelectOverlayStyle => ({
128
- ...toContainerStyle(resolve().overlay),
135
+ ...StyleAdapterUtils.container(resolve().overlay),
129
136
  flex: 1,
130
137
  })),
131
138
  menu: createStyleResolver((state: SelectMenuState): SelectMenuStyle => (
132
- toContainerStyle(resolve({ hasSearch: state.hasSearch }).menu)
139
+ StyleAdapterUtils.container(resolve({ hasSearch: state.hasSearch }).menu)
133
140
  )),
134
141
  header: createSimpleStyleResolver((): SelectHeaderStyle => (
135
- toContainerStyle(resolve().header)
142
+ StyleAdapterUtils.container(resolve().header)
136
143
  )),
137
144
  option: createStyleResolver((state: SelectOptionState): SelectOptionStyle => (
138
- toContainerStyle(resolve({
145
+ StyleAdapterUtils.container(resolve({
139
146
  color: state.color,
140
147
  isDisabled: state.isDisabled,
141
148
  isSelected: state.isSelected,
@@ -143,7 +150,7 @@ export const toSelectThemeResolvers: ComponentThemeResolver<SelectThemeResolvers
143
150
  }).option)
144
151
  )),
145
152
  optionText: createStyleResolver((state: SelectOptionState): SelectOptionTextStyle => (
146
- toTextStyle(resolve({
153
+ StyleAdapterUtils.text(resolve({
147
154
  color: state.color,
148
155
  isDisabled: state.isDisabled,
149
156
  isSelected: state.isSelected,
@@ -151,7 +158,7 @@ export const toSelectThemeResolvers: ComponentThemeResolver<SelectThemeResolvers
151
158
  }).optionText)
152
159
  )),
153
160
  emptyText: createSimpleStyleResolver((): SelectEmptyTextStyle => (
154
- toTextStyle(resolve().emptyText)
161
+ StyleAdapterUtils.text(resolve().emptyText)
155
162
  )),
156
163
  }
157
164
  }