@newtonedev/components 0.1.4 → 0.1.6
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.
- package/dist/composites/actions/Button/Button.d.ts +37 -0
- package/dist/composites/actions/Button/Button.d.ts.map +1 -0
- package/dist/composites/actions/Button/Button.styles.d.ts +65 -0
- package/dist/composites/actions/Button/Button.styles.d.ts.map +1 -0
- package/dist/{Button → composites/actions/Button}/Button.types.d.ts +12 -3
- package/dist/composites/actions/Button/Button.types.d.ts.map +1 -0
- package/dist/composites/actions/Button/index.d.ts.map +1 -0
- package/dist/composites/form-controls/Select/Select.d.ts.map +1 -0
- package/dist/{Select → composites/form-controls/Select}/Select.styles.d.ts +1 -1
- package/dist/composites/form-controls/Select/Select.styles.d.ts.map +1 -0
- package/dist/composites/form-controls/Select/Select.types.d.ts.map +1 -0
- package/dist/composites/form-controls/Select/SelectOption.d.ts.map +1 -0
- package/dist/composites/form-controls/Select/index.d.ts.map +1 -0
- package/dist/composites/form-controls/Select/useSelect.d.ts.map +1 -0
- package/dist/composites/form-controls/TextInput/TextInput.d.ts.map +1 -0
- package/dist/{TextInput → composites/form-controls/TextInput}/TextInput.styles.d.ts +1 -1
- package/dist/composites/form-controls/TextInput/TextInput.styles.d.ts.map +1 -0
- package/dist/composites/form-controls/TextInput/TextInput.types.d.ts.map +1 -0
- package/dist/composites/form-controls/TextInput/index.d.ts.map +1 -0
- package/dist/composites/form-controls/Toggle/Toggle.d.ts.map +1 -0
- package/dist/{Toggle → composites/form-controls/Toggle}/Toggle.styles.d.ts +1 -1
- package/dist/composites/form-controls/Toggle/Toggle.styles.d.ts.map +1 -0
- package/dist/composites/form-controls/Toggle/Toggle.types.d.ts.map +1 -0
- package/dist/composites/form-controls/Toggle/index.d.ts.map +1 -0
- package/dist/composites/layout/AppShell/AppShell.d.ts.map +1 -0
- package/dist/{AppShell → composites/layout/AppShell}/AppShell.styles.d.ts +1 -1
- package/dist/composites/layout/AppShell/AppShell.styles.d.ts.map +1 -0
- package/dist/composites/layout/AppShell/AppShell.types.d.ts.map +1 -0
- package/dist/composites/layout/AppShell/index.d.ts.map +1 -0
- package/dist/composites/layout/Card/Card.d.ts.map +1 -0
- package/dist/{Card → composites/layout/Card}/Card.styles.d.ts +1 -1
- package/dist/composites/layout/Card/Card.styles.d.ts.map +1 -0
- package/dist/{Card → composites/layout/Card}/Card.types.d.ts +1 -1
- package/dist/composites/layout/Card/Card.types.d.ts.map +1 -0
- package/dist/composites/layout/Card/index.d.ts.map +1 -0
- package/dist/composites/layout/Navbar/Navbar.d.ts.map +1 -0
- package/dist/{Navbar → composites/layout/Navbar}/Navbar.styles.d.ts +1 -1
- package/dist/composites/layout/Navbar/Navbar.styles.d.ts.map +1 -0
- package/dist/composites/layout/Navbar/Navbar.types.d.ts.map +1 -0
- package/dist/composites/layout/Navbar/index.d.ts.map +1 -0
- package/dist/composites/layout/Sidebar/Sidebar.d.ts.map +1 -0
- package/dist/{Sidebar → composites/layout/Sidebar}/Sidebar.styles.d.ts +1 -1
- package/dist/composites/layout/Sidebar/Sidebar.styles.d.ts.map +1 -0
- package/dist/composites/layout/Sidebar/Sidebar.types.d.ts.map +1 -0
- package/dist/composites/layout/Sidebar/index.d.ts.map +1 -0
- package/dist/composites/overlays/Popover/Popover.d.ts.map +1 -0
- package/dist/{Popover → composites/overlays/Popover}/Popover.styles.d.ts +1 -1
- package/dist/composites/overlays/Popover/Popover.styles.d.ts.map +1 -0
- package/dist/composites/overlays/Popover/Popover.types.d.ts.map +1 -0
- package/dist/composites/overlays/Popover/index.d.ts.map +1 -0
- package/dist/composites/overlays/Popover/usePopover.d.ts.map +1 -0
- package/dist/composites/range-inputs/ColorScaleSlider/ColorScaleSlider.d.ts.map +1 -0
- package/dist/{ColorScaleSlider → composites/range-inputs/ColorScaleSlider}/ColorScaleSlider.styles.d.ts +1 -1
- package/dist/composites/range-inputs/ColorScaleSlider/ColorScaleSlider.styles.d.ts.map +1 -0
- package/dist/composites/range-inputs/ColorScaleSlider/ColorScaleSlider.types.d.ts.map +1 -0
- package/dist/composites/range-inputs/ColorScaleSlider/index.d.ts.map +1 -0
- package/dist/composites/range-inputs/HueSlider/HueSlider.d.ts.map +1 -0
- package/dist/{HueSlider → composites/range-inputs/HueSlider}/HueSlider.styles.d.ts +1 -1
- package/dist/composites/range-inputs/HueSlider/HueSlider.styles.d.ts.map +1 -0
- package/dist/composites/range-inputs/HueSlider/HueSlider.types.d.ts.map +1 -0
- package/dist/composites/range-inputs/HueSlider/index.d.ts.map +1 -0
- package/dist/composites/range-inputs/Slider/Slider.d.ts.map +1 -0
- package/dist/{Slider → composites/range-inputs/Slider}/Slider.styles.d.ts +1 -1
- package/dist/composites/range-inputs/Slider/Slider.styles.d.ts.map +1 -0
- package/dist/composites/range-inputs/Slider/Slider.types.d.ts.map +1 -0
- package/dist/composites/range-inputs/Slider/index.d.ts.map +1 -0
- package/dist/index.cjs +1277 -764
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +30 -29
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1234 -726
- package/dist/index.js.map +1 -1
- package/dist/primitives/Frame/Frame.d.ts +2 -3
- package/dist/primitives/Frame/Frame.d.ts.map +1 -1
- package/dist/primitives/Frame/Frame.types.d.ts +4 -15
- package/dist/primitives/Frame/Frame.types.d.ts.map +1 -1
- package/dist/primitives/Icon/Icon.d.ts.map +1 -1
- package/dist/primitives/Text/Text.d.ts.map +1 -1
- package/dist/primitives/Text/Text.types.d.ts +9 -4
- package/dist/primitives/Text/Text.types.d.ts.map +1 -1
- package/dist/primitives/Wrapper/Wrapper.d.ts +1 -1
- package/dist/primitives/Wrapper/Wrapper.types.d.ts +1 -1
- package/dist/registry/registry.d.ts.map +1 -1
- package/dist/theme/FrameContext.d.ts +7 -5
- package/dist/theme/FrameContext.d.ts.map +1 -1
- package/dist/theme/NewtoneProvider.d.ts +5 -6
- package/dist/theme/NewtoneProvider.d.ts.map +1 -1
- package/dist/theme/defaults.d.ts.map +1 -1
- package/dist/theme/types.d.ts +38 -24
- package/dist/theme/types.d.ts.map +1 -1
- package/dist/tokens/computeTokens.d.ts +82 -7
- package/dist/tokens/computeTokens.d.ts.map +1 -1
- package/dist/tokens/types.d.ts +66 -14
- package/dist/tokens/types.d.ts.map +1 -1
- package/dist/tokens/useTokens.d.ts +11 -14
- package/dist/tokens/useTokens.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/composites/actions/Button/Button.styles.ts +338 -0
- package/src/composites/actions/Button/Button.tsx +119 -0
- package/src/{Button → composites/actions/Button}/Button.types.ts +14 -3
- package/src/{Select → composites/form-controls/Select}/Select.styles.ts +1 -1
- package/src/{Select → composites/form-controls/Select}/Select.tsx +4 -4
- package/src/{Select → composites/form-controls/Select}/SelectOption.tsx +4 -4
- package/src/{TextInput → composites/form-controls/TextInput}/TextInput.styles.ts +1 -1
- package/src/{TextInput → composites/form-controls/TextInput}/TextInput.tsx +1 -1
- package/src/{Toggle → composites/form-controls/Toggle}/Toggle.styles.ts +2 -2
- package/src/{Toggle → composites/form-controls/Toggle}/Toggle.tsx +1 -1
- package/src/{AppShell → composites/layout/AppShell}/AppShell.styles.ts +1 -1
- package/src/{AppShell → composites/layout/AppShell}/AppShell.tsx +1 -1
- package/src/{Card → composites/layout/Card}/Card.styles.ts +1 -1
- package/src/{Card → composites/layout/Card}/Card.tsx +1 -1
- package/src/{Card → composites/layout/Card}/Card.types.ts +1 -1
- package/src/{Navbar → composites/layout/Navbar}/Navbar.styles.ts +1 -1
- package/src/{Navbar → composites/layout/Navbar}/Navbar.tsx +1 -1
- package/src/{Sidebar → composites/layout/Sidebar}/Sidebar.styles.ts +1 -1
- package/src/{Sidebar → composites/layout/Sidebar}/Sidebar.tsx +1 -1
- package/src/{Popover → composites/overlays/Popover}/Popover.styles.ts +1 -1
- package/src/{Popover → composites/overlays/Popover}/Popover.tsx +1 -1
- package/src/{ColorScaleSlider → composites/range-inputs/ColorScaleSlider}/ColorScaleSlider.styles.ts +2 -2
- package/src/{ColorScaleSlider → composites/range-inputs/ColorScaleSlider}/ColorScaleSlider.tsx +1 -1
- package/src/{HueSlider → composites/range-inputs/HueSlider}/HueSlider.styles.ts +1 -1
- package/src/{HueSlider → composites/range-inputs/HueSlider}/HueSlider.tsx +1 -1
- package/src/{Slider → composites/range-inputs/Slider}/Slider.styles.ts +3 -3
- package/src/{Slider → composites/range-inputs/Slider}/Slider.tsx +1 -1
- package/src/index.ts +40 -33
- package/src/primitives/Frame/Frame.tsx +10 -18
- package/src/primitives/Frame/Frame.types.ts +5 -17
- package/src/primitives/Icon/Icon.tsx +16 -1
- package/src/primitives/Text/Text.tsx +18 -8
- package/src/primitives/Text/Text.types.ts +9 -4
- package/src/primitives/Wrapper/Wrapper.tsx +1 -1
- package/src/primitives/Wrapper/Wrapper.types.ts +1 -1
- package/src/registry/registry.ts +239 -6
- package/src/theme/FrameContext.tsx +7 -5
- package/src/theme/NewtoneProvider.tsx +5 -10
- package/src/theme/defaults.ts +0 -9
- package/src/theme/types.ts +53 -26
- package/src/tokens/computeTokens.ts +351 -113
- package/src/tokens/types.ts +82 -14
- package/src/tokens/useTokens.ts +29 -24
- package/dist/AppShell/AppShell.d.ts.map +0 -1
- package/dist/AppShell/AppShell.styles.d.ts.map +0 -1
- package/dist/AppShell/AppShell.types.d.ts.map +0 -1
- package/dist/AppShell/index.d.ts.map +0 -1
- package/dist/Button/Button.d.ts +0 -28
- package/dist/Button/Button.d.ts.map +0 -1
- package/dist/Button/Button.styles.d.ts +0 -46
- package/dist/Button/Button.styles.d.ts.map +0 -1
- package/dist/Button/Button.types.d.ts.map +0 -1
- package/dist/Button/index.d.ts.map +0 -1
- package/dist/Card/Card.d.ts.map +0 -1
- package/dist/Card/Card.styles.d.ts.map +0 -1
- package/dist/Card/Card.types.d.ts.map +0 -1
- package/dist/Card/index.d.ts.map +0 -1
- package/dist/ColorScaleSlider/ColorScaleSlider.d.ts.map +0 -1
- package/dist/ColorScaleSlider/ColorScaleSlider.styles.d.ts.map +0 -1
- package/dist/ColorScaleSlider/ColorScaleSlider.types.d.ts.map +0 -1
- package/dist/ColorScaleSlider/index.d.ts.map +0 -1
- package/dist/HueSlider/HueSlider.d.ts.map +0 -1
- package/dist/HueSlider/HueSlider.styles.d.ts.map +0 -1
- package/dist/HueSlider/HueSlider.types.d.ts.map +0 -1
- package/dist/HueSlider/index.d.ts.map +0 -1
- package/dist/Navbar/Navbar.d.ts.map +0 -1
- package/dist/Navbar/Navbar.styles.d.ts.map +0 -1
- package/dist/Navbar/Navbar.types.d.ts.map +0 -1
- package/dist/Navbar/index.d.ts.map +0 -1
- package/dist/Popover/Popover.d.ts.map +0 -1
- package/dist/Popover/Popover.styles.d.ts.map +0 -1
- package/dist/Popover/Popover.types.d.ts.map +0 -1
- package/dist/Popover/index.d.ts.map +0 -1
- package/dist/Popover/usePopover.d.ts.map +0 -1
- package/dist/Select/Select.d.ts.map +0 -1
- package/dist/Select/Select.styles.d.ts.map +0 -1
- package/dist/Select/Select.types.d.ts.map +0 -1
- package/dist/Select/SelectOption.d.ts.map +0 -1
- package/dist/Select/index.d.ts.map +0 -1
- package/dist/Select/useSelect.d.ts.map +0 -1
- package/dist/Sidebar/Sidebar.d.ts.map +0 -1
- package/dist/Sidebar/Sidebar.styles.d.ts.map +0 -1
- package/dist/Sidebar/Sidebar.types.d.ts.map +0 -1
- package/dist/Sidebar/index.d.ts.map +0 -1
- package/dist/Slider/Slider.d.ts.map +0 -1
- package/dist/Slider/Slider.styles.d.ts.map +0 -1
- package/dist/Slider/Slider.types.d.ts.map +0 -1
- package/dist/Slider/index.d.ts.map +0 -1
- package/dist/TextInput/TextInput.d.ts.map +0 -1
- package/dist/TextInput/TextInput.styles.d.ts.map +0 -1
- package/dist/TextInput/TextInput.types.d.ts.map +0 -1
- package/dist/TextInput/index.d.ts.map +0 -1
- package/dist/Toggle/Toggle.d.ts.map +0 -1
- package/dist/Toggle/Toggle.styles.d.ts.map +0 -1
- package/dist/Toggle/Toggle.types.d.ts.map +0 -1
- package/dist/Toggle/index.d.ts.map +0 -1
- package/src/Button/Button.styles.ts +0 -133
- package/src/Button/Button.tsx +0 -86
- /package/dist/{Button → composites/actions/Button}/index.d.ts +0 -0
- /package/dist/{Select → composites/form-controls/Select}/Select.d.ts +0 -0
- /package/dist/{Select → composites/form-controls/Select}/Select.types.d.ts +0 -0
- /package/dist/{Select → composites/form-controls/Select}/SelectOption.d.ts +0 -0
- /package/dist/{Select → composites/form-controls/Select}/index.d.ts +0 -0
- /package/dist/{Select → composites/form-controls/Select}/useSelect.d.ts +0 -0
- /package/dist/{TextInput → composites/form-controls/TextInput}/TextInput.d.ts +0 -0
- /package/dist/{TextInput → composites/form-controls/TextInput}/TextInput.types.d.ts +0 -0
- /package/dist/{TextInput → composites/form-controls/TextInput}/index.d.ts +0 -0
- /package/dist/{Toggle → composites/form-controls/Toggle}/Toggle.d.ts +0 -0
- /package/dist/{Toggle → composites/form-controls/Toggle}/Toggle.types.d.ts +0 -0
- /package/dist/{Toggle → composites/form-controls/Toggle}/index.d.ts +0 -0
- /package/dist/{AppShell → composites/layout/AppShell}/AppShell.d.ts +0 -0
- /package/dist/{AppShell → composites/layout/AppShell}/AppShell.types.d.ts +0 -0
- /package/dist/{AppShell → composites/layout/AppShell}/index.d.ts +0 -0
- /package/dist/{Card → composites/layout/Card}/Card.d.ts +0 -0
- /package/dist/{Card → composites/layout/Card}/index.d.ts +0 -0
- /package/dist/{Navbar → composites/layout/Navbar}/Navbar.d.ts +0 -0
- /package/dist/{Navbar → composites/layout/Navbar}/Navbar.types.d.ts +0 -0
- /package/dist/{Navbar → composites/layout/Navbar}/index.d.ts +0 -0
- /package/dist/{Sidebar → composites/layout/Sidebar}/Sidebar.d.ts +0 -0
- /package/dist/{Sidebar → composites/layout/Sidebar}/Sidebar.types.d.ts +0 -0
- /package/dist/{Sidebar → composites/layout/Sidebar}/index.d.ts +0 -0
- /package/dist/{Popover → composites/overlays/Popover}/Popover.d.ts +0 -0
- /package/dist/{Popover → composites/overlays/Popover}/Popover.types.d.ts +0 -0
- /package/dist/{Popover → composites/overlays/Popover}/index.d.ts +0 -0
- /package/dist/{Popover → composites/overlays/Popover}/usePopover.d.ts +0 -0
- /package/dist/{ColorScaleSlider → composites/range-inputs/ColorScaleSlider}/ColorScaleSlider.d.ts +0 -0
- /package/dist/{ColorScaleSlider → composites/range-inputs/ColorScaleSlider}/ColorScaleSlider.types.d.ts +0 -0
- /package/dist/{ColorScaleSlider → composites/range-inputs/ColorScaleSlider}/index.d.ts +0 -0
- /package/dist/{HueSlider → composites/range-inputs/HueSlider}/HueSlider.d.ts +0 -0
- /package/dist/{HueSlider → composites/range-inputs/HueSlider}/HueSlider.types.d.ts +0 -0
- /package/dist/{HueSlider → composites/range-inputs/HueSlider}/index.d.ts +0 -0
- /package/dist/{Slider → composites/range-inputs/Slider}/Slider.d.ts +0 -0
- /package/dist/{Slider → composites/range-inputs/Slider}/Slider.types.d.ts +0 -0
- /package/dist/{Slider → composites/range-inputs/Slider}/index.d.ts +0 -0
- /package/src/{Button → composites/actions/Button}/index.ts +0 -0
- /package/src/{Select → composites/form-controls/Select}/Select.types.ts +0 -0
- /package/src/{Select → composites/form-controls/Select}/index.ts +0 -0
- /package/src/{Select → composites/form-controls/Select}/useSelect.ts +0 -0
- /package/src/{TextInput → composites/form-controls/TextInput}/TextInput.types.ts +0 -0
- /package/src/{TextInput → composites/form-controls/TextInput}/index.ts +0 -0
- /package/src/{Toggle → composites/form-controls/Toggle}/Toggle.types.ts +0 -0
- /package/src/{Toggle → composites/form-controls/Toggle}/index.ts +0 -0
- /package/src/{AppShell → composites/layout/AppShell}/AppShell.types.ts +0 -0
- /package/src/{AppShell → composites/layout/AppShell}/index.ts +0 -0
- /package/src/{Card → composites/layout/Card}/index.ts +0 -0
- /package/src/{Navbar → composites/layout/Navbar}/Navbar.types.ts +0 -0
- /package/src/{Navbar → composites/layout/Navbar}/index.ts +0 -0
- /package/src/{Sidebar → composites/layout/Sidebar}/Sidebar.types.ts +0 -0
- /package/src/{Sidebar → composites/layout/Sidebar}/index.ts +0 -0
- /package/src/{Popover → composites/overlays/Popover}/Popover.types.ts +0 -0
- /package/src/{Popover → composites/overlays/Popover}/index.ts +0 -0
- /package/src/{Popover → composites/overlays/Popover}/usePopover.ts +0 -0
- /package/src/{ColorScaleSlider → composites/range-inputs/ColorScaleSlider}/ColorScaleSlider.types.ts +0 -0
- /package/src/{ColorScaleSlider → composites/range-inputs/ColorScaleSlider}/index.ts +0 -0
- /package/src/{HueSlider → composites/range-inputs/HueSlider}/HueSlider.types.ts +0 -0
- /package/src/{HueSlider → composites/range-inputs/HueSlider}/index.ts +0 -0
- /package/src/{Slider → composites/range-inputs/Slider}/Slider.types.ts +0 -0
- /package/src/{Slider → composites/range-inputs/Slider}/index.ts +0 -0
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
import type { ElevationLevel } from '../theme/types';
|
|
2
2
|
import type { ResolvedTokens } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* Extended tokens result that includes the resolved elevation level.
|
|
5
|
+
* This allows components to make elevation-aware styling decisions.
|
|
6
|
+
*/
|
|
7
|
+
export interface UseTokensResult extends ResolvedTokens {
|
|
8
|
+
elevation: ElevationLevel;
|
|
9
|
+
}
|
|
3
10
|
/**
|
|
4
11
|
* Hook to compute design tokens for the current theme/mode/elevation.
|
|
5
12
|
*
|
|
@@ -8,22 +15,12 @@ import type { ResolvedTokens } from './types';
|
|
|
8
15
|
* 2. FrameContext values (from nearest parent Frame) are used when elevation is omitted
|
|
9
16
|
* 3. Falls back to NewtoneProvider theme + elevation 1
|
|
10
17
|
*
|
|
11
|
-
*
|
|
18
|
+
* When inside a Frame and no explicit elevation override is given, reuses the
|
|
19
|
+
* Frame's pre-computed tokens to avoid redundant computeTokens calls.
|
|
12
20
|
*
|
|
13
21
|
* @param elevation - Elevation level (0=sunken, 1=default, 2=elevated).
|
|
14
22
|
* When omitted, reads from FrameContext or defaults to 1.
|
|
15
|
-
* @returns Resolved design tokens with all necessary colors
|
|
16
|
-
*
|
|
17
|
-
* @example
|
|
18
|
-
* ```tsx
|
|
19
|
-
* // Inside a <Frame theme="primary" elevation={1}>:
|
|
20
|
-
* function MyComponent() {
|
|
21
|
-
* const tokens = useTokens(); // Gets primary theme, elevation 2 (mapped from Frame's 1)
|
|
22
|
-
* return (
|
|
23
|
-
* <View style={{ backgroundColor: srgbToHex(tokens.background.srgb) }} />
|
|
24
|
-
* );
|
|
25
|
-
* }
|
|
26
|
-
* ```
|
|
23
|
+
* @returns Resolved design tokens with all necessary colors + resolved elevation
|
|
27
24
|
*/
|
|
28
|
-
export declare function useTokens(elevation?: ElevationLevel):
|
|
25
|
+
export declare function useTokens(elevation?: ElevationLevel): UseTokensResult;
|
|
29
26
|
//# sourceMappingURL=useTokens.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTokens.d.ts","sourceRoot":"","sources":["../../src/tokens/useTokens.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C
|
|
1
|
+
{"version":3,"file":"useTokens.d.ts","sourceRoot":"","sources":["../../src/tokens/useTokens.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C;;;GAGG;AACH,MAAM,WAAW,eAAgB,SAAQ,cAAc;IACrD,SAAS,EAAE,cAAc,CAAC;CAC3B;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,SAAS,CAAC,SAAS,CAAC,EAAE,cAAc,GAAG,eAAe,CA+BrE"}
|
package/package.json
CHANGED
|
@@ -0,0 +1,338 @@
|
|
|
1
|
+
import { srgbToHex } from 'newtone';
|
|
2
|
+
import type { UseTokensResult } from '../../../tokens/useTokens';
|
|
3
|
+
import type { PaletteTokens } from '../../../tokens/types';
|
|
4
|
+
import type { ButtonVariant, ButtonSemantic, ButtonSize } from './Button.types';
|
|
5
|
+
import type { TextSize } from '../../../primitives/Text/Text.types';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Configuration returned by getButtonConfig
|
|
9
|
+
*/
|
|
10
|
+
export interface ButtonConfig {
|
|
11
|
+
variantColors: {
|
|
12
|
+
bg: string;
|
|
13
|
+
hoveredBg: string;
|
|
14
|
+
pressedBg: string;
|
|
15
|
+
textColor: string;
|
|
16
|
+
iconColor: string;
|
|
17
|
+
borderWidth: number;
|
|
18
|
+
borderColor?: string;
|
|
19
|
+
};
|
|
20
|
+
sizeTokens: {
|
|
21
|
+
padding: number;
|
|
22
|
+
gap: number;
|
|
23
|
+
borderRadius: number;
|
|
24
|
+
textSize: TextSize;
|
|
25
|
+
iconSize: number;
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Padding object for asymmetric horizontal padding
|
|
31
|
+
*/
|
|
32
|
+
export interface ButtonPadding {
|
|
33
|
+
paddingLeft: number;
|
|
34
|
+
paddingRight: number;
|
|
35
|
+
paddingTop: number;
|
|
36
|
+
paddingBottom: number;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Compute asymmetric button padding based on icon/text presence.
|
|
41
|
+
*
|
|
42
|
+
* Text appears visually closer to borders than icons, so we add 8px extra
|
|
43
|
+
* horizontal padding on the text side for optical balance.
|
|
44
|
+
*
|
|
45
|
+
* @param size - Button size (determines base padding)
|
|
46
|
+
* @param hasIcon - Whether button has an icon
|
|
47
|
+
* @param hasText - Whether button has text
|
|
48
|
+
* @param iconPosition - Icon position relative to text
|
|
49
|
+
* @returns Padding object with all four sides
|
|
50
|
+
*/
|
|
51
|
+
export function computeButtonPadding(
|
|
52
|
+
size: ButtonSize,
|
|
53
|
+
hasIcon: boolean,
|
|
54
|
+
hasText: boolean,
|
|
55
|
+
iconPosition: 'left' | 'right'
|
|
56
|
+
): ButtonPadding {
|
|
57
|
+
// Size-specific base padding
|
|
58
|
+
const basePadding: Record<ButtonSize, number> = {
|
|
59
|
+
sm: 8,
|
|
60
|
+
md: 12,
|
|
61
|
+
lg: 16,
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
const base = basePadding[size];
|
|
65
|
+
const textExtra = 8; // Optical correction for text vs icon
|
|
66
|
+
|
|
67
|
+
// Icon-only: square button
|
|
68
|
+
if (!hasText && hasIcon) {
|
|
69
|
+
return {
|
|
70
|
+
paddingLeft: base,
|
|
71
|
+
paddingRight: base,
|
|
72
|
+
paddingTop: base,
|
|
73
|
+
paddingBottom: base,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// Text-only: extra padding on both sides
|
|
78
|
+
if (hasText && !hasIcon) {
|
|
79
|
+
return {
|
|
80
|
+
paddingLeft: base + textExtra,
|
|
81
|
+
paddingRight: base + textExtra,
|
|
82
|
+
paddingTop: base,
|
|
83
|
+
paddingBottom: base,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// Icon + text: extra padding on text side only
|
|
88
|
+
if (hasText && hasIcon) {
|
|
89
|
+
if (iconPosition === 'left') {
|
|
90
|
+
return {
|
|
91
|
+
paddingLeft: base,
|
|
92
|
+
paddingRight: base + textExtra,
|
|
93
|
+
paddingTop: base,
|
|
94
|
+
paddingBottom: base,
|
|
95
|
+
};
|
|
96
|
+
} else {
|
|
97
|
+
return {
|
|
98
|
+
paddingLeft: base + textExtra,
|
|
99
|
+
paddingRight: base,
|
|
100
|
+
paddingTop: base,
|
|
101
|
+
paddingBottom: base,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// Fallback: symmetric base padding
|
|
107
|
+
return {
|
|
108
|
+
paddingLeft: base,
|
|
109
|
+
paddingRight: base,
|
|
110
|
+
paddingTop: base,
|
|
111
|
+
paddingBottom: base,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Resolve the PaletteTokens for a given semantic.
|
|
117
|
+
* Returns undefined for 'neutral' (handled separately).
|
|
118
|
+
*/
|
|
119
|
+
function getPaletteTokens(semantic: ButtonSemantic, tokens: UseTokensResult): PaletteTokens | undefined {
|
|
120
|
+
switch (semantic) {
|
|
121
|
+
case 'accent': return tokens.accent;
|
|
122
|
+
case 'success': return tokens.success;
|
|
123
|
+
case 'error': return tokens.error;
|
|
124
|
+
case 'warning': return tokens.warning;
|
|
125
|
+
default: return undefined;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Compute button configuration based on variant, semantic, size, and state.
|
|
131
|
+
*
|
|
132
|
+
* This function ONLY computes variant colors + size tokens.
|
|
133
|
+
* Layout concerns (flexbox, spacing, alignment) are handled by Wrapper primitive.
|
|
134
|
+
* Typography concerns (font, size, weight) are handled by Text primitive.
|
|
135
|
+
*
|
|
136
|
+
* Elevation-aware: neutral primary uses backgroundInteractive for consistent contrast.
|
|
137
|
+
* Semantic variants use proper PaletteTokens — no opacity hacks.
|
|
138
|
+
*
|
|
139
|
+
* @param variant - Button type (primary, secondary, tertiary)
|
|
140
|
+
* @param semantic - Button semantic meaning (neutral, accent, success, error, warning)
|
|
141
|
+
* @param size - Button size (sm, md, lg)
|
|
142
|
+
* @param disabled - Whether button is disabled
|
|
143
|
+
* @param tokens - Resolved tokens for current elevation
|
|
144
|
+
* @returns ButtonConfig with variantColors and sizeTokens
|
|
145
|
+
*/
|
|
146
|
+
export function getButtonConfig(
|
|
147
|
+
variant: ButtonVariant,
|
|
148
|
+
semantic: ButtonSemantic,
|
|
149
|
+
size: ButtonSize,
|
|
150
|
+
disabled: boolean,
|
|
151
|
+
tokens: UseTokensResult
|
|
152
|
+
): ButtonConfig {
|
|
153
|
+
// Get size configuration
|
|
154
|
+
const sizeConfig = getSizeConfig(size, tokens);
|
|
155
|
+
|
|
156
|
+
// Get variant-specific colors
|
|
157
|
+
const variantColors = getVariantColors(variant, semantic, disabled, tokens);
|
|
158
|
+
|
|
159
|
+
return {
|
|
160
|
+
variantColors,
|
|
161
|
+
sizeTokens: {
|
|
162
|
+
padding: sizeConfig.padding,
|
|
163
|
+
gap: sizeConfig.gap,
|
|
164
|
+
borderRadius: sizeConfig.borderRadius,
|
|
165
|
+
textSize: sizeConfig.textSize,
|
|
166
|
+
iconSize: sizeConfig.iconSize,
|
|
167
|
+
},
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* Get size configuration with unified icon/text sizes across all sizes.
|
|
173
|
+
* Only padding and radius scale with size.
|
|
174
|
+
*/
|
|
175
|
+
function getSizeConfig(size: ButtonSize, tokens: UseTokensResult) {
|
|
176
|
+
const configs: Record<ButtonSize, {
|
|
177
|
+
padding: number;
|
|
178
|
+
gap: number;
|
|
179
|
+
borderRadius: number;
|
|
180
|
+
textSize: TextSize;
|
|
181
|
+
iconSize: number;
|
|
182
|
+
}> = {
|
|
183
|
+
sm: {
|
|
184
|
+
padding: 8,
|
|
185
|
+
gap: tokens.spacing['08'],
|
|
186
|
+
borderRadius: 8,
|
|
187
|
+
textSize: 'base', // 16px
|
|
188
|
+
iconSize: 24,
|
|
189
|
+
},
|
|
190
|
+
md: {
|
|
191
|
+
padding: 12,
|
|
192
|
+
gap: tokens.spacing['08'],
|
|
193
|
+
borderRadius: 12,
|
|
194
|
+
textSize: 'base', // 16px
|
|
195
|
+
iconSize: 24,
|
|
196
|
+
},
|
|
197
|
+
lg: {
|
|
198
|
+
padding: 16,
|
|
199
|
+
gap: tokens.spacing['08'],
|
|
200
|
+
borderRadius: 16,
|
|
201
|
+
textSize: 'base', // 16px
|
|
202
|
+
iconSize: 24,
|
|
203
|
+
},
|
|
204
|
+
};
|
|
205
|
+
|
|
206
|
+
return configs[size];
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* Get variant-specific colors from theme tokens.
|
|
211
|
+
* Handles disabled state override for all variants.
|
|
212
|
+
*/
|
|
213
|
+
function getVariantColors(
|
|
214
|
+
variant: ButtonVariant,
|
|
215
|
+
semantic: ButtonSemantic,
|
|
216
|
+
disabled: boolean,
|
|
217
|
+
tokens: UseTokensResult
|
|
218
|
+
) {
|
|
219
|
+
// Disabled state overrides for all variants
|
|
220
|
+
if (disabled) {
|
|
221
|
+
const baseColors = getVariantColorsForState(variant, semantic, tokens);
|
|
222
|
+
const disabledBg = srgbToHex(tokens.backgroundSunken.srgb);
|
|
223
|
+
return {
|
|
224
|
+
...baseColors,
|
|
225
|
+
bg: disabledBg,
|
|
226
|
+
hoveredBg: disabledBg,
|
|
227
|
+
pressedBg: disabledBg,
|
|
228
|
+
textColor: srgbToHex(tokens.textSecondary.srgb),
|
|
229
|
+
iconColor: srgbToHex(tokens.textSecondary.srgb),
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
return getVariantColorsForState(variant, semantic, tokens);
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* Get variant colors for non-disabled state.
|
|
238
|
+
* Implements 3 types × 5 semantics = 15 combinations.
|
|
239
|
+
* Uses proper PaletteTokens for all semantic variants — no opacity hacks.
|
|
240
|
+
*/
|
|
241
|
+
function getVariantColorsForState(
|
|
242
|
+
variant: ButtonVariant,
|
|
243
|
+
semantic: ButtonSemantic,
|
|
244
|
+
tokens: UseTokensResult
|
|
245
|
+
) {
|
|
246
|
+
const paletteTokens = getPaletteTokens(semantic, tokens);
|
|
247
|
+
|
|
248
|
+
// PRIMARY VARIANT: Filled background
|
|
249
|
+
if (variant === 'primary') {
|
|
250
|
+
if (semantic === 'neutral') {
|
|
251
|
+
// Neutral primary - uses backgroundInteractive tokens for consistent contrast across elevations
|
|
252
|
+
return {
|
|
253
|
+
bg: srgbToHex(tokens.backgroundInteractive.srgb),
|
|
254
|
+
hoveredBg: srgbToHex(tokens.backgroundInteractiveHover.srgb),
|
|
255
|
+
pressedBg: srgbToHex(tokens.backgroundInteractiveActive.srgb),
|
|
256
|
+
textColor: srgbToHex(tokens.textPrimary.srgb),
|
|
257
|
+
iconColor: srgbToHex(tokens.textPrimary.srgb),
|
|
258
|
+
borderWidth: 1,
|
|
259
|
+
borderColor: 'transparent',
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
// Semantic primary (accent, success, error, warning) — uses palette fill tokens
|
|
264
|
+
return {
|
|
265
|
+
bg: srgbToHex(paletteTokens!.fill.srgb),
|
|
266
|
+
hoveredBg: srgbToHex(paletteTokens!.fillHover.srgb),
|
|
267
|
+
pressedBg: srgbToHex(paletteTokens!.fillActive.srgb),
|
|
268
|
+
textColor: srgbToHex(paletteTokens!.onFill.srgb),
|
|
269
|
+
iconColor: srgbToHex(paletteTokens!.onFill.srgb),
|
|
270
|
+
borderWidth: 1,
|
|
271
|
+
borderColor: 'transparent',
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
// SECONDARY VARIANT: Outlined (border + subtle background for non-neutral)
|
|
276
|
+
if (variant === 'secondary') {
|
|
277
|
+
if (semantic === 'neutral') {
|
|
278
|
+
// Shifted action scale: transparent → 01 (hover) → 02 (pressed)
|
|
279
|
+
return {
|
|
280
|
+
bg: 'transparent',
|
|
281
|
+
hoveredBg: srgbToHex(tokens.backgroundInteractive.srgb),
|
|
282
|
+
pressedBg: srgbToHex(tokens.backgroundInteractiveHover.srgb),
|
|
283
|
+
textColor: srgbToHex(tokens.textPrimary.srgb),
|
|
284
|
+
iconColor: srgbToHex(tokens.textPrimary.srgb),
|
|
285
|
+
borderWidth: 1,
|
|
286
|
+
borderColor: srgbToHex(tokens.border.srgb),
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
// Semantic secondary — uses palette surface tokens for subtle bg
|
|
291
|
+
return {
|
|
292
|
+
bg: srgbToHex(paletteTokens!.background.srgb),
|
|
293
|
+
hoveredBg: srgbToHex(paletteTokens!.backgroundInteractive.srgb),
|
|
294
|
+
pressedBg: srgbToHex(paletteTokens!.backgroundInteractiveHover.srgb),
|
|
295
|
+
textColor: srgbToHex(paletteTokens!.fill.srgb),
|
|
296
|
+
iconColor: srgbToHex(paletteTokens!.fill.srgb),
|
|
297
|
+
borderWidth: 1,
|
|
298
|
+
borderColor: 'transparent',
|
|
299
|
+
};
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
// TERTIARY VARIANT: Ghost (text-only, no visible border)
|
|
303
|
+
if (variant === 'tertiary') {
|
|
304
|
+
if (semantic === 'neutral') {
|
|
305
|
+
// Shifted action scale: transparent → 01 (hover) → 02 (pressed)
|
|
306
|
+
return {
|
|
307
|
+
bg: 'transparent',
|
|
308
|
+
hoveredBg: srgbToHex(tokens.backgroundInteractive.srgb),
|
|
309
|
+
pressedBg: srgbToHex(tokens.backgroundInteractiveHover.srgb),
|
|
310
|
+
textColor: srgbToHex(tokens.textPrimary.srgb),
|
|
311
|
+
iconColor: srgbToHex(tokens.textPrimary.srgb),
|
|
312
|
+
borderWidth: 1,
|
|
313
|
+
borderColor: 'transparent',
|
|
314
|
+
};
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
// Semantic tertiary — uses palette surface tokens for hover/pressed
|
|
318
|
+
return {
|
|
319
|
+
bg: 'transparent',
|
|
320
|
+
hoveredBg: srgbToHex(paletteTokens!.background.srgb),
|
|
321
|
+
pressedBg: srgbToHex(paletteTokens!.backgroundInteractive.srgb),
|
|
322
|
+
textColor: srgbToHex(paletteTokens!.fill.srgb),
|
|
323
|
+
iconColor: srgbToHex(paletteTokens!.fill.srgb),
|
|
324
|
+
borderWidth: 1,
|
|
325
|
+
borderColor: 'transparent',
|
|
326
|
+
};
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
// Fallback (should never reach here with proper types)
|
|
330
|
+
return {
|
|
331
|
+
bg: 'transparent',
|
|
332
|
+
hoveredBg: 'transparent',
|
|
333
|
+
pressedBg: 'transparent',
|
|
334
|
+
textColor: srgbToHex(tokens.textPrimary.srgb),
|
|
335
|
+
iconColor: srgbToHex(tokens.textPrimary.srgb),
|
|
336
|
+
borderWidth: 0,
|
|
337
|
+
};
|
|
338
|
+
}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Pressable } from 'react-native';
|
|
3
|
+
import type { ButtonProps } from './Button.types';
|
|
4
|
+
import { getButtonConfig, computeButtonPadding } from './Button.styles';
|
|
5
|
+
import { useTokens } from '../../../tokens/useTokens';
|
|
6
|
+
import { Icon } from '../../../primitives/Icon/Icon';
|
|
7
|
+
import { Text } from '../../../primitives/Text/Text';
|
|
8
|
+
import { Wrapper } from '../../../primitives/Wrapper/Wrapper';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Button — A composite component demonstrating the primitive composition pattern.
|
|
12
|
+
*
|
|
13
|
+
* **Composition Architecture:**
|
|
14
|
+
* - Pressable (RN primitive) — handles interaction
|
|
15
|
+
* - Wrapper (primitive) — handles layout (direction, gap, padding, alignment)
|
|
16
|
+
* - Icon (primitive) — handles icon rendering with theme tokens
|
|
17
|
+
* - Text (primitive) — handles typography with theme tokens
|
|
18
|
+
*
|
|
19
|
+
* This component does NOT manually compute flexbox, spacing, or typography styles.
|
|
20
|
+
* Instead, it delegates to primitives which already handle these concerns.
|
|
21
|
+
*
|
|
22
|
+
* Automatically adapts to the current theme and mode from NewtoneProvider.
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```tsx
|
|
26
|
+
* <Button variant="primary" semantic="accent" size="md" onPress={() => console.log('Pressed')}>
|
|
27
|
+
* Click me
|
|
28
|
+
* </Button>
|
|
29
|
+
* ```
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* ```tsx
|
|
33
|
+
* <Button icon="add" variant="primary" semantic="accent" onPress={handleAdd}>
|
|
34
|
+
* New Item
|
|
35
|
+
* </Button>
|
|
36
|
+
* ```
|
|
37
|
+
*
|
|
38
|
+
* @example
|
|
39
|
+
* ```tsx
|
|
40
|
+
* <Button icon="delete" variant="tertiary" semantic="neutral" size="sm" onPress={handleDelete} />
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
export function Button({
|
|
44
|
+
children,
|
|
45
|
+
icon,
|
|
46
|
+
iconPosition = 'left',
|
|
47
|
+
variant = 'primary',
|
|
48
|
+
semantic = 'neutral',
|
|
49
|
+
size = 'md',
|
|
50
|
+
disabled = false,
|
|
51
|
+
style,
|
|
52
|
+
textStyle,
|
|
53
|
+
...pressableProps
|
|
54
|
+
}: ButtonProps) {
|
|
55
|
+
// Read tokens from current elevation context
|
|
56
|
+
// backgroundInteractive provides consistent contrast across all elevations
|
|
57
|
+
const tokens = useTokens();
|
|
58
|
+
|
|
59
|
+
// Get color tokens + size config (now using backgroundInteractive for consistent contrast)
|
|
60
|
+
const { variantColors, sizeTokens } = React.useMemo(
|
|
61
|
+
() => getButtonConfig(variant, semantic, size, disabled, tokens),
|
|
62
|
+
[variant, semantic, size, disabled, tokens]
|
|
63
|
+
);
|
|
64
|
+
|
|
65
|
+
// Compute asymmetric padding (+8px on text side for optical balance)
|
|
66
|
+
const padding = React.useMemo(
|
|
67
|
+
() => computeButtonPadding(size, !!icon, !!children, iconPosition),
|
|
68
|
+
[size, icon, children, iconPosition]
|
|
69
|
+
);
|
|
70
|
+
|
|
71
|
+
return (
|
|
72
|
+
<Pressable disabled={disabled} {...pressableProps}>
|
|
73
|
+
{({ pressed, hovered }: { pressed: boolean; hovered?: boolean }) => (
|
|
74
|
+
// Wrapper handles layout: direction, gap, alignment (padding via style)
|
|
75
|
+
<Wrapper
|
|
76
|
+
direction="horizontal"
|
|
77
|
+
align="center"
|
|
78
|
+
justify="center"
|
|
79
|
+
gap={sizeTokens.gap}
|
|
80
|
+
style={[
|
|
81
|
+
{
|
|
82
|
+
...padding, // Asymmetric horizontal padding for text optical balance
|
|
83
|
+
backgroundColor: pressed && !disabled
|
|
84
|
+
? variantColors.pressedBg
|
|
85
|
+
: hovered && !disabled
|
|
86
|
+
? variantColors.hoveredBg
|
|
87
|
+
: variantColors.bg,
|
|
88
|
+
borderRadius: sizeTokens.borderRadius,
|
|
89
|
+
borderWidth: variantColors.borderWidth, // Always 1 for consistent sizing
|
|
90
|
+
borderColor: variantColors.borderColor || 'transparent',
|
|
91
|
+
opacity: disabled ? 0.4 : 1,
|
|
92
|
+
},
|
|
93
|
+
...(Array.isArray(style) ? style : style ? [style] : []),
|
|
94
|
+
]}
|
|
95
|
+
>
|
|
96
|
+
{icon && iconPosition === 'left' && (
|
|
97
|
+
<Icon name={icon} size={sizeTokens.iconSize} color={variantColors.iconColor} />
|
|
98
|
+
)}
|
|
99
|
+
{children && (
|
|
100
|
+
// Text primitive with semantic props + color style override
|
|
101
|
+
<Text
|
|
102
|
+
size={sizeTokens.textSize}
|
|
103
|
+
weight="semibold"
|
|
104
|
+
style={[
|
|
105
|
+
{ color: variantColors.textColor },
|
|
106
|
+
...(Array.isArray(textStyle) ? textStyle : textStyle ? [textStyle] : []),
|
|
107
|
+
]}
|
|
108
|
+
>
|
|
109
|
+
{children}
|
|
110
|
+
</Text>
|
|
111
|
+
)}
|
|
112
|
+
{icon && iconPosition === 'right' && (
|
|
113
|
+
<Icon name={icon} size={sizeTokens.iconSize} color={variantColors.iconColor} />
|
|
114
|
+
)}
|
|
115
|
+
</Wrapper>
|
|
116
|
+
)}
|
|
117
|
+
</Pressable>
|
|
118
|
+
);
|
|
119
|
+
}
|
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
import type { PressableProps, ViewStyle, TextStyle } from 'react-native';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
* Visual
|
|
4
|
+
* Visual type for the Button component (describes visual weight)
|
|
5
5
|
*/
|
|
6
|
-
export type ButtonVariant = 'primary' | 'secondary' | '
|
|
6
|
+
export type ButtonVariant = 'primary' | 'secondary' | 'tertiary';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Semantic meaning for the Button component (describes color purpose)
|
|
10
|
+
*/
|
|
11
|
+
export type ButtonSemantic = 'neutral' | 'accent' | 'success' | 'error' | 'warning';
|
|
7
12
|
|
|
8
13
|
/**
|
|
9
14
|
* Size presets for the Button component
|
|
@@ -38,11 +43,17 @@ export interface ButtonProps extends Omit<PressableProps, 'children' | 'style'>
|
|
|
38
43
|
readonly iconPosition?: ButtonIconPosition;
|
|
39
44
|
|
|
40
45
|
/**
|
|
41
|
-
* Visual
|
|
46
|
+
* Visual type (describes visual weight: filled, outlined, ghost)
|
|
42
47
|
* @default 'primary'
|
|
43
48
|
*/
|
|
44
49
|
readonly variant?: ButtonVariant;
|
|
45
50
|
|
|
51
|
+
/**
|
|
52
|
+
* Semantic meaning (describes color purpose: neutral, accent, success, error, warning)
|
|
53
|
+
* @default 'neutral'
|
|
54
|
+
*/
|
|
55
|
+
readonly semantic?: ButtonSemantic;
|
|
56
|
+
|
|
46
57
|
/**
|
|
47
58
|
* Size preset
|
|
48
59
|
* @default 'md'
|
|
@@ -2,11 +2,11 @@ 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 '
|
|
5
|
+
import { useTokens } from '../../../tokens/useTokens';
|
|
6
6
|
import { getSelectStyles } from './Select.styles';
|
|
7
|
-
import { Icon } from '
|
|
8
|
-
import { Popover } from '
|
|
9
|
-
import { usePopover } from '
|
|
7
|
+
import { Icon } from '../../../primitives/Icon/Icon';
|
|
8
|
+
import { Popover } from '../../overlays/Popover/Popover';
|
|
9
|
+
import { usePopover } from '../../overlays/Popover/usePopover';
|
|
10
10
|
import { useSelect } from './useSelect';
|
|
11
11
|
import { SelectOptionRow } from './SelectOption';
|
|
12
12
|
import { srgbToHex } from 'newtone';
|
|
@@ -1,8 +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 '
|
|
5
|
-
import { Icon } from '
|
|
4
|
+
import { useTokens } from '../../../tokens/useTokens';
|
|
5
|
+
import { Icon } from '../../../primitives/Icon/Icon';
|
|
6
6
|
import { srgbToHex } from 'newtone';
|
|
7
7
|
|
|
8
8
|
interface SelectOptionRowProps {
|
|
@@ -80,7 +80,7 @@ export function SelectOptionRow({
|
|
|
80
80
|
},
|
|
81
81
|
isSelected && {
|
|
82
82
|
fontWeight: tokens.typography.weight.semibold as any,
|
|
83
|
-
color: srgbToHex(tokens.
|
|
83
|
+
color: srgbToHex(tokens.accent.fill.srgb),
|
|
84
84
|
},
|
|
85
85
|
option.disabled && {
|
|
86
86
|
color: srgbToHex(tokens.textSecondary.srgb),
|
|
@@ -95,7 +95,7 @@ export function SelectOptionRow({
|
|
|
95
95
|
<Icon
|
|
96
96
|
name="check"
|
|
97
97
|
size={fontSize}
|
|
98
|
-
color={srgbToHex(tokens.
|
|
98
|
+
color={srgbToHex(tokens.accent.fill.srgb)}
|
|
99
99
|
/>
|
|
100
100
|
</View>
|
|
101
101
|
)}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { StyleSheet } from 'react-native';
|
|
2
2
|
import { srgbToHex } from 'newtone';
|
|
3
|
-
import type { ResolvedTokens } from '
|
|
3
|
+
import type { ResolvedTokens } from '../../../tokens/types';
|
|
4
4
|
|
|
5
5
|
export function getTextInputStyles(tokens: ResolvedTokens, disabled: boolean) {
|
|
6
6
|
return StyleSheet.create({
|
|
@@ -1,7 +1,7 @@
|
|
|
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 '
|
|
4
|
+
import { useTokens } from '../../../tokens/useTokens';
|
|
5
5
|
import { getTextInputStyles } from './TextInput.styles';
|
|
6
6
|
import { srgbToHex } from 'newtone';
|
|
7
7
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { StyleSheet } from 'react-native';
|
|
2
2
|
import { srgbToHex } from 'newtone';
|
|
3
|
-
import type { ResolvedTokens } from '
|
|
3
|
+
import type { ResolvedTokens } from '../../../tokens/types';
|
|
4
4
|
|
|
5
5
|
const TRACK_WIDTH = 40;
|
|
6
6
|
const TRACK_HEIGHT = 22;
|
|
@@ -30,7 +30,7 @@ export function getToggleStyles(
|
|
|
30
30
|
height: TRACK_HEIGHT,
|
|
31
31
|
borderRadius: TRACK_HEIGHT / 2,
|
|
32
32
|
backgroundColor: value
|
|
33
|
-
? srgbToHex(tokens.
|
|
33
|
+
? srgbToHex(tokens.accent.fill.srgb)
|
|
34
34
|
: srgbToHex(tokens.border.srgb),
|
|
35
35
|
justifyContent: 'center',
|
|
36
36
|
paddingHorizontal: THUMB_OFFSET,
|
|
@@ -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 '
|
|
4
|
+
import { useTokens } from '../../../tokens/useTokens';
|
|
5
5
|
import { getToggleStyles } from './Toggle.styles';
|
|
6
6
|
|
|
7
7
|
export function Toggle({
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { StyleSheet } from 'react-native';
|
|
2
2
|
import { srgbToHex } from 'newtone';
|
|
3
|
-
import type { ResolvedTokens } from '
|
|
3
|
+
import type { ResolvedTokens } from '../../../tokens/types';
|
|
4
4
|
|
|
5
5
|
export function getAppShellStyles(tokens: ResolvedTokens) {
|
|
6
6
|
return StyleSheet.create({
|
|
@@ -1,7 +1,7 @@
|
|
|
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 '
|
|
4
|
+
import { useTokens } from '../../../tokens/useTokens';
|
|
5
5
|
import { getAppShellStyles } from './AppShell.styles';
|
|
6
6
|
|
|
7
7
|
export function AppShell({ sidebar, children }: AppShellProps) {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { StyleSheet } from 'react-native';
|
|
2
2
|
import { srgbToHex } from 'newtone';
|
|
3
|
-
import type { ResolvedTokens } from '
|
|
3
|
+
import type { ResolvedTokens } from '../../../tokens/types';
|
|
4
4
|
|
|
5
5
|
export function getCardStyles(tokens: ResolvedTokens, disabled: boolean) {
|
|
6
6
|
return StyleSheet.create({
|