@ankhorage/surface 1.4.0 → 2.0.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 (203) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/dist/components/badge/Badge.d.ts +1 -1
  3. package/dist/components/badge/Badge.d.ts.map +1 -1
  4. package/dist/components/badge/Badge.js +3 -3
  5. package/dist/components/badge/Badge.js.map +1 -1
  6. package/dist/components/badge/types.d.ts +2 -2
  7. package/dist/components/badge/types.d.ts.map +1 -1
  8. package/dist/components/badge/types.js.map +1 -1
  9. package/dist/components/button/Button.d.ts +1 -1
  10. package/dist/components/button/Button.d.ts.map +1 -1
  11. package/dist/components/button/Button.js +6 -3
  12. package/dist/components/button/Button.js.map +1 -1
  13. package/dist/components/button/types.d.ts +2 -2
  14. package/dist/components/button/types.d.ts.map +1 -1
  15. package/dist/components/button/types.js.map +1 -1
  16. package/dist/components/checkbox/Checkbox.d.ts +1 -1
  17. package/dist/components/checkbox/Checkbox.d.ts.map +1 -1
  18. package/dist/components/checkbox/Checkbox.js +7 -4
  19. package/dist/components/checkbox/Checkbox.js.map +1 -1
  20. package/dist/components/checkbox/types.d.ts +2 -2
  21. package/dist/components/checkbox/types.d.ts.map +1 -1
  22. package/dist/components/checkbox/types.js.map +1 -1
  23. package/dist/components/field/Field.d.ts.map +1 -1
  24. package/dist/components/field/Field.js +6 -2
  25. package/dist/components/field/Field.js.map +1 -1
  26. package/dist/components/helper-text/HelperText.d.ts +1 -1
  27. package/dist/components/helper-text/HelperText.d.ts.map +1 -1
  28. package/dist/components/helper-text/HelperText.js +2 -2
  29. package/dist/components/helper-text/HelperText.js.map +1 -1
  30. package/dist/components/helper-text/types.d.ts +3 -2
  31. package/dist/components/helper-text/types.d.ts.map +1 -1
  32. package/dist/components/helper-text/types.js.map +1 -1
  33. package/dist/components/icon-button/IconButton.d.ts +1 -1
  34. package/dist/components/icon-button/IconButton.d.ts.map +1 -1
  35. package/dist/components/icon-button/IconButton.js +2 -2
  36. package/dist/components/icon-button/IconButton.js.map +1 -1
  37. package/dist/components/icon-button/types.d.ts +2 -2
  38. package/dist/components/icon-button/types.d.ts.map +1 -1
  39. package/dist/components/icon-button/types.js.map +1 -1
  40. package/dist/components/label/Label.d.ts +1 -1
  41. package/dist/components/label/Label.d.ts.map +1 -1
  42. package/dist/components/label/Label.js +3 -3
  43. package/dist/components/label/Label.js.map +1 -1
  44. package/dist/components/label/types.d.ts +3 -2
  45. package/dist/components/label/types.d.ts.map +1 -1
  46. package/dist/components/label/types.js.map +1 -1
  47. package/dist/components/list-item/ListItem.js +1 -1
  48. package/dist/components/list-item/ListItem.js.map +1 -1
  49. package/dist/components/menu/Menu.d.ts.map +1 -1
  50. package/dist/components/menu/Menu.js +1 -3
  51. package/dist/components/menu/Menu.js.map +1 -1
  52. package/dist/components/navigation/NavigationItem.d.ts.map +1 -1
  53. package/dist/components/navigation/NavigationItem.js +1 -1
  54. package/dist/components/navigation/NavigationItem.js.map +1 -1
  55. package/dist/components/navigation/TabBarItem.d.ts.map +1 -1
  56. package/dist/components/navigation/TabBarItem.js +1 -1
  57. package/dist/components/navigation/TabBarItem.js.map +1 -1
  58. package/dist/components/radio/Radio.d.ts +1 -1
  59. package/dist/components/radio/Radio.d.ts.map +1 -1
  60. package/dist/components/radio/Radio.js +4 -3
  61. package/dist/components/radio/Radio.js.map +1 -1
  62. package/dist/components/radio/types.d.ts +2 -2
  63. package/dist/components/radio/types.d.ts.map +1 -1
  64. package/dist/components/radio/types.js.map +1 -1
  65. package/dist/components/switch/Switch.d.ts +1 -1
  66. package/dist/components/switch/Switch.d.ts.map +1 -1
  67. package/dist/components/switch/Switch.js +4 -3
  68. package/dist/components/switch/Switch.js.map +1 -1
  69. package/dist/components/switch/types.d.ts +2 -2
  70. package/dist/components/switch/types.d.ts.map +1 -1
  71. package/dist/components/switch/types.js.map +1 -1
  72. package/dist/components/tabs/Tab.d.ts.map +1 -1
  73. package/dist/components/tabs/Tab.js +1 -1
  74. package/dist/components/tabs/Tab.js.map +1 -1
  75. package/dist/components/toast/Toast.d.ts +1 -1
  76. package/dist/components/toast/Toast.d.ts.map +1 -1
  77. package/dist/components/toast/Toast.js +34 -9
  78. package/dist/components/toast/Toast.js.map +1 -1
  79. package/dist/components/toast/ToastProvider.js +1 -1
  80. package/dist/components/toast/ToastProvider.js.map +1 -1
  81. package/dist/components/toast/index.d.ts +1 -1
  82. package/dist/components/toast/index.d.ts.map +1 -1
  83. package/dist/components/toast/index.js.map +1 -1
  84. package/dist/components/toast/types.d.ts +3 -2
  85. package/dist/components/toast/types.d.ts.map +1 -1
  86. package/dist/components/toast/types.js.map +1 -1
  87. package/dist/components/tooltip/Tooltip.js +1 -1
  88. package/dist/components/tooltip/Tooltip.js.map +1 -1
  89. package/dist/examples/DocsExamples.js +4 -4
  90. package/dist/examples/DocsExamples.js.map +1 -1
  91. package/dist/index.d.ts +3 -1
  92. package/dist/index.d.ts.map +1 -1
  93. package/dist/index.js +1 -0
  94. package/dist/index.js.map +1 -1
  95. package/dist/internal/resolvers/index.d.ts +1 -1
  96. package/dist/internal/resolvers/index.d.ts.map +1 -1
  97. package/dist/internal/resolvers/index.js +1 -1
  98. package/dist/internal/resolvers/index.js.map +1 -1
  99. package/dist/internal/resolvers/resolveFieldPresentation.d.ts +5 -5
  100. package/dist/internal/resolvers/resolveFieldPresentation.d.ts.map +1 -1
  101. package/dist/internal/resolvers/resolveFieldPresentation.js +8 -6
  102. package/dist/internal/resolvers/resolveFieldPresentation.js.map +1 -1
  103. package/dist/internal/resolvers/resolveInteractiveColors.d.ts +3 -3
  104. package/dist/internal/resolvers/resolveInteractiveColors.d.ts.map +1 -1
  105. package/dist/internal/resolvers/resolveInteractiveColors.js +4 -6
  106. package/dist/internal/resolvers/resolveInteractiveColors.js.map +1 -1
  107. package/dist/internal/resolvers/resolveSelectionControlColors.d.ts +3 -3
  108. package/dist/internal/resolvers/resolveSelectionControlColors.d.ts.map +1 -1
  109. package/dist/internal/resolvers/resolveSelectionControlColors.js +4 -4
  110. package/dist/internal/resolvers/resolveSelectionControlColors.js.map +1 -1
  111. package/dist/internal/resolvers/resolveSurfaceColor.d.ts +4 -0
  112. package/dist/internal/resolvers/resolveSurfaceColor.d.ts.map +1 -0
  113. package/dist/internal/resolvers/resolveSurfaceColor.js +26 -0
  114. package/dist/internal/resolvers/resolveSurfaceColor.js.map +1 -0
  115. package/dist/internal/resolvers/resolveTextColor.d.ts +2 -3
  116. package/dist/internal/resolvers/resolveTextColor.d.ts.map +1 -1
  117. package/dist/internal/resolvers/resolveTextColor.js +7 -11
  118. package/dist/internal/resolvers/resolveTextColor.js.map +1 -1
  119. package/dist/primitives/heading/Heading.d.ts.map +1 -1
  120. package/dist/primitives/heading/Heading.js +2 -2
  121. package/dist/primitives/heading/Heading.js.map +1 -1
  122. package/dist/primitives/heading/resolveHeadingStyle.d.ts +2 -1
  123. package/dist/primitives/heading/resolveHeadingStyle.d.ts.map +1 -1
  124. package/dist/primitives/heading/resolveHeadingStyle.js +2 -2
  125. package/dist/primitives/heading/resolveHeadingStyle.js.map +1 -1
  126. package/dist/primitives/heading/types.d.ts +3 -0
  127. package/dist/primitives/heading/types.d.ts.map +1 -1
  128. package/dist/primitives/heading/types.js.map +1 -1
  129. package/dist/primitives/text/Text.d.ts +1 -1
  130. package/dist/primitives/text/Text.d.ts.map +1 -1
  131. package/dist/primitives/text/Text.js +2 -2
  132. package/dist/primitives/text/Text.js.map +1 -1
  133. package/dist/primitives/text/types.d.ts +3 -3
  134. package/dist/primitives/text/types.d.ts.map +1 -1
  135. package/dist/primitives/text/types.js.map +1 -1
  136. package/dist/surfaceColor.d.ts +9 -0
  137. package/dist/surfaceColor.d.ts.map +1 -0
  138. package/dist/surfaceColor.js +15 -0
  139. package/dist/surfaceColor.js.map +1 -0
  140. package/dist/theme/colorEngine.d.ts.map +1 -1
  141. package/dist/theme/colorEngine.js +9 -1
  142. package/dist/theme/colorEngine.js.map +1 -1
  143. package/dist/theme/types.d.ts +5 -0
  144. package/dist/theme/types.d.ts.map +1 -1
  145. package/dist/theme/types.js.map +1 -1
  146. package/package.json +1 -1
  147. package/src/components/badge/Badge.tsx +8 -3
  148. package/src/components/badge/types.ts +2 -2
  149. package/src/components/button/Button.tsx +9 -3
  150. package/src/components/button/types.ts +2 -2
  151. package/src/components/checkbox/Checkbox.tsx +13 -4
  152. package/src/components/checkbox/types.ts +2 -2
  153. package/src/components/field/Field.tsx +11 -3
  154. package/src/components/helper-text/HelperText.tsx +2 -2
  155. package/src/components/helper-text/types.ts +3 -2
  156. package/src/components/icon-button/IconButton.tsx +2 -2
  157. package/src/components/icon-button/types.ts +2 -2
  158. package/src/components/label/Label.tsx +9 -3
  159. package/src/components/label/types.ts +3 -2
  160. package/src/components/list-item/ListItem.tsx +1 -1
  161. package/src/components/menu/Menu.tsx +1 -8
  162. package/src/components/navigation/NavigationItem.tsx +2 -1
  163. package/src/components/navigation/TabBarItem.tsx +2 -1
  164. package/src/components/radio/Radio.tsx +5 -3
  165. package/src/components/radio/types.ts +2 -2
  166. package/src/components/switch/Switch.tsx +5 -3
  167. package/src/components/switch/types.ts +2 -2
  168. package/src/components/tabs/Tab.tsx +1 -5
  169. package/src/components/toast/Toast.tsx +38 -10
  170. package/src/components/toast/ToastProvider.tsx +1 -1
  171. package/src/components/toast/index.ts +1 -1
  172. package/src/components/toast/types.ts +4 -2
  173. package/src/components/tooltip/Tooltip.tsx +1 -1
  174. package/src/examples/DocsExamples.tsx +4 -4
  175. package/src/index.test.ts +1 -0
  176. package/src/index.ts +13 -1
  177. package/src/internal/resolvers/index.ts +1 -1
  178. package/src/internal/resolvers/resolveFieldPresentation.test.ts +12 -10
  179. package/src/internal/resolvers/resolveFieldPresentation.ts +13 -11
  180. package/src/internal/resolvers/resolveInteractiveColors.test.ts +4 -4
  181. package/src/internal/resolvers/resolveInteractiveColors.ts +6 -7
  182. package/src/internal/resolvers/resolveSelectionControlColors.test.ts +8 -8
  183. package/src/internal/resolvers/resolveSelectionControlColors.ts +6 -5
  184. package/src/internal/resolvers/resolveSurfaceColor.test.ts +21 -0
  185. package/src/internal/resolvers/resolveSurfaceColor.ts +31 -0
  186. package/src/internal/resolvers/resolveTextColor.test.ts +16 -5
  187. package/src/internal/resolvers/resolveTextColor.ts +10 -22
  188. package/src/primitives/heading/Heading.tsx +3 -1
  189. package/src/primitives/heading/resolveHeadingStyle.test.ts +1 -1
  190. package/src/primitives/heading/resolveHeadingStyle.ts +4 -1
  191. package/src/primitives/heading/types.ts +4 -0
  192. package/src/primitives/text/Text.tsx +2 -2
  193. package/src/primitives/text/types.ts +3 -3
  194. package/src/surfaceColor.test.ts +46 -0
  195. package/src/surfaceColor.ts +22 -0
  196. package/src/theme/colorEngine.test.ts +6 -0
  197. package/src/theme/colorEngine.ts +9 -1
  198. package/src/theme/types.ts +5 -0
  199. package/dist/internal/resolvers/resolveTone.d.ts +0 -4
  200. package/dist/internal/resolvers/resolveTone.d.ts.map +0 -1
  201. package/dist/internal/resolvers/resolveTone.js +0 -16
  202. package/dist/internal/resolvers/resolveTone.js.map +0 -1
  203. package/src/internal/resolvers/resolveTone.ts +0 -19
