@lockin90/ui-native 2.2.0 → 2.4.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 (57) hide show
  1. package/lib/commonjs/components/BackLink.js +2 -2
  2. package/lib/commonjs/components/BackLink.js.map +1 -1
  3. package/lib/commonjs/components/Button.js +8 -2
  4. package/lib/commonjs/components/Button.js.map +1 -1
  5. package/lib/commonjs/components/Chip.js +2 -3
  6. package/lib/commonjs/components/Chip.js.map +1 -1
  7. package/lib/commonjs/components/FollowButton.js +2 -2
  8. package/lib/commonjs/components/FollowButton.js.map +1 -1
  9. package/lib/commonjs/components/FormField.js +21 -9
  10. package/lib/commonjs/components/FormField.js.map +1 -1
  11. package/lib/commonjs/components/Input.js +9 -3
  12. package/lib/commonjs/components/Input.js.map +1 -1
  13. package/lib/commonjs/components/PasswordInput.js +11 -4
  14. package/lib/commonjs/components/PasswordInput.js.map +1 -1
  15. package/lib/commonjs/components/Select.js +6 -4
  16. package/lib/commonjs/components/Select.js.map +1 -1
  17. package/lib/commonjs/components/SplitButton.js +1 -1
  18. package/lib/commonjs/components/SplitButton.js.map +1 -1
  19. package/lib/commonjs/components/SsoButton.js +5 -4
  20. package/lib/commonjs/components/SsoButton.js.map +1 -1
  21. package/lib/module/components/BackLink.js +2 -2
  22. package/lib/module/components/BackLink.js.map +1 -1
  23. package/lib/module/components/Button.js +9 -2
  24. package/lib/module/components/Button.js.map +1 -1
  25. package/lib/module/components/Chip.js +2 -3
  26. package/lib/module/components/Chip.js.map +1 -1
  27. package/lib/module/components/FollowButton.js +2 -2
  28. package/lib/module/components/FollowButton.js.map +1 -1
  29. package/lib/module/components/FormField.js +21 -9
  30. package/lib/module/components/FormField.js.map +1 -1
  31. package/lib/module/components/Input.js +9 -3
  32. package/lib/module/components/Input.js.map +1 -1
  33. package/lib/module/components/PasswordInput.js +11 -4
  34. package/lib/module/components/PasswordInput.js.map +1 -1
  35. package/lib/module/components/Select.js +6 -4
  36. package/lib/module/components/Select.js.map +1 -1
  37. package/lib/module/components/SplitButton.js +1 -1
  38. package/lib/module/components/SplitButton.js.map +1 -1
  39. package/lib/module/components/SsoButton.js +5 -4
  40. package/lib/module/components/SsoButton.js.map +1 -1
  41. package/lib/typescript/components/Button.d.ts.map +1 -1
  42. package/lib/typescript/components/FormField.d.ts +3 -1
  43. package/lib/typescript/components/FormField.d.ts.map +1 -1
  44. package/package.json +1 -1
  45. package/src/components/BackLink.tsx +2 -2
  46. package/src/components/Button.tsx +9 -6
  47. package/src/components/Chip.tsx +3 -3
  48. package/src/components/FollowButton.tsx +2 -2
  49. package/src/components/FormField.tsx +19 -8
  50. package/src/components/Input.tsx +9 -5
  51. package/src/components/PasswordInput.tsx +11 -5
  52. package/src/components/Select.tsx +6 -4
  53. package/src/components/SplitButton.tsx +1 -1
  54. package/src/components/SsoButton.tsx +4 -3
  55. package/src/components/__tests__/Button.test.tsx +12 -0
  56. package/src/components/__tests__/FormField.test.tsx +17 -0
  57. package/src/components/__tests__/SsoButton.test.tsx +15 -0
