@symbiote-native/blur 0.0.0-stage → 0.0.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.
Files changed (84) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +51 -2
  3. package/build/angular/blur-target-view/index.android.d.ts +7 -0
  4. package/build/angular/blur-target-view/index.android.js +84 -0
  5. package/build/angular/blur-target-view/index.d.ts +1 -0
  6. package/build/angular/blur-target-view/index.ios.d.ts +6 -0
  7. package/build/angular/blur-target-view/index.ios.js +76 -0
  8. package/build/angular/blur-target-view/index.js +2 -0
  9. package/build/angular/blur-target-view/shared.d.ts +9 -0
  10. package/build/angular/blur-target-view/shared.js +64 -0
  11. package/build/angular/blur-view.d.ts +23 -0
  12. package/build/angular/blur-view.js +136 -0
  13. package/build/angular/index.d.ts +3 -0
  14. package/build/angular/index.js +4 -0
  15. package/build/core/blur.d.ts +53 -0
  16. package/build/core/blur.js +104 -0
  17. package/build/core/index.d.ts +1 -0
  18. package/build/core/index.js +1 -0
  19. package/build/react/blur.d.ts +18 -0
  20. package/build/react/blur.js +18 -0
  21. package/build/react/index.d.ts +3 -0
  22. package/build/react/index.js +3 -0
  23. package/build/solid/blur.d.ts +19 -0
  24. package/build/solid/blur.js +17 -0
  25. package/build/solid/index.d.ts +3 -0
  26. package/build/solid/index.js +3 -0
  27. package/build/svelte/blur-props.d.ts +13 -0
  28. package/build/svelte/blur-props.js +1 -0
  29. package/build/svelte/blur-target-view.svelte +14 -0
  30. package/build/svelte/blur-target-view.svelte.d.ts +4 -0
  31. package/build/svelte/blur-view.svelte +21 -0
  32. package/build/svelte/blur-view.svelte.d.ts +4 -0
  33. package/build/svelte/index.d.ts +4 -0
  34. package/build/svelte/index.js +4 -0
  35. package/build/vue/blur.d.ts +12 -0
  36. package/build/vue/blur.js +50 -0
  37. package/build/vue/index.d.ts +3 -0
  38. package/build/vue/index.js +3 -0
  39. package/build-ngc/angular/blur-target-view/index.android.d.ts +10 -0
  40. package/build-ngc/angular/blur-target-view/index.android.js +40 -0
  41. package/build-ngc/angular/blur-target-view/index.android.js.map +1 -0
  42. package/build-ngc/angular/blur-target-view/index.d.ts +1 -0
  43. package/build-ngc/angular/blur-target-view/index.ios.d.ts +9 -0
  44. package/build-ngc/angular/blur-target-view/index.ios.js +27 -0
  45. package/build-ngc/angular/blur-target-view/index.ios.js.map +1 -0
  46. package/build-ngc/angular/blur-target-view/index.js +3 -0
  47. package/build-ngc/angular/blur-target-view/index.js.map +1 -0
  48. package/build-ngc/angular/blur-target-view/shared.d.ts +12 -0
  49. package/build-ngc/angular/blur-target-view/shared.js +20 -0
  50. package/build-ngc/angular/blur-target-view/shared.js.map +1 -0
  51. package/build-ngc/angular/blur-view.d.ts +26 -0
  52. package/build-ngc/angular/blur-view.js +77 -0
  53. package/build-ngc/angular/blur-view.js.map +1 -0
  54. package/build-ngc/angular/index.d.ts +3 -0
  55. package/build-ngc/angular/index.js +5 -0
  56. package/build-ngc/angular/index.js.map +1 -0
  57. package/build-ngc/core/blur.d.ts +53 -0
  58. package/build-ngc/core/blur.js +105 -0
  59. package/build-ngc/core/blur.js.map +1 -0
  60. package/build-ngc/core/index.d.ts +1 -0
  61. package/build-ngc/core/index.js +2 -0
  62. package/build-ngc/core/index.js.map +1 -0
  63. package/native-link.json +12 -0
  64. package/package.json +145 -3
  65. package/src/angular/blur-target-view/index.android.ts +39 -0
  66. package/src/angular/blur-target-view/index.ios.ts +25 -0
  67. package/src/angular/blur-target-view/index.ts +2 -0
  68. package/src/angular/blur-target-view/shared.ts +21 -0
  69. package/src/angular/blur-view.ts +85 -0
  70. package/src/angular/index.ts +13 -0
  71. package/src/core/blur.ts +210 -0
  72. package/src/core/index.ts +15 -0
  73. package/src/react/blur.ts +46 -0
  74. package/src/react/index.ts +14 -0
  75. package/src/solid/blur.ts +54 -0
  76. package/src/solid/index.ts +14 -0
  77. package/src/svelte/blur-props.ts +18 -0
  78. package/src/svelte/blur-target-view.svelte +14 -0
  79. package/src/svelte/blur-view.svelte +21 -0
  80. package/src/svelte/index.ts +15 -0
  81. package/src/svelte/svelte-ambient.d.ts +6 -0
  82. package/src/svelte/svelte-compile.test-helper.ts +6 -0
  83. package/src/vue/blur.ts +82 -0
  84. package/src/vue/index.ts +14 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blur-view.js","sourceRoot":"","sources":["../../src/angular/blur-view.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,EACvB,SAAS,EACT,KAAK,GAKN,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,cAAc,EACd,cAAc,EACd,UAAU,GACX,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;;AAGzE,2FAA2F;AAU3F,MAAM,OAAO,QACX,SAAQ,cAAc;IAGb,IAAI,CAA0B;IAC9B,SAAS,CAA+B;IACxC,mBAAmB,CAAyC;IAC5D,sBAAsB,CAA4C;IAClE,UAAU,CAAgC;IACnD,4EAA4E;IACnE,UAAU,CAAW;IAEF,SAAS,GAAG;QACtC,MAAM;QACN,WAAW;QACX,qBAAqB;QACrB,wBAAwB;QACxB,YAAY;KACkC,CAAC;IAEzC,YAAY,CAAqB;IACjC,WAAW,GAAG,GAAS,EAAE,GAAE,CAAC,CAAC;IAC7B,WAAW,GAAG,KAAK,CAAC;IAET,UAAU,CAAC,KAAa;QACzC,OAAO,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IAClD,CAAC;IAED,kFAAkF;IAClF,eAAe;QACb,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,aAAa,CACX,MAAM,CAAC,WAAW,CAChB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAC5D,EACD,IAAI,CAAC,UAAU,KAAK,SAAS,CAC9B,CAAC;IACJ,CAAC;IAEQ,WAAW,CAAC,OAAsB;QACzC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAC3B,IAAI,IAAI,CAAC,WAAW,IAAI,YAAY,IAAI,OAAO;YAAE,IAAI,CAAC,WAAW,EAAE,CAAC;IACtE,CAAC;IAEkB,WAAW;QAC5B,IAAI,CAAC,WAAW,EAAE,CAAC;IACrB,CAAC;IAEO,WAAW;QACjB,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,IAAI,CAAC,WAAW,GAAG,eAAe,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC,EAAE;YACnE,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;YACvB,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE,CAAC;QACrC,CAAC,CAAC,CAAC;IACL,CAAC;uGAvDU,QAAQ;2FAAR,QAAQ,oTAJT;;IAER,4DAJQ,cAAc;;2FAMb,QAAQ;kBATpB,SAAS;mBAAC;oBACT,QAAQ,EAAE,UAAU;oBACpB,UAAU,EAAE,IAAI;oBAChB,OAAO,EAAE,CAAC,cAAc,CAAC;oBACzB,eAAe,EAAE,uBAAuB,CAAC,MAAM;oBAC/C,QAAQ,EAAE;;IAER;iBACH;;sBAKE,KAAK;;sBACL,KAAK;;sBACL,KAAK;;sBACL,KAAK;;sBACL,KAAK;;sBAEL,KAAK"}
