@symbiote-native/image 0.0.0 → 0.1.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 +232 -17
- package/build/angular/image-background/index.js +3 -1
- package/build/core/hash-strings.js +3 -1
- package/build/core/image-background.js +4 -1
- package/build/core/image-view-events.js +4 -2
- package/build/core/image-view.js +4 -2
- package/build/core/native-style.js +4 -1
- package/build/core/props.js +1 -1
- package/build/core/sources.js +3 -1
- package/build/svelte/use-image.svelte.js +1 -1
- package/build-ngc/angular/image/index.js.map +1 -1
- package/build-ngc/angular/image-background/index.js +6 -2
- package/build-ngc/angular/image-background/index.js.map +1 -1
- package/build-ngc/core/hash-strings.js +3 -1
- package/build-ngc/core/hash-strings.js.map +1 -1
- package/build-ngc/core/image-api.js.map +1 -1
- package/build-ngc/core/image-background.js +4 -1
- package/build-ngc/core/image-background.js.map +1 -1
- package/build-ngc/core/image-loader.js.map +1 -1
- package/build-ngc/core/image-view-events.js +4 -2
- package/build-ngc/core/image-view-events.js.map +1 -1
- package/build-ngc/core/image-view.js +4 -2
- package/build-ngc/core/image-view.js.map +1 -1
- package/build-ngc/core/native-module.js.map +1 -1
- package/build-ngc/core/native-style.js +4 -1
- package/build-ngc/core/native-style.js.map +1 -1
- package/build-ngc/core/props.js +1 -1
- package/build-ngc/core/props.js.map +1 -1
- package/build-ngc/core/sources.js +3 -1
- package/build-ngc/core/sources.js.map +1 -1
- package/package.json +15 -15
- package/src/angular/image/index.ts +3 -2
- package/src/angular/image-background/index.ts +6 -3
- package/src/core/hash-strings.ts +3 -1
- package/src/core/image-api.ts +19 -9
- package/src/core/image-background.ts +7 -2
- package/src/core/image-loader.ts +9 -2
- package/src/core/image-view-events.ts +8 -2
- package/src/core/image-view.ts +24 -7
- package/src/core/native-module.ts +2 -3
- package/src/core/native-style.ts +11 -4
- package/src/core/props.ts +7 -2
- package/src/core/sources.ts +8 -3
- package/src/core/types.ts +6 -9
- package/src/react/image-background.ts +3 -1
- package/src/react/image.ts +4 -1
- package/src/solid/image-background.ts +2 -3
- package/src/solid/image.ts +4 -3
- package/src/svelte/use-image.svelte.ts +1 -1
- package/src/vue/use-image.ts +5 -1
package/README.md
CHANGED
|
@@ -4,21 +4,175 @@
|
|
|
4
4
|
[SymbioteNative](../../README.md) adapter: React, Vue, Svelte, Solid and Angular. An image view
|
|
5
5
|
with caching, placeholders, transitions and SF Symbols, plus the cache and hash functions.
|
|
6
6
|
|
|
7
|
+
Built the same way as [`@symbiote-native/clipboard`](../clipboard)'s `ClipboardPasteButton`, an
|
|
8
|
+
`expo-modules-core` native view reached through `requireNativeViewManager` (see the
|
|
9
|
+
`symbiote-expo-native-module` project skill: why `expo-modules-core` is depended on directly and never
|
|
10
|
+
the `expo` meta-package, why the upstream JS is hand-ported into `core/`, and how autolinking finds the
|
|
11
|
+
native module). One render function in `core/` returns a descriptor and every adapter only turns it into
|
|
12
|
+
its own element.
|
|
13
|
+
|
|
7
14
|
## Install
|
|
8
15
|
|
|
16
|
+
**New app:**
|
|
17
|
+
|
|
9
18
|
```bash
|
|
10
|
-
npx @symbiote-native/cli new my-app --image
|
|
11
|
-
npx @symbiote-native/cli add --image # existing app
|
|
19
|
+
npx @symbiote-native/cli new my-app --image
|
|
12
20
|
```
|
|
13
21
|
|
|
14
|
-
|
|
15
|
-
|
|
22
|
+
**Existing SymbioteNative app:**
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
npx @symbiote-native/cli add --image
|
|
26
|
+
```
|
|
16
27
|
|
|
17
|
-
|
|
28
|
+
Either way: installs `@symbiote-native/image` and wires the native autolinking automatically,
|
|
29
|
+
see [`@symbiote-native/cli`](../cli).
|
|
30
|
+
|
|
31
|
+
<details>
|
|
32
|
+
<summary>Manual install (no CLI - installing and wiring native autolinking by hand)</summary>
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
npm install @symbiote-native/image
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Depends on `expo-image` and `expo-modules-core` directly (regular dependencies, pinned to exact
|
|
39
|
+
versions, since this package's `core/` is hand-ported against one specific native API shape).
|
|
40
|
+
Never install `expo-image` yourself, and never add the `expo` package to this project: it bundles
|
|
41
|
+
its own Metro/Babel pipeline that conflicts with this project's own.
|
|
42
|
+
|
|
43
|
+
### Required one-time step: native autolinking wiring
|
|
44
|
+
|
|
45
|
+
`expo-image`'s native code is discovered by `expo-modules-autolinking`, not by RN's own
|
|
46
|
+
`react-native.config.cjs` mechanism. Wire it into the native host app **once**, it covers this package
|
|
47
|
+
and every other `expo-modules-core` package with zero further changes. The steps and the
|
|
48
|
+
mechanics behind them are in the `symbiote-expo-native-module` skill and in
|
|
49
|
+
[`@symbiote-native/network`](../network)'s README; the reference app is `examples/expo-react`.
|
|
50
|
+
|
|
51
|
+
### Android KSP
|
|
52
|
+
|
|
53
|
+
`expo-image` reads a `kspVersion` from the app's root `build.gradle`. `native-link.json` declares
|
|
54
|
+
`android.requiresKsp`, so the `expo-modules-link` postinstall writes the right version there from Expo's
|
|
55
|
+
table for the app's Kotlin version.
|
|
56
|
+
|
|
57
|
+
</details>
|
|
58
|
+
|
|
59
|
+
## Shape
|
|
60
|
+
|
|
61
|
+
```
|
|
62
|
+
src/core/ image-view.ts - createImageView(getNode): render, the view handle and the events.
|
|
63
|
+
props.ts (normalization, deprecation warnings), sources.ts, native-style.ts,
|
|
64
|
+
image-background.ts, image-api.ts (the statics as functions), image-loader.ts and
|
|
65
|
+
image-ref-loader.ts (useImage's core), hash-strings.ts, types.ts.
|
|
66
|
+
src/react/ @symbiote-native/image/react - Image, ImageBackground, useImage
|
|
67
|
+
src/vue/ @symbiote-native/image/vue - Image, ImageBackground, useImage (a shallow ref)
|
|
68
|
+
src/svelte/ @symbiote-native/image/svelte - Image, ImageBackground, useImage ({ current })
|
|
69
|
+
src/solid/ @symbiote-native/image/solid - Image, ImageBackground, useImage (an accessor)
|
|
70
|
+
src/angular/ @symbiote-native/image/angular - ExpoImage, ExpoImageBackground, injectImage (a signal)
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Angular's selectors are `ExpoImage` and `ExpoImageBackground` because `Image` and `ImageBackground` are
|
|
74
|
+
already tags of the adapter.
|
|
75
|
+
|
|
76
|
+
## Use it
|
|
77
|
+
|
|
78
|
+
### React
|
|
18
79
|
|
|
19
80
|
```tsx
|
|
20
81
|
import { Image, useImage } from '@symbiote-native/image/react';
|
|
21
82
|
|
|
83
|
+
const image = useImage('https://picsum.photos/1000/800', { maxWidth: 800 });
|
|
84
|
+
|
|
85
|
+
<Image
|
|
86
|
+
source="https://picsum.photos/400"
|
|
87
|
+
placeholder="blurhash:/L6PZfSi_.AyE_3t7t7R**0o#DgR4"
|
|
88
|
+
contentFit="cover"
|
|
89
|
+
transition={200}
|
|
90
|
+
style={{ width: 200, height: 200 }}
|
|
91
|
+
/>;
|
|
92
|
+
{image && <Image source={image} style={{ width: 200, height: 160 }} />}
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### Vue
|
|
96
|
+
|
|
97
|
+
```vue
|
|
98
|
+
<script setup lang="ts">
|
|
99
|
+
import { Image, useImage } from '@symbiote-native/image/vue';
|
|
100
|
+
|
|
101
|
+
const image = useImage('https://picsum.photos/1000/800', { maxWidth: 800 });
|
|
102
|
+
</script>
|
|
103
|
+
|
|
104
|
+
<template>
|
|
105
|
+
<Image
|
|
106
|
+
source="https://picsum.photos/400"
|
|
107
|
+
placeholder="blurhash:/L6PZfSi_.AyE_3t7t7R**0o#DgR4"
|
|
108
|
+
contentFit="cover"
|
|
109
|
+
:transition="200"
|
|
110
|
+
:style="{ width: 200, height: 200 }"
|
|
111
|
+
/>
|
|
112
|
+
<Image v-if="image" :source="image" :style="{ width: 200, height: 160 }" />
|
|
113
|
+
</template>
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
`image` is a shallow ref, so a template reads it unwrapped and a script reads `image.value`.
|
|
117
|
+
|
|
118
|
+
### Angular
|
|
119
|
+
|
|
120
|
+
```ts
|
|
121
|
+
import { Component } from '@angular/core';
|
|
122
|
+
import { ExpoImage, injectImage } from '@symbiote-native/image/angular';
|
|
123
|
+
|
|
124
|
+
@Component({
|
|
125
|
+
standalone: true,
|
|
126
|
+
imports: [ExpoImage],
|
|
127
|
+
template: `
|
|
128
|
+
<ExpoImage
|
|
129
|
+
source="https://picsum.photos/400"
|
|
130
|
+
placeholder="blurhash:/L6PZfSi_.AyE_3t7t7R**0o#DgR4"
|
|
131
|
+
contentFit="cover"
|
|
132
|
+
[transition]="200"
|
|
133
|
+
[style]="{ width: 200, height: 200 }"
|
|
134
|
+
/>
|
|
135
|
+
@if (image(); as ref) {
|
|
136
|
+
<ExpoImage [source]="ref" [style]="{ width: 200, height: 160 }" />
|
|
137
|
+
}
|
|
138
|
+
`,
|
|
139
|
+
})
|
|
140
|
+
export class Photo {
|
|
141
|
+
readonly image = injectImage(() => 'https://picsum.photos/1000/800', () => ({ maxWidth: 800 }));
|
|
142
|
+
}
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
The selector is `ExpoImage`, because `Image` is already a tag of the adapter. `image` is a signal.
|
|
146
|
+
|
|
147
|
+
### Svelte
|
|
148
|
+
|
|
149
|
+
```svelte
|
|
150
|
+
<script lang="ts">
|
|
151
|
+
import { Image, useImage } from '@symbiote-native/image/svelte';
|
|
152
|
+
|
|
153
|
+
const image = useImage(() => 'https://picsum.photos/1000/800', () => ({ maxWidth: 800 }));
|
|
154
|
+
</script>
|
|
155
|
+
|
|
156
|
+
<Image
|
|
157
|
+
source="https://picsum.photos/400"
|
|
158
|
+
placeholder="blurhash:/L6PZfSi_.AyE_3t7t7R**0o#DgR4"
|
|
159
|
+
contentFit="cover"
|
|
160
|
+
transition={200}
|
|
161
|
+
style={{ width: 200, height: 200 }}
|
|
162
|
+
/>
|
|
163
|
+
{#if image.current}
|
|
164
|
+
<Image source={image.current} style={{ width: 200, height: 160 }} />
|
|
165
|
+
{/if}
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
### Solid
|
|
169
|
+
|
|
170
|
+
```tsx
|
|
171
|
+
import { Show } from 'solid-js';
|
|
172
|
+
import { Image, useImage } from '@symbiote-native/image/solid';
|
|
173
|
+
|
|
174
|
+
const image = useImage(() => 'https://picsum.photos/1000/800', () => ({ maxWidth: 800 }));
|
|
175
|
+
|
|
22
176
|
<Image
|
|
23
177
|
source="https://picsum.photos/400"
|
|
24
178
|
placeholder="blurhash:/L6PZfSi_.AyE_3t7t7R**0o#DgR4"
|
|
@@ -26,21 +180,82 @@ import { Image, useImage } from '@symbiote-native/image/react';
|
|
|
26
180
|
transition={200}
|
|
27
181
|
style={{ width: 200, height: 200 }}
|
|
28
182
|
/>;
|
|
183
|
+
<Show when={image()}>{ref => <Image source={ref()} style={{ width: 200, height: 160 }} />}</Show>;
|
|
29
184
|
```
|
|
30
185
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
186
|
+
## API
|
|
187
|
+
|
|
188
|
+
```ts
|
|
189
|
+
<Image source placeholder? contentFit? contentPosition? transition? cachePolicy? recyclingKey? priority?
|
|
190
|
+
tintColor? allowDownscaling? autoplay? alt? onLoadStart? onProgress? onLoad? onError? onDisplay? />
|
|
191
|
+
<ImageBackground imageStyle? ...Image props>children paint over the image</ImageBackground>
|
|
192
|
+
|
|
193
|
+
useImage(source, options?, dependencies?): ImageRef | null // per adapter, see Shape
|
|
194
|
+
// view handle: startAnimating, stopAnimating, lockResourceAsync, unlockResourceAsync, reloadAsync
|
|
195
|
+
|
|
196
|
+
prefetchImages(urls: string | string[], options?: CachePolicy | { cachePolicy?, headers? }): Promise<boolean>
|
|
197
|
+
clearMemoryCache(): Promise<boolean> clearDiskCache(): Promise<boolean> // true on success
|
|
198
|
+
getCachePathAsync(cacheKey): Promise<string | null> // null when not cached
|
|
199
|
+
writeToCacheAsync(source: string | ImageRef, cacheKey): Promise<void>
|
|
200
|
+
readFromCacheAsync(cacheKey): Promise<ImageRef | null>
|
|
201
|
+
configureCache(config): void
|
|
202
|
+
loadImageAsync(source, options?): Promise<ImageRef>
|
|
203
|
+
generateBlurhashAsync(source: string | ImageRef, numberOfComponents: [number, number] | { width, height }): Promise<string | null>
|
|
204
|
+
generateThumbhashAsync(source: string | ImageRef): Promise<string>
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
The statics of upstream's `Image` class are plain functions here. Ported from upstream's `Image.tsx`,
|
|
208
|
+
`ImageBackground.tsx` and `useImage.ts`.
|
|
209
|
+
|
|
210
|
+
## Notes
|
|
211
|
+
|
|
212
|
+
- **It is not React Native's `Image`.** The default fit is `contentFit="cover"`. The old `resizeMode`,
|
|
213
|
+
`fadeDuration` and `defaultSource` props still work but log a warning once, and `resizeMode:
|
|
214
|
+
'repeat'` is not supported at all. Use `contentFit`, `transition` and `placeholder`.
|
|
215
|
+
- **Caching is on by default.** `cachePolicy` is `disk`. `memory` and `memory-disk` keep decoded
|
|
216
|
+
images in RAM, which the system purges quickly under pressure.
|
|
217
|
+
- **A new source keeps the old picture until the new one loads**, and `transition` blends them. That
|
|
218
|
+
is the point of the library, and it is why recycling lists need `recyclingKey`.
|
|
219
|
+
- **`require('./a.png')` works.** Asset numbers go through Metro's asset registry before reaching
|
|
220
|
+
native, the same as for any image view.
|
|
221
|
+
- **SVG is decoded by the system on iOS.** An elliptical arc command with more than one parameter
|
|
222
|
+
set and packed flags can draw distorted or not at all. Simplify the path if one looks wrong.
|
|
223
|
+
- **Colors go through `processColor` by hand**, so `tintColor` and the style colors accept names,
|
|
224
|
+
hex and `rgb()`.
|
|
225
|
+
- **Not ported.** The web build, the RSC render tests of upstream (snapshot tests of a server renderer) and the `expo-observe` integration.
|
|
226
|
+
- **Not ported.** The web build, upstream's RSC snapshot tests and the `expo-observe` integration.
|
|
227
|
+
|
|
228
|
+
## Common questions
|
|
34
229
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
`
|
|
230
|
+
- **A list shows the previous row's picture.** The view keeps the old image until the new one is
|
|
231
|
+
ready. Give each image a `recyclingKey` (the item id). A `key` instead destroys the view and
|
|
232
|
+
defeats recycling.
|
|
233
|
+
- **Memory climbs with many images.** Show thumbnails sized to the box, keep `cachePolicy="disk"`,
|
|
234
|
+
leave `allowDownscaling` on, use `useImage` with `maxWidth`, call `clearMemoryCache()` on memory
|
|
235
|
+
pressure.
|
|
236
|
+
- **Animated WebP freezes or is slow on iOS.** Apple's decoder is slow on some files. Test or
|
|
237
|
+
re-encode them, and control playback with `autoplay={false}` and `startAnimating()`.
|
|
238
|
+
- **Android `NoSuchMethodError`.** `expo-image` and `expo-modules-core` must come from matching
|
|
239
|
+
releases. This package pins both, never install either yourself.
|
|
240
|
+
- **The placeholder flickers.** Set `placeholderContentFit` to the same value as `contentFit`.
|
|
241
|
+
- **`resizeMode`, `fadeDuration`, `defaultSource`.** Still work, warn once, `repeat` is unsupported.
|
|
242
|
+
Use `contentFit`, `transition`, `placeholder`.
|
|
243
|
+
- **Angular names.** `ExpoImage` and `ExpoImageBackground`.
|
|
40
244
|
|
|
41
|
-
|
|
42
|
-
|
|
245
|
+
Sources: [Expo docs: Image](https://docs.expo.dev/versions/latest/sdk/image/),
|
|
246
|
+
[expo/expo#21211](https://github.com/expo/expo/issues/21211),
|
|
247
|
+
[expo/expo#26781](https://github.com/expo/expo/issues/26781),
|
|
248
|
+
[expo/expo#24557](https://github.com/expo/expo/issues/24557),
|
|
249
|
+
[expo/expo#25920](https://github.com/expo/expo/issues/25920),
|
|
250
|
+
[expo/expo#37229](https://github.com/expo/expo/issues/37229).
|
|
43
251
|
|
|
44
|
-
##
|
|
252
|
+
## Test it
|
|
45
253
|
|
|
46
|
-
|
|
254
|
+
No device is needed for the logic. The core tests (`src/core/*.test.ts`) replace `expo-modules-core`
|
|
255
|
+
(`requireNativeViewManager`, `Platform`) and assert the descriptor a render function returns. The
|
|
256
|
+
adapter tests (`src/{react,vue,solid,angular}/**/*.test.*`, `vitest`) render the real component over the
|
|
257
|
+
recording Fabric with an injected view config and assert the committed payload, and Svelte's
|
|
258
|
+
`*.smoke.test.ts` compile the `.svelte` files and mount them. Painting itself is verified on a device in
|
|
259
|
+
the six `examples/expo-*` canary apps (`examples/expo-react`, `examples/expo-vue-sfc`,
|
|
260
|
+
`examples/expo-vue-tsx`, `examples/expo-svelte`, `examples/expo-solid`, `examples/expo-angular`), see the
|
|
261
|
+
parent [README](../../README.md).
|
|
@@ -81,7 +81,9 @@ let ExpoImageBackground = (() => {
|
|
|
81
81
|
inputs: [...IMAGE_BACKGROUND_INPUTS],
|
|
82
82
|
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
83
83
|
template: `@if (descriptor; as node) {
|
|
84
|
-
<symbiote-descriptor-host [node]="node"
|
|
84
|
+
<symbiote-descriptor-host [node]="node"
|
|
85
|
+
><ng-content
|
|
86
|
+
/></symbiote-descriptor-host>
|
|
85
87
|
}`,
|
|
86
88
|
})];
|
|
87
89
|
let _classDescriptor;
|
|
@@ -5,7 +5,9 @@ function hashToUri(type, hash) {
|
|
|
5
5
|
}
|
|
6
6
|
/** `blurhash:/<hash>/<width>/<height>` or `<hash>/<width>/<height>` */
|
|
7
7
|
export function resolveBlurhashString(str) {
|
|
8
|
-
const [hash = '', width = '', height = ''] = str
|
|
8
|
+
const [hash = '', width = '', height = ''] = str
|
|
9
|
+
.replace(/^blurhash:\//, '')
|
|
10
|
+
.split('/');
|
|
9
11
|
return {
|
|
10
12
|
uri: hashToUri('blurhash', hash),
|
|
11
13
|
width: parseInt(width, 10) || DEFAULT_HASH_SIZE,
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { el } from '@symbiote-native/components';
|
|
2
2
|
import { createImageView } from './image-view.js';
|
|
3
|
-
const CLASS_KEYS = new Set([
|
|
3
|
+
const CLASS_KEYS = new Set([
|
|
4
|
+
'className',
|
|
5
|
+
'class',
|
|
6
|
+
]);
|
|
4
7
|
function isClassEntry([key]) {
|
|
5
8
|
return CLASS_KEYS.has(key);
|
|
6
9
|
}
|
|
@@ -2,10 +2,12 @@ function field(value, key) {
|
|
|
2
2
|
return Reflect.get(Object(value), key);
|
|
3
3
|
}
|
|
4
4
|
function isLoad(value) {
|
|
5
|
-
return typeof field(value, 'cacheType') === 'string' &&
|
|
5
|
+
return (typeof field(value, 'cacheType') === 'string' &&
|
|
6
|
+
typeof field(value, 'source') === 'object');
|
|
6
7
|
}
|
|
7
8
|
function isProgress(value) {
|
|
8
|
-
return typeof field(value, 'loaded') === 'number' &&
|
|
9
|
+
return (typeof field(value, 'loaded') === 'number' &&
|
|
10
|
+
typeof field(value, 'total') === 'number');
|
|
9
11
|
}
|
|
10
12
|
function isError(value) {
|
|
11
13
|
return typeof field(value, 'error') === 'string';
|
package/build/core/image-view.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { requireNativeModule, requireNativeViewManager } from 'expo-modules-core';
|
|
1
|
+
import { requireNativeModule, requireNativeViewManager, } from 'expo-modules-core';
|
|
2
2
|
import { el } from '@symbiote-native/components';
|
|
3
3
|
import { defineExpoNativeView, defineExpoViewMethods, getNativeTag, isDevBuild, styleOfProps, } from '@symbiote-native/engine';
|
|
4
4
|
import { IMAGE_MODULE_NAME, SF_SYMBOL_PREFIX } from './constants.js';
|
|
@@ -53,7 +53,9 @@ function symbolProps(parts, isSfSymbol) {
|
|
|
53
53
|
}
|
|
54
54
|
function sizedStyle(parts, isSfSymbol) {
|
|
55
55
|
const { fontSize, rest } = parts;
|
|
56
|
-
return isSfSymbol && fontSize
|
|
56
|
+
return isSfSymbol && fontSize
|
|
57
|
+
? { width: fontSize, height: fontSize, ...rest }
|
|
58
|
+
: rest;
|
|
57
59
|
}
|
|
58
60
|
function nativeProps(props) {
|
|
59
61
|
const parts = splitImageStyle(styleOfProps(props));
|
|
@@ -58,5 +58,8 @@ export function platformStyle(style) {
|
|
|
58
58
|
}
|
|
59
59
|
/** `backgroundColor` and the border colors in the form native reads */
|
|
60
60
|
export function nativeColorProps(style) {
|
|
61
|
-
return Object.fromEntries(['backgroundColor', ...BORDER_COLOR_KEYS].map(key => [
|
|
61
|
+
return Object.fromEntries(['backgroundColor', ...BORDER_COLOR_KEYS].map(key => [
|
|
62
|
+
key,
|
|
63
|
+
toNativeColor(style[key]),
|
|
64
|
+
]));
|
|
62
65
|
}
|
package/build/core/props.js
CHANGED
|
@@ -72,7 +72,7 @@ export function resolveSfEffect(sfEffect) {
|
|
|
72
72
|
return null;
|
|
73
73
|
}
|
|
74
74
|
const effects = Array.isArray(sfEffect) ? sfEffect : [sfEffect];
|
|
75
|
-
return effects.map(item =>
|
|
75
|
+
return effects.map(item => typeof item === 'string' ? { effect: item } : item);
|
|
76
76
|
}
|
|
77
77
|
/** A number is the duration of a cross dissolve */
|
|
78
78
|
export function resolveTransition(transition, fadeDuration) {
|
package/build/core/sources.js
CHANGED
|
@@ -28,7 +28,9 @@ export function resolveSource(source) {
|
|
|
28
28
|
return resolveThumbhashString(source);
|
|
29
29
|
}
|
|
30
30
|
if (source.startsWith(SF_SYMBOL_PREFIX)) {
|
|
31
|
-
return {
|
|
31
|
+
return {
|
|
32
|
+
uri: `${SF_SYMBOL_PREFIX}/${source.slice(SF_SYMBOL_PREFIX.length)}`,
|
|
33
|
+
};
|
|
32
34
|
}
|
|
33
35
|
return { uri: source };
|
|
34
36
|
}
|
|
@@ -10,7 +10,7 @@ export function useImage(getSource, getOptions = () => ({}), getDependencies = (
|
|
|
10
10
|
const key = $derived(resolveSource(getSource())?.uri);
|
|
11
11
|
$effect(() => {
|
|
12
12
|
// Read so the effect tracks them, the source itself is not a trigger
|
|
13
|
-
key;
|
|
13
|
+
void key;
|
|
14
14
|
getDependencies();
|
|
15
15
|
const loader = createImageRefLoader(loaded => {
|
|
16
16
|
image = loaded;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/angular/image/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAG5E,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;;AAG7C,oFAAoF;AACpF,MAAM,YAAY,GAAG;IACnB,QAAQ;IACR,aAAa;IACb,YAAY;IACZ,uBAAuB;IACvB,iBAAiB;IACjB,YAAY;IACZ,YAAY;IACZ,WAAW;IACX,UAAU;IACV,SAAS;IACT,aAAa;IACb,kBAAkB;IAClB,cAAc;IACd,UAAU;IACV,UAAU;IACV,aAAa;IACb,QAAQ;IACR,YAAY;IACZ,SAAS;IACT,WAAW;IACX,WAAW;IACX,eAAe;IACf,wBAAwB;IACxB,YAAY;IACZ,cAAc;IACd,KAAK;IACL,2BAA2B;IAC3B,kBAAkB;IAClB,cAAc;IACd,mBAAmB;IACnB,sBAAsB;IACtB,wBAAwB;IACxB,WAAW;CACH,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/angular/image/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAG5E,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;;AAG7C,oFAAoF;AACpF,MAAM,YAAY,GAAG;IACnB,QAAQ;IACR,aAAa;IACb,YAAY;IACZ,uBAAuB;IACvB,iBAAiB;IACjB,YAAY;IACZ,YAAY;IACZ,WAAW;IACX,UAAU;IACV,SAAS;IACT,aAAa;IACb,kBAAkB;IAClB,cAAc;IACd,UAAU;IACV,UAAU;IACV,aAAa;IACb,QAAQ;IACR,YAAY;IACZ,SAAS;IACT,WAAW;IACX,WAAW;IACX,eAAe;IACf,wBAAwB;IACxB,YAAY;IACZ,cAAc;IACd,KAAK;IACL,2BAA2B;IAC3B,kBAAkB;IAClB,cAAc;IACd,mBAAmB;IACnB,sBAAsB;IACtB,wBAAwB;IACxB,WAAW;CACH,CAAC;AAOX,+FAA+F;AAW/F,MAAM,OAAO,SAAU,SAAQ,cAAc;IAI1B,IAAI,GAAG,eAAe,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IAE/D,sFAAsF;IAC7E,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC;IACjD,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC;IAC/C,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC;IACvD,mBAAmB,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC;IAC3D,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;IAExB,SAAS,GAAG,YAAY,CAAC;IAElC,UAAU,CAAC,KAAa;QACzC,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;uGAjBU,SAAS;2FAAT,SAAS,okCAJV;;IAER,4DALQ,gBAAgB;;2FAOf,SAAS;kBAVrB,SAAS;mBAAC;oBACT,QAAQ,EAAE,WAAW;oBACrB,UAAU,EAAE,IAAI;oBAChB,OAAO,EAAE,CAAC,gBAAgB,CAAC;oBAC3B,MAAM,EAAE,CAAC,GAAG,YAAY,CAAC;oBACzB,eAAe,EAAE,uBAAuB,CAAC,MAAM;oBAC/C,QAAQ,EAAE;;IAER;iBACH"}
|
|
@@ -47,7 +47,9 @@ export class ExpoImageBackground extends NativeViewBase {
|
|
|
47
47
|
}
|
|
48
48
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ExpoImageBackground, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
49
49
|
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: ExpoImageBackground, isStandalone: true, selector: "ExpoImageBackground", inputs: { source: "source", placeholder: "placeholder", contentFit: "contentFit", placeholderContentFit: "placeholderContentFit", contentPosition: "contentPosition", transition: "transition", blurRadius: "blurRadius", tintColor: "tintColor", priority: "priority", loading: "loading", cachePolicy: "cachePolicy", responsivePolicy: "responsivePolicy", recyclingKey: "recyclingKey", autoplay: "autoplay", sfEffect: "sfEffect", onLoadStart: "onLoadStart", onLoad: "onLoad", onProgress: "onProgress", onError: "onError", onLoadEnd: "onLoadEnd", onDisplay: "onDisplay", defaultSource: "defaultSource", loadingIndicatorSource: "loadingIndicatorSource", resizeMode: "resizeMode", fadeDuration: "fadeDuration", alt: "alt", enableLiveTextInteraction: "enableLiveTextInteraction", allowDownscaling: "allowDownscaling", decodeFormat: "decodeFormat", useAppleWebpCodec: "useAppleWebpCodec", enforceEarlyResizing: "enforceEarlyResizing", preferHighDynamicRange: "preferHighDynamicRange", draggable: "draggable", imageStyle: "imageStyle" }, usesInheritance: true, ngImport: i0, template: `@if (descriptor; as node) {
|
|
50
|
-
<symbiote-descriptor-host [node]="node"
|
|
50
|
+
<symbiote-descriptor-host [node]="node"
|
|
51
|
+
><ng-content
|
|
52
|
+
/></symbiote-descriptor-host>
|
|
51
53
|
}`, isInline: true, dependencies: [{ kind: "component", type: DescriptorHost, selector: "symbiote-descriptor-host", inputs: ["node"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
52
54
|
}
|
|
53
55
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ExpoImageBackground, decorators: [{
|
|
@@ -59,7 +61,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
59
61
|
inputs: [...IMAGE_BACKGROUND_INPUTS],
|
|
60
62
|
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
61
63
|
template: `@if (descriptor; as node) {
|
|
62
|
-
<symbiote-descriptor-host [node]="node"
|
|
64
|
+
<symbiote-descriptor-host [node]="node"
|
|
65
|
+
><ng-content
|
|
66
|
+
/></symbiote-descriptor-host>
|
|
63
67
|
}`,
|
|
64
68
|
}]
|
|
65
69
|
}] });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/angular/image-background/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1E,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;;AAInD,8EAA8E;AAC9E,MAAM,uBAAuB,GAAG;IAC9B,QAAQ;IACR,aAAa;IACb,YAAY;IACZ,uBAAuB;IACvB,iBAAiB;IACjB,YAAY;IACZ,YAAY;IACZ,WAAW;IACX,UAAU;IACV,SAAS;IACT,aAAa;IACb,kBAAkB;IAClB,cAAc;IACd,UAAU;IACV,UAAU;IACV,aAAa;IACb,QAAQ;IACR,YAAY;IACZ,SAAS;IACT,WAAW;IACX,WAAW;IACX,eAAe;IACf,wBAAwB;IACxB,YAAY;IACZ,cAAc;IACd,KAAK;IACL,2BAA2B;IAC3B,kBAAkB;IAClB,cAAc;IACd,mBAAmB;IACnB,sBAAsB;IACtB,wBAAwB;IACxB,WAAW;IACX,YAAY;CACJ,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/angular/image-background/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1E,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;;AAInD,8EAA8E;AAC9E,MAAM,uBAAuB,GAAG;IAC9B,QAAQ;IACR,aAAa;IACb,YAAY;IACZ,uBAAuB;IACvB,iBAAiB;IACjB,YAAY;IACZ,YAAY;IACZ,WAAW;IACX,UAAU;IACV,SAAS;IACT,aAAa;IACb,kBAAkB;IAClB,cAAc;IACd,UAAU;IACV,UAAU;IACV,aAAa;IACb,QAAQ;IACR,YAAY;IACZ,SAAS;IACT,WAAW;IACX,WAAW;IACX,eAAe;IACf,wBAAwB;IACxB,YAAY;IACZ,cAAc;IACd,KAAK;IACL,2BAA2B;IAC3B,kBAAkB;IAClB,cAAc;IACd,mBAAmB;IACnB,sBAAsB;IACtB,wBAAwB;IACxB,WAAW;IACX,YAAY;CACJ,CAAC;AAMX,0FAA0F;AAa1F,MAAM,OAAO,mBAAoB,SAAQ,cAAc;IAIzB,SAAS,GAAG,uBAAuB,CAAC;IAE7C,UAAU,CAAC,KAAa;QACzC,OAAO,qBAAqB,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC;uGARU,mBAAmB;2FAAnB,mBAAmB,wmCANpB;;;;IAIR,4DAPQ,cAAc;;2FASb,mBAAmB;kBAZ/B,SAAS;mBAAC;oBACT,QAAQ,EAAE,qBAAqB;oBAC/B,UAAU,EAAE,IAAI;oBAChB,OAAO,EAAE,CAAC,cAAc,CAAC;oBACzB,MAAM,EAAE,CAAC,GAAG,uBAAuB,CAAC;oBACpC,eAAe,EAAE,uBAAuB,CAAC,MAAM;oBAC/C,QAAQ,EAAE;;;;IAIR;iBACH"}
|
|
@@ -5,7 +5,9 @@ function hashToUri(type, hash) {
|
|
|
5
5
|
}
|
|
6
6
|
/** `blurhash:/<hash>/<width>/<height>` or `<hash>/<width>/<height>` */
|
|
7
7
|
export function resolveBlurhashString(str) {
|
|
8
|
-
const [hash = '', width = '', height = ''] = str
|
|
8
|
+
const [hash = '', width = '', height = ''] = str
|
|
9
|
+
.replace(/^blurhash:\//, '')
|
|
10
|
+
.split('/');
|
|
9
11
|
return {
|
|
10
12
|
uri: hashToUri('blurhash', hash),
|
|
11
13
|
width: parseInt(width, 10) || DEFAULT_HASH_SIZE,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hash-strings.js","sourceRoot":"","sources":["../../src/core/hash-strings.ts"],"names":[],"mappings":"AAIA,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAE7B,SAAS,SAAS,CAAC,IAAoB,EAAE,IAAY;IACnD,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC3E,OAAO,GAAG,IAAI,KAAK,OAAO,EAAE,CAAC;AAC/B,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,qBAAqB,CAAC,GAAW;IAC/C,MAAM,CAAC,IAAI,GAAG,EAAE,EAAE,KAAK,GAAG,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC,GAAG,GAAG,
|
|
1
|
+
{"version":3,"file":"hash-strings.js","sourceRoot":"","sources":["../../src/core/hash-strings.ts"],"names":[],"mappings":"AAIA,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAE7B,SAAS,SAAS,CAAC,IAAoB,EAAE,IAAY;IACnD,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC3E,OAAO,GAAG,IAAI,KAAK,OAAO,EAAE,CAAC;AAC/B,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,qBAAqB,CAAC,GAAW;IAC/C,MAAM,CAAC,IAAI,GAAG,EAAE,EAAE,KAAK,GAAG,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC,GAAG,GAAG;SAC7C,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC;SAC3B,KAAK,CAAC,GAAG,CAAC,CAAC;IACd,OAAO;QACL,GAAG,EAAE,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC;QAChC,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,iBAAiB;QAC/C,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,iBAAiB;KAClD,CAAC;AACJ,CAAC;AAED,sCAAsC;AACtC,MAAM,UAAU,sBAAsB,CAAC,GAAW;IAChD,4DAA4D;IAC5D,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACnE,OAAO,EAAE,GAAG,EAAE,SAAS,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE,CAAC;AAC/C,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"image-api.js","sourceRoot":"","sources":["../../src/core/image-api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAS1C,MAAM,oBAAoB,GAAG,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"image-api.js","sourceRoot":"","sources":["../../src/core/image-api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAS1C,MAAM,oBAAoB,GAAG,aAAa,CAAC;AAK3C,2EAA2E;AAC3E,MAAM,UAAU,cAAc,CAC5B,IAAuB,EACvB,OAA0B;IAE1B,MAAM,EAAE,WAAW,GAAG,oBAAoB,EAAE,OAAO,EAAE,GACnD,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;IAC3E,OAAO,SAAS,CAAC,QAAQ,CACvB,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EACnC,WAAW,EACX,OAAO,CACR,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAqB,EAAE,CACrD,SAAS,CAAC,gBAAgB,EAAE,CAAC;AAE/B,MAAM,CAAC,MAAM,cAAc,GAAG,GAAqB,EAAE,CACnD,SAAS,CAAC,cAAc,EAAE,CAAC;AAE7B,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,QAAgB,EAA0B,EAAE,CAC5E,SAAS,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;AAExC,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,MAAyB,EACzB,QAAgB,EACD,EAAE,CAAC,SAAS,CAAC,iBAAiB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AAElE,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,QAAgB,EACU,EAAE,CAAC,SAAS,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;AAEtE,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,MAAyB,EAAQ,EAAE,CAChE,SAAS,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;AAEnC,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,MAAyB,EACzB,kBAAwE,EAChD,EAAE,CAC1B,SAAS,CAAC,qBAAqB,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;AAE9D,MAAM,CAAC,MAAM,sBAAsB,GAAG,CACpC,MAAyB,EACR,EAAE,CAAC,SAAS,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC;AAE/D,uEAAuE;AACvE,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,MAAsC,EACtC,UAA6B,EAAE;IAE/B,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IACvC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;IAC1E,CAAC;IACD,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;IACnD,OAAO,SAAS,CAAC,SAAS,CAAC,QAAQ,EAAE;QACnC,QAAQ;QACR,SAAS;QACT,SAAS,EAAE,aAAa,CAAC,SAAS,CAAC;KACpC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { el } from '@symbiote-native/components';
|
|
2
2
|
import { createImageView } from './image-view';
|
|
3
|
-
const CLASS_KEYS = new Set([
|
|
3
|
+
const CLASS_KEYS = new Set([
|
|
4
|
+
'className',
|
|
5
|
+
'class',
|
|
6
|
+
]);
|
|
4
7
|
function isClassEntry([key]) {
|
|
5
8
|
return CLASS_KEYS.has(key);
|
|
6
9
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"image-background.js","sourceRoot":"","sources":["../../src/core/image-background.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,6BAA6B,CAAC;AAGjD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAW/C,MAAM,UAAU,GAAwB,IAAI,GAAG,CAAY,
|
|
1
|
+
{"version":3,"file":"image-background.js","sourceRoot":"","sources":["../../src/core/image-background.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,6BAA6B,CAAC;AAGjD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAW/C,MAAM,UAAU,GAAwB,IAAI,GAAG,CAAY;IACzD,WAAW;IACX,OAAO;CACR,CAAC,CAAC;AAEH,SAAS,YAAY,CAAC,CAAC,GAAG,CAAoB;IAC5C,OAAO,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,aAAa,GAAG;IACpB,QAAQ,EAAE,UAAU;IACpB,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;IACR,GAAG,EAAE,CAAC;IACN,MAAM,EAAE,CAAC;CACqB,CAAC;AAEjC,wEAAwE;AACxE,MAAM,eAAe,GAAG,eAAe,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;AAEpD,wFAAwF;AACxF,MAAM,UAAU,qBAAqB,CACnC,KAA4B;IAE5B,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC;IAC7C,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,eAAe,CAAC,MAAM,CAAC;QACnC,GAAG,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;QACpE,KAAK,EAAE,CAAC,aAAa,EAAE,UAAU,CAAC;KACnC,CAAC,CAAC;IACH,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC;IACnE,OAAO,EAAE,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,GAAG,SAAS,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AACnE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"image-loader.js","sourceRoot":"","sources":["../../src/core/image-loader.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"image-loader.js","sourceRoot":"","sources":["../../src/core/image-loader.ts"],"names":[],"mappings":"AAoBA,2DAA2D;AAC3D,MAAM,UAAU,iBAAiB,CAC/B,MAAkC;IAElC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,MAAM,GAAkB,IAAI,CAAC;IAEjC,SAAS,OAAO;QACd,MAAM,EAAE,OAAO,EAAE,CAAC;QAClB,MAAM,GAAG,IAAI,CAAC;IAChB,CAAC;IAED,SAAS,IAAI,CACX,MAAsC,EACtC,KAAc,EACd,KAAiB;QAEjB,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;QACxC,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;YAC1E,OAAO;QACT,CAAC;QACD,OAAO,CAAC,KAAK,CACX,0BAA0B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,0CAA0C,CAC3F,CAAC;QACF,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IAED,SAAS,IAAI,CAAC,MAAsC;QAClD,OAAO,EAAE,CAAC;QACV,KAAK,IAAI,CAAC,CAAC;QACX,MAAM,IAAI,GAAG,KAAK,CAAC;QACnB,MAAM;aACH,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC;aACjC,IAAI,CAAC,KAAK,CAAC,EAAE;YACZ,IAAI,IAAI,KAAK,KAAK;gBAAE,OAAO;YAC3B,MAAM,GAAG,KAAK,CAAC;YACf,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACxB,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;YACxB,IAAI,IAAI,KAAK,KAAK;gBAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;IACP,CAAC;IAED,OAAO;QACL,IAAI;QACJ,MAAM,EAAE,GAAG,EAAE;YACX,KAAK,IAAI,CAAC,CAAC;YACX,OAAO,EAAE,CAAC;QACZ,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -2,10 +2,12 @@ function field(value, key) {
|
|
|
2
2
|
return Reflect.get(Object(value), key);
|
|
3
3
|
}
|
|
4
4
|
function isLoad(value) {
|
|
5
|
-
return typeof field(value, 'cacheType') === 'string' &&
|
|
5
|
+
return (typeof field(value, 'cacheType') === 'string' &&
|
|
6
|
+
typeof field(value, 'source') === 'object');
|
|
6
7
|
}
|
|
7
8
|
function isProgress(value) {
|
|
8
|
-
return typeof field(value, 'loaded') === 'number' &&
|
|
9
|
+
return (typeof field(value, 'loaded') === 'number' &&
|
|
10
|
+
typeof field(value, 'total') === 'number');
|
|
9
11
|
}
|
|
10
12
|
function isError(value) {
|
|
11
13
|
return typeof field(value, 'error') === 'string';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"image-view-events.js","sourceRoot":"","sources":["../../src/core/image-view-events.ts"],"names":[],"mappings":"AAQA,SAAS,KAAK,CAAC,KAAc,EAAE,GAAW;IACxC,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,MAAM,CAAC,KAAc;IAC5B,OAAO,OAAO,KAAK,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,QAAQ,
|
|
1
|
+
{"version":3,"file":"image-view-events.js","sourceRoot":"","sources":["../../src/core/image-view-events.ts"],"names":[],"mappings":"AAQA,SAAS,KAAK,CAAC,KAAc,EAAE,GAAW;IACxC,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,MAAM,CAAC,KAAc;IAC5B,OAAO,CACL,OAAO,KAAK,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,QAAQ;QAC7C,OAAO,KAAK,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,QAAQ,CAC3C,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,KAAc;IAChC,OAAO,CACL,OAAO,KAAK,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,QAAQ;QAC1C,OAAO,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,QAAQ,CAC1C,CAAC;AACJ,CAAC;AAED,SAAS,OAAO,CAAC,KAAc;IAC7B,OAAO,OAAO,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,QAAQ,CAAC;AACnD,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,aAAa,CAAC,KAAsB;IAClD,OAAO;QACL,WAAW,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE;QACxC,MAAM,EAAE,CAAC,KAAqB,EAAE,EAAE;YAChC,IAAI,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC;gBAAE,KAAK,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YACjE,KAAK,CAAC,SAAS,EAAE,EAAE,CAAC;QACtB,CAAC;QACD,UAAU,EAAE,CAAC,KAAqB,EAAE,EAAE;YACpC,IAAI,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC;gBAAE,KAAK,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAC3E,CAAC;QACD,OAAO,EAAE,CAAC,KAAqB,EAAE,EAAE;YACjC,IAAI,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC;gBAAE,KAAK,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YACnE,KAAK,CAAC,SAAS,EAAE,EAAE,CAAC;QACtB,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { requireNativeModule, requireNativeViewManager } from 'expo-modules-core';
|
|
1
|
+
import { requireNativeModule, requireNativeViewManager, } from 'expo-modules-core';
|
|
2
2
|
import { el } from '@symbiote-native/components';
|
|
3
3
|
import { defineExpoNativeView, defineExpoViewMethods, getNativeTag, isDevBuild, styleOfProps, } from '@symbiote-native/engine';
|
|
4
4
|
import { IMAGE_MODULE_NAME, SF_SYMBOL_PREFIX } from './constants';
|
|
@@ -53,7 +53,9 @@ function symbolProps(parts, isSfSymbol) {
|
|
|
53
53
|
}
|
|
54
54
|
function sizedStyle(parts, isSfSymbol) {
|
|
55
55
|
const { fontSize, rest } = parts;
|
|
56
|
-
return isSfSymbol && fontSize
|
|
56
|
+
return isSfSymbol && fontSize
|
|
57
|
+
? { width: fontSize, height: fontSize, ...rest }
|
|
58
|
+
: rest;
|
|
57
59
|
}
|
|
58
60
|
function nativeProps(props) {
|
|
59
61
|
const parts = splitImageStyle(styleOfProps(props));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"image-view.js","sourceRoot":"","sources":["../../src/core/image-view.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"image-view.js","sourceRoot":"","sources":["../../src/core/image-view.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"native-module.js","sourceRoot":"","sources":["../../src/core/native-module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAExD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAwChD,MAAM,CAAC,MAAM,SAAS,
|
|
1
|
+
{"version":3,"file":"native-module.js","sourceRoot":"","sources":["../../src/core/native-module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAExD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAwChD,MAAM,CAAC,MAAM,SAAS,GACpB,mBAAmB,CAAqB,iBAAiB,CAAC,CAAC"}
|
|
@@ -58,6 +58,9 @@ export function platformStyle(style) {
|
|
|
58
58
|
}
|
|
59
59
|
/** `backgroundColor` and the border colors in the form native reads */
|
|
60
60
|
export function nativeColorProps(style) {
|
|
61
|
-
return Object.fromEntries(['backgroundColor', ...BORDER_COLOR_KEYS].map(key => [
|
|
61
|
+
return Object.fromEntries(['backgroundColor', ...BORDER_COLOR_KEYS].map(key => [
|
|
62
|
+
key,
|
|
63
|
+
toNativeColor(style[key]),
|
|
64
|
+
]));
|
|
62
65
|
}
|
|
63
66
|
//# sourceMappingURL=native-style.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"native-style.js","sourceRoot":"","sources":["../../src/core/native-style.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAMrE,MAAM,WAAW,GAAG;IAClB,aAAa;IACb,cAAc;IACd,eAAe;IACf,cAAc;CACkC,CAAC;AAEnD,MAAM,iBAAiB,GAAG;IACxB,aAAa;IACb,kBAAkB;IAClB,gBAAgB;IAChB,iBAAiB;IACjB,kBAAkB;IAClB,gBAAgB;IAChB,mBAAmB;CAC6B,CAAC;AAEnD,MAAM,YAAY,GAAG,IAAI,GAAG,CAAU;IACpC,OAAO;IACP,SAAS;IACT,SAAS;IACT,QAAQ;IACR,QAAQ;CACsC,CAAC,CAAC;AAWlD,SAAS,YAAY,CAAC,KAAc;IAClC,OAAO,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,YAAY,CAAC,KAAc;IAClC,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,OAAO,KAAK,KAAK,QAAQ;QACzB,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC,CAC9C,CAAC;AACJ,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,OAAO,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC/D,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,eAAe,CAAC,KAAc;IAC5C,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"native-style.js","sourceRoot":"","sources":["../../src/core/native-style.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAMrE,MAAM,WAAW,GAAG;IAClB,aAAa;IACb,cAAc;IACd,eAAe;IACf,cAAc;CACkC,CAAC;AAEnD,MAAM,iBAAiB,GAAG;IACxB,aAAa;IACb,kBAAkB;IAClB,gBAAgB;IAChB,iBAAiB;IACjB,kBAAkB;IAClB,gBAAgB;IAChB,mBAAmB;CAC6B,CAAC;AAEnD,MAAM,YAAY,GAAG,IAAI,GAAG,CAAU;IACpC,OAAO;IACP,SAAS;IACT,SAAS;IACT,QAAQ;IACR,QAAQ;CACsC,CAAC,CAAC;AAWlD,SAAS,YAAY,CAAC,KAAc;IAClC,OAAO,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,YAAY,CAAC,KAAc;IAClC,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,OAAO,KAAK,KAAK,QAAQ;QACzB,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC,CAC9C,CAAC;AACJ,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,OAAO,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC/D,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,eAAe,CAAC,KAAc;IAC5C,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,GACxD,YAAY,CAAC,KAAK,CAAC,CAAC;IACtB,MAAM,QAAQ,GACZ,OAAO,UAAU,KAAK,QAAQ,IAAI,OAAO,UAAU,KAAK,QAAQ,CAAC;IACnE,OAAO;QACL,UAAU,EAAE,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;QAC7D,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;QAC7C,QAAQ,EAAE,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;QAC7D,KAAK;QACL,IAAI;KACL,CAAC;AACJ,CAAC;AAED,SAAS,OAAO,CAAC,GAAc,EAAE,IAAuB;IACtD,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAC3D,CAAC;AACJ,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,aAAa,CAAC,KAAgB;IAC5C,OAAO,QAAQ,CAAC,MAAM,CAAC;QACrB,OAAO,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,GAAG,WAAW,EAAE,iBAAiB,CAAC,CAAC;QAC5D,OAAO,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,WAAW,CAAC,CAAC;KACvC,CAAC,CAAC;AACL,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,gBAAgB,CAAC,KAAgB;IAC/C,OAAO,MAAM,CAAC,WAAW,CACvB,CAAC,iBAAiB,EAAE,GAAG,iBAAiB,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;QACnD,GAAG;QACH,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;KAC1B,CAAC,CACH,CAAC;AACJ,CAAC"}
|
package/build-ngc/core/props.js
CHANGED
|
@@ -72,7 +72,7 @@ export function resolveSfEffect(sfEffect) {
|
|
|
72
72
|
return null;
|
|
73
73
|
}
|
|
74
74
|
const effects = Array.isArray(sfEffect) ? sfEffect : [sfEffect];
|
|
75
|
-
return effects.map(item =>
|
|
75
|
+
return effects.map(item => typeof item === 'string' ? { effect: item } : item);
|
|
76
76
|
}
|
|
77
77
|
/** A number is the duration of a cross dissolve */
|
|
78
78
|
export function resolveTransition(transition, fadeDuration) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"props.js","sourceRoot":"","sources":["../../src/core/props.ts"],"names":[],"mappings":"AAWA,MAAM,MAAM,GAAgC,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AAExE,MAAM,mBAAmB,
|
|
1
|
+
{"version":3,"file":"props.js","sourceRoot":"","sources":["../../src/core/props.ts"],"names":[],"mappings":"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"}
|
|
@@ -28,7 +28,9 @@ export function resolveSource(source) {
|
|
|
28
28
|
return resolveThumbhashString(source);
|
|
29
29
|
}
|
|
30
30
|
if (source.startsWith(SF_SYMBOL_PREFIX)) {
|
|
31
|
-
return {
|
|
31
|
+
return {
|
|
32
|
+
uri: `${SF_SYMBOL_PREFIX}/${source.slice(SF_SYMBOL_PREFIX.length)}`,
|
|
33
|
+
};
|
|
32
34
|
}
|
|
33
35
|
return { uri: source };
|
|
34
36
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sources.js","sourceRoot":"","sources":["../../src/core/sources.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAG/E,MAAM,gBAAgB,
|
|
1
|
+
{"version":3,"file":"sources.js","sourceRoot":"","sources":["../../src/core/sources.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@symbiote-native/image",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.1.0",
|
|
4
4
|
"description": "expo-image wrapped for SymbioteNative — one framework-agnostic core, built once and reachable from the React, Vue, Svelte, Solid, and Angular adapters. The image view with caching, placeholders and SF Symbols, plus the image cache and hash functions.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -68,7 +68,7 @@
|
|
|
68
68
|
"expo-image": "57.0.5",
|
|
69
69
|
"expo-modules-core": "57.0.20",
|
|
70
70
|
"sf-symbols-typescript": "^2.0.0",
|
|
71
|
-
"@symbiote-native/components": "3.
|
|
71
|
+
"@symbiote-native/components": "3.2.0"
|
|
72
72
|
},
|
|
73
73
|
"peerDependencies": {
|
|
74
74
|
"@angular/core": ">=20",
|
|
@@ -78,12 +78,12 @@
|
|
|
78
78
|
"solid-js": ">=1.9.0",
|
|
79
79
|
"svelte": ">=5.56.0",
|
|
80
80
|
"vue": ">=3.5.0",
|
|
81
|
-
"@symbiote-native/angular": "^3.
|
|
82
|
-
"@symbiote-native/engine": "^1.
|
|
83
|
-
"@symbiote-native/
|
|
84
|
-
"@symbiote-native/
|
|
85
|
-
"@symbiote-native/svelte": "^3.
|
|
86
|
-
"@symbiote-native/vue": "^3.
|
|
81
|
+
"@symbiote-native/angular": "^3.3.0",
|
|
82
|
+
"@symbiote-native/engine": "^1.6.0",
|
|
83
|
+
"@symbiote-native/react": "^3.3.0",
|
|
84
|
+
"@symbiote-native/solid": "^3.2.0",
|
|
85
|
+
"@symbiote-native/svelte": "^3.2.0",
|
|
86
|
+
"@symbiote-native/vue": "^3.3.0"
|
|
87
87
|
},
|
|
88
88
|
"peerDependenciesMeta": {
|
|
89
89
|
"@symbiote-native/angular": {
|
|
@@ -131,13 +131,13 @@
|
|
|
131
131
|
"solid-js": "^1.9.14",
|
|
132
132
|
"svelte": "^5.56.0",
|
|
133
133
|
"typescript": "~6.0.0",
|
|
134
|
-
"@symbiote-native/angular": "3.
|
|
135
|
-
"@symbiote-native/
|
|
136
|
-
"@symbiote-native/
|
|
137
|
-
"@symbiote-native/
|
|
138
|
-
"@symbiote-native/
|
|
139
|
-
"@symbiote-native/
|
|
140
|
-
"@symbiote-native/
|
|
134
|
+
"@symbiote-native/angular": "3.3.0",
|
|
135
|
+
"@symbiote-native/engine": "1.6.0",
|
|
136
|
+
"@symbiote-native/react": "3.3.0",
|
|
137
|
+
"@symbiote-native/solid": "3.2.0",
|
|
138
|
+
"@symbiote-native/svelte": "3.2.0",
|
|
139
|
+
"@symbiote-native/test-utils": "0.4.7",
|
|
140
|
+
"@symbiote-native/vue": "3.3.0"
|
|
141
141
|
},
|
|
142
142
|
"scripts": {
|
|
143
143
|
"typecheck": "tsc --build",
|
|
@@ -43,8 +43,9 @@ const IMAGE_INPUTS = [
|
|
|
43
43
|
] as const;
|
|
44
44
|
|
|
45
45
|
// Types the inputs for the template, the decorators that would do it are replaced by `inputs`
|
|
46
|
-
export interface ExpoImage
|
|
47
|
-
|
|
46
|
+
export interface ExpoImage extends Partial<
|
|
47
|
+
Pick<IImageViewProps, (typeof IMAGE_INPUTS)[number]>
|
|
48
|
+
> {}
|
|
48
49
|
|
|
49
50
|
/** Angular twin of `expo-image`'s `Image`, `Image` itself is a primitive tag of the adapter */
|
|
50
51
|
@Component({
|
|
@@ -43,8 +43,9 @@ const IMAGE_BACKGROUND_INPUTS = [
|
|
|
43
43
|
'imageStyle',
|
|
44
44
|
] as const;
|
|
45
45
|
|
|
46
|
-
export interface ExpoImageBackground
|
|
47
|
-
|
|
46
|
+
export interface ExpoImageBackground extends Partial<
|
|
47
|
+
Pick<IImageBackgroundProps, (typeof IMAGE_BACKGROUND_INPUTS)[number]>
|
|
48
|
+
> {}
|
|
48
49
|
|
|
49
50
|
/** Angular twin of `expo-image`'s `ImageBackground`, the content paints over the image */
|
|
50
51
|
@Component({
|
|
@@ -54,7 +55,9 @@ export interface ExpoImageBackground
|
|
|
54
55
|
inputs: [...IMAGE_BACKGROUND_INPUTS],
|
|
55
56
|
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
56
57
|
template: `@if (descriptor; as node) {
|
|
57
|
-
<symbiote-descriptor-host [node]="node"
|
|
58
|
+
<symbiote-descriptor-host [node]="node"
|
|
59
|
+
><ng-content
|
|
60
|
+
/></symbiote-descriptor-host>
|
|
58
61
|
}`,
|
|
59
62
|
})
|
|
60
63
|
export class ExpoImageBackground extends NativeViewBase {
|
package/src/core/hash-strings.ts
CHANGED
|
@@ -11,7 +11,9 @@ function hashToUri(type: IImageHashType, hash: string): string {
|
|
|
11
11
|
|
|
12
12
|
/** `blurhash:/<hash>/<width>/<height>` or `<hash>/<width>/<height>` */
|
|
13
13
|
export function resolveBlurhashString(str: string): IImageSource {
|
|
14
|
-
const [hash = '', width = '', height = ''] = str
|
|
14
|
+
const [hash = '', width = '', height = ''] = str
|
|
15
|
+
.replace(/^blurhash:\//, '')
|
|
16
|
+
.split('/');
|
|
15
17
|
return {
|
|
16
18
|
uri: hashToUri('blurhash', hash),
|
|
17
19
|
width: parseInt(width, 10) || DEFAULT_HASH_SIZE,
|
package/src/core/image-api.ts
CHANGED
|
@@ -11,7 +11,8 @@ import type {
|
|
|
11
11
|
|
|
12
12
|
const DEFAULT_CACHE_POLICY = 'memory-disk';
|
|
13
13
|
|
|
14
|
-
type IPrefetchOptions =
|
|
14
|
+
type IPrefetchOptions =
|
|
15
|
+
IImagePrefetchOptions['cachePolicy'] | IImagePrefetchOptions;
|
|
15
16
|
|
|
16
17
|
/** The caching policy as a string, or with request headers as an object */
|
|
17
18
|
export function prefetchImages(
|
|
@@ -20,12 +21,18 @@ export function prefetchImages(
|
|
|
20
21
|
): Promise<boolean> {
|
|
21
22
|
const { cachePolicy = DEFAULT_CACHE_POLICY, headers } =
|
|
22
23
|
typeof options === 'string' ? { cachePolicy: options } : (options ?? {});
|
|
23
|
-
return expoImage.prefetch(
|
|
24
|
+
return expoImage.prefetch(
|
|
25
|
+
Array.isArray(urls) ? urls : [urls],
|
|
26
|
+
cachePolicy,
|
|
27
|
+
headers,
|
|
28
|
+
);
|
|
24
29
|
}
|
|
25
30
|
|
|
26
|
-
export const clearMemoryCache = (): Promise<boolean> =>
|
|
31
|
+
export const clearMemoryCache = (): Promise<boolean> =>
|
|
32
|
+
expoImage.clearMemoryCache();
|
|
27
33
|
|
|
28
|
-
export const clearDiskCache = (): Promise<boolean> =>
|
|
34
|
+
export const clearDiskCache = (): Promise<boolean> =>
|
|
35
|
+
expoImage.clearDiskCache();
|
|
29
36
|
|
|
30
37
|
export const getCachePathAsync = (cacheKey: string): Promise<string | null> =>
|
|
31
38
|
expoImage.getCachePathAsync(cacheKey);
|
|
@@ -35,8 +42,9 @@ export const writeToCacheAsync = (
|
|
|
35
42
|
cacheKey: string,
|
|
36
43
|
): Promise<void> => expoImage.writeToCacheAsync(source, cacheKey);
|
|
37
44
|
|
|
38
|
-
export const readFromCacheAsync = (
|
|
39
|
-
|
|
45
|
+
export const readFromCacheAsync = (
|
|
46
|
+
cacheKey: string,
|
|
47
|
+
): Promise<ImageRef | null> => expoImage.readFromCacheAsync(cacheKey);
|
|
40
48
|
|
|
41
49
|
export const configureCache = (config: IImageCacheConfig): void =>
|
|
42
50
|
expoImage.configureCache(config);
|
|
@@ -44,10 +52,12 @@ export const configureCache = (config: IImageCacheConfig): void =>
|
|
|
44
52
|
export const generateBlurhashAsync = (
|
|
45
53
|
source: string | ImageRef,
|
|
46
54
|
numberOfComponents: [number, number] | { width: number; height: number },
|
|
47
|
-
): Promise<string | null> =>
|
|
55
|
+
): Promise<string | null> =>
|
|
56
|
+
expoImage.generateBlurhashAsync(source, numberOfComponents);
|
|
48
57
|
|
|
49
|
-
export const generateThumbhashAsync = (
|
|
50
|
-
|
|
58
|
+
export const generateThumbhashAsync = (
|
|
59
|
+
source: string | ImageRef,
|
|
60
|
+
): Promise<string> => expoImage.generateThumbhashAsync(source);
|
|
51
61
|
|
|
52
62
|
/** Loads the image into a native `ImageRef`, the caller releases it */
|
|
53
63
|
export async function loadImageAsync(
|
|
@@ -12,7 +12,10 @@ export type IImageBackgroundProps = IImageViewProps & {
|
|
|
12
12
|
};
|
|
13
13
|
|
|
14
14
|
type IClassKey = 'className' | 'class';
|
|
15
|
-
const CLASS_KEYS: ReadonlySet<string> = new Set<IClassKey>([
|
|
15
|
+
const CLASS_KEYS: ReadonlySet<string> = new Set<IClassKey>([
|
|
16
|
+
'className',
|
|
17
|
+
'class',
|
|
18
|
+
]);
|
|
16
19
|
|
|
17
20
|
function isClassEntry([key]: [string, unknown]): boolean {
|
|
18
21
|
return CLASS_KEYS.has(key);
|
|
@@ -30,7 +33,9 @@ const ABSOLUTE_FILL = {
|
|
|
30
33
|
const backgroundImage = createImageView(() => null);
|
|
31
34
|
|
|
32
35
|
/** A view with an image filling it, the children of the app go after this descriptor */
|
|
33
|
-
export function renderImageBackground(
|
|
36
|
+
export function renderImageBackground(
|
|
37
|
+
props: IImageBackgroundProps,
|
|
38
|
+
): IDescriptor {
|
|
34
39
|
const { style, imageStyle, ...rest } = props;
|
|
35
40
|
const entries = Object.entries(rest);
|
|
36
41
|
const image = backgroundImage.render({
|
package/src/core/image-loader.ts
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import type { IImageLoadOptions, IImageSource } from './types';
|
|
2
2
|
|
|
3
3
|
export type IImageLoaderConfig<TImage extends { release(): void }> = {
|
|
4
|
-
load(
|
|
4
|
+
load(
|
|
5
|
+
source: IImageSource | string | number,
|
|
6
|
+
options: IImageLoadOptions,
|
|
7
|
+
): Promise<TImage>;
|
|
5
8
|
/** Called with each image that finished loading */
|
|
6
9
|
onImage(image: TImage): void;
|
|
7
10
|
/** Read at the time of a failure, so the latest callback wins */
|
|
@@ -27,7 +30,11 @@ export function createImageLoader<TImage extends { release(): void }>(
|
|
|
27
30
|
loaded = null;
|
|
28
31
|
}
|
|
29
32
|
|
|
30
|
-
function fail(
|
|
33
|
+
function fail(
|
|
34
|
+
source: IImageSource | string | number,
|
|
35
|
+
error: unknown,
|
|
36
|
+
retry: () => void,
|
|
37
|
+
): void {
|
|
31
38
|
const { onError } = config.getOptions();
|
|
32
39
|
if (onError) {
|
|
33
40
|
onError(error instanceof Error ? error : new Error(String(error)), retry);
|
|
@@ -11,11 +11,17 @@ function field(value: unknown, key: string): unknown {
|
|
|
11
11
|
}
|
|
12
12
|
|
|
13
13
|
function isLoad(value: unknown): value is IImageLoadEventData {
|
|
14
|
-
return
|
|
14
|
+
return (
|
|
15
|
+
typeof field(value, 'cacheType') === 'string' &&
|
|
16
|
+
typeof field(value, 'source') === 'object'
|
|
17
|
+
);
|
|
15
18
|
}
|
|
16
19
|
|
|
17
20
|
function isProgress(value: unknown): value is IImageProgressEventData {
|
|
18
|
-
return
|
|
21
|
+
return (
|
|
22
|
+
typeof field(value, 'loaded') === 'number' &&
|
|
23
|
+
typeof field(value, 'total') === 'number'
|
|
24
|
+
);
|
|
19
25
|
}
|
|
20
26
|
|
|
21
27
|
function isError(value: unknown): value is IImageErrorEventData {
|
package/src/core/image-view.ts
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
requireNativeModule,
|
|
3
|
+
requireNativeViewManager,
|
|
4
|
+
} from 'expo-modules-core';
|
|
2
5
|
import { el } from '@symbiote-native/components';
|
|
3
6
|
import type { IDescriptor } from '@symbiote-native/components';
|
|
4
7
|
import {
|
|
@@ -29,9 +32,15 @@ import { resolveSources } from './sources';
|
|
|
29
32
|
import type { IImageViewHandle, IImageViewProps } from './types';
|
|
30
33
|
|
|
31
34
|
// Registered on render: a barrel side effect is lost in a release build
|
|
32
|
-
const imageView = defineExpoNativeView(
|
|
35
|
+
const imageView = defineExpoNativeView(
|
|
36
|
+
requireNativeViewManager,
|
|
37
|
+
IMAGE_MODULE_NAME,
|
|
38
|
+
);
|
|
33
39
|
|
|
34
|
-
const callViewFunction = defineExpoViewMethods(
|
|
40
|
+
const callViewFunction = defineExpoViewMethods(
|
|
41
|
+
requireNativeModule,
|
|
42
|
+
IMAGE_MODULE_NAME,
|
|
43
|
+
);
|
|
35
44
|
|
|
36
45
|
export const imageViewName = imageView.name;
|
|
37
46
|
|
|
@@ -70,15 +79,21 @@ function hasSfSymbol(sources: ReturnType<typeof resolveSources>): boolean {
|
|
|
70
79
|
|
|
71
80
|
function withoutOwnProps(props: IImageViewProps): Record<string, unknown> {
|
|
72
81
|
const own: readonly string[] = OWN_PROPS;
|
|
73
|
-
return Object.fromEntries(
|
|
82
|
+
return Object.fromEntries(
|
|
83
|
+
Object.entries(props).filter(([key]) => !own.includes(key)),
|
|
84
|
+
);
|
|
74
85
|
}
|
|
75
86
|
|
|
76
87
|
function placeholderOf(props: IImageViewProps) {
|
|
77
88
|
const { defaultSource, loadingIndicatorSource } = props;
|
|
78
89
|
if (defaultSource || loadingIndicatorSource) {
|
|
79
|
-
warnOnce(
|
|
90
|
+
warnOnce(
|
|
91
|
+
'`defaultSource` and `loadingIndicatorSource` props are deprecated, use `placeholder`',
|
|
92
|
+
);
|
|
80
93
|
}
|
|
81
|
-
return resolveSources(
|
|
94
|
+
return resolveSources(
|
|
95
|
+
props.placeholder ?? defaultSource ?? loadingIndicatorSource,
|
|
96
|
+
);
|
|
82
97
|
}
|
|
83
98
|
|
|
84
99
|
// For an SF Symbol `fontSize` sizes both the symbol and its container
|
|
@@ -93,7 +108,9 @@ function symbolProps(parts: IImageStyleParts, isSfSymbol: boolean) {
|
|
|
93
108
|
|
|
94
109
|
function sizedStyle(parts: IImageStyleParts, isSfSymbol: boolean) {
|
|
95
110
|
const { fontSize, rest } = parts;
|
|
96
|
-
return isSfSymbol && fontSize
|
|
111
|
+
return isSfSymbol && fontSize
|
|
112
|
+
? { width: fontSize, height: fontSize, ...rest }
|
|
113
|
+
: rest;
|
|
97
114
|
}
|
|
98
115
|
|
|
99
116
|
function nativeProps(props: IImageViewProps): Record<string, unknown> {
|
package/src/core/native-style.ts
CHANGED
|
@@ -58,8 +58,10 @@ export function toNativeColor(value: unknown): unknown {
|
|
|
58
58
|
|
|
59
59
|
/** `resizeMode` and the SF Symbol keys are props to native, not style */
|
|
60
60
|
export function splitImageStyle(style: unknown): IImageStyleParts {
|
|
61
|
-
const { resizeMode, fontWeight, fontSize, color, ...rest } =
|
|
62
|
-
|
|
61
|
+
const { resizeMode, fontWeight, fontSize, color, ...rest } =
|
|
62
|
+
flattenStyle(style);
|
|
63
|
+
const isWeight =
|
|
64
|
+
typeof fontWeight === 'string' || typeof fontWeight === 'number';
|
|
63
65
|
return {
|
|
64
66
|
resizeMode: isResizeMode(resizeMode) ? resizeMode : undefined,
|
|
65
67
|
fontWeight: isWeight ? fontWeight : undefined,
|
|
@@ -70,7 +72,9 @@ export function splitImageStyle(style: unknown): IImageStyleParts {
|
|
|
70
72
|
}
|
|
71
73
|
|
|
72
74
|
function without(bag: IStyleBag, keys: readonly string[]): IStyleBag {
|
|
73
|
-
return Object.fromEntries(
|
|
75
|
+
return Object.fromEntries(
|
|
76
|
+
Object.entries(bag).filter(([key]) => !keys.includes(key)),
|
|
77
|
+
);
|
|
74
78
|
}
|
|
75
79
|
|
|
76
80
|
/** Android shadows by `elevation` and paints the background itself, iOS by `shadow*` */
|
|
@@ -84,6 +88,9 @@ export function platformStyle(style: IStyleBag): IStyleBag {
|
|
|
84
88
|
/** `backgroundColor` and the border colors in the form native reads */
|
|
85
89
|
export function nativeColorProps(style: IStyleBag): IStyleBag {
|
|
86
90
|
return Object.fromEntries(
|
|
87
|
-
['backgroundColor', ...BORDER_COLOR_KEYS].map(key => [
|
|
91
|
+
['backgroundColor', ...BORDER_COLOR_KEYS].map(key => [
|
|
92
|
+
key,
|
|
93
|
+
toNativeColor(style[key]),
|
|
94
|
+
]),
|
|
88
95
|
);
|
|
89
96
|
}
|
package/src/core/props.ts
CHANGED
|
@@ -11,7 +11,10 @@ import type {
|
|
|
11
11
|
|
|
12
12
|
const CENTER: IImageContentPositionObject = { top: '50%', left: '50%' };
|
|
13
13
|
|
|
14
|
-
const POSITION_BY_KEYWORD: Record<
|
|
14
|
+
const POSITION_BY_KEYWORD: Record<
|
|
15
|
+
IImageContentPositionString,
|
|
16
|
+
IImageContentPositionObject
|
|
17
|
+
> = {
|
|
15
18
|
center: CENTER,
|
|
16
19
|
top: { top: 0, left: '50%' },
|
|
17
20
|
right: { top: '50%', right: 0 },
|
|
@@ -99,7 +102,9 @@ export function resolveSfEffect(
|
|
|
99
102
|
return null;
|
|
100
103
|
}
|
|
101
104
|
const effects = Array.isArray(sfEffect) ? sfEffect : [sfEffect];
|
|
102
|
-
return effects.map(item =>
|
|
105
|
+
return effects.map(item =>
|
|
106
|
+
typeof item === 'string' ? { effect: item } : item,
|
|
107
|
+
);
|
|
103
108
|
}
|
|
104
109
|
|
|
105
110
|
/** A number is the duration of a cross dissolve */
|
package/src/core/sources.ts
CHANGED
|
@@ -4,7 +4,8 @@ import { SF_SYMBOL_PREFIX } from './constants';
|
|
|
4
4
|
import { resolveBlurhashString, resolveThumbhashString } from './hash-strings';
|
|
5
5
|
import type { IImageSource, IImageSources } from './types';
|
|
6
6
|
|
|
7
|
-
const BLURHASH_PATTERN =
|
|
7
|
+
const BLURHASH_PATTERN =
|
|
8
|
+
/^(blurhash:\/)+[\w#$%*+,\-.:;=?@[\]^_{}|~]+(\/[\d.]+)*$/;
|
|
8
9
|
const THUMBHASH_PREFIX = 'thumbhash:/';
|
|
9
10
|
|
|
10
11
|
type IImageSourceInput = IImageSource | string | number | null | undefined;
|
|
@@ -37,7 +38,9 @@ export function resolveSource(source: IImageSourceInput): IImageSource | null {
|
|
|
37
38
|
return resolveThumbhashString(source);
|
|
38
39
|
}
|
|
39
40
|
if (source.startsWith(SF_SYMBOL_PREFIX)) {
|
|
40
|
-
return {
|
|
41
|
+
return {
|
|
42
|
+
uri: `${SF_SYMBOL_PREFIX}/${source.slice(SF_SYMBOL_PREFIX.length)}`,
|
|
43
|
+
};
|
|
41
44
|
}
|
|
42
45
|
return { uri: source };
|
|
43
46
|
}
|
|
@@ -59,7 +62,9 @@ function isPresent(source: IImageSource | null): source is IImageSource {
|
|
|
59
62
|
}
|
|
60
63
|
|
|
61
64
|
/** The shape the native view takes: a list of sources or a shared object id */
|
|
62
|
-
export function resolveSources(
|
|
65
|
+
export function resolveSources(
|
|
66
|
+
sources: IImageSources | undefined,
|
|
67
|
+
): IImageSource[] | number {
|
|
63
68
|
if (Array.isArray(sources)) {
|
|
64
69
|
return sources.map(resolveSource).filter(isPresent);
|
|
65
70
|
}
|
package/src/core/types.ts
CHANGED
|
@@ -32,18 +32,16 @@ export type IImageSource = {
|
|
|
32
32
|
isAnimated?: boolean;
|
|
33
33
|
};
|
|
34
34
|
|
|
35
|
-
export type IImageContentFit =
|
|
35
|
+
export type IImageContentFit =
|
|
36
|
+
'cover' | 'contain' | 'fill' | 'none' | 'scale-down';
|
|
36
37
|
|
|
37
38
|
export type IImageDecodeFormat = 'argb' | 'rgb';
|
|
38
39
|
|
|
39
|
-
export type IImageResizeMode =
|
|
40
|
+
export type IImageResizeMode =
|
|
41
|
+
'cover' | 'contain' | 'stretch' | 'repeat' | 'center';
|
|
40
42
|
|
|
41
43
|
export type IImageContentPositionValue =
|
|
42
|
-
| number
|
|
43
|
-
| string
|
|
44
|
-
| `${number}%`
|
|
45
|
-
| `${number}`
|
|
46
|
-
| 'center';
|
|
44
|
+
number | string | `${number}%` | `${number}` | 'center';
|
|
47
45
|
|
|
48
46
|
export type IImageContentPositionString =
|
|
49
47
|
| 'center'
|
|
@@ -72,8 +70,7 @@ export type IImageContentPositionObject =
|
|
|
72
70
|
| { bottom?: IImageContentPositionValue; left?: IImageContentPositionValue };
|
|
73
71
|
|
|
74
72
|
export type IImageContentPosition =
|
|
75
|
-
|
|
|
76
|
-
| IImageContentPositionString;
|
|
73
|
+
IImageContentPositionObject | IImageContentPositionString;
|
|
77
74
|
|
|
78
75
|
export type IImageTransition = {
|
|
79
76
|
/** In milliseconds */
|
|
@@ -8,7 +8,9 @@ export type IImageBackgroundReactProps = IImageBackgroundProps & {
|
|
|
8
8
|
};
|
|
9
9
|
|
|
10
10
|
/** React twin of `expo-image`'s `ImageBackground`, children paint over the image */
|
|
11
|
-
export function ImageBackground(
|
|
11
|
+
export function ImageBackground(
|
|
12
|
+
props: IImageBackgroundReactProps,
|
|
13
|
+
): ReactElement {
|
|
12
14
|
const { children, ...rest } = props;
|
|
13
15
|
return descriptorToReactWithChildren(renderImageBackground(rest), children);
|
|
14
16
|
}
|
package/src/react/image.ts
CHANGED
|
@@ -9,6 +9,9 @@ export type IImageReactProps = IImageViewProps & {
|
|
|
9
9
|
};
|
|
10
10
|
|
|
11
11
|
/** React twin of `expo-image`'s `Image` */
|
|
12
|
-
export function Image({
|
|
12
|
+
export function Image({
|
|
13
|
+
ref,
|
|
14
|
+
...props
|
|
15
|
+
}: IImageReactProps): ReactElement | null {
|
|
13
16
|
return useNativeViewController(ref, createImageView, props);
|
|
14
17
|
}
|
|
@@ -8,6 +8,5 @@ export type IImageBackgroundSolidProps = IImageBackgroundProps & {
|
|
|
8
8
|
};
|
|
9
9
|
|
|
10
10
|
/** Solid twin of `expo-image`'s `ImageBackground`, children paint over the image */
|
|
11
|
-
export const ImageBackground =
|
|
12
|
-
renderImageBackground
|
|
13
|
-
);
|
|
11
|
+
export const ImageBackground =
|
|
12
|
+
defineDescriptorComponent<IImageBackgroundSolidProps>(renderImageBackground);
|
package/src/solid/image.ts
CHANGED
|
@@ -3,6 +3,7 @@ import { createImageView } from '../core';
|
|
|
3
3
|
import type { IImageViewHandle, IImageViewProps } from '../core';
|
|
4
4
|
|
|
5
5
|
/** Solid twin of `expo-image`'s `Image`, `ref` gets the handle of the view */
|
|
6
|
-
export const Image = defineNativeViewComponent<
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
export const Image = defineNativeViewComponent<
|
|
7
|
+
IImageViewHandle,
|
|
8
|
+
IImageViewProps
|
|
9
|
+
>(createImageView);
|
package/src/vue/use-image.ts
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import { shallowRef, toValue, watch } from '@vue/runtime-core';
|
|
2
|
-
import type {
|
|
2
|
+
import type {
|
|
3
|
+
MaybeRefOrGetter,
|
|
4
|
+
ShallowRef,
|
|
5
|
+
WatchSource,
|
|
6
|
+
} from '@vue/runtime-core';
|
|
3
7
|
import { createImageRefLoader, resolveSource } from '../core';
|
|
4
8
|
import type { IImageLoadOptions, IImageSource, ImageRef } from '../core';
|
|
5
9
|
|