@jobber/components-native 0.76.1-JOB-116234-d279b0f.20 → 0.76.1-JOB-116234-4bc5afd.23

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 (33) hide show
  1. package/dist/package.json +2 -2
  2. package/dist/src/AtlantisThemeContext/AtlantisThemeContext.js +10 -21
  3. package/dist/src/InputFieldWrapper/CommonInputStyles.style.js +6 -2
  4. package/dist/src/InputFieldWrapper/components/Suffix/Suffix.js +2 -1
  5. package/dist/src/InputPressable/InputPressable.style.js +6 -5
  6. package/dist/src/InputText/InputText.style.js +6 -6
  7. package/dist/src/Typography/Typography.js +12 -11
  8. package/dist/src/Typography/Typography.style.js +1 -8
  9. package/dist/src/utils/design/index.js +5 -2
  10. package/dist/src/utils/meta/meta.json +1 -0
  11. package/dist/tsconfig.tsbuildinfo +1 -1
  12. package/dist/types/src/AtlantisThemeContext/types.d.ts +6 -3
  13. package/dist/types/src/Button/Button.d.ts +1 -1
  14. package/dist/types/src/Text/Text.d.ts +1 -1
  15. package/dist/types/src/Typography/Typography.style.d.ts +1 -8
  16. package/dist/types/src/utils/design/index.d.ts +5 -0
  17. package/package.json +2 -2
  18. package/src/AtlantisThemeContext/AtlantisThemeContext.test.tsx +106 -0
  19. package/src/AtlantisThemeContext/AtlantisThemeContext.tsx +12 -54
  20. package/src/AtlantisThemeContext/buildThemedStyles.test.tsx +83 -0
  21. package/src/AtlantisThemeContext/types.ts +7 -3
  22. package/src/Button/Button.tsx +1 -1
  23. package/src/InputFieldWrapper/CommonInputStyles.style.ts +2 -0
  24. package/src/InputFieldWrapper/components/Prefix/Prefix.test.tsx +1 -6
  25. package/src/InputFieldWrapper/components/Suffix/Suffix.test.tsx +9 -2
  26. package/src/InputFieldWrapper/components/Suffix/Suffix.tsx +2 -1
  27. package/src/InputPressable/InputPressable.style.ts +7 -5
  28. package/src/InputText/InputText.style.ts +7 -6
  29. package/src/Text/Text.tsx +1 -1
  30. package/src/Typography/Typography.style.ts +1 -8
  31. package/src/Typography/Typography.tsx +19 -8
  32. package/src/utils/design/index.ts +5 -2
  33. package/src/utils/meta/meta.json +1 -0
@@ -1,16 +1,19 @@
1
1
  import { iosTokens } from "@jobber/design";
2
- import { PropsWithChildren } from "react";
3
2
  export interface AtlantisThemeContextValue {
4
3
  /**
5
- * The theme of the application.
4
+ * The active theme.
6
5
  */
7
6
  readonly theme: Theme;
8
7
  /**
9
8
  * The design tokens for the current theme.
10
9
  */
11
10
  readonly tokens: typeof iosTokens;
11
+ /**
12
+ * Change the current theme globally.
13
+ */
14
+ readonly setTheme: (theme: Theme) => void;
12
15
  }