@@ -0,0 +1,3 @@
1
+ export { BlurView } from './blur-view';
2
+ export { BlurTargetView } from './blur-target-view';
3
+ export { BLUR_MODULE_NAME, blurTargetViewName, blurViewName, type IBlurMethod, type IBlurTint, type IBlurViewProps, type IBlurTargetViewProps, } from '../core';
@@ -0,0 +1,5 @@
1
+ // @symbiote-native/blur/angular: компоненты `BlurView` и `BlurTargetView` поверх общего ядра
2
+ export { BlurView } from './blur-view';
3
+ export { BlurTargetView } from './blur-target-view';
4
+ export { BLUR_MODULE_NAME, blurTargetViewName, blurViewName, } from '../core';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/angular/index.ts"],"names":[],"mappings":"AAAA,6FAA6F;AAE7F,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,YAAY,GAKb,MAAM,SAAS,CAAC"}
@@ -0,0 +1,53 @@
1
+ import type { IAccessibilityProps, IAriaProps, IDescriptor, IResponderProps } from '@symbiote-native/components';
2
+ import type { IStyleProp, ISymbioteEvent, IViewStyle } from '@symbiote-native/engine';
3
+ export declare const BLUR_MODULE_NAME = "ExpoBlur";
4
+ declare const BLUR_METHODS: readonly ["none", "dimezisBlurView", "dimezisBlurViewSdk31Plus"];
5
+ /** Метод размытия на Android: `none` это полупрозрачный view, остальные нативный BlurView */
6
+ export type IBlurMethod = (typeof BLUR_METHODS)[number];
7
+ export type IBlurTint = 'light' | 'dark' | 'default' | 'extraLight' | 'regular' | 'prominent' | 'systemUltraThinMaterial' | 'systemThinMaterial' | 'systemMaterial' | 'systemThickMaterial' | 'systemChromeMaterial' | 'systemUltraThinMaterialLight' | 'systemThinMaterialLight' | 'systemMaterialLight' | 'systemThickMaterialLight' | 'systemChromeMaterialLight' | 'systemUltraThinMaterialDark' | 'systemThinMaterialDark' | 'systemMaterialDark' | 'systemThickMaterialDark' | 'systemChromeMaterialDark';
8
+ type IViewSurface = IAccessibilityProps & IAriaProps & IResponderProps & {
9
+ style?: IStyleProp<IViewStyle>;
10
+ testID?: string;
11
+ nativeID?: string;
12
+ onLayout?: (event: ISymbioteEvent) => void;
13
+ };
14
+ export type IBlurViewProps = IViewSurface & {
15
+ /** @default 'default' */
16
+ tint?: IBlurTint;
17
+ /**
18
+ * Сила размытия от 1 до 100
19
+ * @default 50
20
+ */
21
+ intensity?: number;
22
+ /**
23
+ * Делитель силы размытия на Android
24
+ * @default 4
25
+ * @platform android
26
+ */
27
+ blurReductionFactor?: number;
28
+ /**
29
+ * @deprecated Use `blurMethod` instead
30
+ * @platform android
31
+ */
32
+ experimentalBlurMethod?: IBlurMethod;
33
+ /**
34
+ * @default 'none'
35
+ * @platform android
36
+ */
37
+ blurMethod?: IBlurMethod;
38
+ };
39
+ export type IBlurTargetViewProps = IViewSurface;
40
+ export declare const blurViewName: () => string;
41
+ export declare const blurTargetViewName: () => string;
42
+ export declare const ensureBlurRegistered: () => boolean;
43
+ export declare const ensureBlurTargetRegistered: () => boolean;
44
+ /** Предупреждения из `componentDidMount` upstream, зовутся один раз при монтировании */
45
+ export declare function warnBlurProps(props: object, hasBlurTarget: boolean): void;
46
+ /**
47
+ * Отдаёт нативный тег цели размытия после её коммита, у не-узла отдаёт `undefined`
48
+ * Адаптер сам приводит свой ref к host-узлу, возвращённая функция отменяет ожидание
49
+ */
50
+ export declare function watchBlurTarget(target: unknown, onId: (id: number | undefined) => void): () => void;
51
+ export declare function renderBlurView(props: object, blurTargetId: number | null | undefined): IDescriptor;
52
+ export declare function renderBlurTargetView(props: object): IDescriptor;
53
+ export {};
@@ -0,0 +1,105 @@
1
+ // Ядро `BlurView` и `BlurTargetView`, порт `BlurView.tsx` из expo-blur
2
+ import { Platform, requireNativeViewManager } from 'expo-modules-core';
3
+ import { el } from '@symbiote-native/components';
4
+ import { defineExpoNativeViews, getNativeTag, isSymbioteNode, whenCommitted, } from '@symbiote-native/engine';
5
+ export const BLUR_MODULE_NAME = 'ExpoBlur';
6
+ const BLUR_VIEW_NAME = 'ExpoBlurView';
7
+ const BLUR_TARGET_VIEW_NAME = 'ExpoBlurTargetView';
8
+ const BLUR_METHODS = [
9
+ 'none',
10
+ 'dimezisBlurView',
11
+ 'dimezisBlurViewSdk31Plus',
12
+ ];
13
+ const DEFAULT_BLUR_METHOD = BLUR_METHODS[0];
14
+ // Эти ключи разбираются здесь, остальное уходит на View как есть
15
+ const BLUR_KEYS = new Set([
16
+ 'tint',
17
+ 'intensity',
18
+ 'blurReductionFactor',
19
+ 'experimentalBlurMethod',
20
+ 'blurMethod',
21
+ ]);
22
+ const ABSOLUTE_FILL = {
23
+ position: 'absolute',
24
+ left: 0,
25
+ right: 0,
26
+ top: 0,
27
+ bottom: 0,
28
+ };
29
+ const CONTAINER_STYLE = { backgroundColor: 'transparent' };
30
+ const DEPRECATED_METHOD_WARNING = 'The `experimentalBlurMethod` prop has been depracated. Please use the `blurMethod` prop instead.';
31
+ // Регистрация идёт при рендере: побочный эффект барреля теряется в release
32
+ const views = defineExpoNativeViews(requireNativeViewManager, BLUR_MODULE_NAME, {
33
+ blur: BLUR_VIEW_NAME,
34
+ target: BLUR_TARGET_VIEW_NAME,
35
+ });
36
+ export const blurViewName = views.blur.name;
37
+ export const blurTargetViewName = views.target.name;
38
+ export const ensureBlurRegistered = views.blur.ensureRegistered;
39
+ export const ensureBlurTargetRegistered = views.target.ensureRegistered;
40
+ function isBlurMethod(value) {
41
+ return BLUR_METHODS.some(method => method === value);
42
+ }
43
+ function blurMethodOf(props) {
44
+ const provided = Reflect.get(props, 'blurMethod');
45
+ const deprecated = Reflect.get(props, 'experimentalBlurMethod');
46
+ if (isBlurMethod(provided))
47
+ return provided;
48
+ return isBlurMethod(deprecated) ? deprecated : DEFAULT_BLUR_METHOD;
49
+ }
50
+ /** Предупреждения из `componentDidMount` upstream, зовутся один раз при монтировании */
51
+ export function warnBlurProps(props, hasBlurTarget) {
52
+ const method = blurMethodOf(props);
53
+ const isAndroidTarget = Platform.select({ android: true, default: false });
54
+ if (isAndroidTarget && method !== DEFAULT_BLUR_METHOD && !hasBlurTarget) {
55
+ console.warn(`You have selected the "${method}" blur method, but the \`blurTarget\` prop has not been configured. The blur view will fallback to "none" blur method to avoid errors. You can learn more about the new BlurView API at: https://docs.expo.dev/versions/latest/sdk/blur-view/`);
56
+ }
57
+ if (Reflect.get(props, 'experimentalBlurMethod') != null) {
58
+ console.warn(DEPRECATED_METHOD_WARNING);
59
+ }
60
+ }
61
+ /**
62
+ * Отдаёт нативный тег цели размытия после её коммита, у не-узла отдаёт `undefined`
63
+ * Адаптер сам приводит свой ref к host-узлу, возвращённая функция отменяет ожидание
64
+ */
65
+ export function watchBlurTarget(target, onId) {
66
+ if (!isSymbioteNode(target)) {
67
+ onId(undefined);
68
+ return () => { };
69
+ }
70
+ return whenCommitted(target, () => onId(getNativeTag(target)));
71
+ }
72
+ // `object`, а не тип пропсов: Vue и Angular отдают нетипизированный набор атрибутов
73
+ export function renderBlurView(props, blurTargetId) {
74
+ const hostProps = Object.fromEntries(Object.entries(props).filter(([key]) => !BLUR_KEYS.has(key)));
75
+ const style = [CONTAINER_STYLE, Reflect.get(props, 'style')];
76
+ if (!ensureBlurRegistered()) {
77
+ console.warn('BlurView is not available on this platform');
78
+ return el('view', { ...hostProps, style });
79
+ }
80
+ const tint = Reflect.get(props, 'tint');
81
+ const intensity = Reflect.get(props, 'intensity');
82
+ const reduction = Reflect.get(props, 'blurReductionFactor');
83
+ const native = el(blurViewName(), {
84
+ ...(blurTargetId === undefined ? {} : { blurTargetId }),
85
+ tint: tint ?? 'default',
86
+ intensity: intensity ?? 50,
87
+ blurReductionFactor: reduction ?? 4,
88
+ blurMethod: blurMethodOf(props),
89
+ style: ABSOLUTE_FILL,
90
+ });
91
+ return el('view', { ...hostProps, style }, [native]);
92
+ }
93
+ // Нативная цель размытия есть только на Android, на iOS это обычный View
94
+ export function renderBlurTargetView(props) {
95
+ const hostProps = { ...props };
96
+ if (!Platform.select({ android: true, default: false })) {
97
+ return el('view', hostProps);
98
+ }
99
+ if (!ensureBlurTargetRegistered()) {
100
+ console.warn('BlurTargetView is not available on this platform');
101
+ return el('view', hostProps);
102
+ }
103
+ return el(blurTargetViewName(), hostProps);
104
+ }
105
+ //# sourceMappingURL=blur.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blur.js","sourceRoot":"","sources":["../../src/core/blur.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export { BLUR_MODULE_NAME, blurTargetViewName, blurViewName, ensureBlurRegistered, ensureBlurTargetRegistered, renderBlurTargetView, renderBlurView, warnBlurProps, watchBlurTarget, type IBlurMethod, type IBlurTargetViewProps, type IBlurTint, type IBlurViewProps, } from './blur';
@@ -0,0 +1,2 @@
1
+ export { BLUR_MODULE_NAME, blurTargetViewName, blurViewName, ensureBlurRegistered, ensureBlurTargetRegistered, renderBlurTargetView, renderBlurView, warnBlurProps, watchBlurTarget, } from './blur';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,YAAY,EACZ,oBAAoB,EACpB,0BAA0B,EAC1B,oBAAoB,EACpB,cAAc,EACd,aAAa,EACb,eAAe,GAKhB,MAAM,QAAQ,CAAC"}
@@ -0,0 +1,12 @@
1
+ {
2
+ "android": {
3
+ "gradleProjectName": "expo-blur",
4
+ "modules": [
5
+ {
6
+ "importPath": "expo.modules.blur.BlurModule",
7
+ "className": "BlurModule",
8
+ "nativeName": "ExpoBlur"
9
+ }
10
+ ]
11
+ }
12
+ }
package/package.json CHANGED
@@ -1,6 +1,148 @@
1
1
  {
2
2
  "name": "@symbiote-native/blur",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "0.0.0",
4
+ "description": "expo-blur wrapped for SymbioteNative — one framework-agnostic core, built once and reachable from the React, Vue, Svelte, Solid, and Angular adapters. A native view that blurs the content behind it, plus the Android blur target.",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/OneEyed1366/symbiote-native.git",
9
+ "directory": "packages/blur"
10
+ },
11
+ "homepage": "https://github.com/OneEyed1366/symbiote-native/tree/master/packages/blur#readme",
12
+ "bugs": {
13
+ "url": "https://github.com/OneEyed1366/symbiote-native/issues"
14
+ },
15
+ "author": "Andrey Prokopenko <psevdoproger@gmail.com>",
16
+ "keywords": [
17
+ "react-native",
18
+ "symbiote-native",
19
+ "expo-blur",
20
+ "react",
21
+ "vue",
22
+ "svelte",
23
+ "solid",
24
+ "angular",
25
+ "blur-view",
26
+ "blur"
27
+ ],
28
+ "type": "module",
29
+ "main": "./build/core/index.js",
30
+ "module": "./build/core/index.js",
31
+ "types": "./build/core/index.d.ts",
32
+ "exports": {
33
+ ".": {
34
+ "types": "./build/core/index.d.ts",
35
+ "default": "./build/core/index.js"
36
+ },
37
+ "./vue": {
38
+ "types": "./build/vue/index.d.ts",
39
+ "default": "./build/vue/index.js"
40
+ },
41
+ "./react": {
42
+ "types": "./build/react/index.d.ts",
43
+ "default": "./build/react/index.js"
44
+ },
45
+ "./svelte": "./src/svelte/index.ts",
46
+ "./solid": {
47
+ "types": "./build/solid/index.d.ts",
48
+ "default": "./build/solid/index.js"
49
+ },
50
+ "./angular": {
51
+ "types": "./build-ngc/angular/index.d.ts",
52
+ "react-native": "./build-ngc/angular/index.js",
53
+ "default": "./src/angular/index.ts"
54
+ }
55
+ },
56
+ "files": [
57
+ "src",
58
+ "build",
59
+ "build-ngc",
60
+ "native-link.json",
61
+ "!src/**/*.test.*",
62
+ "!src/**/*.spec.*",
63
+ "!src/**/*.detox.*"
64
+ ],
65
+ "publishConfig": {
66
+ "access": "public"
67
+ },
68
+ "dependencies": {
69
+ "expo-blur": "57.0.3",
70
+ "expo-modules-core": "57.0.20",
71
+ "@symbiote-native/components": "3.1.4"
72
+ },
73
+ "peerDependencies": {
74
+ "@angular/core": ">=20",
75
+ "@vue/runtime-core": "^3.5.13",
76
+ "react": ">=19.0.0",
77
+ "react-native": ">=0.86",
78
+ "solid-js": ">=1.9.0",
79
+ "svelte": ">=5.56.0",
80
+ "vue": ">=3.5.0",
81
+ "@symbiote-native/angular": "^3.2.0",
82
+ "@symbiote-native/engine": "^1.5.0",
83
+ "@symbiote-native/svelte": "^3.1.0",
84
+ "@symbiote-native/react": "^3.2.0",
85
+ "@symbiote-native/solid": "^3.1.0",
86
+ "@symbiote-native/vue": "^3.2.0"
87
+ },
88
+ "peerDependenciesMeta": {
89
+ "@symbiote-native/angular": {
90
+ "optional": true
91
+ },
92
+ "@symbiote-native/react": {
93
+ "optional": true
94
+ },
95
+ "@symbiote-native/solid": {
96
+ "optional": true
97
+ },
98
+ "@symbiote-native/svelte": {
99
+ "optional": true
100
+ },
101
+ "@symbiote-native/vue": {
102
+ "optional": true
103
+ },
104
+ "@angular/core": {
105
+ "optional": true
106
+ },
107
+ "@vue/runtime-core": {
108
+ "optional": true
109
+ },
110
+ "react": {
111
+ "optional": true
112
+ },
113
+ "solid-js": {
114
+ "optional": true
115
+ },
116
+ "svelte": {
117
+ "optional": true
118
+ },
119
+ "vue": {
120
+ "optional": true
121
+ }
122
+ },
123
+ "devDependencies": {
124
+ "@angular/compiler": "~22.0.8",
125
+ "@angular/compiler-cli": "~22.0.8",
126
+ "@angular/core": "~22.0.8",
127
+ "@types/node": "^26.0.0",
128
+ "@types/react": "^19.2.0",
129
+ "@vue/runtime-core": "^3.5.13",
130
+ "react": "19.2.3",
131
+ "solid-js": "^1.9.14",
132
+ "svelte": "^5.56.0",
133
+ "typescript": "~6.0.0",
134
+ "@symbiote-native/angular": "3.2.0",
135
+ "@symbiote-native/engine": "1.5.0",
136
+ "@symbiote-native/test-utils": "0.4.6",
137
+ "@symbiote-native/vue": "3.2.0",
138
+ "@symbiote-native/react": "3.2.0",
139
+ "@symbiote-native/svelte": "3.1.0",
140
+ "@symbiote-native/solid": "3.1.0"
141
+ },
142
+ "scripts": {
143
+ "typecheck": "tsc --build",
144
+ "clean": "rm -rf build-ngc",
145
+ "ng:build": "pnpm run clean && ngc -p tsconfig.angular.json",
146
+ "format": "prettier --write \"src/**/*.{ts,tsx}\""
147
+ }
6
148
  }