@@ -1 +1 @@
1
- {"version":3,"names":["View","Text","Pressable","StyleSheet","LinearGradient","colors","radii","gradients","fonts","nativeShadows","Icon","Menu","jsx","_jsx","jsxs","_jsxs","SplitButton","label","onPress","items","variant","icon","isPrimary","fg","text","chevColor","textDim","style","styles","group","groupPrimary","groupDefault","children","pressed","cta","stops","start","x","y","end","main","color","numberOfLines","mainDefault","divider","backgroundColor","border","chevWrapPrimary","chevWrapDefault","absoluteFill","align","trigger","chev","name","size","create","flexDirection","alignItems","alignSelf","borderRadius","sm","overflow","glowAccent","borderWidth","borderColor","gap","paddingVertical","paddingHorizontal","glass2","opacity","flexShrink","fontFamily","ui","fontWeight","fontSize","width","position","justifyContent","transform","rotate"],"sourceRoot":"../../../src","sources":["components/SplitButton.tsx"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["View","Text","Pressable","StyleSheet","LinearGradient","colors","radii","gradients","fonts","nativeShadows","Icon","Menu","jsx","_jsx","jsxs","_jsxs","SplitButton","label","onPress","items","variant","icon","isPrimary","fg","text","chevColor","textDim","style","styles","group","groupPrimary","groupDefault","children","pressed","cta","stops","start","x","y","end","main","color","numberOfLines","mainDefault","divider","backgroundColor","border","chevWrapPrimary","chevWrapDefault","absoluteFill","align","trigger","chev","name","size","create","flexDirection","alignItems","alignSelf","borderRadius","sm","overflow","glowAccent","borderWidth","borderColor","border2","gap","paddingVertical","paddingHorizontal","glass2","opacity","flexShrink","fontFamily","ui","fontWeight","fontSize","width","position","justifyContent","transform","rotate"],"sourceRoot":"../../../src","sources":["components/SplitButton.tsx"],"mappings":"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","ignoreList":[]}
@@ -13,9 +13,9 @@ export function SsoButton({
13
13
  }) {
14
14
  const label = provider === 'google' ? 'Google' : 'Apple';
15
15
  return /*#__PURE__*/_jsxs(Pressable, {
16
- ...rest,
17
16
  accessibilityRole: "button",
18
17
  accessibilityLabel: `Continue with ${label}`,
18
+ ...rest,
19
19
  style: ({
20
20
  pressed
21
21
  }) => [styles.btn, pressed && styles.pressed, rest.disabled === true ? styles.disabled : undefined],
@@ -78,11 +78,10 @@ const styles = StyleSheet.create({
78
78
  borderRadius: radii.sm,
79
79
  backgroundColor: 'rgba(255,255,255,0.04)',
80
80
  borderWidth: 1,
81
- borderColor: 'rgba(255,255,255,0.10)'
81
+ borderColor: colors.border2
82
82
  },
83
83
  pressed: {
84
- backgroundColor: 'rgba(255,255,255,0.06)',
85
- borderColor: 'rgba(255,255,255,0.16)'
84
+ backgroundColor: 'rgba(255,255,255,0.06)'
86
85
  },
87
86
  disabled: {
88
87
  opacity: 0.5
@@ -98,6 +97,8 @@ const styles = StyleSheet.create({
98
97
  fontFamily: fonts.ui,
99
98
  fontWeight: '600',
100
99
  fontSize: 12.5,
100
+ // the web's 1.55 line height: 10 + 19.4 + 10 + 2 borders = 41.4, as on web
101
+ lineHeight: 12.5 * 1.55,
101
102
  letterSpacing: 0.1
102
103
  }
103
104
  });
@@ -1 +1 @@
1
- {"version":3,"names":["Pressable","Text","View","StyleSheet","Svg","Path","colors","fonts","radii","jsx","_jsx","jsxs","_jsxs","SsoButton","provider","rest","label","accessibilityRole","accessibilityLabel","style","pressed","styles","btn","disabled","undefined","children","iconSlot","GoogleBrandIcon","AppleBrandIcon","color","text","size","width","height","viewBox","fill","d","create","flex","flexDirection","alignItems","justifyContent","gap","paddingVertical","paddingHorizontal","borderRadius","sm","backgroundColor","borderWidth","borderColor","opacity","fontFamily","ui","fontWeight","fontSize","letterSpacing"],"sourceRoot":"../../../src","sources":["components/SsoButton.tsx"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["Pressable","Text","View","StyleSheet","Svg","Path","colors","fonts","radii","jsx","_jsx","jsxs","_jsxs","SsoButton","provider","rest","label","accessibilityRole","accessibilityLabel","style","pressed","styles","btn","disabled","undefined","children","iconSlot","GoogleBrandIcon","AppleBrandIcon","color","text","size","width","height","viewBox","fill","d","create","flex","flexDirection","alignItems","justifyContent","gap","paddingVertical","paddingHorizontal","borderRadius","sm","backgroundColor","borderWidth","borderColor","border2","opacity","fontFamily","ui","fontWeight","fontSize","lineHeight","letterSpacing"],"sourceRoot":"../../../src","sources":["components/SsoButton.tsx"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"Button.d.ts","sourceRoot":"","sources":["../../../src/components/Button.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,EAAqC,KAAK,cAAc,EAAE,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAKtH,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;AAC5D,MAAM,MAAM,UAAU,GAAG,QAAQ,CAAC;AAOlC,MAAM,WAAW,WAAY,SAAQ,IAAI,CAAC,cAAc,EAAE,UAAU,GAAG,OAAO,CAAC;IAC7E,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB;;;;;OAKG;IACH,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,4EAA4E;IAC5E,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;CAC9B;AAED;;;wBAGwB;AACxB,wBAAgB,MAAM,CAAC,EAAE,OAAmB,EAAE,IAAI,EAAE,IAAW,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,EAAE,WAAW,+BAgFhI"}
1
+ {"version":3,"file":"Button.d.ts","sourceRoot":"","sources":["../../../src/components/Button.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,EAAqC,KAAK,cAAc,EAAE,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAQtH,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;AAC5D,MAAM,MAAM,UAAU,GAAG,QAAQ,CAAC;AAOlC,MAAM,WAAW,WAAY,SAAQ,IAAI,CAAC,cAAc,EAAE,UAAU,GAAG,OAAO,CAAC;IAC7E,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB;;;;;OAKG;IACH,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,4EAA4E;IAC5E,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;CAC9B;AAED;;;wBAGwB;AACxB,wBAAgB,MAAM,CAAC,EAAE,OAAmB,EAAE,IAAI,EAAE,IAAW,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,EAAE,WAAW,+BAgFhI"}
@@ -9,11 +9,13 @@ export interface FormFieldProps extends ViewProps {
9
9
  error?: ReactNode;
10
10
  /** appends a small accent `*` after the label */
11
11
  required?: boolean;
12
+ /** a link or action at the end of the label row (e.g. "Forgot password?") */
13
+ labelAction?: ReactNode;
12
14
  /** the form control to wrap */
13
15
  children?: ReactNode;
14
16
  }
15
17
  /** Labeled form-control wrapper — mono label, the control, then faint help or red error. */
16
- export declare function FormField({ label, help, error, required, children, style, ...rest }: FormFieldProps): import("react").JSX.Element;
18
+ export declare function FormField({ label, help, error, required, labelAction, children, style, ...rest }: FormFieldProps): import("react").JSX.Element;
17
19
  export interface SearchInputProps extends Omit<TextInputProps, 'onChange' | 'value'> {
18
20
  /** current query value (controlled) */
19
21
  value?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"FormField.d.ts","sourceRoot":"","sources":["../../../src/components/FormField.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AACjD,OAAO,EAML,KAAK,cAAc,EACnB,KAAK,SAAS,EACf,MAAM,cAAc,CAAC;AAItB,MAAM,WAAW,cAAe,SAAQ,SAAS;IAC/C,4DAA4D;IAC5D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uEAAuE;IACvE,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,sEAAsE;IACtE,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,iDAAiD;IACjD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,+BAA+B;IAC/B,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,4FAA4F;AAC5F,wBAAgB,SAAS,CAAC,EACxB,KAAK,EACL,IAAI,EACJ,KAAK,EACL,QAAgB,EAChB,QAAQ,EACR,KAAK,EACL,GAAG,IAAI,EACR,EAAE,cAAc,+BAiBhB;AAED,MAAM,WAAW,gBAAiB,SAAQ,IAAI,CAAC,cAAc,EAAE,UAAU,GAAG,OAAO,CAAC;IAClF,uCAAuC;IACvC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uEAAuE;IACvE,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,2CAA2C;IAC3C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,6EAA6E;IAC7E,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB;oFACgF;IAChF,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED,4FAA4F;AAC5F,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,QAAQ,EACR,WAAuB,EACvB,OAAO,EACP,KAAc,EACd,KAAK,EACL,OAAO,EACP,MAAM,EACN,GAAG,IAAI,EACR,EAAE,gBAAgB,+BA8ElB"}
1
+ {"version":3,"file":"FormField.d.ts","sourceRoot":"","sources":["../../../src/components/FormField.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AACjD,OAAO,EAML,KAAK,cAAc,EACnB,KAAK,SAAS,EACf,MAAM,cAAc,CAAC;AAItB,MAAM,WAAW,cAAe,SAAQ,SAAS;IAC/C,4DAA4D;IAC5D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uEAAuE;IACvE,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,sEAAsE;IACtE,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,iDAAiD;IACjD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,6EAA6E;IAC7E,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,+BAA+B;IAC/B,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,4FAA4F;AAC5F,wBAAgB,SAAS,CAAC,EACxB,KAAK,EACL,IAAI,EACJ,KAAK,EACL,QAAgB,EAChB,WAAW,EACX,QAAQ,EACR,KAAK,EACL,GAAG,IAAI,EACR,EAAE,cAAc,+BAsBhB;AAED,MAAM,WAAW,gBAAiB,SAAQ,IAAI,CAAC,cAAc,EAAE,UAAU,GAAG,OAAO,CAAC;IAClF,uCAAuC;IACvC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uEAAuE;IACvE,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,2CAA2C;IAC3C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,6EAA6E;IAC7E,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB;oFACgF;IAChF,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED,4FAA4F;AAC5F,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,QAAQ,EACR,WAAuB,EACvB,OAAO,EACP,KAAc,EACd,KAAK,EACL,OAAO,EACP,MAAM,EACN,GAAG,IAAI,EACR,EAAE,gBAAgB,+BA8ElB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lockin90/ui-native",
3
- "version": "2.2.0",
3
+ "version": "2.4.0",
4
4
  "description": "LockIn90 \"Aurora Flux\" React Native component library — StyleSheet primitives driven by @lockin90/tokens.",
5
5
  "license": "UNLICENSED",
6
6
  "repository": {
@@ -55,9 +55,9 @@ const pillStyles = StyleSheet.create({
55
55
  paddingVertical: 7,
56
56
  paddingHorizontal: 13,
57
57
  borderWidth: 1,
58
- borderColor: colors.border,
58
+ borderColor: colors.border2,
59
59
  backgroundColor: colors.glass,
60
- borderRadius: radii.pill,
60
+ borderRadius: radii.sm,
61
61
  alignSelf: 'flex-start',
62
62
  },
63
63
  label: { color: colors.textDim, fontFamily: fonts.mono, fontSize: 11.5, fontWeight: '400' },
@@ -4,6 +4,9 @@ import { LinearGradient } from 'expo-linear-gradient';
4
4
  import { colors, radii, gradients, fonts, nativeShadows } from '@lockin90/tokens';
5
5
  import { hapticSelection } from '../internal/optionalHaptics';
6
6
 
7
+ // the web's body line height (1.55): the md button is 12 + 14 × 1.55 + 12 = 45.7, as on web
8
+ const LINE = 1.55;
9
+
7
10
  export type ButtonVariant = 'default' | 'primary' | 'ghost';
8
11
  export type ButtonTone = 'danger';
9
12
 
@@ -50,7 +53,7 @@ export function Button({ variant = 'default', tone, size = 'md', title, leading,
50
53
 
51
54
  if (variant === 'primary' && !danger) {
52
55
  return (
53
- <Pressable onPress={press} {...rest}>
56
+ <Pressable accessibilityRole="button" onPress={press} {...rest}>
54
57
  {({ pressed }) => (
55
58
  <LinearGradient
56
59
  colors={gradients.cta.stops as unknown as [string, string]}
@@ -59,7 +62,7 @@ export function Button({ variant = 'default', tone, size = 'md', title, leading,
59
62
  style={[styles.base, pad, styles.primary, pressed && styles.pressed, style]}
60
63
  >
61
64
  {leading}
62
- <Text style={[styles.label, { fontSize: labelSize, color: '#0A0A12' }]}>{title}</Text>
65
+ <Text style={[styles.label, { fontSize: labelSize, lineHeight: labelSize * LINE, color: '#0A0A12' }]}>{title}</Text>
63
66
  {trailing}
64
67
  </LinearGradient>
65
68
  )}
@@ -90,12 +93,12 @@ export function Button({ variant = 'default', tone, size = 'md', title, leading,
90
93
  textColor = colors.bad;
91
94
  } else {
92
95
  backgroundColor = ghost ? 'transparent' : colors.glass2;
93
- borderColor = ghost ? colors.border : colors.border2;
96
+ borderColor = colors.border2;
94
97
  textColor = ghost ? colors.textDim : colors.text;
95
98
  }
96
99
 
97
100
  return (
98
- <Pressable onPress={press} {...rest}>
101
+ <Pressable accessibilityRole="button" onPress={press} {...rest}>
99
102
  {({ pressed }) => (
100
103
  <View
101
104
  style={[
@@ -108,7 +111,7 @@ export function Button({ variant = 'default', tone, size = 'md', title, leading,
108
111
  ]}
109
112
  >
110
113
  {leading}
111
- <Text style={[styles.label, { fontSize: labelSize, color: textColor }]}>{title}</Text>
114
+ <Text style={[styles.label, { fontSize: labelSize, lineHeight: labelSize * LINE, color: textColor }]}>{title}</Text>
112
115
  {trailing}
113
116
  </View>
114
117
  )}
@@ -117,7 +120,7 @@ export function Button({ variant = 'default', tone, size = 'md', title, leading,
117
120
  }
118
121
 
119
122
  const styles = StyleSheet.create({
120
- base: { flexDirection: 'row', alignItems: 'center', justifyContent: 'center', gap: 9, borderRadius: radii.pill },
123
+ base: { flexDirection: 'row', alignItems: 'center', justifyContent: 'center', gap: 9, borderRadius: radii.sm },
121
124
  padMd: { paddingVertical: 12, paddingHorizontal: 20 },
122
125
  padSm: { paddingVertical: 8, paddingHorizontal: 14 },
123
126
  primary: { ...nativeShadows.glowAccent },
@@ -18,7 +18,7 @@ export interface ChipProps extends ViewProps {
18
18
  }
19
19
 
20
20
  const TONE: Record<ChipTone, { color: string; border: string; bg: string }> = {
21
- default: { color: colors.textDim, border: colors.border, bg: colors.glass },
21
+ default: { color: colors.textDim, border: colors.border2, bg: colors.glass },
22
22
  neutral: { color: colors.textFaint, border: colors.border2, bg: colors.glass2 },
23
23
  high: { color: colors.zoneHigh, border: 'rgba(52,245,197,0.35)', bg: 'rgba(52,245,197,0.08)' },
24
24
  mid: { color: colors.zoneMid, border: 'rgba(255,176,32,0.35)', bg: 'rgba(255,176,32,0.08)' },
@@ -34,7 +34,7 @@ const TONE: Record<ChipTone, { color: string; border: string; bg: string }> = {
34
34
  * pill (high/mid/low read slightly stronger; neutral reads dim on glass-2).
35
35
  * The `accent` tone is handled specially (filled gradient). */
36
36
  const TONE_SM: Partial<Record<ChipTone, Partial<{ color: string; border: string; bg: string }>>> = {
37
- neutral: { color: colors.textDim, border: colors.border, bg: colors.glass2 },
37
+ neutral: { color: colors.textDim, bg: colors.glass2 },
38
38
  high: { bg: 'rgba(52,245,197,0.10)' },
39
39
  mid: { bg: 'rgba(255,176,32,0.10)' },
40
40
  low: { bg: 'rgba(255,77,109,0.10)' },
@@ -102,7 +102,7 @@ const styles = StyleSheet.create({
102
102
  gap: 7,
103
103
  paddingVertical: 5,
104
104
  paddingHorizontal: 11,
105
- borderRadius: radii.pill,
105
+ borderRadius: radii.sm,
106
106
  borderWidth: 1,
107
107
  alignSelf: 'flex-start',
108
108
  },
@@ -35,7 +35,7 @@ export function FollowButton({
35
35
  const labelSize = size === 'sm' ? 12 : 12.5;
36
36
 
37
37
  const tone = following
38
- ? { color: colors.textDim, border: colors.border, bg: colors.glass }
38
+ ? { color: colors.textDim, border: colors.border2, bg: colors.glass }
39
39
  : { color: '#cbbcff', border: 'rgba(124,92,255,0.45)', bg: 'rgba(124,92,255,0.10)' };
40
40
 
41
41
  return (
@@ -66,7 +66,7 @@ const styles = StyleSheet.create({
66
66
  flexDirection: 'row',
67
67
  alignItems: 'center',
68
68
  gap: 6,
69
- borderRadius: radii.pill,
69
+ borderRadius: radii.sm,
70
70
  borderWidth: 1,
71
71
  alignSelf: 'flex-start',
72
72
  },
@@ -20,6 +20,8 @@ export interface FormFieldProps extends ViewProps {
20
20
  error?: ReactNode;
21
21
  /** appends a small accent `*` after the label */
22
22
  required?: boolean;
23
+ /** a link or action at the end of the label row (e.g. "Forgot password?") */
24
+ labelAction?: ReactNode;
23
25
  /** the form control to wrap */
24
26
  children?: ReactNode;
25
27
  }
@@ -30,17 +32,23 @@ export function FormField({
30
32
  help,
31
33
  error,
32
34
  required = false,
35
+ labelAction,
33
36
  children,
34
37
  style,
35
38
  ...rest
36
39
  }: FormFieldProps) {
37
40
  return (
38
41
  <View style={[styles.field, style]} {...rest}>
39
- {label ? (
40
- <Text style={styles.fieldLabel}>
41
- {label.toUpperCase()}
42
- {required ? <Text style={styles.req}> *</Text> : null}
43
- </Text>
42
+ {label || labelAction ? (
43
+ <View style={styles.labelRow}>
44
+ {label ? (
45
+ <Text style={styles.fieldLabel}>
46
+ {label.toUpperCase()}
47
+ {required ? <Text style={styles.req}> *</Text> : null}
48
+ </Text>
49
+ ) : null}
50
+ {labelAction}
51
+ </View>
44
52
  ) : null}
45
53
  <View style={styles.control}>{children}</View>
46
54
  {error ? (
@@ -160,12 +168,15 @@ export function SearchInput({
160
168
  const styles = StyleSheet.create({
161
169
  // FormField
162
170
  field: { gap: 6, minWidth: 0 },
171
+ labelRow: { flexDirection: 'row', alignItems: 'baseline', justifyContent: 'space-between', gap: 10 },
172
+ // the label the web shows (11px / 500, text-dim, 0.12em, line height 1.55 = 17)
163
173
  fieldLabel: {
164
174
  fontFamily: fonts.mono,
165
- fontSize: 10,
175
+ fontSize: 11,
176
+ lineHeight: 17,
166
177
  fontWeight: '500',
167
- letterSpacing: 1.2,
168
- color: colors.textFaint,
178
+ letterSpacing: 1.32,
179
+ color: colors.textDim,
169
180
  },
170
181
  req: { color: colors.accent, fontSize: 11 },
171
182
  control: { minWidth: 0 },
@@ -70,28 +70,32 @@ export function Input({
70
70
 
71
71
  const styles = StyleSheet.create({
72
72
  wrap: { gap: 6, minWidth: 0 },
73
+ // the same caption as FormField's label (11px / 500, text-dim, line height 17), as the web shows
73
74
  label: {
74
75
  fontFamily: fonts.mono,
75
- fontSize: 10,
76
+ fontSize: 11,
77
+ lineHeight: 17,
76
78
  fontWeight: '500',
77
- letterSpacing: 1.2,
78
- color: colors.textFaint,
79
+ letterSpacing: 1.32,
80
+ color: colors.textDim,
79
81
  },
80
82
  field: {
81
83
  flexDirection: 'row',
82
84
  alignItems: 'center',
83
85
  gap: 8,
84
86
  minWidth: 0,
87
+ minHeight: 39.6,
85
88
  paddingVertical: 9,
86
89
  paddingHorizontal: 12,
87
90
  borderRadius: radii.sm,
88
91
  borderWidth: 1,
89
92
  backgroundColor: colors.glass2,
90
93
  },
91
- fieldSm: { paddingVertical: 6, paddingHorizontal: 10 },
94
+ // the web box: 9 + 14 × 1.4 + 9 + 2 borders = 39.6 (sm: 6 + 12.5 × 1.4 + 6 + 2 = 31.5)
95
+ fieldSm: { minHeight: 31.5, paddingVertical: 6, paddingHorizontal: 10 },
92
96
  // design `.strow .sv` — glass-2 fill (already the field default), border-2
93
97
  // (already default), 9px radius, roomier centered padding.
94
- fieldNumeral: { justifyContent: 'center', paddingVertical: 10, paddingHorizontal: 10, borderRadius: 9 },
98
+ fieldNumeral: { minHeight: 0, justifyContent: 'center', paddingVertical: 10, paddingHorizontal: 10, borderRadius: 9 },
95
99
  lead: { flexShrink: 0 },
96
100
  input: {
97
101
  flex: 1,
@@ -80,25 +80,29 @@ export function PasswordInput({
80
80
 
81
81
  const styles = StyleSheet.create({
82
82
  wrap: { gap: 6, minWidth: 0 },
83
+ // the same caption as FormField's label (11px / 500, text-dim, line height 17), as the web shows
83
84
  label: {
84
85
  fontFamily: fonts.mono,
85
- fontSize: 10,
86
+ fontSize: 11,
87
+ lineHeight: 17,
86
88
  fontWeight: '500',
87
- letterSpacing: 1.2,
88
- color: colors.textFaint,
89
+ letterSpacing: 1.32,
90
+ color: colors.textDim,
89
91
  },
90
92
  field: {
91
93
  flexDirection: 'row',
92
94
  alignItems: 'center',
93
95
  gap: 8,
94
96
  minWidth: 0,
97
+ minHeight: 39.6,
95
98
  paddingVertical: 9,
96
99
  paddingHorizontal: 12,
97
100
  borderRadius: radii.sm,
98
101
  borderWidth: 1,
99
102
  backgroundColor: colors.glass2,
100
103
  },
101
- fieldSm: { paddingVertical: 6, paddingHorizontal: 10 },
104
+ // the web box: 9 + 14 × 1.4 + 9 + 2 borders = 39.6 (sm: 6 + 12.5 × 1.4 + 6 + 2 = 31.5)
105
+ fieldSm: { minHeight: 31.5, paddingVertical: 6, paddingHorizontal: 10 },
102
106
  lead: { flexShrink: 0 },
103
107
  input: {
104
108
  flex: 1,
@@ -107,7 +111,9 @@ const styles = StyleSheet.create({
107
111
  color: colors.text,
108
112
  fontFamily: fonts.ui,
109
113
  fontSize: 14,
110
- lineHeight: 20,
114
+ // centred by the field's height, as Input (an explicit lineHeight biases the glyph)
115
+ textAlignVertical: 'center',
116
+ includeFontPadding: false,
111
117
  },
112
118
  inputSm: { fontSize: 12.5 },
113
119
  trail: { flexShrink: 0 },
@@ -248,12 +248,14 @@ const styles = StyleSheet.create({
248
248
  wrap: { flexDirection: 'column', gap: 6, alignSelf: 'stretch' },
249
249
  // sm hugs its content instead of stretching (design `.pref-select` pill)
250
250
  wrapSm: { alignSelf: 'auto' },
251
+ // the same caption as FormField's label (11px / 500, text-dim, line height 17), as the web shows
251
252
  label: {
252
- fontFamily: fonts.ui,
253
- fontSize: 10,
253
+ fontFamily: fonts.mono,
254
+ fontSize: 11,
255
+ lineHeight: 17,
254
256
  fontWeight: '500',
255
- letterSpacing: 1.2,
256
- color: colors.textFaint,
257
+ letterSpacing: 1.32,
258
+ color: colors.textDim,
257
259
  },
258
260
  field: {
259
261
  flexDirection: 'row',
@@ -87,7 +87,7 @@ const styles = StyleSheet.create({
87
87
  overflow: 'hidden',
88
88
  },
89
89
  groupPrimary: { ...nativeShadows.glowAccent },
90
- groupDefault: { borderWidth: 1, borderColor: colors.border },
90
+ groupDefault: { borderWidth: 1, borderColor: colors.border2 },
91
91
  main: {
92
92
  flexDirection: 'row',
93
93
  alignItems: 'center',
@@ -15,9 +15,9 @@ export function SsoButton({ provider, ...rest }: SsoButtonProps) {
15
15
  const label = provider === 'google' ? 'Google' : 'Apple';
16
16
  return (
17
17
  <Pressable
18
- {...rest}
19
18
  accessibilityRole="button"
20
19
  accessibilityLabel={`Continue with ${label}`}
20
+ {...rest}
21
21
  style={({ pressed }) => [
22
22
  styles.btn,
23
23
  pressed && styles.pressed,
@@ -75,11 +75,10 @@ const styles = StyleSheet.create({
75
75
  borderRadius: radii.sm,
76
76
  backgroundColor: 'rgba(255,255,255,0.04)',
77
77
  borderWidth: 1,
78
- borderColor: 'rgba(255,255,255,0.10)',
78
+ borderColor: colors.border2,
79
79
  },
80
80
  pressed: {
81
81
  backgroundColor: 'rgba(255,255,255,0.06)',
82
- borderColor: 'rgba(255,255,255,0.16)',
83
82
  },
84
83
  disabled: { opacity: 0.5 },
85
84
  iconSlot: { width: 16, height: 16, alignItems: 'center', justifyContent: 'center' },
@@ -88,6 +87,8 @@ const styles = StyleSheet.create({
88
87
  fontFamily: fonts.ui,
89
88
  fontWeight: '600',
90
89
  fontSize: 12.5,
90
+ // the web's 1.55 line height: 10 + 19.4 + 10 + 2 borders = 41.4, as on web
91
+ lineHeight: 12.5 * 1.55,
91
92
  letterSpacing: 0.1,
92
93
  },
93
94
  });
@@ -0,0 +1,12 @@
1
+ import { describe, expect, test } from 'vitest';
2
+ import { Button } from '../Button';
3
+ import { render } from './markup';
4
+
5
+ /* Screen readers announce every variant as a button. */
6
+ describe('Button role', () => {
7
+ for (const variant of ['primary', 'ghost'] as const) {
8
+ test(`${variant} is a button`, () => {
9
+ expect(render(Button, { variant, title: 'Sign in' })).toMatch(/role="button"/);
10
+ });
11
+ }
12
+ });
@@ -0,0 +1,17 @@
1
+ import { Text } from 'react-native';
2
+ import { describe, expect, test } from 'vitest';
3
+ import { FormField } from '../FormField';
4
+ import { render } from './markup';
5
+
6
+ /* The label row can end with a link (the sign-in "Forgot password?"). */
7
+ describe('FormField labelAction', () => {
8
+ test('renders the action after the label', () => {
9
+ const html = render(FormField, { label: 'Password', labelAction: <Text>Forgot password?</Text> });
10
+ expect(html.indexOf('PASSWORD')).toBeGreaterThan(-1);
11
+ expect(html.indexOf('Forgot password?')).toBeGreaterThan(html.indexOf('PASSWORD'));
12
+ });
13
+
14
+ test('renders the action without a label', () => {
15
+ expect(render(FormField, { labelAction: <Text>Forgot password?</Text> })).toContain('Forgot password?');
16
+ });
17
+ });
@@ -0,0 +1,15 @@
1
+ import { describe, expect, test } from 'vitest';
2
+ import { SsoButton } from '../SsoButton';
3
+ import { render } from './markup';
4
+
5
+ /* The app's translated name replaces the built-in English one. */
6
+ describe('SsoButton name', () => {
7
+ test('defaults to the English name', () => {
8
+ expect(render(SsoButton, { provider: 'google' })).toContain('aria-label="Continue with Google"');
9
+ });
10
+
11
+ test('takes the app’s accessibilityLabel', () => {
12
+ const html = render(SsoButton, { provider: 'apple', accessibilityLabel: 'Продовжити з Apple' });
13
+ expect(html).toContain('aria-label="Продовжити з Apple"');
14
+ });
15
+ });