@newtonedev/components 0.1.12 → 0.1.14

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 (227) hide show
  1. package/dist/_COMPONENT_TEMPLATE/ComponentName.styles.d.ts +4 -3
  2. package/dist/_COMPONENT_TEMPLATE/ComponentName.styles.d.ts.map +1 -1
  3. package/dist/_COMPONENT_TEMPLATE/ComponentName.types.d.ts +1 -1
  4. package/dist/_COMPONENT_TEMPLATE/ComponentName.types.d.ts.map +1 -1
  5. package/dist/composites/actions/Button/Button.d.ts +11 -1
  6. package/dist/composites/actions/Button/Button.d.ts.map +1 -1
  7. package/dist/composites/actions/Button/Button.styles.d.ts +1 -1
  8. package/dist/composites/actions/Button/Button.styles.d.ts.map +1 -1
  9. package/dist/composites/actions/Button/Button.types.d.ts +11 -1
  10. package/dist/composites/actions/Button/Button.types.d.ts.map +1 -1
  11. package/dist/composites/branding/LogoMonogram/LogoMonogram.d.ts +10 -0
  12. package/dist/composites/branding/LogoMonogram/LogoMonogram.d.ts.map +1 -0
  13. package/dist/composites/branding/LogoMonogram/LogoMonogram.types.d.ts +35 -0
  14. package/dist/composites/branding/LogoMonogram/LogoMonogram.types.d.ts.map +1 -0
  15. package/dist/composites/branding/LogoMonogram/index.d.ts +3 -0
  16. package/dist/composites/branding/LogoMonogram/index.d.ts.map +1 -0
  17. package/dist/composites/branding/LogoWordmark/LogoWordmark.d.ts +9 -0
  18. package/dist/composites/branding/LogoWordmark/LogoWordmark.d.ts.map +1 -0
  19. package/dist/composites/branding/LogoWordmark/LogoWordmark.types.d.ts +26 -0
  20. package/dist/composites/branding/LogoWordmark/LogoWordmark.types.d.ts.map +1 -0
  21. package/dist/composites/branding/LogoWordmark/index.d.ts +3 -0
  22. package/dist/composites/branding/LogoWordmark/index.d.ts.map +1 -0
  23. package/dist/composites/display/Chip/Chip.d.ts +25 -0
  24. package/dist/composites/display/Chip/Chip.d.ts.map +1 -0
  25. package/dist/composites/display/Chip/Chip.styles.d.ts +29 -0
  26. package/dist/composites/display/Chip/Chip.styles.d.ts.map +1 -0
  27. package/dist/composites/display/Chip/Chip.types.d.ts +63 -0
  28. package/dist/composites/display/Chip/Chip.types.d.ts.map +1 -0
  29. package/dist/composites/display/Chip/index.d.ts +3 -0
  30. package/dist/composites/display/Chip/index.d.ts.map +1 -0
  31. package/dist/composites/form-controls/Select/Select.d.ts.map +1 -1
  32. package/dist/composites/form-controls/Select/Select.styles.d.ts +2 -2
  33. package/dist/composites/form-controls/Select/Select.styles.d.ts.map +1 -1
  34. package/dist/composites/form-controls/Select/SelectOption.d.ts.map +1 -1
  35. package/dist/composites/form-controls/TextInput/TextInput.d.ts.map +1 -1
  36. package/dist/composites/form-controls/TextInput/TextInput.styles.d.ts +2 -2
  37. package/dist/composites/form-controls/TextInput/TextInput.styles.d.ts.map +1 -1
  38. package/dist/composites/form-controls/Toggle/Toggle.d.ts.map +1 -1
  39. package/dist/composites/form-controls/Toggle/Toggle.styles.d.ts +2 -2
  40. package/dist/composites/form-controls/Toggle/Toggle.styles.d.ts.map +1 -1
  41. package/dist/composites/layout/AppShell/AppShell.d.ts.map +1 -1
  42. package/dist/composites/layout/AppShell/AppShell.styles.d.ts +2 -2
  43. package/dist/composites/layout/AppShell/AppShell.styles.d.ts.map +1 -1
  44. package/dist/composites/layout/Card/Card.d.ts.map +1 -1
  45. package/dist/composites/layout/Card/Card.styles.d.ts +2 -2
  46. package/dist/composites/layout/Card/Card.styles.d.ts.map +1 -1
  47. package/dist/composites/layout/Card/Card.types.d.ts +1 -1
  48. package/dist/composites/layout/Card/Card.types.d.ts.map +1 -1
  49. package/dist/composites/layout/ContentCard/ContentCard.d.ts +33 -0
  50. package/dist/composites/layout/ContentCard/ContentCard.d.ts.map +1 -0
  51. package/dist/composites/layout/ContentCard/ContentCard.styles.d.ts +10 -0
  52. package/dist/composites/layout/ContentCard/ContentCard.styles.d.ts.map +1 -0
  53. package/dist/composites/layout/ContentCard/ContentCard.types.d.ts +52 -0
  54. package/dist/composites/layout/ContentCard/ContentCard.types.d.ts.map +1 -0
  55. package/dist/composites/layout/ContentCard/index.d.ts +3 -0
  56. package/dist/composites/layout/ContentCard/index.d.ts.map +1 -0
  57. package/dist/composites/layout/Divider/Divider.d.ts +25 -0
  58. package/dist/composites/layout/Divider/Divider.d.ts.map +1 -0
  59. package/dist/composites/layout/Divider/Divider.styles.d.ts +8 -0
  60. package/dist/composites/layout/Divider/Divider.styles.d.ts.map +1 -0
  61. package/dist/composites/layout/Divider/Divider.types.d.ts +25 -0
  62. package/dist/composites/layout/Divider/Divider.types.d.ts.map +1 -0
  63. package/dist/composites/layout/Divider/index.d.ts +3 -0
  64. package/dist/composites/layout/Divider/index.d.ts.map +1 -0
  65. package/dist/composites/layout/Navbar/Navbar.d.ts.map +1 -1
  66. package/dist/composites/layout/Navbar/Navbar.styles.d.ts +4 -2
  67. package/dist/composites/layout/Navbar/Navbar.styles.d.ts.map +1 -1
  68. package/dist/composites/layout/Sidebar/Sidebar.d.ts.map +1 -1
  69. package/dist/composites/layout/Sidebar/Sidebar.styles.d.ts +4 -2
  70. package/dist/composites/layout/Sidebar/Sidebar.styles.d.ts.map +1 -1
  71. package/dist/composites/overlays/Popover/Popover.d.ts.map +1 -1
  72. package/dist/composites/overlays/Popover/Popover.styles.d.ts +2 -2
  73. package/dist/composites/overlays/Popover/Popover.styles.d.ts.map +1 -1
  74. package/dist/composites/range-inputs/ColorScaleSlider/ColorScaleSlider.d.ts +1 -1
  75. package/dist/composites/range-inputs/ColorScaleSlider/ColorScaleSlider.d.ts.map +1 -1
  76. package/dist/composites/range-inputs/ColorScaleSlider/ColorScaleSlider.styles.d.ts +1 -1
  77. package/dist/composites/range-inputs/ColorScaleSlider/ColorScaleSlider.styles.d.ts.map +1 -1
  78. package/dist/composites/range-inputs/ColorScaleSlider/ColorScaleSlider.types.d.ts +2 -0
  79. package/dist/composites/range-inputs/ColorScaleSlider/ColorScaleSlider.types.d.ts.map +1 -1
  80. package/dist/composites/range-inputs/HueSlider/HueSlider.d.ts +3 -4
  81. package/dist/composites/range-inputs/HueSlider/HueSlider.d.ts.map +1 -1
  82. package/dist/composites/range-inputs/HueSlider/HueSlider.styles.d.ts +3 -3
  83. package/dist/composites/range-inputs/HueSlider/HueSlider.styles.d.ts.map +1 -1
  84. package/dist/composites/range-inputs/Slider/Slider.styles.d.ts +1 -1
  85. package/dist/composites/range-inputs/Slider/Slider.styles.d.ts.map +1 -1
  86. package/dist/index.cjs +1609 -1693
  87. package/dist/index.cjs.map +1 -1
  88. package/dist/index.d.ts +22 -24
  89. package/dist/index.d.ts.map +1 -1
  90. package/dist/index.js +1454 -1621
  91. package/dist/index.js.map +1 -1
  92. package/dist/primitives/Frame/Frame.d.ts +1 -35
  93. package/dist/primitives/Frame/Frame.d.ts.map +1 -1
  94. package/dist/primitives/Frame/Frame.styles.d.ts +13 -3
  95. package/dist/primitives/Frame/Frame.styles.d.ts.map +1 -1
  96. package/dist/primitives/Frame/Frame.types.d.ts +99 -1
  97. package/dist/primitives/Frame/Frame.types.d.ts.map +1 -1
  98. package/dist/primitives/Frame/Frame.utils.d.ts +1 -1
  99. package/dist/primitives/Frame/Frame.utils.d.ts.map +1 -1
  100. package/dist/primitives/Frame/index.d.ts +1 -1
  101. package/dist/primitives/Frame/index.d.ts.map +1 -1
  102. package/dist/primitives/Icon/Icon.d.ts.map +1 -1
  103. package/dist/primitives/Icon/Icon.types.d.ts +2 -2
  104. package/dist/primitives/Icon/Icon.types.d.ts.map +1 -1
  105. package/dist/primitives/Text/Text.d.ts +6 -4
  106. package/dist/primitives/Text/Text.d.ts.map +1 -1
  107. package/dist/primitives/Text/Text.spans.d.ts.map +1 -1
  108. package/dist/primitives/Text/Text.types.d.ts +4 -7
  109. package/dist/primitives/Text/Text.types.d.ts.map +1 -1
  110. package/dist/primitives/Wrapper/Wrapper.d.ts +1 -1
  111. package/dist/primitives/Wrapper/Wrapper.d.ts.map +1 -1
  112. package/dist/primitives/Wrapper/Wrapper.styles.d.ts +10 -2
  113. package/dist/primitives/Wrapper/Wrapper.styles.d.ts.map +1 -1
  114. package/dist/primitives/Wrapper/Wrapper.types.d.ts +31 -1
  115. package/dist/primitives/Wrapper/Wrapper.types.d.ts.map +1 -1
  116. package/package.json +3 -2
  117. package/src/_COMPONENT_TEMPLATE/ComponentName.styles.ts +4 -4
  118. package/src/_COMPONENT_TEMPLATE/ComponentName.tsx +2 -2
  119. package/src/_COMPONENT_TEMPLATE/ComponentName.types.ts +1 -1
  120. package/src/composites/actions/Button/Button.styles.ts +72 -55
  121. package/src/composites/actions/Button/Button.tsx +35 -14
  122. package/src/composites/actions/Button/Button.types.ts +13 -1
  123. package/src/composites/branding/LogoMonogram/LogoMonogram.tsx +29 -0
  124. package/src/composites/branding/LogoMonogram/LogoMonogram.types.ts +35 -0
  125. package/src/composites/branding/LogoMonogram/index.ts +2 -0
  126. package/src/composites/branding/LogoWordmark/LogoWordmark.tsx +29 -0
  127. package/src/composites/branding/LogoWordmark/LogoWordmark.types.ts +25 -0
  128. package/src/composites/branding/LogoWordmark/index.ts +2 -0
  129. package/src/composites/display/Chip/Chip.styles.ts +189 -0
  130. package/src/composites/display/Chip/Chip.tsx +97 -0
  131. package/src/composites/display/Chip/Chip.types.ts +74 -0
  132. package/src/composites/display/Chip/index.ts +2 -0
  133. package/src/composites/form-controls/Select/Select.styles.ts +10 -10
  134. package/src/composites/form-controls/Select/Select.tsx +9 -7
  135. package/src/composites/form-controls/Select/SelectOption.tsx +10 -8
  136. package/src/composites/form-controls/TextInput/TextInput.styles.ts +12 -9
  137. package/src/composites/form-controls/TextInput/TextInput.tsx +7 -5
  138. package/src/composites/form-controls/Toggle/Toggle.styles.ts +10 -7
  139. package/src/composites/form-controls/Toggle/Toggle.tsx +4 -3
  140. package/src/composites/layout/AppShell/AppShell.styles.ts +8 -4
  141. package/src/composites/layout/AppShell/AppShell.tsx +6 -2
  142. package/src/composites/layout/Card/Card.styles.ts +10 -5
  143. package/src/composites/layout/Card/Card.tsx +4 -3
  144. package/src/composites/layout/Card/Card.types.ts +1 -1
  145. package/src/composites/layout/ContentCard/ContentCard.styles.ts +44 -0
  146. package/src/composites/layout/ContentCard/ContentCard.tsx +71 -0
  147. package/src/composites/layout/ContentCard/ContentCard.types.ts +60 -0
  148. package/src/composites/layout/ContentCard/index.ts +2 -0
  149. package/src/composites/layout/Divider/Divider.styles.ts +30 -0
  150. package/src/composites/layout/Divider/Divider.tsx +46 -0
  151. package/src/composites/layout/Divider/Divider.types.ts +28 -0
  152. package/src/composites/layout/Divider/index.ts +2 -0
  153. package/src/composites/layout/Navbar/Navbar.styles.ts +7 -5
  154. package/src/composites/layout/Navbar/Navbar.tsx +4 -3
  155. package/src/composites/layout/Sidebar/Sidebar.styles.ts +7 -5
  156. package/src/composites/layout/Sidebar/Sidebar.tsx +4 -3
  157. package/src/composites/overlays/Popover/Popover.styles.ts +7 -5
  158. package/src/composites/overlays/Popover/Popover.tsx +4 -3
  159. package/src/composites/range-inputs/ColorScaleSlider/ColorScaleSlider.styles.ts +4 -5
  160. package/src/composites/range-inputs/ColorScaleSlider/ColorScaleSlider.tsx +6 -2
  161. package/src/composites/range-inputs/ColorScaleSlider/ColorScaleSlider.types.ts +2 -0
  162. package/src/composites/range-inputs/HueSlider/HueSlider.styles.ts +13 -20
  163. package/src/composites/range-inputs/HueSlider/HueSlider.tsx +7 -8
  164. package/src/composites/range-inputs/Slider/Slider.styles.ts +8 -9
  165. package/src/composites/range-inputs/Slider/Slider.tsx +1 -1
  166. package/src/index.ts +108 -61
  167. package/src/primitives/Frame/Frame.styles.ts +55 -11
  168. package/src/primitives/Frame/Frame.tsx +140 -142
  169. package/src/primitives/Frame/Frame.types.ts +119 -1
  170. package/src/primitives/Frame/Frame.utils.ts +1 -1
  171. package/src/primitives/Frame/index.ts +4 -0
  172. package/src/primitives/Icon/Icon.tsx +9 -7
  173. package/src/primitives/Icon/Icon.types.ts +2 -2
  174. package/src/primitives/Text/Text.spans.ts +9 -5
  175. package/src/primitives/Text/Text.tsx +33 -22
  176. package/src/primitives/Text/Text.types.ts +4 -7
  177. package/src/primitives/Wrapper/Wrapper.styles.ts +33 -1
  178. package/src/primitives/Wrapper/Wrapper.tsx +23 -4
  179. package/src/primitives/Wrapper/Wrapper.types.ts +45 -0
  180. package/dist/fonts/GoogleFontLoader.d.ts +0 -20
  181. package/dist/fonts/GoogleFontLoader.d.ts.map +0 -1
  182. package/dist/fonts/IconFontLoader.d.ts +0 -13
  183. package/dist/fonts/IconFontLoader.d.ts.map +0 -1
  184. package/dist/fonts/SelfHostedFontLoader.d.ts +0 -14
  185. package/dist/fonts/SelfHostedFontLoader.d.ts.map +0 -1
  186. package/dist/fonts/buildGoogleFontsUrl.d.ts +0 -2
  187. package/dist/fonts/buildGoogleFontsUrl.d.ts.map +0 -1
  188. package/dist/fonts/measureFont.d.ts +0 -19
  189. package/dist/fonts/measureFont.d.ts.map +0 -1
  190. package/dist/fonts/reportQueue.d.ts +0 -7
  191. package/dist/fonts/reportQueue.d.ts.map +0 -1
  192. package/dist/fonts/useLocalCalibration.d.ts +0 -19
  193. package/dist/fonts/useLocalCalibration.d.ts.map +0 -1
  194. package/dist/fonts/useTypographyCalibrations.d.ts +0 -11
  195. package/dist/fonts/useTypographyCalibrations.d.ts.map +0 -1
  196. package/dist/theme/FrameContext.d.ts +0 -26
  197. package/dist/theme/FrameContext.d.ts.map +0 -1
  198. package/dist/theme/NewtoneProvider.d.ts +0 -40
  199. package/dist/theme/NewtoneProvider.d.ts.map +0 -1
  200. package/dist/theme/defaults.d.ts +0 -8
  201. package/dist/theme/defaults.d.ts.map +0 -1
  202. package/dist/theme/types.d.ts +0 -156
  203. package/dist/theme/types.d.ts.map +0 -1
  204. package/dist/theme/useBreakpoint.d.ts +0 -9
  205. package/dist/theme/useBreakpoint.d.ts.map +0 -1
  206. package/dist/tokens/computeTokens.d.ts +0 -151
  207. package/dist/tokens/computeTokens.d.ts.map +0 -1
  208. package/dist/tokens/types.d.ts +0 -162
  209. package/dist/tokens/types.d.ts.map +0 -1
  210. package/dist/tokens/useTokens.d.ts +0 -26
  211. package/dist/tokens/useTokens.d.ts.map +0 -1
  212. package/src/fonts/GoogleFontLoader.tsx +0 -80
  213. package/src/fonts/IconFontLoader.tsx +0 -51
  214. package/src/fonts/SelfHostedFontLoader.tsx +0 -44
  215. package/src/fonts/buildGoogleFontsUrl.ts +0 -2
  216. package/src/fonts/measureFont.ts +0 -55
  217. package/src/fonts/reportQueue.ts +0 -54
  218. package/src/fonts/useLocalCalibration.ts +0 -97
  219. package/src/fonts/useTypographyCalibrations.ts +0 -15
  220. package/src/theme/FrameContext.tsx +0 -31
  221. package/src/theme/NewtoneProvider.tsx +0 -84
  222. package/src/theme/defaults.ts +0 -71
  223. package/src/theme/types.ts +0 -191
  224. package/src/theme/useBreakpoint.ts +0 -14
  225. package/src/tokens/computeTokens.ts +0 -516
  226. package/src/tokens/types.ts +0 -146
  227. package/src/tokens/useTokens.ts +0 -62
