@abeman/react-native-nitro-blur 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.
Files changed (86) hide show
  1. package/LICENSE +20 -0
  2. package/NitroBlur.podspec +29 -0
  3. package/README.md +200 -0
  4. package/android/CMakeLists.txt +24 -0
  5. package/android/build.gradle +120 -0
  6. package/android/src/main/AndroidManifest.xml +2 -0
  7. package/android/src/main/cpp/cpp-adapter.cpp +6 -0
  8. package/android/src/main/java/com/margelo/nitro/nitroblur/NitroBlur.kt +229 -0
  9. package/android/src/main/java/com/margelo/nitro/nitroblur/NitroBlurPackage.kt +31 -0
  10. package/android/src/main/java/com/margelo/nitro/nitroblur/NitroBlurTarget.kt +149 -0
  11. package/android/src/main/java/com/margelo/nitro/nitroblur/NitroBlurTargetViewGroupManager.kt +47 -0
  12. package/android/src/main/java/com/margelo/nitro/nitroblur/TintStyle.kt +85 -0
  13. package/ios/NitroBlur.swift +173 -0
  14. package/ios/NitroBlurTarget.swift +5 -0
  15. package/lib/module/NitroBlur.nitro.js +4 -0
  16. package/lib/module/NitroBlur.nitro.js.map +1 -0
  17. package/lib/module/NitroBlurTarget.nitro.js +4 -0
  18. package/lib/module/NitroBlurTarget.nitro.js.map +1 -0
  19. package/lib/module/index.js +114 -0
  20. package/lib/module/index.js.map +1 -0
  21. package/lib/module/package.json +1 -0
  22. package/lib/typescript/package.json +1 -0
  23. package/lib/typescript/src/NitroBlur.nitro.d.ts +25 -0
  24. package/lib/typescript/src/NitroBlur.nitro.d.ts.map +1 -0
  25. package/lib/typescript/src/NitroBlurTarget.nitro.d.ts +7 -0
  26. package/lib/typescript/src/NitroBlurTarget.nitro.d.ts.map +1 -0
  27. package/lib/typescript/src/index.d.ts +201 -0
  28. package/lib/typescript/src/index.d.ts.map +1 -0
  29. package/nitro.json +33 -0
  30. package/nitrogen/generated/android/c++/JBlurMethod.hpp +61 -0
  31. package/nitrogen/generated/android/c++/JBlurTint.hpp +115 -0
  32. package/nitrogen/generated/android/c++/JHybridNitroBlurSpec.cpp +99 -0
  33. package/nitrogen/generated/android/c++/JHybridNitroBlurSpec.hpp +72 -0
  34. package/nitrogen/generated/android/c++/JHybridNitroBlurTargetSpec.cpp +49 -0
  35. package/nitrogen/generated/android/c++/JHybridNitroBlurTargetSpec.hpp +63 -0
  36. package/nitrogen/generated/android/c++/views/JHybridNitroBlurStateUpdater.cpp +72 -0
  37. package/nitrogen/generated/android/c++/views/JHybridNitroBlurStateUpdater.hpp +49 -0
  38. package/nitrogen/generated/android/c++/views/JHybridNitroBlurTargetStateUpdater.cpp +53 -0
  39. package/nitrogen/generated/android/c++/views/JHybridNitroBlurTargetStateUpdater.hpp +49 -0
  40. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroblur/BlurMethod.kt +24 -0
  41. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroblur/BlurTint.kt +42 -0
  42. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroblur/HybridNitroBlurSpec.kt +81 -0
  43. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroblur/HybridNitroBlurTargetSpec.kt +53 -0
  44. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroblur/nitroblurOnLoad.kt +35 -0
  45. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroblur/views/HybridNitroBlurManager.kt +80 -0
  46. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroblur/views/HybridNitroBlurStateUpdater.kt +23 -0
  47. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroblur/views/HybridNitroBlurTargetManager.kt +80 -0
  48. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroblur/views/HybridNitroBlurTargetStateUpdater.kt +23 -0
  49. package/nitrogen/generated/android/nitroblur+autolinking.cmake +87 -0
  50. package/nitrogen/generated/android/nitroblur+autolinking.gradle +27 -0
  51. package/nitrogen/generated/android/nitroblurOnLoad.cpp +74 -0
  52. package/nitrogen/generated/android/nitroblurOnLoad.hpp +34 -0
  53. package/nitrogen/generated/ios/NitroBlur+autolinking.rb +60 -0
  54. package/nitrogen/generated/ios/NitroBlur-Swift-Cxx-Bridge.cpp +50 -0
  55. package/nitrogen/generated/ios/NitroBlur-Swift-Cxx-Bridge.hpp +57 -0
  56. package/nitrogen/generated/ios/NitroBlur-Swift-Cxx-Umbrella.hpp +52 -0
  57. package/nitrogen/generated/ios/NitroBlurAutolinking.mm +41 -0
  58. package/nitrogen/generated/ios/NitroBlurAutolinking.swift +38 -0
  59. package/nitrogen/generated/ios/c++/HybridNitroBlurSpecSwift.cpp +11 -0
  60. package/nitrogen/generated/ios/c++/HybridNitroBlurSpecSwift.hpp +110 -0
  61. package/nitrogen/generated/ios/c++/HybridNitroBlurTargetSpecSwift.cpp +11 -0
  62. package/nitrogen/generated/ios/c++/HybridNitroBlurTargetSpecSwift.hpp +75 -0
  63. package/nitrogen/generated/ios/c++/views/HybridNitroBlurComponent.mm +142 -0
  64. package/nitrogen/generated/ios/c++/views/HybridNitroBlurTargetComponent.mm +118 -0
  65. package/nitrogen/generated/ios/swift/BlurMethod.swift +44 -0
  66. package/nitrogen/generated/ios/swift/BlurTint.swift +116 -0
  67. package/nitrogen/generated/ios/swift/HybridNitroBlurSpec.swift +59 -0
  68. package/nitrogen/generated/ios/swift/HybridNitroBlurSpec_cxx.swift +200 -0
  69. package/nitrogen/generated/ios/swift/HybridNitroBlurTargetSpec.swift +55 -0
  70. package/nitrogen/generated/ios/swift/HybridNitroBlurTargetSpec_cxx.swift +147 -0
  71. package/nitrogen/generated/shared/c++/BlurMethod.hpp +80 -0
  72. package/nitrogen/generated/shared/c++/BlurTint.hpp +152 -0
  73. package/nitrogen/generated/shared/c++/HybridNitroBlurSpec.cpp +30 -0
  74. package/nitrogen/generated/shared/c++/HybridNitroBlurSpec.hpp +75 -0
  75. package/nitrogen/generated/shared/c++/HybridNitroBlurTargetSpec.cpp +21 -0
  76. package/nitrogen/generated/shared/c++/HybridNitroBlurTargetSpec.hpp +62 -0
  77. package/nitrogen/generated/shared/c++/views/HybridNitroBlurComponent.cpp +127 -0
  78. package/nitrogen/generated/shared/c++/views/HybridNitroBlurComponent.hpp +116 -0
  79. package/nitrogen/generated/shared/c++/views/HybridNitroBlurTargetComponent.cpp +72 -0
  80. package/nitrogen/generated/shared/c++/views/HybridNitroBlurTargetComponent.hpp +109 -0
  81. package/nitrogen/generated/shared/json/NitroBlurConfig.json +14 -0
  82. package/nitrogen/generated/shared/json/NitroBlurTargetConfig.json +9 -0
  83. package/package.json +174 -0
  84. package/src/NitroBlur.nitro.ts +56 -0
  85. package/src/NitroBlurTarget.nitro.ts +13 -0
  86. package/src/index.tsx +215 -0