@@ -12,7 +12,7 @@ import type { ButtonProps } from './types';
12
12
  export function Button({
13
13
  children,
14
14
  variant = 'solid',
15
- tone = 'primary',
15
+ color = 'primary',
16
16
  size = 'm',
17
17
  disabled = false,
18
18
  loading = false,
@@ -41,9 +41,14 @@ export function Button({
41
41
  {(state) => {
42
42
  const colors = resolveButtonColors(theme, {
43
43
  variant,
44
- tone,
44
+ color,
45
45
  state,
46
46
  });
47
+ const textEmphasis =
48
+ colors.contentColor === theme.semantics.content.muted ? 'muted' : 'default';
49
+ const resolvedTextColor = textEmphasis === 'muted' ? undefined : color;
50
+ const resolvedTextEmphasis =
51
+ textEmphasis === 'muted' ? 'muted' : variant === 'solid' ? 'inverse' : 'default';
47
52
  const iconSize = resolveIconSize(theme, size);
48
53
 
49
54
  return (
@@ -78,7 +83,8 @@ export function Button({
78
83
  </View>
79
84
  ) : null}
80
85
  <Text
81
- color={colors.contentColor}
86
+ color={resolvedTextColor}
87
+ emphasis={resolvedTextEmphasis}
82
88
  variant={controlSize.textVariant}
83
89
  weight="semiBold"
84
90
  >
@@ -2,9 +2,9 @@ import type React from 'react';
2
2
 
3
3
  import type { ControlSize } from '../../internal/resolvers/resolveControlSize';
4
4
  import type { ButtonVariant } from '../../internal/resolvers/resolveInteractiveColors';
5
- import type { ComponentTone } from '../../internal/resolvers/resolveTone';
6
5
  import type { ButtonBaseProps } from '../../primitives/button-base';
7
6
  import type { IconProps } from '../../primitives/icon';
7
+ import type { SurfaceColor } from '../../surfaceColor';
8
8
 
9
9
  export interface ButtonIconSpec {
10
10
  name: IconProps['name'];
@@ -17,7 +17,7 @@ export interface ButtonProps extends Omit<
17
17
  > {
18
18
  children?: React.ReactNode;
19
19
  variant?: ButtonVariant;
20
- tone?: ComponentTone;
20
+ color?: SurfaceColor;
21
21
  size?: ControlSize;
22
22
  loading?: boolean;
23
23
  leadingIcon?: ButtonIconSpec;
@@ -18,7 +18,7 @@ export function Checkbox({
18
18
  checked,
19
19
  defaultChecked = false,
20
20
  onCheckedChange,
21
- tone = 'primary',
21
+ color = 'primary',
22
22
  size = 'm',
23
23
  disabled = false,
24
24
  invalid = false,
@@ -69,8 +69,12 @@ export function Checkbox({
69
69
  fieldState,
70
70
  hovered: interactionState.hovered,
71
71
  pressed: interactionState.pressed,
72
- tone,
72
+ color,
73
73
  });
74
+ const labelEmphasis =
75
+ colors.labelColor === theme.semantics.content.muted ? 'muted' : 'default';
76
+ const indicatorColor = fieldState.invalid ? 'error' : color;
77
+ const indicatorEmphasis = disabled ? 'muted' : 'inverse';
74
78
 
75
79
  return (
76
80
  <Box
@@ -93,14 +97,19 @@ export function Checkbox({
93
97
  }}
94
98
  >
95
99
  {isChecked ? (
96
- <Text color={colors.indicatorColor} variant="caption" weight="bold">
100
+ <Text
101
+ color={disabled ? undefined : indicatorColor}
102
+ emphasis={indicatorEmphasis}
103
+ variant="caption"
104
+ weight="bold"
105
+ >
97
106
  ✓
98
107
  </Text>
99
108
  ) : null}
100
109
  </Box>
101
110
  {children ? (
102
111
  <Box ml="s">
103
- <Text color={colors.labelColor}>{children}</Text>
112
+ <Text emphasis={labelEmphasis}>{children}</Text>
104
113
  </Box>
105
114
  ) : null}
106
115
  </Box>
@@ -1,8 +1,8 @@
1
1
  import type React from 'react';
2
2
 
3
3
  import type { ControlSize } from '../../internal/resolvers/resolveControlSize';
4
- import type { ComponentTone } from '../../internal/resolvers/resolveTone';
5
4
  import type { ButtonBaseProps } from '../../primitives/button-base';
5
+ import type { SurfaceColor } from '../../surfaceColor';
6
6
 
7
7
  export interface CheckboxProps extends Omit<
8
8
  ButtonBaseProps,
@@ -12,7 +12,7 @@ export interface CheckboxProps extends Omit<
12
12
  checked?: boolean;
13
13
  defaultChecked?: boolean;
14
14
  onCheckedChange?: ((checked: boolean) => void) | undefined;
15
- tone?: ComponentTone;
15
+ color?: SurfaceColor;
16
16
  size?: ControlSize;
17
17
  invalid?: boolean;
18
18
  readOnly?: boolean;
@@ -28,15 +28,23 @@ export function Field({
28
28
  return (
29
29
  <Stack gap="xs" testID={testID}>
30
30
  {label ? (
31
- <Label required={required} tone={presentation.labelTone}>
31
+ <Label
32
+ color={presentation.labelColor}
33
+ emphasis={presentation.labelEmphasis}
34
+ required={required}
35
+ >
32
36
  {label}
33
37
  </Label>
34
38
  ) : null}
35
39
  <Box>{children}</Box>
36
40
  {hasErrorText ? (
37
- <HelperText tone={presentation.helperTone}>{errorText}</HelperText>
41
+ <HelperText color={presentation.helperColor} emphasis={presentation.helperEmphasis}>
42
+ {errorText}
43
+ </HelperText>
38
44
  ) : helperText ? (
39
- <HelperText tone={presentation.helperTone}>{helperText}</HelperText>
45
+ <HelperText color={presentation.helperColor} emphasis={presentation.helperEmphasis}>
46
+ {helperText}
47
+ </HelperText>
40
48
  ) : null}
41
49
  </Stack>
42
50
  );
@@ -3,9 +3,9 @@ import React from 'react';
3
3
  import { Text } from '../../primitives/text';
4
4
  import type { HelperTextProps } from './types';
5
5
 
6
- export function HelperText({ children, tone = 'muted', testID }: HelperTextProps) {
6
+ export function HelperText({ children, emphasis = 'muted', color, testID }: HelperTextProps) {
7
7
  return (
8
- <Text testID={testID} tone={tone} variant="caption">
8
+ <Text color={color} emphasis={emphasis} testID={testID} variant="caption">
9
9
  {children}
10
10
  </Text>
11
11
  );
@@ -1,9 +1,10 @@
1
1
  import type React from 'react';
2
2
 
3
- import type { TextTone } from '../../internal/resolvers/resolveTextColor';
3
+ import type { SurfaceColor, SurfaceEmphasis } from '../../surfaceColor';
4
4
 
5
5
  export interface HelperTextProps {
6
6
  children?: React.ReactNode;
7
- tone?: Extract<TextTone, 'default' | 'muted' | 'danger'>;
7
+ emphasis?: Extract<SurfaceEmphasis, 'default' | 'muted'>;
8
+ color?: Extract<SurfaceColor, 'error'>;
8
9
  testID?: string;
9
10
  }
@@ -11,7 +11,7 @@ export function IconButton({
11
11
  icon,
12
12
  accessibilityLabel,
13
13
  variant = 'ghost',
14
- tone = 'primary',
14
+ color = 'primary',
15
15
  size = 'm',
16
16
  disabled = false,
17
17
  onPress,
@@ -30,7 +30,7 @@ export function IconButton({
30
30
  testID={testID}
31
31
  >
32
32
  {(state) => {
33
- const colors = resolveButtonColors(theme, { state, tone, variant });
33
+ const colors = resolveButtonColors(theme, { color, state, variant });
34
34
 
35
35
  return (
36
36
  <Box
@@ -1,8 +1,8 @@
1
1
  import type { ControlSize } from '../../internal/resolvers/resolveControlSize';
2
2
  import type { ButtonVariant } from '../../internal/resolvers/resolveInteractiveColors';
3
- import type { ComponentTone } from '../../internal/resolvers/resolveTone';
4
3
  import type { ButtonBaseProps } from '../../primitives/button-base';
5
4
  import type { IconProps } from '../../primitives/icon';
5
+ import type { SurfaceColor } from '../../surfaceColor';
6
6
 
7
7
  export interface IconButtonProps extends Omit<
8
8
  ButtonBaseProps,
@@ -14,6 +14,6 @@ export interface IconButtonProps extends Omit<
14
14
  };
15
15
  accessibilityLabel: string;
16
16
  variant?: ButtonVariant;
17
- tone?: ComponentTone;
17
+ color?: SurfaceColor;
18
18
  size?: ControlSize;
19
19
  }
@@ -3,12 +3,18 @@ import React from 'react';
3
3
  import { Text } from '../../primitives/text';
4
4
  import type { LabelProps } from './types';
5
5
 
6
- export function Label({ children, required = false, tone = 'default', testID }: LabelProps) {
6
+ export function Label({
7
+ children,
8
+ required = false,
9
+ emphasis = 'default',
10
+ color,
11
+ testID,
12
+ }: LabelProps) {
7
13
  return (
8
- <Text testID={testID} tone={tone} variant="label" weight="medium">
14
+ <Text color={color} emphasis={emphasis} testID={testID} variant="label" weight="medium">
9
15
  {children}
10
16
  {required ? (
11
- <Text tone="danger" variant="label" weight="medium">
17
+ <Text color="error" variant="label" weight="medium">
12
18
  {' *'}
13
19
  </Text>
14
20
  ) : null}
@@ -1,10 +1,11 @@
1
1
  import type React from 'react';
2
2
 
3
- import type { TextTone } from '../../internal/resolvers/resolveTextColor';
3
+ import type { SurfaceColor, SurfaceEmphasis } from '../../surfaceColor';
4
4
 
5
5
  export interface LabelProps {
6
6
  children?: React.ReactNode;
7
7
  required?: boolean;
8
- tone?: Extract<TextTone, 'default' | 'muted' | 'danger'>;
8
+ emphasis?: Extract<SurfaceEmphasis, 'default' | 'muted'>;
9
+ color?: Extract<SurfaceColor, 'error'>;
9
10
  testID?: string;
10
11
  }
@@ -34,7 +34,7 @@ function ListItemContent({
34
34
  </Text>
35
35
  ) : null}
36
36
  {description ? (
37
- <Text numberOfLines={2} tone="muted" variant="bodySmall">
37
+ <Text emphasis="muted" numberOfLines={2} variant="bodySmall">
38
38
  {description}
39
39
  </Text>
40
40
  ) : null}
@@ -156,14 +156,7 @@ export function Menu({ trigger, items, onDismiss, closeOnSelect = true, testID }
156
156
  }}
157
157
  testID={testID ? `${testID}-item-${item.id}` : undefined}
158
158
  >
159
- <Text
160
- color={
161
- selected
162
- ? theme.semantics.action.neutral.base
163
- : theme.semantics.content.default
164
- }
165
- variant="bodySmall"
166
- >
159
+ <Text color={selected ? 'neutral' : undefined} variant="bodySmall">
167
160
  {item.label}
168
161
  </Text>
169
162
  </Box>
@@ -60,7 +60,8 @@ export function NavigationItem({ item, compact = false, testID }: NavigationItem
60
60
  ) : null}
61
61
  <Box flex={1}>
62
62
  <Text
63
- color={presentation.contentColor}
63
+ color={active && !disabled ? 'primary' : undefined}
64
+ emphasis={disabled ? 'muted' : 'default'}
64
65
  numberOfLines={1}
65
66
  variant={compact ? 'bodySmall' : 'body'}
66
67
  weight="medium"
@@ -66,7 +66,8 @@ export function TabBarItem({ item, compact = false, testID }: TabBarItemProps) {
66
66
  ) : null}
67
67
  {item.label ? (
68
68
  <Text
69
- color={contentColor}
69
+ color={active && !disabled ? 'primary' : undefined}
70
+ emphasis={active && !disabled ? 'default' : 'muted'}
70
71
  numberOfLines={1}
71
72
  variant={compact ? 'bodySmall' : 'label'}
72
73
  weight="medium"
@@ -18,7 +18,7 @@ export function Radio({
18
18
  checked,
19
19
  defaultChecked = false,
20
20
  onCheckedChange,
21
- tone = 'primary',
21
+ color = 'primary',
22
22
  size = 'm',
23
23
  disabled = false,
24
24
  invalid = false,
@@ -69,8 +69,10 @@ export function Radio({
69
69
  fieldState,
70
70
  hovered: interactionState.hovered,
71
71
  pressed: interactionState.pressed,
72
- tone,
72
+ color,
73
73
  });
74
+ const labelEmphasis =
75
+ colors.labelColor === theme.semantics.content.muted ? 'muted' : 'default';
74
76
 
75
77
  return (
76
78
  <Box
@@ -105,7 +107,7 @@ export function Radio({
105
107
  </Box>
106
108
  {children ? (
107
109
  <Box ml="s">
108
- <Text color={colors.labelColor}>{children}</Text>
110
+ <Text emphasis={labelEmphasis}>{children}</Text>
109
111
  </Box>
110
112
  ) : null}
111
113
  </Box>
@@ -1,8 +1,8 @@
1
1
  import type React from 'react';
2
2
 
3
3
  import type { ControlSize } from '../../internal/resolvers/resolveControlSize';
4
- import type { ComponentTone } from '../../internal/resolvers/resolveTone';
5
4
  import type { ButtonBaseProps } from '../../primitives/button-base';
5
+ import type { SurfaceColor } from '../../surfaceColor';
6
6
 
7
7
  export interface RadioProps extends Omit<
8
8
  ButtonBaseProps,
@@ -12,7 +12,7 @@ export interface RadioProps extends Omit<
12
12
  checked?: boolean;
13
13
  defaultChecked?: boolean;
14
14
  onCheckedChange?: ((checked: boolean) => void) | undefined;
15
- tone?: ComponentTone;
15
+ color?: SurfaceColor;
16
16
  size?: ControlSize;
17
17
  invalid?: boolean;
18
18
  readOnly?: boolean;
@@ -18,7 +18,7 @@ export function Switch({
18
18
  checked,
19
19
  defaultChecked = false,
20
20
  onCheckedChange,
21
- tone = 'primary',
21
+ color = 'primary',
22
22
  size = 'm',
23
23
  disabled = false,
24
24
  invalid = false,
@@ -69,8 +69,10 @@ export function Switch({
69
69
  fieldState,
70
70
  hovered: interactionState.hovered,
71
71
  pressed: interactionState.pressed,
72
- tone,
72
+ color,
73
73
  });
74
+ const labelEmphasis =
75
+ colors.labelColor === theme.semantics.content.muted ? 'muted' : 'default';
74
76
 
75
77
  return (
76
78
  <Box
@@ -105,7 +107,7 @@ export function Switch({
105
107
  </Box>
106
108
  {children ? (
107
109
  <Box ml="s">
108
- <Text color={colors.labelColor}>{children}</Text>
110
+ <Text emphasis={labelEmphasis}>{children}</Text>
109
111
  </Box>
110
112
  ) : null}
111
113
  </Box>
@@ -1,8 +1,8 @@
1
1
  import type React from 'react';
2
2
 
3
3
  import type { ControlSize } from '../../internal/resolvers/resolveControlSize';
4
- import type { ComponentTone } from '../../internal/resolvers/resolveTone';
5
4
  import type { ButtonBaseProps } from '../../primitives/button-base';
5
+ import type { SurfaceColor } from '../../surfaceColor';
6
6
 
7
7
  export interface SwitchProps extends Omit<
8
8
  ButtonBaseProps,
@@ -12,7 +12,7 @@ export interface SwitchProps extends Omit<
12
12
  checked?: boolean;
13
13
  defaultChecked?: boolean;
14
14
  onCheckedChange?: ((checked: boolean) => void) | undefined;
15
- tone?: ComponentTone;
15
+ color?: SurfaceColor;
16
16
  size?: ControlSize;
17
17
  invalid?: boolean;
18
18
  readOnly?: boolean;
@@ -69,11 +69,7 @@ export function Tab({ value, children, disabled = false, testID }: TabProps) {
69
69
  opacity: disabled ? 0.64 : 1,
70
70
  }}
71
71
  >
72
- <Text
73
- color={selected ? theme.semantics.action.primary.base : theme.semantics.content.default}
74
- variant="label"
75
- weight="medium"
76
- >
72
+ <Text color={selected ? 'primary' : undefined} variant="label" weight="medium">
77
73
  {children}
78
74
  </Text>
79
75
  </Box>
@@ -3,23 +3,51 @@ import { Pressable } from 'react-native';
3
3
 
4
4
  import { Box, Inline, Surface } from '../../layout';
5
5
  import { Text } from '../../primitives/text';
6
+ import type { SurfaceColor } from '../../surfaceColor';
6
7
  import { useTheme } from '../../theme/ThemeContext';
8
+ import type { SurfaceTheme } from '../../theme/types';
7
9
  import type { ToastProps } from './types';
8
10
 
9
- export function Toast({ title, description, tone = 'default', onDismiss, testID }: ToastProps) {
11
+ function resolveToastStatusColor(theme: SurfaceTheme, status: ToastProps['status']) {
12
+ switch (status) {
13
+ case 'success':
14
+ return theme.semantics.success.base;
15
+ case 'warning':
16
+ return theme.semantics.warning.base;
17
+ case 'error':
18
+ return theme.semantics.error.base;
19
+ case 'info':
20
+ return theme.semantics.info.base;
21
+ default:
22
+ return theme.semantics.action.primary.base;
23
+ }
24
+ }
25
+
26
+ function resolveToastStatusTextColor(status: ToastProps['status']): SurfaceColor {
27
+ switch (status) {
28
+ case 'success':
29
+ return 'success';
30
+ case 'warning':
31
+ return 'warning';
32
+ case 'error':
33
+ return 'error';
34
+ case 'info':
35
+ return 'info';
36
+ default:
37
+ return 'primary';
38
+ }
39
+ }
40
+
41
+ export function Toast({ title, description, status = 'default', onDismiss, testID }: ToastProps) {
10
42
  const { theme } = useTheme();
11
- const toneColor =
12
- tone === 'success'
13
- ? theme.semantics.success.base
14
- : tone === 'danger'
15
- ? theme.semantics.danger.base
16
- : theme.semantics.action.primary.base;
43
+ const statusColor = resolveToastStatusColor(theme, status);
44
+ const statusTextColor = resolveToastStatusTextColor(status);
17
45
 
18
46
  return (
19
47
  <Surface
20
48
  p="m"
21
49
  style={{
22
- borderLeftColor: toneColor,
50
+ borderLeftColor: statusColor,
23
51
  borderLeftWidth: 3,
24
52
  minWidth: 280,
25
53
  shadowOpacity: 0.14,
@@ -36,7 +64,7 @@ export function Toast({ title, description, tone = 'default', onDismiss, testID
36
64
  {title}
37
65
  </Text>
38
66
  ) : null}
39
- {description ? <Text tone="muted">{description}</Text> : null}
67
+ {description ? <Text emphasis="muted">{description}</Text> : null}
40
68
  </Box>
41
69
  {onDismiss ? (
42
70
  <Pressable
@@ -45,7 +73,7 @@ export function Toast({ title, description, tone = 'default', onDismiss, testID
45
73
  onPress={onDismiss}
46
74
  testID={testID ? `${testID}-dismiss` : undefined}
47
75
  >
48
- <Text color={toneColor}>×</Text>
76
+ <Text color={statusTextColor}>×</Text>
49
77
  </Pressable>
50
78
  ) : null}
51
79
  </Inline>
@@ -92,9 +92,9 @@ export function ToastProvider({
92
92
  description={toast.description}
93
93
  key={toast.id}
94
94
  onDismiss={() => dismissToast(toast.id)}
95
+ status={toast.status}
95
96
  testID={toast.testID}
96
97
  title={toast.title}
97
- tone={toast.tone}
98
98
  />
99
99
  ))}
100
100
  </Stack>
@@ -1,3 +1,3 @@
1
1
  export { Toast } from './Toast';
2
2
  export { ToastProvider, useToast } from './ToastProvider';
3
- export type { ToastOptions, ToastProps, ToastTone } from './types';
3
+ export type { ToastOptions, ToastProps, ToastStatus } from './types';
@@ -1,11 +1,13 @@
1
1
  import type React from 'react';
2
2
 
3
- export type ToastTone = 'default' | 'success' | 'danger';
3
+ import type { SurfaceStatusColor } from '../../surfaceColor';
4
+
5
+ export type ToastStatus = 'default' | SurfaceStatusColor;
4
6
 
5
7
  export interface ToastProps {
6
8
  title?: React.ReactNode;
7
9
  description?: React.ReactNode;
8
- tone?: ToastTone;
10
+ status?: ToastStatus;
9
11
  onDismiss?: (() => void) | undefined;
10
12
  testID?: string;
11
13
  }
@@ -98,7 +98,7 @@ export function Tooltip({
98
98
  testID={testID}
99
99
  variant="raised"
100
100
  >
101
- <Text color={theme.semantics.content.inverse} variant="caption">
101
+ <Text emphasis="inverse" variant="caption">
102
102
  {content}
103
103
  </Text>
104
104
  </Surface>
@@ -42,8 +42,8 @@ export function ProviderExample() {
42
42
  <ThemeProvider initialConfig={docsThemeConfig}>
43
43
  <Stack gap="m" p="l">
44
44
  <Text variant="body">Surface starter</Text>
45
- <Badge content="Foundation" tone="success" />
46
- <Button tone="warning" variant="soft">
45
+ <Badge color="success" content="Foundation" />
46
+ <Button color="warning" variant="soft">
47
47
  Continue
48
48
  </Button>
49
49
  </Stack>
@@ -66,7 +66,7 @@ export function FormAndOverlayExample() {
66
66
  <Checkbox defaultChecked>Weekly updates</Checkbox>
67
67
  <Radio>Product announcements</Radio>
68
68
  <Switch readOnly>Read-only setting</Switch>
69
- <HelperText tone="danger">Invalid fields should reuse the same danger tone.</HelperText>
69
+ <HelperText color="error">Invalid fields should reuse the same error color.</HelperText>
70
70
  </Stack>
71
71
  <Modal visible={false}>
72
72
  <Text>Modal content</Text>
@@ -106,7 +106,7 @@ export function NavigationExample() {
106
106
  trigger={<Text>Open menu</Text>}
107
107
  />
108
108
  <Box>
109
- <Text tone="success">Theme overrides can stay semantic.</Text>
109
+ <Text color="success">Theme overrides can stay semantic.</Text>
110
110
  </Box>
111
111
  </Stack>
112
112
  </ThemeProvider>
package/src/index.test.ts CHANGED
@@ -34,6 +34,7 @@ const expectedRootExports = [
34
34
  "export * from './core/responsive';",
35
35
  "export * from './layout';",
36
36
  "export { Image } from './primitives/image';",
37
+ "export {\n SURFACE_COLORS,\n SURFACE_EMPHASES,\n SURFACE_PALETTE_COLORS,\n SURFACE_STATUS_COLORS,\n} from './surfaceColor';",
37
38
  "export * from './theme';",
38
39
  ] as const;
39
40
 
package/src/index.ts CHANGED
@@ -50,7 +50,7 @@ export type { TextInputProps } from './components/text-input';
50
50
  export { TextInput } from './components/text-input';
51
51
  export type { TextareaProps } from './components/textarea';
52
52
  export { Textarea } from './components/textarea';
53
- export type { ToastOptions, ToastProps, ToastTone } from './components/toast';
53
+ export type { ToastOptions, ToastProps, ToastStatus } from './components/toast';
54
54
  export { Toast, ToastProvider, useToast } from './components/toast';
55
55
  export type { TooltipProps } from './components/tooltip';
56
56
  export { Tooltip } from './components/tooltip';
@@ -70,6 +70,18 @@ export type { ImageFit, ImageProps, SurfaceImageSource } from './primitives/imag
70
70
  export { Image } from './primitives/image';
71
71
  export type { TextProps } from './primitives/text';
72
72
  export { Text } from './primitives/text';
73
+ export type {
74
+ SurfaceColor,
75
+ SurfaceEmphasis,
76
+ SurfacePaletteColor,
77
+ SurfaceStatusColor,
78
+ } from './surfaceColor';
79
+ export {
80
+ SURFACE_COLORS,
81
+ SURFACE_EMPHASES,
82
+ SURFACE_PALETTE_COLORS,
83
+ SURFACE_STATUS_COLORS,
84
+ } from './surfaceColor';
73
85
  export * from './theme';
74
86
  export { isDeepEqual } from './utils/deepEqual';
75
87
  export { deepMerge } from './utils/deepMerge';
@@ -10,6 +10,6 @@ export * from './resolveOverlayAnimation';
10
10
  export * from './resolveOverlayZIndex';
11
11
  export * from './resolveSelectionControlBehavior';
12
12
  export * from './resolveSelectionControlColors';
13
+ export * from './resolveSurfaceColor';
13
14
  export * from './resolveTextColor';
14
15
  export * from './resolveTextStyles';
15
- export * from './resolveTone';