@@ -0,0 +1,97 @@
1
+ import React from 'react';
2
+ import { Pressable } from 'react-native';
3
+ import type { ChipProps } from './Chip.types';
4
+ import { getChipConfig } from './Chip.styles';
5
+ import { useTokens } from 'newtone-api';
6
+ import { Icon } from '../../../primitives/Icon/Icon';
7
+ import { Text } from '../../../primitives/Text';
8
+ import { Wrapper } from '../../../primitives/Wrapper/Wrapper';
9
+
10
+ /**
11
+ * Chip — A pill-shaped label for tags, filters, badges, and status indicators.
12
+ *
13
+ * **Composition Architecture:**
14
+ * - Pressable (RN primitive) — handles interaction (when onPress is provided)
15
+ * - Wrapper (primitive) — handles layout (direction, gap, padding, alignment)
16
+ * - Icon (primitive) — handles optional leading icon
17
+ * - Text (primitive) — handles typography with theme tokens
18
+ *
19
+ * @example
20
+ * ```tsx
21
+ * // Static label
22
+ * <Chip>Design Systems</Chip>
23
+ *
24
+ * // Interactive filter chip
25
+ * <Chip selected={isActive} onPress={() => toggle()}>Color Science</Chip>
26
+ *
27
+ * // With icon
28
+ * <Chip icon="check" semantic="success">Verified</Chip>
29
+ * ```
30
+ */
31
+ export function Chip({
32
+ children,
33
+ variant = 'tinted',
34
+ size = 'md',
35
+ semantic = 'neutral',
36
+ selected = false,
37
+ onPress,
38
+ disabled = false,
39
+ icon,
40
+ style,
41
+ }: ChipProps) {
42
+ const tokens = useTokens();
43
+
44
+ const { colors, sizeTokens } = React.useMemo(
45
+ () => getChipConfig(variant, semantic, size, selected, disabled, tokens),
46
+ [variant, semantic, size, selected, disabled, tokens]
47
+ );
48
+
49
+ const content = (state?: { pressed: boolean; hovered?: boolean }) => (
50
+ <Wrapper
51
+ direction="horizontal"
52
+ align="center"
53
+ gap={sizeTokens.gap}
54
+ style={[
55
+ {
56
+ paddingLeft: sizeTokens.paddingX,
57
+ paddingRight: sizeTokens.paddingX,
58
+ paddingTop: sizeTokens.paddingY,
59
+ paddingBottom: sizeTokens.paddingY,
60
+ backgroundColor: state?.pressed && !disabled
61
+ ? colors.pressedBg
62
+ : state?.hovered && !disabled
63
+ ? colors.hoveredBg
64
+ : colors.bg,
65
+ borderRadius: 99,
66
+ borderWidth: colors.borderWidth,
67
+ borderColor: colors.borderColor || 'transparent',
68
+ opacity: disabled ? 0.4 : 1,
69
+ },
70
+ ...(Array.isArray(style) ? style : style ? [style] : []),
71
+ ]}
72
+ >
73
+ {icon && (
74
+ <Icon name={icon} size={sizeTokens.iconSize} color={colors.iconColor} />
75
+ )}
76
+ <Text
77
+ role={sizeTokens.textRole}
78
+ weight={selected ? 'bold' : 'medium'}
79
+ style={{ color: colors.textColor }}
80
+ >
81
+ {children}
82
+ </Text>
83
+ </Wrapper>
84
+ );
85
+
86
+ if (onPress) {
87
+ return (
88
+ <Pressable onPress={onPress} disabled={disabled}>
89
+ {({ pressed, hovered }: { pressed: boolean; hovered?: boolean }) =>
90
+ content({ pressed, hovered })
91
+ }
92
+ </Pressable>
93
+ );
94
+ }
95
+
96
+ return content();
97
+ }
@@ -0,0 +1,74 @@
1
+ import type { ViewStyle } from 'react-native';
2
+
3
+ /**
4
+ * Visual variant for the Chip component
5
+ */
6
+ export type ChipVariant = 'filled' | 'tinted' | 'outlined';
7
+
8
+ /**
9
+ * Semantic meaning for the Chip component (describes color purpose)
10
+ */
11
+ export type ChipSemantic = 'neutral' | 'accent' | 'success' | 'error' | 'warning';
12
+
13
+ /**
14
+ * Size presets for the Chip component
15
+ */
16
+ export type ChipSize = 'sm' | 'md';
17
+
18
+ /**
19
+ * Props for the Chip component
20
+ */
21
+ export interface ChipProps {
22
+ /**
23
+ * Chip label content.
24
+ */
25
+ readonly children: React.ReactNode;
26
+
27
+ /**
28
+ * Visual variant (describes visual treatment)
29
+ * @default 'tinted'
30
+ */
31
+ readonly variant?: ChipVariant;
32
+
33
+ /**
34
+ * Size preset
35
+ * @default 'md'
36
+ */
37
+ readonly size?: ChipSize;
38
+
39
+ /**
40
+ * Semantic meaning (describes color purpose)
41
+ * @default 'neutral'
42
+ */
43
+ readonly semantic?: ChipSemantic;
44
+
45
+ /**
46
+ * Selected state — overrides appearance to "strong" with bold weight.
47
+ * Useful for filter bars and toggle groups.
48
+ * @default false
49
+ */
50
+ readonly selected?: boolean;
51
+
52
+ /**
53
+ * Press handler — makes the chip interactive.
54
+ * When provided, the chip renders as a Pressable.
55
+ */
56
+ readonly onPress?: () => void;
57
+
58
+ /**
59
+ * Disabled state
60
+ * @default false
61
+ */
62
+ readonly disabled?: boolean;
63
+
64
+ /**
65
+ * Material Symbol icon name (e.g. 'check', 'close').
66
+ * Renders a leading icon before the label.
67
+ */
68
+ readonly icon?: string;
69
+
70
+ /**
71
+ * Custom style overrides for container
72
+ */
73
+ readonly style?: ViewStyle | ViewStyle[];
74
+ }
@@ -0,0 +1,2 @@
1
+ export { Chip } from './Chip';
2
+ export type { ChipProps, ChipVariant, ChipSemantic, ChipSize } from './Chip.types';
@@ -1,13 +1,15 @@
1
1
  import { StyleSheet } from 'react-native';
