react-native-unistyles 3.0.0-alpha.13 → 3.0.0-alpha.15
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/cxx/core/UnistyleWrapper.h +1 -1
- package/cxx/core/UnistylesCommitHook.cpp +13 -10
- package/cxx/core/UnistylesMountHook.cpp +3 -19
- package/cxx/hybridObjects/HybridStyleSheet.cpp +4 -3
- package/cxx/hybridObjects/HybridStyleSheet.h +1 -1
- package/cxx/parser/Parser.cpp +13 -9
- package/cxx/shadowTree/ShadowTreeManager.cpp +5 -5
- package/lib/commonjs/index.js +4 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/specs/ShadowRegistry/index.js +7 -1
- package/lib/commonjs/specs/ShadowRegistry/index.js.map +1 -1
- package/lib/commonjs/web/convert/index.js +1 -1
- package/lib/commonjs/web/convert/index.js.map +1 -1
- package/lib/commonjs/web/create.js +25 -63
- package/lib/commonjs/web/create.js.map +1 -1
- package/lib/commonjs/web/createUnistylesComponent.js +61 -0
- package/lib/commonjs/web/createUnistylesComponent.js.map +1 -0
- package/lib/commonjs/web/index.js +12 -3
- package/lib/commonjs/web/index.js.map +1 -1
- package/lib/commonjs/web/listener/index.js +7 -0
- package/lib/commonjs/web/listener/index.js.map +1 -1
- package/lib/commonjs/web/listener/listenToDependencies.js +39 -0
- package/lib/commonjs/web/listener/listenToDependencies.js.map +1 -0
- package/lib/commonjs/web/listener/listener.js +1 -2
- package/lib/commonjs/web/listener/listener.js.map +1 -1
- package/lib/commonjs/web/mock.js +1 -10
- package/lib/commonjs/web/mock.js.map +1 -1
- package/lib/commonjs/web/pseudo.js +2 -3
- package/lib/commonjs/web/pseudo.js.map +1 -1
- package/lib/commonjs/web/registry.js +2 -4
- package/lib/commonjs/web/registry.js.map +1 -1
- package/lib/commonjs/web/runtime.js +0 -1
- package/lib/commonjs/web/runtime.js.map +1 -1
- package/lib/commonjs/web/shadowRegistry.js +120 -0
- package/lib/commonjs/web/shadowRegistry.js.map +1 -0
- package/lib/commonjs/web/state.js +0 -40
- package/lib/commonjs/web/state.js.map +1 -1
- package/lib/commonjs/web/utils.js +66 -14
- package/lib/commonjs/web/utils.js.map +1 -1
- package/lib/commonjs/web/variants/useVariants.js +15 -31
- package/lib/commonjs/web/variants/useVariants.js.map +1 -1
- package/lib/module/index.js +4 -0
- package/lib/module/index.js.map +1 -1
- package/lib/module/specs/ShadowRegistry/index.js +7 -1
- package/lib/module/specs/ShadowRegistry/index.js.map +1 -1
- package/lib/module/web/convert/index.js +1 -1
- package/lib/module/web/convert/index.js.map +1 -1
- package/lib/module/web/create.js +26 -64
- package/lib/module/web/create.js.map +1 -1
- package/lib/module/web/createUnistylesComponent.js +54 -0
- package/lib/module/web/createUnistylesComponent.js.map +1 -0
- package/lib/module/web/index.js +4 -2
- package/lib/module/web/index.js.map +1 -1
- package/lib/module/web/listener/index.js +1 -0
- package/lib/module/web/listener/index.js.map +1 -1
- package/lib/module/web/listener/listenToDependencies.js +34 -0
- package/lib/module/web/listener/listenToDependencies.js.map +1 -0
- package/lib/module/web/listener/listener.js +1 -1
- package/lib/module/web/listener/listener.js.map +1 -1
- package/lib/module/web/mock.js +0 -9
- package/lib/module/web/mock.js.map +1 -1
- package/lib/module/web/pseudo.js +2 -3
- package/lib/module/web/pseudo.js.map +1 -1
- package/lib/module/web/registry.js +2 -4
- package/lib/module/web/registry.js.map +1 -1
- package/lib/module/web/runtime.js +0 -1
- package/lib/module/web/runtime.js.map +1 -1
- package/lib/module/web/shadowRegistry.js +116 -0
- package/lib/module/web/shadowRegistry.js.map +1 -0
- package/lib/module/web/state.js +0 -40
- package/lib/module/web/state.js.map +1 -1
- package/lib/module/web/utils.js +59 -12
- package/lib/module/web/utils.js.map +1 -1
- package/lib/module/web/variants/useVariants.js +16 -32
- package/lib/module/web/variants/useVariants.js.map +1 -1
- package/lib/typescript/src/specs/ShadowRegistry/index.d.ts.map +1 -1
- package/lib/typescript/src/web/create.d.ts.map +1 -1
- package/lib/typescript/src/web/createUnistylesComponent.d.ts +3 -0
- package/lib/typescript/src/web/createUnistylesComponent.d.ts.map +1 -0
- package/lib/typescript/src/web/index.d.ts +2 -1
- package/lib/typescript/src/web/index.d.ts.map +1 -1
- package/lib/typescript/src/web/listener/index.d.ts +1 -0
- package/lib/typescript/src/web/listener/index.d.ts.map +1 -1
- package/lib/typescript/src/web/listener/listenToDependencies.d.ts +12 -0
- package/lib/typescript/src/web/listener/listenToDependencies.d.ts.map +1 -0
- package/lib/typescript/src/web/listener/listener.d.ts +2 -1
- package/lib/typescript/src/web/listener/listener.d.ts.map +1 -1
- package/lib/typescript/src/web/mock.d.ts +0 -9
- package/lib/typescript/src/web/mock.d.ts.map +1 -1
- package/lib/typescript/src/web/pseudo.d.ts +4 -2
- package/lib/typescript/src/web/pseudo.d.ts.map +1 -1
- package/lib/typescript/src/web/registry.d.ts +1 -1
- package/lib/typescript/src/web/registry.d.ts.map +1 -1
- package/lib/typescript/src/web/runtime.d.ts +0 -1
- package/lib/typescript/src/web/runtime.d.ts.map +1 -1
- package/lib/typescript/src/web/shadowRegistry.d.ts +17 -0
- package/lib/typescript/src/web/shadowRegistry.d.ts.map +1 -0
- package/lib/typescript/src/web/state.d.ts +0 -5
- package/lib/typescript/src/web/state.d.ts.map +1 -1
- package/lib/typescript/src/web/utils.d.ts +22 -7
- package/lib/typescript/src/web/utils.d.ts.map +1 -1
- package/lib/typescript/src/web/variants/useVariants.d.ts.map +1 -1
- package/nitrogen/generated/android/c++/JHybridNativePlatformSpec.hpp +6 -3
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/unistyles/HybridNativePlatformSpec.kt +8 -3
- package/nitrogen/generated/ios/c++/HybridNativePlatformSpecSwift.hpp +1 -1
- package/nitrogen/generated/ios/swift/HybridNativePlatformSpec.swift +1 -1
- package/nitrogen/generated/ios/swift/HybridNativePlatformSpecCxx.swift +14 -2
- package/nitrogen/generated/shared/c++/HybridNativePlatformSpec.hpp +3 -0
- package/nitrogen/generated/shared/c++/HybridUnistylesNavigationBarSpec.hpp +3 -0
- package/nitrogen/generated/shared/c++/HybridUnistylesRuntimeSpec.hpp +3 -0
- package/nitrogen/generated/shared/c++/HybridUnistylesShadowRegistrySpec.hpp +3 -0
- package/nitrogen/generated/shared/c++/HybridUnistylesStatusBarSpec.hpp +3 -0
- package/nitrogen/generated/shared/c++/HybridUnistylesStyleSheetSpec.cpp +1 -1
- package/nitrogen/generated/shared/c++/HybridUnistylesStyleSheetSpec.hpp +4 -1
- package/package.json +3 -3
- package/plugin/index.js +31 -0
- package/src/index.ts +3 -0
- package/src/specs/ShadowRegistry/index.ts +7 -1
- package/src/web/convert/index.ts +1 -1
- package/src/web/create.ts +24 -79
- package/src/web/createUnistylesComponent.tsx +56 -0
- package/src/web/index.ts +3 -2
- package/src/web/listener/index.ts +1 -0
- package/src/web/listener/listenToDependencies.ts +50 -0
- package/src/web/listener/listener.ts +1 -1
- package/src/web/mock.ts +0 -10
- package/src/web/pseudo.ts +131 -5
- package/src/web/registry.ts +3 -5
- package/src/web/runtime.ts +0 -2
- package/src/web/shadowRegistry.ts +121 -0
- package/src/web/state.ts +0 -44
- package/src/web/utils.ts +90 -16
- package/src/web/variants/useVariants.ts +18 -32
package/nitrogen/generated/android/kotlin/com/margelo/nitro/unistyles/HybridNativePlatformSpec.kt
CHANGED
|
@@ -21,10 +21,8 @@ import com.margelo.nitro.core.*
|
|
|
21
21
|
@Keep
|
|
22
22
|
@Suppress("RedundantSuppression", "KotlinJniMissingFunction", "PropertyName", "RedundantUnitReturnType", "unused")
|
|
23
23
|
abstract class HybridNativePlatformSpec: HybridObject() {
|
|
24
|
-
protected val TAG = "HybridNativePlatformSpec"
|
|
25
|
-
|
|
26
24
|
@DoNotStrip
|
|
27
|
-
|
|
25
|
+
private var mHybridData: HybridData = initHybrid()
|
|
28
26
|
|
|
29
27
|
init {
|
|
30
28
|
// Pass this `HybridData` through to it's base class,
|
|
@@ -32,6 +30,13 @@ abstract class HybridNativePlatformSpec: HybridObject() {
|
|
|
32
30
|
super.updateNative(mHybridData)
|
|
33
31
|
}
|
|
34
32
|
|
|
33
|
+
/**
|
|
34
|
+
* Call from a child class to initialize HybridData with a child.
|
|
35
|
+
*/
|
|
36
|
+
override fun updateNative(hybridData: HybridData) {
|
|
37
|
+
mHybridData = hybridData
|
|
38
|
+
}
|
|
39
|
+
|
|
35
40
|
// Properties
|
|
36
41
|
|
|
37
42
|
|
|
@@ -55,7 +55,7 @@ namespace margelo::nitro::unistyles {
|
|
|
55
55
|
* the future, HybridNativePlatformSpecCxx can directly inherit from the C++ class HybridNativePlatformSpec
|
|
56
56
|
* to simplify the whole structure and memory management.
|
|
57
57
|
*/
|
|
58
|
-
class HybridNativePlatformSpecSwift
|
|
58
|
+
class HybridNativePlatformSpecSwift: public virtual HybridNativePlatformSpec {
|
|
59
59
|
public:
|
|
60
60
|
// Constructor from a Swift instance
|
|
61
61
|
explicit HybridNativePlatformSpecSwift(const Unistyles::HybridNativePlatformSpecCxx& swiftPart):
|
|
@@ -17,7 +17,7 @@ import NitroModules
|
|
|
17
17
|
* - Other HybridObjects need to be wrapped/unwrapped from the Swift TCxx wrapper
|
|
18
18
|
* - Throwing methods need to be wrapped with a Result<T, Error> type, as exceptions cannot be propagated to C++
|
|
19
19
|
*/
|
|
20
|
-
public
|
|
20
|
+
public class HybridNativePlatformSpecCxx {
|
|
21
21
|
/**
|
|
22
22
|
* The Swift <> C++ bridge's namespace (`margelo::nitro::unistyles::bridge::swift`)
|
|
23
23
|
* from `Unistyles-Swift-Cxx-Bridge.hpp`.
|
|
@@ -28,7 +28,15 @@ public final class HybridNativePlatformSpecCxx {
|
|
|
28
28
|
/**
|
|
29
29
|
* Holds an instance of the `HybridNativePlatformSpec` Swift protocol.
|
|
30
30
|
*/
|
|
31
|
-
private
|
|
31
|
+
private var implementation: HybridNativePlatformSpec
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Get the actual `HybridNativePlatformSpec` instance this class wraps.
|
|
35
|
+
*/
|
|
36
|
+
@inline(__always)
|
|
37
|
+
public func getHybridNativePlatformSpec() -> HybridNativePlatformSpec {
|
|
38
|
+
return implementation
|
|
39
|
+
}
|
|
32
40
|
|
|
33
41
|
/**
|
|
34
42
|
* Create a new `HybridNativePlatformSpecCxx` that wraps the given `HybridNativePlatformSpec`.
|
|
@@ -36,15 +44,18 @@ public final class HybridNativePlatformSpecCxx {
|
|
|
36
44
|
*/
|
|
37
45
|
public init(_ implementation: HybridNativePlatformSpec) {
|
|
38
46
|
self.implementation = implementation
|
|
47
|
+
/* no base class */
|
|
39
48
|
}
|
|
40
49
|
|
|
41
50
|
/**
|
|
42
51
|
* Contains a (weak) reference to the C++ HybridObject to cache it.
|
|
43
52
|
*/
|
|
44
53
|
public var hybridContext: margelo.nitro.HybridContext {
|
|
54
|
+
@inline(__always)
|
|
45
55
|
get {
|
|
46
56
|
return self.implementation.hybridContext
|
|
47
57
|
}
|
|
58
|
+
@inline(__always)
|
|
48
59
|
set {
|
|
49
60
|
self.implementation.hybridContext = newValue
|
|
50
61
|
}
|
|
@@ -54,6 +65,7 @@ public final class HybridNativePlatformSpecCxx {
|
|
|
54
65
|
* Get the memory size of the Swift class (plus size of any other allocations)
|
|
55
66
|
* so the JS VM can properly track it and garbage-collect the JS object if needed.
|
|
56
67
|
*/
|
|
68
|
+
@inline(__always)
|
|
57
69
|
public var memorySize: Int {
|
|
58
70
|
return self.implementation.memorySize
|
|
59
71
|
}
|
|
@@ -43,9 +43,12 @@ namespace margelo::nitro::unistyles {
|
|
|
43
43
|
/**
|
|
44
44
|
* An abstract base class for `NativePlatform`
|
|
45
45
|
* Inherit this class to create instances of `HybridNativePlatformSpec` in C++.
|
|
46
|
+
* You must explicitly call `HybridObject`'s constructor yourself, because it is virtual.
|
|
46
47
|
* @example
|
|
47
48
|
* ```cpp
|
|
48
49
|
* class HybridNativePlatform: public HybridNativePlatformSpec {
|
|
50
|
+
* public:
|
|
51
|
+
* HybridNativePlatform(...): HybridObject(TAG) { ... }
|
|
49
52
|
* // ...
|
|
50
53
|
* };
|
|
51
54
|
* ```
|
|
@@ -24,9 +24,12 @@ namespace margelo::nitro::unistyles {
|
|
|
24
24
|
/**
|
|
25
25
|
* An abstract base class for `UnistylesNavigationBar`
|
|
26
26
|
* Inherit this class to create instances of `HybridUnistylesNavigationBarSpec` in C++.
|
|
27
|
+
* You must explicitly call `HybridObject`'s constructor yourself, because it is virtual.
|
|
27
28
|
* @example
|
|
28
29
|
* ```cpp
|
|
29
30
|
* class HybridUnistylesNavigationBar: public HybridUnistylesNavigationBarSpec {
|
|
31
|
+
* public:
|
|
32
|
+
* HybridUnistylesNavigationBar(...): HybridObject(TAG) { ... }
|
|
30
33
|
* // ...
|
|
31
34
|
* };
|
|
32
35
|
* ```
|
|
@@ -39,9 +39,12 @@ namespace margelo::nitro::unistyles {
|
|
|
39
39
|
/**
|
|
40
40
|
* An abstract base class for `UnistylesRuntime`
|
|
41
41
|
* Inherit this class to create instances of `HybridUnistylesRuntimeSpec` in C++.
|
|
42
|
+
* You must explicitly call `HybridObject`'s constructor yourself, because it is virtual.
|
|
42
43
|
* @example
|
|
43
44
|
* ```cpp
|
|
44
45
|
* class HybridUnistylesRuntime: public HybridUnistylesRuntimeSpec {
|
|
46
|
+
* public:
|
|
47
|
+
* HybridUnistylesRuntime(...): HybridObject(TAG) { ... }
|
|
45
48
|
* // ...
|
|
46
49
|
* };
|
|
47
50
|
* ```
|
|
@@ -24,9 +24,12 @@ namespace margelo::nitro::unistyles {
|
|
|
24
24
|
/**
|
|
25
25
|
* An abstract base class for `UnistylesShadowRegistry`
|
|
26
26
|
* Inherit this class to create instances of `HybridUnistylesShadowRegistrySpec` in C++.
|
|
27
|
+
* You must explicitly call `HybridObject`'s constructor yourself, because it is virtual.
|
|
27
28
|
* @example
|
|
28
29
|
* ```cpp
|
|
29
30
|
* class HybridUnistylesShadowRegistry: public HybridUnistylesShadowRegistrySpec {
|
|
31
|
+
* public:
|
|
32
|
+
* HybridUnistylesShadowRegistry(...): HybridObject(TAG) { ... }
|
|
30
33
|
* // ...
|
|
31
34
|
* };
|
|
32
35
|
* ```
|
|
@@ -24,9 +24,12 @@ namespace margelo::nitro::unistyles {
|
|
|
24
24
|
/**
|
|
25
25
|
* An abstract base class for `UnistylesStatusBar`
|
|
26
26
|
* Inherit this class to create instances of `HybridUnistylesStatusBarSpec` in C++.
|
|
27
|
+
* You must explicitly call `HybridObject`'s constructor yourself, because it is virtual.
|
|
27
28
|
* @example
|
|
28
29
|
* ```cpp
|
|
29
30
|
* class HybridUnistylesStatusBar: public HybridUnistylesStatusBarSpec {
|
|
31
|
+
* public:
|
|
32
|
+
* HybridUnistylesStatusBar(...): HybridObject(TAG) { ... }
|
|
30
33
|
* // ...
|
|
31
34
|
* };
|
|
32
35
|
* ```
|
|
@@ -15,7 +15,7 @@ namespace margelo::nitro::unistyles {
|
|
|
15
15
|
// load custom methods/properties
|
|
16
16
|
registerHybrids(this, [](Prototype& prototype) {
|
|
17
17
|
prototype.registerHybridGetter("hairlineWidth", &HybridUnistylesStyleSheetSpec::getHairlineWidth);
|
|
18
|
-
prototype.registerHybridGetter("
|
|
18
|
+
prototype.registerHybridGetter("__unid", &HybridUnistylesStyleSheetSpec::get__unid);
|
|
19
19
|
});
|
|
20
20
|
}
|
|
21
21
|
|
|
@@ -24,9 +24,12 @@ namespace margelo::nitro::unistyles {
|
|
|
24
24
|
/**
|
|
25
25
|
* An abstract base class for `UnistylesStyleSheet`
|
|
26
26
|
* Inherit this class to create instances of `HybridUnistylesStyleSheetSpec` in C++.
|
|
27
|
+
* You must explicitly call `HybridObject`'s constructor yourself, because it is virtual.
|
|
27
28
|
* @example
|
|
28
29
|
* ```cpp
|
|
29
30
|
* class HybridUnistylesStyleSheet: public HybridUnistylesStyleSheetSpec {
|
|
31
|
+
* public:
|
|
32
|
+
* HybridUnistylesStyleSheet(...): HybridObject(TAG) { ... }
|
|
30
33
|
* // ...
|
|
31
34
|
* };
|
|
32
35
|
* ```
|
|
@@ -42,7 +45,7 @@ namespace margelo::nitro::unistyles {
|
|
|
42
45
|
public:
|
|
43
46
|
// Properties
|
|
44
47
|
virtual double getHairlineWidth() = 0;
|
|
45
|
-
virtual double
|
|
48
|
+
virtual double get__unid() = 0;
|
|
46
49
|
|
|
47
50
|
public:
|
|
48
51
|
// Methods
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-native-unistyles",
|
|
3
|
-
"version": "3.0.0-alpha.
|
|
3
|
+
"version": "3.0.0-alpha.15",
|
|
4
4
|
"description": "Level up your React Native StyleSheet",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"test": "jest",
|
|
@@ -74,11 +74,11 @@
|
|
|
74
74
|
"husky": "9.1.5",
|
|
75
75
|
"jest": "29.7.0",
|
|
76
76
|
"metro-react-native-babel-preset": "0.77.0",
|
|
77
|
-
"nitro-codegen": "0.
|
|
77
|
+
"nitro-codegen": "0.11.0",
|
|
78
78
|
"react": "18.3.1",
|
|
79
79
|
"react-native": "0.75.2",
|
|
80
80
|
"react-native-builder-bob": "0.30.0",
|
|
81
|
-
"react-native-nitro-modules": "0.
|
|
81
|
+
"react-native-nitro-modules": "0.11.0",
|
|
82
82
|
"react-native-web": "0.19.12",
|
|
83
83
|
"react-test-renderer": "18.3.1",
|
|
84
84
|
"release-it": "17.6.0",
|
package/plugin/index.js
CHANGED
|
@@ -42,6 +42,37 @@ module.exports = function ({ types: t }) {
|
|
|
42
42
|
}
|
|
43
43
|
}
|
|
44
44
|
},
|
|
45
|
+
FunctionDeclaration(path, state) {
|
|
46
|
+
const componentName = path.node.id
|
|
47
|
+
? path.node.id.name
|
|
48
|
+
: null
|
|
49
|
+
|
|
50
|
+
if (componentName) {
|
|
51
|
+
state.file.hasVariants = false
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
ClassDeclaration(path, state) {
|
|
55
|
+
const componentName = path.node.id
|
|
56
|
+
? path.node.id.name
|
|
57
|
+
: null
|
|
58
|
+
|
|
59
|
+
if (componentName) {
|
|
60
|
+
state.file.hasVariants = false
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
VariableDeclaration(path, state) {
|
|
64
|
+
path.node.declarations.forEach((declaration) => {
|
|
65
|
+
if (t.isArrowFunctionExpression(declaration.init) || t.isFunctionExpression(declaration.init)) {
|
|
66
|
+
const componentName = declaration.id
|
|
67
|
+
? declaration.id.name
|
|
68
|
+
: null
|
|
69
|
+
|
|
70
|
+
if (componentName) {
|
|
71
|
+
state.file.hasVariants = false
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
})
|
|
75
|
+
},
|
|
45
76
|
ImportDeclaration(path, state) {
|
|
46
77
|
const importSource = path.node.source.value
|
|
47
78
|
|
package/src/index.ts
CHANGED
|
@@ -3,6 +3,9 @@ import React from 'react'
|
|
|
3
3
|
export * from './specs'
|
|
4
4
|
export { mq } from './mq'
|
|
5
5
|
export type { UnistylesThemes, UnistylesBreakpoints } from './global'
|
|
6
|
+
// TODO: export Native createUnistylesComponent
|
|
7
|
+
// can't import it this way, it will break native build
|
|
8
|
+
// export { createUnistylesComponent } from './web/createUnistylesComponent'
|
|
6
9
|
|
|
7
10
|
// todo verify true min version
|
|
8
11
|
const minReactVersionRequiredByUnistyles = '18.3.1'
|
|
@@ -27,7 +27,13 @@ const findShadowNodeForHandle = (handle: ViewHandle) => {
|
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
HybridShadowRegistry.add = (handle, style, variants, args) => {
|
|
30
|
-
|
|
30
|
+
// virtualized nodes can be null
|
|
31
|
+
if (!handle || !style) {
|
|
32
|
+
return
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// at this point unistyle can be only object or dynamic function
|
|
36
|
+
if (typeof style !== 'object' && typeof style !== 'function') {
|
|
31
37
|
return
|
|
32
38
|
}
|
|
33
39
|
|
package/src/web/convert/index.ts
CHANGED
|
@@ -21,7 +21,7 @@ export const convertToTypeStyle = (value: UnistylesValues) => {
|
|
|
21
21
|
...value._web
|
|
22
22
|
}).flatMap(([unistylesKey, unistylesValue]) => {
|
|
23
23
|
// Keys to omit
|
|
24
|
-
if (['_css', '_web', 'variants', 'compoundVariants', 'uni__dependencies'].includes(unistylesKey)) {
|
|
24
|
+
if (['_css', '_web', 'variants', 'compoundVariants', 'uni__dependencies', '__unistyles-secrets__'].includes(unistylesKey) || unistylesKey.startsWith('variant-')) {
|
|
25
25
|
return []
|
|
26
26
|
}
|
|
27
27
|
|
package/src/web/create.ts
CHANGED
|
@@ -1,105 +1,50 @@
|
|
|
1
|
-
import type { TypeStyle } from 'typestyle'
|
|
2
1
|
import type { ReactNativeStyleSheet } from '../types'
|
|
3
2
|
import type { StyleSheetWithSuperPowers, StyleSheet } from '../types/stylesheet'
|
|
4
|
-
import {
|
|
5
|
-
import { keyInObject, reduceObject, toReactNativeClassName } from './utils'
|
|
3
|
+
import { assignSecrets, reduceObject, getStyles } from './utils'
|
|
6
4
|
import { UnistylesRuntime } from './runtime'
|
|
7
5
|
import { createUseVariants, getVariants } from './variants'
|
|
8
|
-
import { UnistylesListener } from './listener'
|
|
9
|
-
import type { UnistyleDependency } from '../specs/NativePlatform'
|
|
10
|
-
|
|
11
|
-
type ListenToDependenciesProps = {
|
|
12
|
-
value: StyleSheet[keyof StyleSheet],
|
|
13
|
-
key: PropertyKey,
|
|
14
|
-
unistyles: TypeStyle,
|
|
15
|
-
className: string,
|
|
16
|
-
args?: Array<any>
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
type WebUnistyle = ReturnType<typeof UnistylesRegistry.createStyles>
|
|
20
6
|
|
|
21
7
|
export const create = (stylesheet: StyleSheetWithSuperPowers<StyleSheet>) => {
|
|
22
8
|
const computedStylesheet = typeof stylesheet === 'function'
|
|
23
9
|
? stylesheet(UnistylesRuntime.theme, UnistylesRuntime.miniRuntime)
|
|
24
10
|
: stylesheet
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
const
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
const newComputedStylesheet = typeof stylesheet === 'function'
|
|
36
|
-
? stylesheet(UnistylesRuntime.theme, UnistylesRuntime.miniRuntime)
|
|
37
|
-
: stylesheet
|
|
38
|
-
|
|
39
|
-
if (!keyInObject(newComputedStylesheet, key)) {
|
|
40
|
-
return
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
const value = newComputedStylesheet[key]!
|
|
44
|
-
const result = typeof value === 'function'
|
|
45
|
-
? value(...args)
|
|
46
|
-
: value
|
|
11
|
+
const selectedVariants = new Map<string, any>()
|
|
12
|
+
|
|
13
|
+
const copyVariants = () => Object.fromEntries(selectedVariants.entries())
|
|
14
|
+
const addSecrets = (value: any, key: string, args?: Array<any>) => assignSecrets(value, {
|
|
15
|
+
__uni__key: key,
|
|
16
|
+
__uni__refs: new Set(),
|
|
17
|
+
__uni__stylesheet: stylesheet,
|
|
18
|
+
__uni__args: args,
|
|
19
|
+
__uni__variants: copyVariants()
|
|
20
|
+
})
|
|
47
21
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
}
|
|
22
|
+
const styles = reduceObject(computedStylesheet, (value, _key) => {
|
|
23
|
+
const key = String(_key)
|
|
51
24
|
|
|
52
|
-
const styles = reduceObject(computedStylesheet, (value, key) => {
|
|
53
25
|
if (typeof value === 'function') {
|
|
54
|
-
const
|
|
55
|
-
const disposeByRef = new Map<HTMLElement, VoidFunction | undefined>()
|
|
56
|
-
|
|
57
|
-
return (...args: Array<any>) => {
|
|
58
|
-
const [ref] = args.slice(-1)
|
|
26
|
+
const dynamicStyle = (...args: Array<any>) => {
|
|
59
27
|
const result = value(...args)
|
|
60
|
-
const variants = Object.fromEntries(getVariants({ [key]: result } as ReactNativeStyleSheet<StyleSheet>,
|
|
28
|
+
const variants = Object.fromEntries(getVariants({ [key]: result } as ReactNativeStyleSheet<StyleSheet>, copyVariants()))
|
|
61
29
|
const resultWithVariants = {
|
|
62
30
|
...result,
|
|
63
31
|
...variants[key]
|
|
64
32
|
}
|
|
65
33
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
const webUnistyle = storedWebUnistyle ?? UnistylesRegistry.createStyles(resultWithVariants, key)
|
|
69
|
-
|
|
70
|
-
webUnistyleByRef.set(ref, webUnistyle)
|
|
71
|
-
disposeByRef.get(ref)?.()
|
|
72
|
-
disposeByRef.set(ref, listenToDependencies({
|
|
73
|
-
key,
|
|
74
|
-
value,
|
|
75
|
-
unistyles: webUnistyle.unistyles,
|
|
76
|
-
className: webUnistyle.className,
|
|
77
|
-
args
|
|
78
|
-
}))
|
|
79
|
-
ref.classList.add(webUnistyle.className)
|
|
80
|
-
|
|
81
|
-
if (storedWebUnistyle) {
|
|
82
|
-
UnistylesRegistry.updateStyles(webUnistyle.unistyles, resultWithVariants, webUnistyle.className)
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
return
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
return toReactNativeClassName(null, resultWithVariants)
|
|
34
|
+
// Add secrets to result of dynamic styles function
|
|
35
|
+
return addSecrets(getStyles(resultWithVariants), key, args)
|
|
90
36
|
}
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
const { className, unistyles } = UnistylesRegistry.createStyles(value, key)
|
|
94
37
|
|
|
95
|
-
|
|
38
|
+
// Add secrets to dynamic styles function
|
|
39
|
+
return addSecrets(dynamicStyle, key)
|
|
40
|
+
}
|
|
96
41
|
|
|
97
|
-
|
|
42
|
+
// Add secrets to static styles
|
|
43
|
+
return addSecrets(getStyles(value), key)
|
|
98
44
|
}) as ReactNativeStyleSheet<StyleSheet>
|
|
99
45
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
})
|
|
46
|
+
// Inject useVariants hook to styles
|
|
47
|
+
createUseVariants(styles, newVariants => Object.entries(newVariants).forEach(([key, value]) => selectedVariants.set(key, value)))
|
|
103
48
|
|
|
104
49
|
return styles
|
|
105
50
|
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import React, { useEffect, useState } from 'react'
|
|
2
|
+
import { extractHiddenProperties, extractSecrets } from './utils'
|
|
3
|
+
import { UnistylesRuntime } from './runtime'
|
|
4
|
+
import { getVariants } from './variants'
|
|
5
|
+
import { UnistylesListener } from './listener'
|
|
6
|
+
|
|
7
|
+
const getStyles = (value: Record<string, any>) => {
|
|
8
|
+
const secrets = extractSecrets(value)
|
|
9
|
+
|
|
10
|
+
if (secrets.length === 0) {
|
|
11
|
+
return undefined
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
return secrets.reduce((acc, { __uni__stylesheet, __uni__key, __uni__args = [], __uni__variants }) => {
|
|
15
|
+
const newComputedStylesheet = typeof __uni__stylesheet === 'function'
|
|
16
|
+
? __uni__stylesheet(UnistylesRuntime.theme, UnistylesRuntime.miniRuntime)
|
|
17
|
+
: __uni__stylesheet
|
|
18
|
+
const style = newComputedStylesheet[__uni__key]
|
|
19
|
+
const resultHidden = typeof style === 'function'
|
|
20
|
+
? style(...__uni__args)
|
|
21
|
+
: style
|
|
22
|
+
const result = extractHiddenProperties(resultHidden)
|
|
23
|
+
const { variants } = Object.fromEntries(getVariants({ variants: result }, __uni__variants ))
|
|
24
|
+
const resultWithVariants = {
|
|
25
|
+
...result,
|
|
26
|
+
...variants
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
return {
|
|
30
|
+
...acc,
|
|
31
|
+
...resultWithVariants
|
|
32
|
+
}
|
|
33
|
+
}, {} as Record<string, any>)
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export const createUnistylesComponent = <TProps extends object>(Component: React.ComponentType<TProps>) => (props: TProps) => {
|
|
37
|
+
const passedStyles = (props as TProps & { style: Record<string, any> }).style ?? {}
|
|
38
|
+
const [style, setStyle] = useState(getStyles(passedStyles))
|
|
39
|
+
|
|
40
|
+
useEffect(() => {
|
|
41
|
+
const newStyles = getStyles(passedStyles)
|
|
42
|
+
const dependencies = newStyles?.['uni__dependencies'] ?? []
|
|
43
|
+
const dispose = UnistylesListener.addListeners(dependencies, () => setStyle(getStyles(passedStyles)))
|
|
44
|
+
|
|
45
|
+
setStyle(newStyles)
|
|
46
|
+
|
|
47
|
+
return dispose
|
|
48
|
+
}, [passedStyles])
|
|
49
|
+
|
|
50
|
+
return (
|
|
51
|
+
<Component
|
|
52
|
+
{...props}
|
|
53
|
+
style={style}
|
|
54
|
+
/>
|
|
55
|
+
)
|
|
56
|
+
}
|
package/src/web/index.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { create } from './create'
|
|
2
|
-
import { UnistylesRuntime } from './runtime'
|
|
3
2
|
import { UnistylesState } from './state'
|
|
4
3
|
import { deepMergeObjects } from './utils'
|
|
5
4
|
|
|
@@ -19,6 +18,8 @@ export const StyleSheet = {
|
|
|
19
18
|
}
|
|
20
19
|
|
|
21
20
|
export { UnistylesRuntime } from './runtime'
|
|
21
|
+
export { UnistylesShadowRegistry } from './shadowRegistry'
|
|
22
22
|
export * from './mock'
|
|
23
23
|
|
|
24
|
-
|
|
24
|
+
// TODO: Work on SSR
|
|
25
|
+
export const getSSRUnistyles = () => []
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { TypeStyle } from 'typestyle'
|
|
2
|
+
import type { StyleSheet, StyleSheetWithSuperPowers } from '../../types/stylesheet'
|
|
3
|
+
import type { UnistyleDependency } from '../../specs/NativePlatform'
|
|
4
|
+
import { UnistylesListener } from './listener'
|
|
5
|
+
import { UnistylesRuntime } from '../runtime'
|
|
6
|
+
import { keyInObject } from '../utils'
|
|
7
|
+
import { UnistylesRegistry } from '../registry'
|
|
8
|
+
|
|
9
|
+
type ListenToDependenciesProps = {
|
|
10
|
+
key: PropertyKey,
|
|
11
|
+
unistyles: TypeStyle,
|
|
12
|
+
className: string,
|
|
13
|
+
stylesheet: StyleSheetWithSuperPowers<StyleSheet>
|
|
14
|
+
args?: Array<any>
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export const listenToDependencies = ({ key, className, unistyles, args = [], stylesheet }: ListenToDependenciesProps) => {
|
|
18
|
+
const newComputedStylesheet = typeof stylesheet === 'function'
|
|
19
|
+
? stylesheet(UnistylesRuntime.theme, UnistylesRuntime.miniRuntime)
|
|
20
|
+
: stylesheet
|
|
21
|
+
const _value = keyInObject(newComputedStylesheet, key) ? newComputedStylesheet[key] : undefined
|
|
22
|
+
|
|
23
|
+
if (!_value) {
|
|
24
|
+
return
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const value = typeof _value === 'function' ? _value(...args) : _value
|
|
28
|
+
const dependencies = ('uni__dependencies' in value ? value['uni__dependencies'] : []) as Array<UnistyleDependency>
|
|
29
|
+
|
|
30
|
+
if (dependencies.length === 0) {
|
|
31
|
+
return
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
return UnistylesListener.addListeners(dependencies, () => {
|
|
35
|
+
const newComputedStylesheet = typeof stylesheet === 'function'
|
|
36
|
+
? stylesheet(UnistylesRuntime.theme, UnistylesRuntime.miniRuntime)
|
|
37
|
+
: stylesheet
|
|
38
|
+
|
|
39
|
+
if (!keyInObject(newComputedStylesheet, key)) {
|
|
40
|
+
return
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const value = newComputedStylesheet[key]!
|
|
44
|
+
const result = typeof value === 'function'
|
|
45
|
+
? value(...args)
|
|
46
|
+
: value
|
|
47
|
+
|
|
48
|
+
UnistylesRegistry.updateStyles(unistyles, result, className)
|
|
49
|
+
})
|
|
50
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { UnistyleDependency } from '../../specs/NativePlatform'
|
|
2
2
|
import { UnistylesRuntime } from '../runtime'
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
class UnistylesListenerBuilder {
|
|
5
5
|
private isInitialized = false
|
|
6
6
|
private listeners = Array.from({ length: Object.keys(UnistyleDependency).length / 2 }, () => new Set<VoidFunction>())
|
|
7
7
|
|
package/src/web/mock.ts
CHANGED
|
@@ -23,13 +23,3 @@ export const NavigationBar: NavigationBarSpec = {
|
|
|
23
23
|
__type: 'web',
|
|
24
24
|
name: 'NavigationBar'
|
|
25
25
|
}
|
|
26
|
-
|
|
27
|
-
export const UnistylesShadowRegistry = {
|
|
28
|
-
name: 'UnistylesShadowRegistry',
|
|
29
|
-
__type: 'web',
|
|
30
|
-
equals: () => true,
|
|
31
|
-
toString: () => 'UnistylesShadowRegistry',
|
|
32
|
-
dispose: () => {},
|
|
33
|
-
add: () => {},
|
|
34
|
-
remove: () => {},
|
|
35
|
-
}
|