package/package.json ADDED
@@ -0,0 +1,174 @@
1
+ {
2
+ "name": "@abeman/react-native-nitro-blur",
3
+ "version": "0.1.0",
4
+ "description": "Blur view",
5
+ "main": "./lib/module/index.js",
6
+ "types": "./lib/typescript/src/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "source": "./src/index.tsx",
10
+ "types": "./lib/typescript/src/index.d.ts",
11
+ "default": "./lib/module/index.js"
12
+ },
13
+ "./package.json": "./package.json"
14
+ },
15
+ "files": [
16
+ "src",
17
+ "lib",
18
+ "android",
19
+ "ios",
20
+ "cpp",
21
+ "nitrogen",
22
+ "nitro.json",
23
+ "*.podspec",
24
+ "react-native.config.js",
25
+ "!ios/build",
26
+ "!android/build",
27
+ "!android/gradle",
28
+ "!android/gradlew",
29
+ "!android/gradlew.bat",
30
+ "!android/local.properties",
31
+ "!**/__tests__",
32
+ "!**/__fixtures__",
33
+ "!**/__mocks__",
34
+ "!**/.*"
35
+ ],
36
+ "scripts": {
37
+ "example": "yarn workspace react-native-nitro-blur-example",
38
+ "clean": "del-cli android/build example/android/build example/android/app/build example/ios/build lib",
39
+ "prepare": "bob build",
40
+ "nitrogen": "nitrogen",
41
+ "typecheck": "tsc",
42
+ "lint": "eslint \"**/*.{js,ts,tsx}\"",
43
+ "test": "jest",
44
+ "release": "release-it --only-version"
45
+ },
46
+ "keywords": [
47
+ "react-native",
48
+ "ios",
49
+ "android"
50
+ ],
51
+ "repository": {
52
+ "type": "git",
53
+ "url": "git+https://github.com/huynq1175/react-native-nitro-blur.git"
54
+ },
55
+ "author": "huynq2 <99823149+huynq1175@users.noreply.github.com> (https://github.com/huynq1175)",
56
+ "license": "MIT",
57
+ "bugs": {
58
+ "url": "https://github.com/huynq1175/react-native-nitro-blur/issues"
59
+ },
60
+ "homepage": "https://github.com/huynq1175/react-native-nitro-blur#readme",
61
+ "publishConfig": {
62
+ "registry": "https://registry.npmjs.org/"
63
+ },
64
+ "devDependencies": {
65
+ "@commitlint/config-conventional": "^19.8.1",
66
+ "@eslint/compat": "^1.3.2",
67
+ "@eslint/eslintrc": "^3.3.1",
68
+ "@eslint/js": "^9.35.0",
69
+ "@react-native/babel-preset": "0.83.0",
70
+ "@react-native/eslint-config": "0.83.0",
71
+ "@release-it/conventional-changelog": "^10.0.1",
72
+ "@types/jest": "^29.5.14",
73
+ "@types/react": "^19.2.0",
74
+ "commitlint": "^19.8.1",
75
+ "del-cli": "^6.0.0",
76
+ "eslint": "^9.35.0",
77
+ "eslint-config-prettier": "^10.1.8",
78
+ "eslint-plugin-prettier": "^5.5.4",
79
+ "jest": "^29.7.0",
80
+ "lefthook": "^2.0.3",
81
+ "nitrogen": "^0.35.2",
82
+ "prettier": "^2.8.8",
83
+ "react": "19.2.0",
84
+ "react-native": "0.83.0",
85
+ "react-native-builder-bob": "^0.40.13",
86
+ "react-native-nitro-modules": "^0.35.2",
87
+ "release-it": "^19.0.4",
88
+ "turbo": "^2.5.6",
89
+ "typescript": "^5.9.2"
90
+ },
91
+ "peerDependencies": {
92
+ "react": "*",
93
+ "react-native": "*",
94
+ "react-native-nitro-modules": "^0.35.2"
95
+ },
96
+ "workspaces": [
97
+ "example"
98
+ ],
99
+ "packageManager": "yarn@4.11.0",
100
+ "react-native-builder-bob": {
101
+ "source": "src",
102
+ "output": "lib",
103
+ "targets": [
104
+ [
105
+ "custom",
106
+ {
107
+ "script": "nitrogen",
108
+ "clean": "nitrogen/"
109
+ }
110
+ ],
111
+ [
112
+ "module",
113
+ {
114
+ "esm": true
115
+ }
116
+ ],
117
+ [
118
+ "typescript",
119
+ {
120
+ "project": "tsconfig.build.json"
121
+ }
122
+ ]
123
+ ]
124
+ },
125
+ "prettier": {
126
+ "quoteProps": "consistent",
127
+ "singleQuote": true,
128
+ "tabWidth": 2,
129
+ "trailingComma": "es5",
130
+ "useTabs": false
131
+ },
132
+ "jest": {
133
+ "preset": "react-native",
134
+ "modulePathIgnorePatterns": [
135
+ "<rootDir>/example/node_modules",
136
+ "<rootDir>/lib/"
137
+ ]
138
+ },
139
+ "commitlint": {
140
+ "extends": [
141
+ "@commitlint/config-conventional"
142
+ ]
143
+ },
144
+ "release-it": {
145
+ "git": {
146
+ "commitMessage": "chore: release ${version}",
147
+ "tagName": "v${version}"
148
+ },
149
+ "npm": {
150
+ "publish": true
151
+ },
152
+ "github": {
153
+ "release": true
154
+ },
155
+ "plugins": {
156
+ "@release-it/conventional-changelog": {
157
+ "preset": {
158
+ "name": "angular"
159
+ }
160
+ }
161
+ }
162
+ },
163
+ "create-react-native-library": {
164
+ "type": "nitro-view",
165
+ "languages": "kotlin-swift",
166
+ "tools": [
167
+ "eslint",
168
+ "jest",
169
+ "lefthook",
170
+ "release-it"
171
+ ],
172
+ "version": "0.57.2"
173
+ }
174
+ }
@@ -0,0 +1,56 @@
1
+ import type {
2
+ HybridView,
3
+ HybridViewMethods,
4
+ HybridViewProps,
5
+ } from 'react-native-nitro-modules';
6
+
7
+ export type BlurTint =
8
+ | 'light'
9
+ | 'dark'
10
+ | 'default'
11
+ | 'extraLight'
12
+ | 'regular'
13
+ | 'prominent'
14
+ | 'systemUltraThinMaterial'
15
+ | 'systemThinMaterial'
16
+ | 'systemMaterial'
17
+ | 'systemThickMaterial'
18
+ | 'systemChromeMaterial'
19
+ | 'systemUltraThinMaterialLight'
20
+ | 'systemThinMaterialLight'
21
+ | 'systemMaterialLight'
22
+ | 'systemThickMaterialLight'
23
+ | 'systemChromeMaterialLight'
24
+ | 'systemUltraThinMaterialDark'
25
+ | 'systemThinMaterialDark'
26
+ | 'systemMaterialDark'
27
+ | 'systemThickMaterialDark'
28
+ | 'systemChromeMaterialDark';
29
+
30
+ /**
31
+ * Blur method to use on Android.
32
+ *
33
+ * - `'none'` - Renders a semi-transparent view instead of rendering a blur effect.
34
+ * - `'dimezisBlurView'` - Uses a native blur view implementation based on BlurView library.
35
+ * This method may lead to decreased performance on Android SDK 30 and below.
36
+ * - `'dimezisBlurViewSdk31Plus'` - Uses BlurView library on Android SDK 31 and above,
37
+ * for older versions falls back to 'none'.
38
+ *
39
+ * @platform android
40
+ */
41
+ export type BlurMethod =
42
+ | 'none'
43
+ | 'dimezisBlurView'
44
+ | 'dimezisBlurViewSdk31Plus';
45
+
46
+ export interface NitroBlurProps extends HybridViewProps {
47
+ tint: BlurTint;
48
+ intensity: number;
49
+ blurReductionFactor: number;
50
+ blurTargetId: number;
51
+ blurMethod: BlurMethod;
52
+ }
53
+
54
+ export interface NitroBlurMethods extends HybridViewMethods {}
55
+
56
+ export type NitroBlur = HybridView<NitroBlurProps, NitroBlurMethods>;
@@ -0,0 +1,13 @@
1
+ import type {
2
+ HybridView,
3
+ HybridViewMethods,
4
+ HybridViewProps,
5
+ } from 'react-native-nitro-modules';
6
+
7
+ export interface NitroBlurTargetProps extends HybridViewProps {}
8
+ export interface NitroBlurTargetMethods extends HybridViewMethods {}
9
+
10
+ export type NitroBlurTarget = HybridView<
11
+ NitroBlurTargetProps,
12
+ NitroBlurTargetMethods
13
+ >;
package/src/index.tsx ADDED
@@ -0,0 +1,215 @@
1
+ 'use client';
2
+
3
+ import React from 'react';
4
+ import {
5
+ findNodeHandle,
6
+ Platform,
7
+ StyleSheet,
8
+ View,
9
+ type ViewProps,
10
+ } from 'react-native';
11
+ import { getHostComponent } from 'react-native-nitro-modules';
12
+ import type {
13
+ BlurMethod,
14
+ BlurTint,
15
+ NitroBlurMethods,
16
+ NitroBlurProps,
17
+ } from './NitroBlur.nitro';
18
+ import type {
19
+ NitroBlurTargetMethods,
20
+ NitroBlurTargetProps,
21
+ } from './NitroBlurTarget.nitro';
22
+
23
+ const NitroBlurConfig = require('../nitrogen/generated/shared/json/NitroBlurConfig.json');
24
+ const NitroBlurTargetConfig = require('../nitrogen/generated/shared/json/NitroBlurTargetConfig.json');
25
+
26
+ const NativeBlurView = getHostComponent<NitroBlurProps, NitroBlurMethods>(
27
+ 'NitroBlur',
28
+ () => NitroBlurConfig
29
+ );
30
+
31
+ const NativeBlurTargetView = getHostComponent<
32
+ NitroBlurTargetProps,
33
+ NitroBlurTargetMethods
34
+ >('NitroBlurTarget', () => NitroBlurTargetConfig);
35
+
36
+ // ----- BlurViewProps -----
37
+
38
+ export type BlurViewProps = {
39
+ /**
40
+ * A ref to a BlurTargetView, which this BlurView will blur as its background.
41
+ *
42
+ * @platform android
43
+ */
44
+ blurTarget?: React.RefObject<View | null>;
45
+
46
+ /**
47
+ * A tint mode which will be applied to the view.
48
+ * @default 'default'
49
+ */
50
+ tint?: BlurTint;
51
+
52
+ /**
53
+ * A number from `1` to `100` to control the intensity of the blur effect.
54
+ *
55
+ * You can animate this property using `react-native-reanimated`.
56
+ *
57
+ * @default 50
58
+ */
59
+ intensity?: number;
60
+
61
+ /**
62
+ * A number by which the blur intensity will be divided on Android.
63
+ *
64
+ * When using blur methods on Android, the perceived blur intensity might differ from iOS
65
+ * at different intensity levels. This property can be used to fine tune it on Android
66
+ * to match it more closely with iOS.
67
+ * @default 4
68
+ * @platform android
69
+ */
70
+ blurReductionFactor?: number;
71
+
72
+ /**
73
+ * Blur method to use on Android.
74
+ *
75
+ * @default 'none'
76
+ * @platform android
77
+ */
78
+ blurMethod?: BlurMethod;
79
+
80
+ /**
81
+ * @hidden
82
+ * @deprecated Use `blurMethod` instead.
83
+ * @default 'none'
84
+ * @platform android
85
+ */
86
+ experimentalBlurMethod?: BlurMethod;
87
+ } & ViewProps;
88
+
89
+ export type BlurTargetViewProps = {
90
+ ref?: React.RefObject<View | null>;
91
+ } & ViewProps;
92
+
93
+ // ----- BlurView -----
94
+
95
+ type BlurViewState = {
96
+ blurTargetId?: number | null;
97
+ };
98
+
99
+ export class BlurView extends React.Component<BlurViewProps, BlurViewState> {
100
+ constructor(props: BlurViewProps) {
101
+ super(props);
102
+ this.state = {
103
+ blurTargetId: undefined,
104
+ };
105
+ }
106
+
107
+ componentDidMount(): void {
108
+ this._updateBlurTargetId();
109
+ this._maybeWarnAboutBlurMethod();
110
+
111
+ if (this.props.experimentalBlurMethod != null) {
112
+ console.warn(
113
+ 'The `experimentalBlurMethod` prop has been deprecated. Please use the `blurMethod` prop instead.'
114
+ );
115
+ }
116
+ }
117
+
118
+ componentDidUpdate(prevProps: Readonly<BlurViewProps>): void {
119
+ if (prevProps.blurTarget?.current !== this.props.blurTarget?.current) {
120
+ this._updateBlurTargetId();
121
+ }
122
+ }
123
+
124
+ _maybeWarnAboutBlurMethod(): void {
125
+ const blurMethod = this._getBlurMethod();
126
+ if (
127
+ Platform.OS === 'android' &&
128
+ (blurMethod === 'dimezisBlurView' ||
129
+ blurMethod === 'dimezisBlurViewSdk31Plus') &&
130
+ !this.props.blurTarget
131
+ ) {
132
+ // The fallback happens on the native side
133
+ console.warn(
134
+ `You have selected the "${blurMethod}" blur method, but the \`blurTarget\` prop has not been configured. The blur view will fallback to "none" blur method to avoid errors.`
135
+ );
136
+ }
137
+ }
138
+
139
+ _updateBlurTargetId = () => {
140
+ const blurTarget = this.props.blurTarget?.current;
141
+ const blurTargetId = blurTarget ? findNodeHandle(blurTarget) : undefined;
142
+ this.setState(() => ({
143
+ blurTargetId,
144
+ }));
145
+ };
146
+
147
+ _getBlurMethod(): BlurMethod {
148
+ const providedMethod =
149
+ this.props.blurMethod ?? this.props.experimentalBlurMethod;
150
+ return providedMethod ?? 'none';
151
+ }
152
+
153
+ render() {
154
+ const {
155
+ tint = 'default',
156
+ intensity = 30,
157
+ blurReductionFactor = 4,
158
+ style,
159
+ children,
160
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
161
+ blurTarget,
162
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
163
+ blurMethod,
164
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
165
+ experimentalBlurMethod,
166
+ ...props
167
+ } = this.props;
168
+
169
+ return (
170
+ <View {...props} style={[styles.container, style]}>
171
+ <NativeBlurView
172
+ blurTargetId={this.state.blurTargetId ?? 0}
173
+ tint={tint}
174
+ intensity={intensity}
175
+ blurReductionFactor={blurReductionFactor}
176
+ blurMethod={this._getBlurMethod()}
177
+ style={StyleSheet.absoluteFill}
178
+ />
179
+ {children}
180
+ </View>
181
+ );
182
+ }
183
+ }
184
+
185
+ const styles = StyleSheet.create({
186
+ container: { backgroundColor: 'transparent' },
187
+ });
188
+
189
+ // ----- BlurTargetView -----
190
+
191
+ /**
192
+ * A container view that can be used as a blur target on Android.
193
+ * Wrap the content you want to blur with this view, then pass
194
+ * a ref to it via the `blurTarget` prop of `BlurView`.
195
+ *
196
+ * On iOS, this is just a regular View since UIVisualEffectView
197
+ * naturally blurs whatever is behind it.
198
+ */
199
+ export const BlurTargetView = React.forwardRef<View, ViewProps>(
200
+ (props, ref) => {
201
+ if (Platform.OS === 'android') {
202
+ return <NativeBlurTargetView {...props} ref={ref as any} />;
203
+ }
204
+ return <View {...props} ref={ref as any} collapsable={false} />;
205
+ }
206
+ );
207
+
208
+ // ----- Exports -----
209
+
210
+ export type {
211
+ BlurTint,
212
+ BlurMethod,
213
+ NitroBlurProps,
214
+ NitroBlurMethods,
215
+ } from './NitroBlur.nitro';