2
- import { srgbToHex } from 'newtone';
3
- import type { ResolvedTokens } from '../../../tokens/types';
2
+ import type { ResolvedTokens, AppearanceTokens, ThemeName, AppearanceName } from 'newtone-api';
4
3
 
5
4
  export function getSelectStyles(
6
5
  tokens: ResolvedTokens,
7
6
  disabled: boolean,
8
7
  size: 'sm' | 'md',
9
- isOpen: boolean
8
+ isOpen: boolean,
9
+ theme: ThemeName = 'primary',
10
+ appearance: AppearanceName = 'main',
10
11
  ) {
12
+ const at: AppearanceTokens = tokens.colors[theme][appearance];
11
13
  const isSm = size === 'sm';
12
14
  const fontSize = isSm ? tokens.typography.fontSizes['04'] : tokens.typography.fontSizes['05'];
13
15
  const iconSize = fontSize + 2;
@@ -24,14 +26,14 @@ export function getSelectStyles(
24
26
  fontFamily: tokens.typography.fonts.main.family,
25
27
  fontSize: tokens.typography.fontSizes['04'],
26
28
  fontWeight: tokens.typography.fonts.main.weights.medium as any,
27
- color: srgbToHex(tokens.textSecondary.srgb),
29
+ color: at.fontTertiary,
28
30
  },
29
31
  trigger: {
30
32
  flexDirection: 'row',
31
33
  alignItems: 'center',
32
- backgroundColor: srgbToHex(tokens.backgroundSunken.srgb),
34
+ backgroundColor: at.fontSecondary,
33
35
  borderWidth: 1,
34
- borderColor: srgbToHex(tokens.border.srgb),
36
+ borderColor: at.fontSecondary,
35
37
  borderRadius: tokens.radius.md,
36
38
  paddingVertical,
37
39
  paddingLeft: paddingHorizontal,
@@ -42,9 +44,7 @@ export function getSelectStyles(
42
44
  flex: 1,
43
45
  fontFamily: tokens.typography.fonts.main.family,
44
46
  fontSize,
45
- color: disabled
46
- ? srgbToHex(tokens.textSecondary.srgb)
47
- : srgbToHex(tokens.textPrimary.srgb),
47
+ color: disabled ? at.fontTertiary : at.divider,
48
48
  },
49
49
  iconWrapper: {
50
50
  position: 'absolute',
@@ -57,7 +57,7 @@ export function getSelectStyles(
57
57
  fontFamily: tokens.typography.fonts.main.family,
58
58
  fontSize: tokens.typography.fontSizes['01'],
59
59
  fontWeight: tokens.typography.fonts.main.weights.medium as any,
60
- color: srgbToHex(tokens.textSecondary.srgb),
60
+ color: at.fontTertiary,
61
61
  textTransform: 'uppercase',
62
62
  letterSpacing: 0.5,
63
63
  paddingVertical: tokens.spacing['04'],
@@ -2,14 +2,13 @@ import React, { useMemo } from 'react';
2
2
  import { View, Text, Pressable, ScrollView } from 'react-native';
3
3
  import type { SelectProps, SelectOption } from './Select.types';
4
4
  import { isOptionGroup } from './Select.types';
5
- import { useTokens } from '../../../tokens/useTokens';
5
+ import { useTokens, useFrameContext } from 'newtone-api';
6
6
  import { getSelectStyles } from './Select.styles';
7
7
  import { Icon } from '../../../primitives/Icon/Icon';
8
8
  import { Popover } from '../../overlays/Popover/Popover';
9
9
  import { usePopover } from '../../overlays/Popover/usePopover';
10
10
  import { useSelect } from './useSelect';
11
11
  import { SelectOptionRow } from './SelectOption';
12
- import { srgbToHex } from 'newtone';
13
12
 
14
13
  function flattenOptions(items: readonly (SelectOption | { readonly label: string; readonly options: readonly SelectOption[] })[]): SelectOption[] {
15
14
  const result: SelectOption[] = [];
@@ -36,6 +35,7 @@ export function Select({
36
35
  style,
37
36
  }: SelectProps) {
38
37
  const tokens = useTokens(1);
38
+ const frameCtx = useFrameContext();
39
39
  const { isOpen, open, close, toggle } = usePopover();
40
40
 
41
41
  const flatOptions = useMemo(() => flattenOptions(options), [options]);
@@ -52,17 +52,19 @@ export function Select({
52
52
  onOpen: open,
53
53
  });
54
54
 
55
+ const inheritedTheme = frameCtx?.theme;
56
+ const inheritedAppearance = frameCtx?.appearance;
57
+
55
58
  const styles = useMemo(
56
- () => getSelectStyles(tokens, disabled, size, isOpen),
57
- [tokens, disabled, size, isOpen]
59
+ () => getSelectStyles(tokens, disabled, size, isOpen, inheritedTheme, inheritedAppearance),
60
+ [tokens, disabled, size, isOpen, inheritedTheme, inheritedAppearance]
58
61
  );
59
62
 
60
63
  const selectedOption = flatOptions.find((o) => o.value === value);
61
64
  const displayLabel = selectedOption?.label ?? placeholder ?? value;
62
65
 
63
- const iconColor = disabled
64
- ? srgbToHex(tokens.textSecondary.srgb)
65
- : srgbToHex(tokens.textPrimary.srgb);
66
+ const at = tokens.colors[inheritedTheme ?? 'primary'][inheritedAppearance ?? 'main'];
67
+ const iconColor = disabled ? at.fontTertiary : at.divider;
66
68
 
67
69
  // onKeyDown is a web-only prop supported by react-native-web but not in RN types
68
70
  const triggerWebProps = { onKeyDown: handleKeyDown } as any;
@@ -1,9 +1,8 @@
1
1
  import React from 'react';
2
2
  import { Pressable, Text, View } from 'react-native';
3
3
  import type { SelectOption as SelectOptionType, SelectProps } from './Select.types';
4
- import { useTokens } from '../../../tokens/useTokens';
4
+ import { useTokens, useFrameContext } from 'newtone-api';
5
5
  import { Icon } from '../../../primitives/Icon/Icon';
6
- import { srgbToHex } from 'newtone';
7
6
 
8
7
  interface SelectOptionRowProps {
9
8
  readonly option: SelectOptionType;
@@ -23,6 +22,9 @@ export function SelectOptionRow({
23
22
  size,
24
23
  }: SelectOptionRowProps) {
25
24
  const tokens = useTokens(1);
25
+ const frameCtx = useFrameContext();
26
+ const at = tokens.colors[frameCtx?.theme ?? 'primary'][frameCtx?.appearance ?? 'main'];
27
+ const emphasisAt = tokens.colors[frameCtx?.theme ?? 'primary'].emphasis;
26
28
 
27
29
  const paddingVertical = size === 'sm' ? tokens.spacing['04'] : tokens.spacing['08'];
28
30
  const paddingHorizontal = size === 'sm' ? tokens.spacing['08'] : tokens.spacing['12'];
@@ -56,11 +58,11 @@ export function SelectOptionRow({
56
58
  paddingHorizontal,
57
59
  },
58
60
  isSelected && {
59
- backgroundColor: srgbToHex(tokens.backgroundSunken.srgb),
61
+ backgroundColor: at.fontSecondary,
60
62
  },
61
63
  isFocused &&
62
64
  !isSelected && {
63
- backgroundColor: `${srgbToHex(tokens.border.srgb)}20`,
65
+ backgroundColor: `${at.fontSecondary}20`,
64
66
  },
65
67
  option.disabled && {
66
68
  opacity: 0.5,
@@ -76,14 +78,14 @@ export function SelectOptionRow({
76
78
  flex: 1,
77
79
  fontFamily: tokens.typography.fonts.main.family,
78
80
  fontSize,
79
- color: srgbToHex(tokens.textPrimary.srgb),
81
+ color: at.divider,
80
82
  },
81
83
  isSelected && {
82
84
  fontWeight: tokens.typography.fonts.main.weights.medium as any,
83
- color: srgbToHex(tokens.accent.fill.srgb),
85
+ color: emphasisAt.divider,
84
86
  },
85
87
  option.disabled && {
86
- color: srgbToHex(tokens.textSecondary.srgb),
88
+ color: at.fontTertiary,
87
89
  },
88
90
  ]}
89
91
  numberOfLines={1}
@@ -95,7 +97,7 @@ export function SelectOptionRow({
95
97
  <Icon
96
98
  name="check"
97
99
  size={fontSize}
98
- color={srgbToHex(tokens.accent.fill.srgb)}
100
+ color={emphasisAt.divider}
99
101
  />
100
102
  </View>
101
103
  )}
@@ -1,8 +1,13 @@
1
1
  import { StyleSheet } from 'react-native';
2
- import { srgbToHex } from 'newtone';
3
- import type { ResolvedTokens } from '../../../tokens/types';
2
+ import type { ResolvedTokens, AppearanceTokens, ThemeName, AppearanceName } from 'newtone-api';
4
3
 
5
- export function getTextInputStyles(tokens: ResolvedTokens, disabled: boolean) {
4
+ export function getTextInputStyles(
5
+ tokens: ResolvedTokens,
6
+ disabled: boolean,
7
+ theme: ThemeName = 'primary',
8
+ appearance: AppearanceName = 'main',
9
+ ) {
10
+ const at: AppearanceTokens = tokens.colors[theme][appearance];
6
11
  return StyleSheet.create({
7
12
  container: {
8
13
  gap: tokens.spacing['04'],
@@ -11,20 +16,18 @@ export function getTextInputStyles(tokens: ResolvedTokens, disabled: boolean) {
11
16
  fontFamily: tokens.typography.fonts.main.family,
12
17
  fontSize: tokens.typography.fontSizes['04'],
13
18
  fontWeight: tokens.typography.fonts.main.weights.medium as any,
14
- color: srgbToHex(tokens.textSecondary.srgb),
19
+ color: at.fontTertiary,
15
20
  },
16
21
  input: {
17
22
  fontFamily: tokens.typography.fonts.main.family,
18
- backgroundColor: srgbToHex(tokens.backgroundSunken.srgb),
23
+ backgroundColor: at.fontSecondary,
19
24
  borderWidth: 1,
20
- borderColor: srgbToHex(tokens.border.srgb),
25
+ borderColor: at.fontSecondary,
21
26
  borderRadius: tokens.radius.md,
22
27
  paddingVertical: tokens.spacing['08'],
23
28
  paddingHorizontal: tokens.spacing['12'],
24
29
  fontSize: tokens.typography.fontSizes['05'],
25
- color: disabled
26
- ? srgbToHex(tokens.textSecondary.srgb)
27
- : srgbToHex(tokens.textPrimary.srgb),
30
+ color: disabled ? at.fontTertiary : at.divider,
28
31
  opacity: disabled ? 0.5 : 1,
29
32
  },
30
33
  });
@@ -1,9 +1,8 @@
1
1
  import React from 'react';
2
2
  import { View, Text, TextInput as RNTextInput } from 'react-native';
3
3
  import type { TextInputProps } from './TextInput.types';
4
- import { useTokens } from '../../../tokens/useTokens';
4
+ import { useTokens, useFrameContext } from 'newtone-api';
5
5
  import { getTextInputStyles } from './TextInput.styles';
6
- import { srgbToHex } from 'newtone';
7
6
 
8
7
  export function TextInput({
9
8
  label,
@@ -12,10 +11,13 @@ export function TextInput({
12
11
  ...textInputProps
13
12
  }: TextInputProps) {
14
13
  const tokens = useTokens(1);
14
+ const frameCtx = useFrameContext();
15
+ const theme = frameCtx?.theme ?? 'primary';
16
+ const appearance = frameCtx?.appearance ?? 'main';
15
17
 
16
18
  const styles = React.useMemo(
17
- () => getTextInputStyles(tokens, disabled),
18
- [tokens, disabled]
19
+ () => getTextInputStyles(tokens, disabled, theme, appearance),
20
+ [tokens, disabled, theme, appearance]
19
21
  );
20
22
 
21
23
  return (
@@ -24,7 +26,7 @@ export function TextInput({
24
26
  <RNTextInput
25
27
  style={styles.input}
26
28
  editable={!disabled}
27
- placeholderTextColor={srgbToHex(tokens.textSecondary.srgb)}
29
+ placeholderTextColor={tokens.colors[theme][appearance].fontTertiary}
28
30
  {...textInputProps}
29
31
  />
30
32
  </View>
@@ -1,6 +1,5 @@
1
1
  import { StyleSheet } from 'react-native';
2
- import { srgbToHex } from 'newtone';
3
- import type { ResolvedTokens } from '../../../tokens/types';
2
+ import type { ResolvedTokens, AppearanceTokens, ThemeName, AppearanceName } from 'newtone-api';
4
3
 
5
4
  const TRACK_WIDTH = 40;
6
5
  const TRACK_HEIGHT = 22;
@@ -10,8 +9,12 @@ const THUMB_OFFSET = 2;
10
9
  export function getToggleStyles(
11
10
  tokens: ResolvedTokens,
12
11
  value: boolean,
13
- disabled: boolean
12
+ disabled: boolean,
13
+ theme: ThemeName = 'primary',
14
+ appearance: AppearanceName = 'main',
14
15
  ) {
16
+ const at: AppearanceTokens = tokens.colors[theme][appearance];
17
+ const emphasisAt: AppearanceTokens = tokens.colors[theme].emphasis;
15
18
  return StyleSheet.create({
16
19
  container: {
17
20
  flexDirection: 'row',
@@ -23,15 +26,15 @@ export function getToggleStyles(
23
26
  fontFamily: tokens.typography.fonts.main.family,
24
27
  fontSize: tokens.typography.fontSizes['04'],
25
28
  fontWeight: tokens.typography.fonts.main.weights.medium as any,
26
- color: srgbToHex(tokens.textSecondary.srgb),
29
+ color: at.fontTertiary,
27
30
  },
28
31
  track: {
29
32
  width: TRACK_WIDTH,
30
33
  height: TRACK_HEIGHT,
31
34
  borderRadius: TRACK_HEIGHT / 2,
32
35
  backgroundColor: value
33
- ? srgbToHex(tokens.accent.fill.srgb)
34
- : srgbToHex(tokens.border.srgb),
36
+ ? emphasisAt.divider
37
+ : at.fontSecondary,
35
38
  justifyContent: 'center',
36
39
  paddingHorizontal: THUMB_OFFSET,
37
40
  },
@@ -39,7 +42,7 @@ export function getToggleStyles(
39
42
  width: THUMB_SIZE,
40
43
  height: THUMB_SIZE,
41
44
  borderRadius: THUMB_SIZE / 2,
42
- backgroundColor: srgbToHex(tokens.background.srgb),
45
+ backgroundColor: at.background,
43
46
  alignSelf: value ? 'flex-end' : 'flex-start',
44
47
  },
45
48
  });
@@ -1,7 +1,7 @@
1
1
  import React from 'react';
2
2
  import { View, Text, Pressable } from 'react-native';
3
3
  import type { ToggleProps } from './Toggle.types';
4
- import { useTokens } from '../../../tokens/useTokens';
4
+ import { useTokens, useFrameContext } from 'newtone-api';
5
5
  import { getToggleStyles } from './Toggle.styles';
6
6
 
7
7
  export function Toggle({
@@ -12,10 +12,11 @@ export function Toggle({
12
12
  style,
13
13
  }: ToggleProps) {
14
14
  const tokens = useTokens(1);
15
+ const frameCtx = useFrameContext();
15
16
 
16
17
  const styles = React.useMemo(
17
- () => getToggleStyles(tokens, value, disabled),
18
- [tokens, value, disabled]
18
+ () => getToggleStyles(tokens, value, disabled, frameCtx?.theme, frameCtx?.appearance),
19
+ [tokens, value, disabled, frameCtx?.theme, frameCtx?.appearance]
19
20
  );
20
21
 
21
22
  const handlePress = React.useCallback(() => {
@@ -1,14 +1,18 @@
1
1
  import { StyleSheet } from 'react-native';
2
- import { srgbToHex } from 'newtone';
3
- import type { ResolvedTokens } from '../../../tokens/types';
2
+ import type { ResolvedTokens, AppearanceTokens, ThemeName, AppearanceName } from 'newtone-api';
4
3
 
5
- export function getAppShellStyles(tokens: ResolvedTokens) {
4
+ export function getAppShellStyles(
5
+ tokens: ResolvedTokens,
6
+ theme: ThemeName = 'primary',
7
+ appearance: AppearanceName = 'main',
8
+ ) {
9
+ const at: AppearanceTokens = tokens.colors[theme][appearance];
6
10
  return StyleSheet.create({
7
11
  container: {
8
12
  flex: 1,
9
13
  flexDirection: 'row',
10
14
  overflow: 'hidden',
11
- backgroundColor: srgbToHex(tokens.background.srgb),
15
+ backgroundColor: at.background,
12
16
  },
13
17
  main: {
14
18
  flex: 1,
@@ -1,12 +1,16 @@
1
1
  import React from 'react';
2
2
  import { View } from 'react-native';
3
3
  import type { AppShellProps } from './AppShell.types';
4
- import { useTokens } from '../../../tokens/useTokens';
4
+ import { useTokens, useFrameContext } from 'newtone-api';
5
5
  import { getAppShellStyles } from './AppShell.styles';
6
6
 
7
7
  export function AppShell({ sidebar, children }: AppShellProps) {
8
8
  const tokens = useTokens();
9
- const styles = React.useMemo(() => getAppShellStyles(tokens), [tokens]);
9
+ const frameCtx = useFrameContext();
10
+ const styles = React.useMemo(
11
+ () => getAppShellStyles(tokens, frameCtx?.theme, frameCtx?.appearance),
12
+ [tokens, frameCtx?.theme, frameCtx?.appearance]
13
+ );
10
14
 
11
15
  return (
12
16
  <View style={styles.container}>
@@ -1,13 +1,18 @@
1
1
  import { StyleSheet } from 'react-native';
2
- import { srgbToHex } from 'newtone';
3
- import type { ResolvedTokens } from '../../../tokens/types';
2
+ import type { ResolvedTokens, AppearanceTokens, ThemeName, AppearanceName } from 'newtone-api';
4
3
 
5
- export function getCardStyles(tokens: ResolvedTokens, disabled: boolean) {
4
+ export function getCardStyles(
5
+ tokens: ResolvedTokens,
6
+ disabled: boolean,
7
+ theme: ThemeName = 'primary',
8
+ appearance: AppearanceName = 'main',
9
+ ) {
10
+ const at: AppearanceTokens = tokens.colors[theme][appearance];
6
11
  return StyleSheet.create({
7
12
  container: {
8
- backgroundColor: srgbToHex(tokens.background.srgb),
13
+ backgroundColor: at.background,
9
14
  borderWidth: 1,
10
- borderColor: srgbToHex(tokens.border.srgb),
15
+ borderColor: at.fontSecondary,
11
16
  borderRadius: tokens.radius.lg,
12
17
  padding: tokens.spacing['16'],
13
18
  opacity: disabled ? 0.5 : 1,
@@ -1,7 +1,7 @@
1
1
  import React from 'react';
2
2
  import { View } from 'react-native';
3
3
  import type { CardProps } from './Card.types';
4
- import { useTokens } from '../../../tokens/useTokens';
4
+ import { useTokens, useFrameContext } from 'newtone-api';
5
5
  import { getCardStyles } from './Card.styles';
6
6
 
7
7
  export function Card({
@@ -11,10 +11,11 @@ export function Card({
11
11
  disabled = false,
12
12
  }: CardProps) {
13
13
  const tokens = useTokens(elevation);
14
+ const frameCtx = useFrameContext();
14
15
 
15
16
  const styles = React.useMemo(
16
- () => getCardStyles(tokens, disabled),
17
- [tokens, disabled]
17
+ () => getCardStyles(tokens, disabled, frameCtx?.theme, frameCtx?.appearance),
18
+ [tokens, disabled, frameCtx?.theme, frameCtx?.appearance]
18
19
  );
19
20
 
20
21
  return (
@@ -1,5 +1,5 @@
1
1
  import type { ViewStyle } from 'react-native';
2
- import type { ElevationLevel } from '../../../theme/types';
2
+ import type { ElevationLevel } from 'newtone-api';
3
3
 
4
4
  export interface CardProps {
5
5
  readonly children: React.ReactNode;
@@ -0,0 +1,44 @@
1
+ import type { ViewStyle } from 'react-native';
2
+ import type { UseTokensResult } from 'newtone-api';
3
+ import type { ContentCardVariant } from './ContentCard.types';
4
+
5
+ /**
6
+ * Compute variant-specific styles for ContentCard.
7
+ * Uses `as ViewStyle` for web-only properties (cursor, borderBottomStyle)
8
+ * that react-native-web supports but RN types don't include.
9
+ */
10
+ export function getContentCardStyles(
11
+ variant: ContentCardVariant,
12
+ isInteractive: boolean,
13
+ tokens: UseTokensResult
14
+ ): ViewStyle {
15
+ const dividerColor = tokens.colors.primary.main.divider;
16
+
17
+ const interactiveStyles = isInteractive
18
+ ? { cursor: 'pointer', textDecorationLine: 'none' } as ViewStyle
19
+ : {} as ViewStyle;
20
+
21
+ if (variant === 'elevated') {
22
+ return {
23
+ borderRadius: 12,
24
+ ...interactiveStyles,
25
+ } as ViewStyle;
26
+ }
27
+
28
+ if (variant === 'bordered') {
29
+ return {
30
+ borderWidth: 1,
31
+ borderColor: dividerColor,
32
+ borderStyle: 'solid',
33
+ borderRadius: 12,
34
+ ...interactiveStyles,
35
+ } as ViewStyle;
36
+ }
37
+
38
+ // flat variant — bottom border only
39
+ return {
40
+ borderBottomWidth: 1,
41
+ borderBottomColor: dividerColor,
42
+ ...interactiveStyles,
43
+ } as ViewStyle;
44
+ }