13
- export interface AtlantisThemeContextProviderProps extends PropsWithChildren {
16
+ export interface AtlantisThemeContextProviderProps {
14
17
  /**
15
18
  * The children to render.
16
19
  */
@@ -62,7 +62,7 @@ interface CommonButtonProps {
62
62
  /**
63
63
  * **Use at your own risk:** Custom style for specific elements. This should only be used as a
64
64
  * **last resort**. Using this may result in unexpected side effects.
65
- * More information [here](https://atlantis.getjobber.com/storybook/?path=/docs/guides-customizing-components--docs#unsafe_-props).
65
+ * More information in the [Customizing components Guide](https://atlantis.getjobber.com/guides/customizing-components).
66
66
  */
67
67
  readonly UNSAFE_style?: ButtonUnsafeStyle;
68
68
  }
@@ -63,7 +63,7 @@ export interface TextProps extends Pick<TypographyProps<"base">, "maxFontScaleSi
63
63
  /**
64
64
  * **Use at your own risk:** Custom style for specific elements. This should only be used as a
65
65
  * **last resort**. Using this may result in unexpected side effects.
66
- * More information [here](https://atlantis.getjobber.com/storybook/?path=/docs/guides-customizing-components--docs#unsafe_-props).
66
+ * More information in the [Customizing components Guide](https://atlantis.getjobber.com/guides/customizing-components).
67
67
  */
68
68
  readonly UNSAFE_style?: TypographyUnsafeStyle;
69
69
  }
@@ -8,14 +8,7 @@ export declare const createTypographyTokens: (tokens: AtlantisThemeContextValue[
8
8
  [index: string]: TextStyle;
9
9
  };
10
10
  /**
11
- * `StyleSheet` for Typography.tsx.
12
- *
13
- * If you find yourself needing to use what's inside this object on files other
14
- * than `<Typography />`, please import from `@jobber/components-native` instead.
15
- *
16
- * ```
17
- * import { typographyStyles } from "@jobber/components-native"
18
- * ```
11
+ * @deprecated Use useTypographyStyles instead
19
12
  */
20
13
  export declare const typographyStyles: Record<string, TextStyle>;
21
14
  export declare const useTypographyStyles: () => {
@@ -1,2 +1,7 @@
1
1
  import { iosTokens } from "@jobber/design";
2
+ /**
3
+ * These design tokens don't react to theme changes. Only use these if you need to access
4
+ * tokens that are not affected by the current theme, otherwise you should be using our
5
+ * useAtlantisTheme() hook to access the current theme's tokens.
6
+ */
2
7
  export declare const tokens: typeof iosTokens;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jobber/components-native",
3
- "version": "0.76.1-JOB-116234-d279b0f.20+d279b0fd",
3
+ "version": "0.76.1-JOB-116234-4bc5afd.23+4bc5afdb",
4
4
  "license": "MIT",
5
5
  "description": "React Native implementation of Atlantis",
6
6
  "repository": {
@@ -80,5 +80,5 @@
80
80
  "react-native-safe-area-context": "^4.5.2",
81
81
  "react-native-svg": ">=12.0.0"
82
82
  },
83
- "gitHead": "d279b0fddc435572c48dff35f02db80ee4ca3ee7"
83
+ "gitHead": "4bc5afdb99786f50a9ae8474ac282eb593dd9867"
84
84
  }
@@ -0,0 +1,106 @@
1
+ import React from "react";
2
+ import { act, renderHook } from "@testing-library/react-native";
3
+ import { darkTokens, iosTokens } from "@jobber/design";
4
+ import merge from "lodash/merge";
5
+ import {
6
+ AtlantisThemeContextProvider,
7
+ useAtlantisTheme,
8
+ } from "./AtlantisThemeContext";
9
+ import { AtlantisThemeContextProviderProps, Theme } from "./types";
10
+
11
+ const expectedDarkTokens = merge({}, iosTokens, darkTokens);
12
+ const expectedLightTokens = iosTokens;
13
+
14
+ function Wrapper({
15
+ children,
16
+ dangerouslyOverrideTheme,
17
+ }: AtlantisThemeContextProviderProps) {
18
+ return (
19
+ <AtlantisThemeContextProvider
20
+ dangerouslyOverrideTheme={dangerouslyOverrideTheme}
21
+ >
22
+ {children}
23
+ </AtlantisThemeContextProvider>
24
+ );
25
+ }
26
+
27
+ function WrapperWithOverride({
28
+ children,
29
+ dangerouslyOverrideTheme,
30
+ }: AtlantisThemeContextProviderProps) {
31
+ return (
32
+ <Wrapper>
33
+ <AtlantisThemeContextProvider
34
+ dangerouslyOverrideTheme={dangerouslyOverrideTheme}
35
+ >
36
+ {children}
37
+ </AtlantisThemeContextProvider>
38
+ </Wrapper>
39
+ );
40
+ }
41
+
42
+ describe("ThemeContext", () => {
43
+ it("defaults to the light theme", () => {
44
+ const { result } = renderHook(useAtlantisTheme, {
45
+ wrapper: (props: AtlantisThemeContextProviderProps) => (
46
+ <Wrapper {...props} />
47
+ ),
48
+ });
49
+
50
+ expect(result.current.theme).toBe("light");
51
+ expect(result.current.tokens).toEqual(expectedLightTokens);
52
+ });
53
+
54
+ it("updates the theme and tokens", () => {
55
+ const { result } = renderHook(useAtlantisTheme, {
56
+ wrapper: (props: AtlantisThemeContextProviderProps) => (
57
+ <Wrapper {...props} />
58
+ ),
59
+ });
60
+
61
+ act(() => result.current.setTheme("dark"));
62
+ expect(result.current.theme).toBe("dark");
63
+ expect(result.current.tokens).toEqual(expectedDarkTokens);
64
+
65
+ act(() => result.current.setTheme("light"));
66
+ expect(result.current.theme).toBe("light");
67
+ expect(result.current.tokens).toEqual(expectedLightTokens);
68
+ });
69
+
70
+ describe("when theme is forced for provider", () => {
71
+ it("ignores updates to the global theme", () => {
72
+ const { result } = renderHook(useAtlantisTheme, {
73
+ wrapper: (props: AtlantisThemeContextProviderProps) => (
74
+ <WrapperWithOverride {...props} dangerouslyOverrideTheme="light" />
75
+ ),
76
+ });
77
+
78
+ // Update the global theme
79
+ act(() => result.current.setTheme("dark"));
80
+
81
+ // This hook shouldn't be affected by it because it's set to the light theme
82
+ expect(result.current.theme).toBe("light");
83
+ expect(result.current.tokens).toEqual(expectedLightTokens);
84
+ });
85
+
86
+ it.each([
87
+ { defaultTheme: "light", expectedTokens: expectedLightTokens },
88
+ { defaultTheme: "dark", expectedTokens: expectedDarkTokens },
89
+ ] as { defaultTheme: Theme; expectedTokens: typeof iosTokens }[])(
90
+ "provides the dangerouslyOverrideTheme $defaultTheme tokens",
91
+ ({ defaultTheme, expectedTokens }) => {
92
+ const { result } = renderHook(useAtlantisTheme, {
93
+ wrapper: (props: AtlantisThemeContextProviderProps) => (
94
+ <WrapperWithOverride
95
+ {...props}
96
+ dangerouslyOverrideTheme={defaultTheme}
97
+ />
98
+ ),
99
+ });
100
+
101
+ expect(result.current.theme).toBe(defaultTheme);
102
+ expect(result.current.tokens).toEqual(expectedTokens);
103
+ },
104
+ );
105
+ });
106
+ });
@@ -1,10 +1,5 @@
1
1
  import { androidTokens, darkTokens, iosTokens } from "@jobber/design";
2
- import React, {
3
- PropsWithChildren,
4
- createContext,
5
- useContext,
6
- useState,
7
- } from "react";
2
+ import React, { createContext, useContext, useState } from "react";
8
3
  import merge from "lodash/merge";
9
4
  import { Platform } from "react-native";
10
5
  import {
@@ -24,68 +19,31 @@ const completeDarkTokens = merge({}, lightTokens, darkTokens);
24
19
  const AtlantisThemeContext = createContext<AtlantisThemeContextValue>({
25
20
  theme: "light",
26
21
  tokens: lightTokens,
22
+ setTheme: () => {
23
+ console.error(
24
+ "useAtlantisTheme accessed outside of AtlantisThemeContextProvider",
25
+ );
26
+ },
27
27
  });
28
28
 
29
29
  export function AtlantisThemeContextProvider({
30
30
  children,
31
31
  dangerouslyOverrideTheme,
32
32
  }: AtlantisThemeContextProviderProps) {
33
- if (dangerouslyOverrideTheme) {
34
- return (
35
- <InternalStaticThemeProvider
36
- dangerouslyOverrideTheme={dangerouslyOverrideTheme}
37
- >
38
- {children}
39
- </InternalStaticThemeProvider>
40
- );
41
- }
42
-
43
- return (
44
- <InternalDynamicThemeProvider>{children}</InternalDynamicThemeProvider>
45
- );
46
- }
47
-
48
- function InternalDynamicThemeProvider({ children }: PropsWithChildren) {
49
- // TODO: check initial theme from local/device storage?
50
- // const initialTheme: Theme = (globalThis.document.documentElement.dataset.theme as Theme) ?? "light";
33
+ // TODO: check last saved theme from local/device storage
51
34
  const initialTheme: Theme = "light";
35
+ const [globalTheme, setGlobalTheme] = useState<Theme>(initialTheme);
52
36
 
53
- const [internalTheme] = useState<Theme>(initialTheme);
54
- const currentTokens =
55
- internalTheme === "dark" ? completeDarkTokens : lightTokens;
56
-
57
- // TODO: listen for global theme update -> setInternalTheme
58
- // See web's AtlantisThemeContext for an example of how it does this.
59
-
60
- return (
61
- <AtlantisThemeContext.Provider
62
- value={{
63
- theme: internalTheme,
64
- tokens: currentTokens,
65
- }}
66
- >
67
- {children}
68
- </AtlantisThemeContext.Provider>
69
- );
70
- }
71
-
72
- function InternalStaticThemeProvider({
73
- dangerouslyOverrideTheme,
74
- children,
75
- }: Required<
76
- Pick<
77
- AtlantisThemeContextProviderProps,
78
- "dangerouslyOverrideTheme" | "children"
79
- >
80
- >) {
37
+ const currentTheme = dangerouslyOverrideTheme ?? globalTheme;
81
38
  const currentTokens =
82
- dangerouslyOverrideTheme === "dark" ? completeDarkTokens : lightTokens;
39
+ currentTheme === "dark" ? completeDarkTokens : lightTokens;
83
40
 
84
41
  return (
85
42
  <AtlantisThemeContext.Provider
86
43
  value={{
87
- theme: dangerouslyOverrideTheme,
44
+ theme: currentTheme,
88
45
  tokens: currentTokens,
46
+ setTheme: setGlobalTheme,
89
47
  }}
90
48
  >
91
49
  {children}
@@ -0,0 +1,83 @@
1
+ import React from "react";
2
+ import { renderHook } from "@testing-library/react-native";
3
+ import { buildThemedStyles } from "./buildThemedStyles";
4
+ import { AtlantisThemeContextProvider } from "./AtlantisThemeContext";
5
+
6
+ describe("buildThemedStyles", () => {
7
+ const wrapper = ({ children }: { children: React.ReactNode }) => (
8
+ <AtlantisThemeContextProvider>{children}</AtlantisThemeContextProvider>
9
+ );
10
+
11
+ it("creates styles using theme tokens", () => {
12
+ const useTestStyles = buildThemedStyles(tokens => ({
13
+ container: {
14
+ backgroundColor: tokens["color-surface"],
15
+ padding: tokens["space-base"],
16
+ },
17
+ }));
18
+
19
+ const { result } = renderHook(() => useTestStyles(), { wrapper });
20
+
21
+ expect(result.current).toEqual({
22
+ container: {
23
+ backgroundColor: expect.any(String),
24
+ padding: expect.any(Number),
25
+ },
26
+ });
27
+ });
28
+
29
+ it("memoizes styles and only updates when tokens change", () => {
30
+ const styleFactory = jest.fn(tokens => ({
31
+ container: {
32
+ backgroundColor: tokens["color-surface"],
33
+ },
34
+ }));
35
+
36
+ const useTestStyles = buildThemedStyles(styleFactory);
37
+
38
+ const { result, rerender } = renderHook(() => useTestStyles(), { wrapper });
39
+
40
+ // Initial render should call styleFactory
41
+ expect(styleFactory).toHaveBeenCalledTimes(1);
42
+ const initialResult = result.current;
43
+
44
+ // Rerender without token changes should not call styleFactory again
45
+ rerender({ wrapper });
46
+ expect(styleFactory).toHaveBeenCalledTimes(1);
47
+ expect(result.current).toBe(initialResult);
48
+ });
49
+
50
+ it("creates styles with dependent hooks", () => {
51
+ const useDependentStyles = () => ({
52
+ text: { color: "red" },
53
+ });
54
+
55
+ const useTestStyles = () => {
56
+ const dependentStyles = useDependentStyles();
57
+
58
+ return buildThemedStyles(tokens => ({
59
+ container: {
60
+ ...dependentStyles.text,
61
+ padding: tokens["space-base"],
62
+ },
63
+ }))();
64
+ };
65
+
66
+ const { result } = renderHook(() => useTestStyles(), { wrapper });
67
+
68
+ expect(result.current).toEqual({
69
+ container: {
70
+ color: "red",
71
+ padding: expect.any(Number),
72
+ },
73
+ });
74
+ });
75
+
76
+ it("handles empty style objects", () => {
77
+ const useTestStyles = buildThemedStyles(() => ({}));
78
+
79
+ const { result } = renderHook(() => useTestStyles(), { wrapper });
80
+
81
+ expect(result.current).toEqual({});
82
+ });
83
+ });
@@ -1,9 +1,8 @@
1
1
  import { iosTokens } from "@jobber/design";
2
- import { PropsWithChildren } from "react";
3
2
 
4
3
  export interface AtlantisThemeContextValue {
5
4
  /**
6
- * The theme of the application.
5
+ * The active theme.
7
6
  */
8
7
  readonly theme: Theme;
9
8
 
@@ -11,9 +10,14 @@ export interface AtlantisThemeContextValue {
11
10
  * The design tokens for the current theme.
12
11
  */
13
12
  readonly tokens: typeof iosTokens;
13
+
14
+ /**
15
+ * Change the current theme globally.
16
+ */
17
+ readonly setTheme: (theme: Theme) => void;
14
18
  }
15
19
 
16
- export interface AtlantisThemeContextProviderProps extends PropsWithChildren {
20
+ export interface AtlantisThemeContextProviderProps {
17
21
  /**
18
22
  * The children to render.
19
23
  */
@@ -81,7 +81,7 @@ interface CommonButtonProps {
81
81
  /**
82
82
  * **Use at your own risk:** Custom style for specific elements. This should only be used as a
83
83
  * **last resort**. Using this may result in unexpected side effects.
84
- * More information [here](https://atlantis.getjobber.com/storybook/?path=/docs/guides-customizing-components--docs#unsafe_-props).
84
+ * More information in the [Customizing components Guide](https://atlantis.getjobber.com/guides/customizing-components).
85
85
  */
86
86
  readonly UNSAFE_style?: ButtonUnsafeStyle;
87
87
  }
@@ -4,6 +4,7 @@ import {
4
4
  buildThemedStyles,
5
5
  } from "../AtlantisThemeContext";
6
6
  import {
7
+ // eslint-disable-next-line import/no-deprecated
7
8
  typographyStyles as staticTypographyStyles,
8
9
  useTypographyStyles,
9
10
  } from "../Typography";
@@ -52,6 +53,7 @@ export const createCommonInputTokens = (
52
53
  * @deprecated Use useCommonInputStyles instead
53
54
  */
54
55
  export const commonInputStyles = StyleSheet.create(
56
+ // eslint-disable-next-line import/no-deprecated
55
57
  createCommonInputTokens(staticTokens, staticTypographyStyles),
56
58
  );
57
59
 
@@ -10,10 +10,7 @@ import {
10
10
  prefixIconTestId,
11
11
  prefixLabelTestId,
12
12
  } from "./Prefix";
13
- import {
14
- typographyStyles as staticStyles,
15
- useTypographyStyles,
16
- } from "../../../Typography";
13
+ import { useTypographyStyles } from "../../../Typography";
17
14
  import { useStyles } from "../../InputFieldWrapper.style";
18
15
  import { tokens } from "../../../utils/design";
19
16
  import * as IconComponent from "../../../Icon/Icon";
@@ -31,8 +28,6 @@ beforeAll(() => {
31
28
 
32
29
  styles = stylesHook.result.current;
33
30
  typographyStyles = typographyStylesHook.result.current;
34
- console.log(typographyStyles.defaultSize);
35
- console.log(staticStyles.defaultSize);
36
31
  });
37
32
 
38
33
  function setupLabel({
@@ -1,5 +1,5 @@
1
1
  import React from "react";
2
- import { render } from "@testing-library/react-native";
2
+ import { render, renderHook } from "@testing-library/react-native";
3
3
  import { TextStyle } from "react-native";
4
4
  import {
5
5
  SuffixIcon,
@@ -7,7 +7,7 @@ import {
7
7
  SuffixLabel,
8
8
  SuffixLabelProps,
9
9
  } from "./Suffix";
10
- import { typographyStyles } from "../../../Typography";
10
+ import { useTypographyStyles } from "../../../Typography";
11
11
 
12
12
  const mockLabel = "$";
13
13
 
@@ -49,6 +49,13 @@ function setupIcon({
49
49
  );
50
50
  }
51
51
 
52
+ let typographyStyles: ReturnType<typeof useTypographyStyles>;
53
+
54
+ beforeAll(() => {
55
+ const typographyStylesHook = renderHook(() => useTypographyStyles());
56
+ typographyStyles = typographyStylesHook.result.current;
57
+ });
58
+
52
59
  describe("Suffix", () => {
53
60
  it("renders a suffix label when specified", () => {
54
61
  const { getByText } = setupLabel({});
@@ -9,7 +9,7 @@ import {
9
9
  import { IconNames } from "@jobber/design";
10
10
  import { Icon } from "../../../Icon";
11
11
  import { Text } from "../../../Text";
12
- import { typographyStyles } from "../../../Typography";
12
+ import { useTypographyStyles } from "../../../Typography";
13
13
  import { useAtlantisTheme } from "../../../AtlantisThemeContext";
14
14
  import { useStyles } from "../../InputFieldWrapper.style";
15
15
 
@@ -36,6 +36,7 @@ export function SuffixLabel({
36
36
  styleOverride,
37
37
  }: SuffixLabelProps): JSX.Element {
38
38
  const styles = useStyles();
39
+ const typographyStyles = useTypographyStyles();
39
40
 
40
41
  return (
41
42
  <View
@@ -1,8 +1,10 @@
1
1
  import { buildThemedStyles } from "../AtlantisThemeContext";
2
- import { typographyStyles } from "../Typography/Typography.style";
2
+ import { useTypographyStyles } from "../Typography";
3
3
 
4
- export const useStyles = buildThemedStyles(tokens => {
5
- return {
4
+ export const useStyles = () => {
5
+ const typographyStyles = useTypographyStyles();
6
+
7
+ return buildThemedStyles(tokens => ({
6
8
  pressable: {
7
9
  flex: 1,
8
10
  },
@@ -26,5 +28,5 @@ export const useStyles = buildThemedStyles(tokens => {
26
28
  inputInvalid: {
27
29
  borderColor: tokens["color-critical"],
28
30
  },
29
- };
30
- });
31
+ }))();
32
+ };
@@ -1,8 +1,10 @@
1
1
  import { buildThemedStyles } from "../AtlantisThemeContext";
2
- import { typographyStyles } from "../Typography";
2
+ import { useTypographyStyles } from "../Typography";
3
3
 
4
- export const useStyles = buildThemedStyles(tokens => {
5
- return {
4
+ export const useStyles = () => {
5
+ const typographyStyles = useTypographyStyles();
6
+
7
+ return buildThemedStyles(tokens => ({
6
8
  inputPaddingTop: {
7
9
  paddingTop:
8
10
  (typographyStyles.smallSize.fontSize || 0) +
@@ -22,9 +24,8 @@ export const useStyles = buildThemedStyles(tokens => {
22
24
  },
23
25
 
24
26
  multilineInputiOS: {
25
- // for placeholder
26
27
  paddingTop:
27
28
  (typographyStyles.defaultSize.fontSize || 0) + tokens["space-smallest"],
28
29
  },
29
- };
30
- });
30
+ }))();
31
+ };
package/src/Text/Text.tsx CHANGED
@@ -90,7 +90,7 @@ export interface TextProps
90
90
  /**
91
91
  * **Use at your own risk:** Custom style for specific elements. This should only be used as a
92
92
  * **last resort**. Using this may result in unexpected side effects.
93
- * More information [here](https://atlantis.getjobber.com/storybook/?path=/docs/guides-customizing-components--docs#unsafe_-props).
93
+ * More information in the [Customizing components Guide](https://atlantis.getjobber.com/guides/customizing-components).
94
94
  */
95
95
  readonly UNSAFE_style?: TypographyUnsafeStyle;
96
96
  }
@@ -620,14 +620,7 @@ export const createTypographyTokens = (
620
620
  });
621
621
 
622
622
  /**
623
- * `StyleSheet` for Typography.tsx.
624
- *
625
- * If you find yourself needing to use what's inside this object on files other
626
- * than `<Typography />`, please import from `@jobber/components-native` instead.
627
- *
628
- * ```
629
- * import { typographyStyles } from "@jobber/components-native"
630
- * ```
623
+ * @deprecated Use useTypographyStyles instead
631
624
  */
632
625
  export const typographyStyles: Record<string, TextStyle> = StyleSheet.create(
633
626
  createTypographyTokens(staticTokens),
@@ -10,7 +10,7 @@ import {
10
10
  ViewStyle,
11
11
  } from "react-native";
12
12
  import { TypographyGestureDetector } from "./TypographyGestureDetector";
13
- import { typographyStyles as styles } from "./Typography.style";
13
+ import { useTypographyStyles } from "./Typography.style";
14
14
  import { capitalize } from "../utils/intl";
15
15
  import { useAtlantisTheme } from "../AtlantisThemeContext";
16
16
 
@@ -161,13 +161,14 @@ function InternalTypography<T extends FontFamily = "base">({
161
161
  UNSAFE_style,
162
162
  selectable = true,
163
163
  }: TypographyProps<T>): JSX.Element {
164
- const sizeAndHeight = getSizeAndHeightStyle(size, lineHeight);
164
+ const styles = useTypographyStyles();
165
+ const sizeAndHeight = getSizeAndHeightStyle(size, styles, lineHeight);
165
166
  const style: StyleProp<ViewStyle>[] = [
166
- getFontStyle(fontFamily, fontStyle, fontWeight),
167
- getColorStyle(color, reverseTheme),
168
- getAlignStyle(align),
167
+ getFontStyle(fontFamily, fontStyle, fontWeight, styles),
168
+ getColorStyle(styles, color, reverseTheme),
169
+ getAlignStyle(styles, align),
169
170
  sizeAndHeight,
170
- getLetterSpacingStyle(letterSpacing),
171
+ getLetterSpacingStyle(letterSpacing, styles),
171
172
  ];
172
173
 
173
174
  if (strikeThrough) {
@@ -233,6 +234,7 @@ function getFontStyle(
233
234
  fontFamily: FontFamily = "base",
234
235
  fontStyle: FontStyle = "regular",
235
236
  fontWeight: FontWeight = "regular",
237
+ styles: Record<string, TextStyle>,
236
238
  ) {
237
239
  const defaultBaseFontStyling = styles.baseRegularRegular;
238
240
  const defaultDisplayFontStyling = styles.displayRegularBold;
@@ -263,7 +265,11 @@ function getTransformedText(text?: string, transform?: TextTransform) {
263
265
  }
264
266
  }
265
267
 
266
- function getColorStyle(color?: TextColor, reverseTheme?: boolean) {
268
+ function getColorStyle(
269
+ styles: Record<string, TextStyle>,
270
+ color?: TextColor,
271
+ reverseTheme?: boolean,
272
+ ) {
267
273
  if (color === "default" || !color) {
268
274
  return styles.greyBlue;
269
275
  }
@@ -273,6 +279,7 @@ function getColorStyle(color?: TextColor, reverseTheme?: boolean) {
273
279
  }
274
280
 
275
281
  function getAlignStyle(
282
+ styles: Record<string, TextStyle>,
276
283
  alignStyle: TextAlign = I18nManager.isRTL ? "end" : "start",
277
284
  ) {
278
285
  return styles[`${alignStyle}Align`];
@@ -280,6 +287,7 @@ function getAlignStyle(
280
287
 
281
288
  function getSizeAndHeightStyle(
282
289
  textSize: TextSize,
290
+ styles: Record<string, TextStyle>,
283
291
  lineHeightOverwrite?: LineHeight,
284
292
  ) {
285
293
  const fontSize = styles[`${textSize}Size`];
@@ -293,7 +301,10 @@ function getSizeAndHeightStyle(
293
301
  return fontSize;
294
302
  }
295
303
 
296
- function getLetterSpacingStyle(letterSpacing: LetterSpacing = "base") {
304
+ function getLetterSpacingStyle(
305
+ letterSpacing: LetterSpacing = "base",
306
+ styles: Record<string, TextStyle>,
307
+ ) {
297
308
  return styles[`${letterSpacing}LetterSpacing`];
298
309
  }
299
310
 
@@ -1,8 +1,11 @@
1
1
  import { Platform } from "react-native";
2
2
  import { androidTokens, iosTokens } from "@jobber/design";
3
3
 
4
- // TODO: remove all references to const in JM and Atlantis. Replace with useAtlantisTheme.
5
- // Rename to `nonThemedTokens` in the meantime?
4
+ /**
5
+ * These design tokens don't react to theme changes. Only use these if you need to access
6
+ * tokens that are not affected by the current theme, otherwise you should be using our
7
+ * useAtlantisTheme() hook to access the current theme's tokens.
8
+ */
6
9
  export const tokens: typeof iosTokens = Platform.select({
7
10
  ios: () => iosTokens,
8
11
  android: () => androidTokens,
@@ -8,6 +8,7 @@
8
8
  "AtlantisContext.Provider",
9
9
  "AtlantisFormContext.Consumer",
10
10
  "AtlantisFormContext.Provider",
11
+ "AtlantisThemeContextProvider",
11
12
  "AutoLink",
12
13
  "Banner",
13
14
  "BottomSheet",