@factorialco/f0-react-native 0.34.0 → 0.36.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -5
- package/lib/module/components/Button/index.js +1 -1
- package/lib/module/components/Button/index.js.map +1 -1
- package/lib/module/components/F0Button/F0Button.js +2 -0
- package/lib/module/components/F0Button/F0Button.js.map +1 -0
- package/lib/module/components/F0Button/F0Button.md +163 -0
- package/lib/module/components/F0Button/F0Button.styles.js +2 -0
- package/lib/module/components/F0Button/F0Button.styles.js.map +1 -0
- package/lib/module/components/F0Button/F0Button.types.js +2 -0
- package/lib/module/components/F0Button/F0Button.types.js.map +1 -0
- package/lib/module/components/F0Button/index.js +2 -0
- package/lib/module/components/F0Button/index.js.map +1 -0
- package/lib/module/components/Icon/index.js.map +1 -1
- package/lib/module/components/exports.js +1 -1
- package/lib/module/components/exports.js.map +1 -1
- package/lib/module/components/primitives/F0Image/F0Image.js +2 -0
- package/lib/module/components/primitives/F0Image/F0Image.js.map +1 -0
- package/lib/module/components/primitives/F0Image/F0Image.md +40 -0
- package/lib/module/components/primitives/F0Image/F0Image.types.js +2 -0
- package/lib/module/components/primitives/F0Image/F0Image.types.js.map +1 -0
- package/lib/module/components/primitives/F0Image/index.js +2 -0
- package/lib/module/components/primitives/F0Image/index.js.map +1 -0
- package/lib/typescript/components/Button/index.d.ts +18 -0
- package/lib/typescript/components/Button/index.d.ts.map +1 -1
- package/lib/typescript/components/F0Button/F0Button.d.ts +6 -0
- package/lib/typescript/components/F0Button/F0Button.d.ts.map +1 -0
- package/lib/typescript/components/F0Button/F0Button.styles.d.ts +161 -0
- package/lib/typescript/components/F0Button/F0Button.styles.d.ts.map +1 -0
- package/lib/typescript/components/F0Button/F0Button.types.d.ts +47 -0
- package/lib/typescript/components/F0Button/F0Button.types.d.ts.map +1 -0
- package/lib/typescript/components/F0Button/index.d.ts +4 -0
- package/lib/typescript/components/F0Button/index.d.ts.map +1 -0
- package/lib/typescript/components/Icon/index.d.ts +5 -0
- package/lib/typescript/components/Icon/index.d.ts.map +1 -1
- package/lib/typescript/components/exports.d.ts +2 -0
- package/lib/typescript/components/exports.d.ts.map +1 -1
- package/lib/typescript/components/primitives/F0Image/F0Image.d.ts +11 -0
- package/lib/typescript/components/primitives/F0Image/F0Image.d.ts.map +1 -0
- package/lib/typescript/components/primitives/F0Image/F0Image.types.d.ts +21 -0
- package/lib/typescript/components/primitives/F0Image/F0Image.types.d.ts.map +1 -0
- package/lib/typescript/components/primitives/F0Image/index.d.ts +3 -0
- package/lib/typescript/components/primitives/F0Image/index.d.ts.map +1 -0
- package/package.json +2 -1
- package/src/components/Button/__snapshots__/index.spec.tsx.snap +11 -11
- package/src/components/Button/index.tsx +22 -2
- package/src/components/F0Button/F0Button.md +163 -0
- package/src/components/F0Button/F0Button.styles.ts +141 -0
- package/src/components/F0Button/F0Button.tsx +228 -0
- package/src/components/F0Button/F0Button.types.ts +82 -0
- package/src/components/F0Button/__tests__/F0Button.spec.tsx +285 -0
- package/src/components/F0Button/__tests__/__snapshots__/F0Button.spec.tsx.snap +966 -0
- package/src/components/F0Button/index.ts +7 -0
- package/src/components/Icon/index.tsx +5 -0
- package/src/components/exports.ts +2 -0
- package/src/components/primitives/F0Image/F0Image.md +40 -0
- package/src/components/primitives/F0Image/F0Image.tsx +48 -0
- package/src/components/primitives/F0Image/F0Image.types.ts +23 -0
- package/src/components/primitives/F0Image/__tests__/F0Image.spec.tsx +46 -0
- package/src/components/primitives/F0Image/index.ts +2 -0
|
@@ -21,6 +21,11 @@ const iconVariants = tv({
|
|
|
21
21
|
},
|
|
22
22
|
})
|
|
23
23
|
|
|
24
|
+
/**
|
|
25
|
+
* @deprecated Use `F0IconProps` from `../primitives/F0Icon` instead.
|
|
26
|
+
* Migration: Replace `IconProps` with `F0IconProps`.
|
|
27
|
+
* `F0Icon` supports `icon`, `size`, `testID`, and `className`, and adds semantic `color` variants.
|
|
28
|
+
*/
|
|
24
29
|
export interface IconProps extends SvgProps, VariantProps<typeof iconVariants> {
|
|
25
30
|
icon: IconType
|
|
26
31
|
testID?: string
|
|
@@ -3,6 +3,7 @@ export * from "./Activity/ActivityItem"
|
|
|
3
3
|
export * from "./Avatars/exports"
|
|
4
4
|
export * from "./Badge"
|
|
5
5
|
export * from "./Button"
|
|
6
|
+
export * from "./F0Button"
|
|
6
7
|
export * from "./F0Badge"
|
|
7
8
|
export * from "./Counter"
|
|
8
9
|
export * from "./ExampleComponent"
|
|
@@ -18,4 +19,5 @@ export * from "./experimental/Lists/DetailsItemsList"
|
|
|
18
19
|
// Export primitives
|
|
19
20
|
export * from "./primitives/F0Text"
|
|
20
21
|
export * from "./primitives/F0Icon"
|
|
22
|
+
export * from "./primitives/F0Image"
|
|
21
23
|
export * from "./primitives/PressableFeedback"
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# F0Image
|
|
2
|
+
|
|
3
|
+
Image primitive for React Native in F0.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
`F0Image` is a thin wrapper around `expo-image` with className support and consistent defaults for `contentFit`, `transition`, and `cachePolicy`.
|
|
8
|
+
|
|
9
|
+
`expo-image` is a runtime peer dependency of `@factorialco/f0-react-native`. Ensure your app installs a compatible `expo-image` version.
|
|
10
|
+
|
|
11
|
+
## Usage
|
|
12
|
+
|
|
13
|
+
<!-- prettier-ignore -->
|
|
14
|
+
```tsx
|
|
15
|
+
import { F0Image } from "@factorialco/f0-react-native"
|
|
16
|
+
|
|
17
|
+
<F0Image
|
|
18
|
+
source={{ uri: "https://example.com/avatar.png" }}
|
|
19
|
+
className="h-8 w-8 rounded-full"
|
|
20
|
+
accessibilityLabel="Profile picture"
|
|
21
|
+
/>
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Props
|
|
25
|
+
|
|
26
|
+
| Prop | Type | Default | Description |
|
|
27
|
+
| ------------- | ------------------- | ----------------- | ------------------------------ |
|
|
28
|
+
| `source` | `ImageSource` | required | Image source |
|
|
29
|
+
| `className` | `string` | `"h-full w-full"` | Utility classes for layout |
|
|
30
|
+
| `contentFit` | `ImageContentFit` | `"cover"` | Content fit mode |
|
|
31
|
+
| `transition` | `number \| boolean` | `150` | Transition duration / behavior |
|
|
32
|
+
| `cachePolicy` | `ImageCachePolicy` | `"memory-disk"` | Caching policy |
|
|
33
|
+
|
|
34
|
+
All other supported `expo-image` props are forwarded.
|
|
35
|
+
|
|
36
|
+
## Testing
|
|
37
|
+
|
|
38
|
+
Main tests:
|
|
39
|
+
|
|
40
|
+
- `src/components/primitives/F0Image/__tests__/F0Image.spec.tsx`
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { Image as ExpoImage } from "expo-image"
|
|
2
|
+
import React from "react"
|
|
3
|
+
import { withUniwind } from "uniwind"
|
|
4
|
+
|
|
5
|
+
import { cn } from "../../../lib/utils"
|
|
6
|
+
|
|
7
|
+
import type { F0ImageProps } from "./F0Image.types"
|
|
8
|
+
|
|
9
|
+
const UniwindExpoImage = withUniwind(ExpoImage)
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* F0Image - Image primitive for React Native in F0.
|
|
13
|
+
*
|
|
14
|
+
* Wraps `expo-image` to provide className support and sane defaults.
|
|
15
|
+
*/
|
|
16
|
+
const F0Image = React.memo(
|
|
17
|
+
React.forwardRef<React.ElementRef<typeof ExpoImage>, F0ImageProps>(
|
|
18
|
+
(
|
|
19
|
+
{
|
|
20
|
+
source,
|
|
21
|
+
className,
|
|
22
|
+
style,
|
|
23
|
+
contentFit = "cover",
|
|
24
|
+
transition = 150,
|
|
25
|
+
cachePolicy = "memory-disk",
|
|
26
|
+
...rest
|
|
27
|
+
},
|
|
28
|
+
ref
|
|
29
|
+
) => {
|
|
30
|
+
return (
|
|
31
|
+
<UniwindExpoImage
|
|
32
|
+
ref={ref}
|
|
33
|
+
source={source}
|
|
34
|
+
className={cn("h-full w-full", className)}
|
|
35
|
+
style={style}
|
|
36
|
+
contentFit={contentFit}
|
|
37
|
+
transition={transition}
|
|
38
|
+
cachePolicy={cachePolicy}
|
|
39
|
+
{...rest}
|
|
40
|
+
/>
|
|
41
|
+
)
|
|
42
|
+
}
|
|
43
|
+
)
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
F0Image.displayName = "F0Image"
|
|
47
|
+
|
|
48
|
+
export { F0Image }
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { ImageProps as ExpoImageProps } from "expo-image"
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Public F0Image props.
|
|
5
|
+
*
|
|
6
|
+
* Thin primitive wrapper around `expo-image` with className support.
|
|
7
|
+
*/
|
|
8
|
+
export interface F0ImageProps extends Omit<ExpoImageProps, "source" | "style"> {
|
|
9
|
+
/**
|
|
10
|
+
* Image source passed to expo-image.
|
|
11
|
+
*/
|
|
12
|
+
source: ExpoImageProps["source"]
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Utility classes for sizing/layout.
|
|
16
|
+
*/
|
|
17
|
+
className?: string
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Inline style escape hatch.
|
|
21
|
+
*/
|
|
22
|
+
style?: ExpoImageProps["style"]
|
|
23
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { render } from "@testing-library/react-native"
|
|
2
|
+
import React from "react"
|
|
3
|
+
|
|
4
|
+
import { F0Image } from "../"
|
|
5
|
+
|
|
6
|
+
describe("F0Image", () => {
|
|
7
|
+
it("renders with a remote source", () => {
|
|
8
|
+
const { getByTestId } = render(
|
|
9
|
+
<F0Image
|
|
10
|
+
source={{ uri: "https://example.com/avatar.png" }}
|
|
11
|
+
testID="f0-image"
|
|
12
|
+
/>
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
expect(getByTestId("f0-image")).toBeTruthy()
|
|
16
|
+
})
|
|
17
|
+
|
|
18
|
+
it("applies sane defaults", () => {
|
|
19
|
+
const { getByTestId } = render(
|
|
20
|
+
<F0Image
|
|
21
|
+
source={{ uri: "https://example.com/defaults.png" }}
|
|
22
|
+
testID="f0-image-defaults"
|
|
23
|
+
/>
|
|
24
|
+
)
|
|
25
|
+
const image = getByTestId("f0-image-defaults")
|
|
26
|
+
|
|
27
|
+
expect(image.props.contentFit).toBe("cover")
|
|
28
|
+
expect(image.props.transition).toBe(150)
|
|
29
|
+
expect(image.props.cachePolicy).toBe("memory-disk")
|
|
30
|
+
})
|
|
31
|
+
|
|
32
|
+
it("accepts className overrides", () => {
|
|
33
|
+
const { getByTestId } = render(
|
|
34
|
+
<F0Image
|
|
35
|
+
source={{ uri: "https://example.com/classname.png" }}
|
|
36
|
+
className="h-8 w-8 rounded-full"
|
|
37
|
+
testID="f0-image-classname"
|
|
38
|
+
/>
|
|
39
|
+
)
|
|
40
|
+
const image = getByTestId("f0-image-classname")
|
|
41
|
+
|
|
42
|
+
expect(image.props.className).toContain("h-8")
|
|
43
|
+
expect(image.props.className).toContain("w-8")
|
|
44
|
+
expect(image.props.className).toContain("rounded-full")
|
|
45
|
+
})
|
|
46
|
+
})
|