@@ -0,0 +1,39 @@
1
+ import {
2
+ ChangeDetectionStrategy,
3
+ Component,
4
+ ElementRef,
5
+ NO_ERRORS_SCHEMA,
6
+ ViewChild,
7
+ } from '@angular/core';
8
+ import { warnIfViewNameIsDynamic } from '@symbiote-native/engine';
9
+ import { SymbioteHostPropsDirective } from '@symbiote-native/angular';
10
+ import { BLUR_MODULE_NAME } from '../../core';
11
+ import { BlurTargetViewBase } from './shared';
12
+
13
+ const TEMPLATE_TAG = 'ViewManagerAdapter_ExpoBlur_ExpoBlurTargetView';
14
+
15
+ /** Angular twin of `expo-blur`'s `BlurTargetView`, the native target view on Android */
16
+ @Component({
17
+ selector: 'BlurTargetView',
18
+ standalone: true,
19
+ imports: [SymbioteHostPropsDirective],
20
+ schemas: [NO_ERRORS_SCHEMA],
21
+ changeDetection: ChangeDetectionStrategy.OnPush,
22
+ // Имя тега это нативное имя view, его нельзя собрать динамически
23
+ template: `<ViewManagerAdapter_ExpoBlur_ExpoBlurTargetView #host [symbioteHostProps]="hostProps">
24
+ <ng-content />
25
+ </ViewManagerAdapter_ExpoBlur_ExpoBlurTargetView>`,
26
+ })
27
+ export class BlurTargetView extends BlurTargetViewBase {
28
+ @ViewChild('host', { read: ElementRef, static: true })
29
+ private readonly hostRef!: ElementRef<unknown>;
30
+
31
+ constructor() {
32
+ super();
33
+ warnIfViewNameIsDynamic(TEMPLATE_TAG, BLUR_MODULE_NAME, 'ExpoBlurTargetView');
34
+ }
35
+
36
+ get nativeElement(): unknown {
37
+ return this.hostRef.nativeElement;
38
+ }
39
+ }
@@ -0,0 +1,25 @@
1
+ import {
2
+ ChangeDetectionStrategy,
3
+ Component,
4
+ ElementRef,
5
+ ViewChild,
6
+ } from '@angular/core';
7
+ import { SymbioteHostPropsDirective, View } from '@symbiote-native/angular';
8
+ import { BlurTargetViewBase } from './shared';
9
+
10
+ /** Angular twin of `expo-blur`'s `BlurTargetView`, a plain View on iOS */
11
+ @Component({
12
+ selector: 'BlurTargetView',
13
+ standalone: true,
14
+ imports: [SymbioteHostPropsDirective, View],
15
+ changeDetection: ChangeDetectionStrategy.OnPush,
16
+ template: `<view #host [symbioteHostProps]="hostProps"><ng-content /></view>`,
17
+ })
18
+ export class BlurTargetView extends BlurTargetViewBase {
19
+ @ViewChild('host', { read: ElementRef, static: true })
20
+ private readonly hostRef!: ElementRef<unknown>;
21
+
22
+ get nativeElement(): unknown {
23
+ return this.hostRef.nativeElement;
24
+ }
25
+ }
@@ -0,0 +1,2 @@
1
+ // Базовая точка для headless и tsc, Metro берёт `index.ios` или `index.android`
2
+ export { BlurTargetView } from './index.ios';
@@ -0,0 +1,21 @@
1
+ import { Directive, Input } from '@angular/core';
2
+ import { NativeViewBase } from '@symbiote-native/angular';
3
+ import type { IDescriptor } from '@symbiote-native/components';
4
+ import { renderBlurTargetView } from '../../core';
5
+
6
+ // Платформы различаются только тегом в шаблоне, остальное общее
7
+ @Directive()
8
+ export abstract class BlurTargetViewBase extends NativeViewBase {
9
+ /** Нужен свойству `blurTarget` у `BlurView`, чтобы найти host-узел */
10
+ abstract readonly nativeElement: unknown;
11
+
12
+ protected readonly propNames = [] as const satisfies readonly (keyof BlurTargetViewBase)[];
13
+
14
+ protected override renderView(props: object): IDescriptor {
15
+ return renderBlurTargetView(props);
16
+ }
17
+
18
+ get hostProps(): Record<string, unknown> {
19
+ return this.descriptor?.props ?? {};
20
+ }
21
+ }
@@ -0,0 +1,85 @@
1
+ import {
2
+ ChangeDetectionStrategy,
3
+ Component,
4
+ Input,
5
+ type AfterViewInit,
6
+ type OnChanges,
7
+ type OnDestroy,
8
+ type SimpleChanges,
9
+ } from '@angular/core';
10
+ import {
11
+ DescriptorHost,
12
+ NativeViewBase,
13
+ hostNodeOf,
14
+ } from '@symbiote-native/angular';
15
+ import type { IDescriptor } from '@symbiote-native/components';
16
+ import { renderBlurView, warnBlurProps, watchBlurTarget } from '../core';
17
+ import type { IBlurViewProps } from '../core';
18
+
19
+ /** Angular twin of `expo-blur`'s `BlurView`, the projected content paints over the blur */
20
+ @Component({
21
+ selector: 'BlurView',
22
+ standalone: true,
23
+ imports: [DescriptorHost],
24
+ changeDetection: ChangeDetectionStrategy.OnPush,
25
+ template: `@if (descriptor; as node) {
26
+ <symbiote-descriptor-host [node]="node"><ng-content /></symbiote-descriptor-host>
27
+ }`,
28
+ })
29
+ export class BlurView
30
+ extends NativeViewBase
31
+ implements AfterViewInit, OnChanges, OnDestroy
32
+ {
33
+ @Input() tint?: IBlurViewProps['tint'];
34
+ @Input() intensity?: IBlurViewProps['intensity'];
35
+ @Input() blurReductionFactor?: IBlurViewProps['blurReductionFactor'];
36
+ @Input() experimentalBlurMethod?: IBlurViewProps['experimentalBlurMethod'];
37
+ @Input() blurMethod?: IBlurViewProps['blurMethod'];
38
+ /** Template ref на `BlurTargetView`, его содержимое это фон для размытия */
39
+ @Input() blurTarget?: unknown;
40
+
41
+ protected override readonly propNames = [
42
+ 'tint',
43
+ 'intensity',
44
+ 'blurReductionFactor',
45
+ 'experimentalBlurMethod',
46
+ 'blurMethod',
47
+ ] as const satisfies readonly (keyof BlurView)[];
48
+
49
+ private blurTargetId: number | undefined;
50
+ private cancelWatch = (): void => {};
51
+ private isViewReady = false;
52
+
53
+ protected override renderView(props: object): IDescriptor {
54
+ return renderBlurView(props, this.blurTargetId);
55
+ }
56
+
57
+ // Цель ставится при создании представления соседа, поэтому ждём `ngAfterViewInit`
58
+ ngAfterViewInit(): void {
59
+ this.isViewReady = true;
60
+ this.watchTarget();
61
+ warnBlurProps(
62
+ Object.fromEntries(
63
+ this.propNames.map(name => [name, Reflect.get(this, name)]),
64
+ ),
65
+ this.blurTarget !== undefined,
66
+ );
67
+ }
68
+
69
+ override ngOnChanges(changes: SimpleChanges): void {
70
+ super.ngOnChanges(changes);
71
+ if (this.isViewReady && 'blurTarget' in changes) this.watchTarget();
72
+ }
73
+
74
+ protected override disposeView(): void {
75
+ this.cancelWatch();
76
+ }
77
+
78
+ private watchTarget(): void {
79
+ this.cancelWatch();
80
+ this.cancelWatch = watchBlurTarget(hostNodeOf(this.blurTarget), id => {
81
+ this.blurTargetId = id;
82
+ this.changeDetector.markForCheck();
83
+ });
84
+ }
85
+ }
@@ -0,0 +1,13 @@
1
+ // @symbiote-native/blur/angular: компоненты `BlurView` и `BlurTargetView` поверх общего ядра
2
+
3
+ export { BlurView } from './blur-view';
4
+ export { BlurTargetView } from './blur-target-view';
5
+ export {
6
+ BLUR_MODULE_NAME,
7
+ blurTargetViewName,
8
+ blurViewName,
9
+ type IBlurMethod,
10
+ type IBlurTint,
11
+ type IBlurViewProps,
12
+ type IBlurTargetViewProps,
13
+ } from '../core';