@vsreact/core 0.0.24 → 0.0.25
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/dist/hooks.d.ts +10 -0
- package/dist/hooks.js +15 -0
- package/dist/index.d.ts +3 -2
- package/dist/index.js +2 -2
- package/dist/tw.js +12 -0
- package/package.json +1 -1
- package/src/hooks.ts +24 -0
- package/src/index.ts +3 -1
- package/src/layout.test.tsx +19 -0
- package/src/tw.test.ts +14 -0
- package/src/tw.ts +12 -0
package/dist/hooks.d.ts
CHANGED
|
@@ -22,6 +22,16 @@ export declare function useNativeEvent(name: string, handler: (payload: any) =>
|
|
|
22
22
|
* <Meter value={meter.level} />
|
|
23
23
|
*/
|
|
24
24
|
export declare function useNativeValue<T = any>(name: string, initial: T): T;
|
|
25
|
+
export interface RootSize {
|
|
26
|
+
width: number;
|
|
27
|
+
height: number;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* The editor's current size. The native side sends a "resize" event at
|
|
31
|
+
* mount (so this resolves on the first committed frame) and on every
|
|
32
|
+
* host resize — the foundation for resizable editors.
|
|
33
|
+
*/
|
|
34
|
+
export declare function useRootSize(): RootSize;
|
|
25
35
|
/**
|
|
26
36
|
* The value, but only after it has stopped changing for `delayMs` —
|
|
27
37
|
* classic input debouncing for expensive native calls:
|
package/dist/hooks.js
CHANGED
|
@@ -35,6 +35,21 @@ export function useNativeValue(name, initial) {
|
|
|
35
35
|
useNativeEvent(name, setValue);
|
|
36
36
|
return value;
|
|
37
37
|
}
|
|
38
|
+
/**
|
|
39
|
+
* The editor's current size. The native side sends a "resize" event at
|
|
40
|
+
* mount (so this resolves on the first committed frame) and on every
|
|
41
|
+
* host resize — the foundation for resizable editors.
|
|
42
|
+
*/
|
|
43
|
+
export function useRootSize() {
|
|
44
|
+
const [size, setSize] = useState({ width: 0, height: 0 });
|
|
45
|
+
useNativeEvent("resize", (payload) => {
|
|
46
|
+
const width = Number(payload?.width);
|
|
47
|
+
const height = Number(payload?.height);
|
|
48
|
+
if (Number.isFinite(width) && Number.isFinite(height))
|
|
49
|
+
setSize((s) => (s.width === width && s.height === height ? s : { width, height }));
|
|
50
|
+
});
|
|
51
|
+
return size;
|
|
52
|
+
}
|
|
38
53
|
/**
|
|
39
54
|
* The value, but only after it has stopped changing for `delayMs` —
|
|
40
55
|
* classic input debouncing for expensive native calls:
|
package/dist/index.d.ts
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import "./runtime";
|
|
2
2
|
import "./bridge";
|
|
3
3
|
/** The SDK version — stamp it on support dumps and analytics. */
|
|
4
|
-
export declare const VERSION = "0.0.
|
|
4
|
+
export declare const VERSION = "0.0.25";
|
|
5
5
|
export { View, Text, Image, TextInput, NativeView, Svg, SvgPath } from "./primitives";
|
|
6
6
|
export type { CommonProps, TextProps, ImageProps, TextInputProps, NativeViewProps, SvgProps, SvgPathProps, } from "./primitives";
|
|
7
7
|
export { render, unmount } from "./render";
|
|
8
8
|
export { native } from "./native";
|
|
9
|
-
export { useNativeEvent, useNativeValue, useDebounced, useThrottled, usePrevious, useToggle, useInterval, useHover, useLayoutRect, } from "./hooks";
|
|
9
|
+
export { useNativeEvent, useNativeValue, useRootSize, useDebounced, useThrottled, usePrevious, useToggle, useInterval, useHover, useLayoutRect, } from "./hooks";
|
|
10
|
+
export type { RootSize } from "./hooks";
|
|
10
11
|
export { useOverlay, OverlayLayer } from "./overlay";
|
|
11
12
|
export { Tooltip, Modal } from "./popover";
|
|
12
13
|
export type { TooltipProps, ModalProps } from "./popover";
|
package/dist/index.js
CHANGED
|
@@ -3,11 +3,11 @@
|
|
|
3
3
|
import "./runtime";
|
|
4
4
|
import "./bridge";
|
|
5
5
|
/** The SDK version — stamp it on support dumps and analytics. */
|
|
6
|
-
export const VERSION = "0.0.
|
|
6
|
+
export const VERSION = "0.0.25";
|
|
7
7
|
export { View, Text, Image, TextInput, NativeView, Svg, SvgPath } from "./primitives";
|
|
8
8
|
export { render, unmount } from "./render";
|
|
9
9
|
export { native } from "./native";
|
|
10
|
-
export { useNativeEvent, useNativeValue, useDebounced, useThrottled, usePrevious, useToggle, useInterval, useHover, useLayoutRect, } from "./hooks";
|
|
10
|
+
export { useNativeEvent, useNativeValue, useRootSize, useDebounced, useThrottled, usePrevious, useToggle, useInterval, useHover, useLayoutRect, } from "./hooks";
|
|
11
11
|
export { useOverlay, OverlayLayer } from "./overlay";
|
|
12
12
|
export { Tooltip, Modal } from "./popover";
|
|
13
13
|
export { Button } from "./button";
|
package/dist/tw.js
CHANGED
|
@@ -80,6 +80,18 @@ const staticClasses = {
|
|
|
80
80
|
"cursor-not-allowed": { cursor: "not-allowed" },
|
|
81
81
|
"pointer-events-none": { pointerEvents: "none" },
|
|
82
82
|
"pointer-events-auto": { pointerEvents: "auto" },
|
|
83
|
+
hidden: { display: "none" },
|
|
84
|
+
invisible: { visibility: "hidden" },
|
|
85
|
+
visible: { visibility: "visible" },
|
|
86
|
+
"origin-center": { transformOriginX: 50, transformOriginY: 50 },
|
|
87
|
+
"origin-top": { transformOriginX: 50, transformOriginY: 0 },
|
|
88
|
+
"origin-bottom": { transformOriginX: 50, transformOriginY: 100 },
|
|
89
|
+
"origin-left": { transformOriginX: 0, transformOriginY: 50 },
|
|
90
|
+
"origin-right": { transformOriginX: 100, transformOriginY: 50 },
|
|
91
|
+
"origin-top-left": { transformOriginX: 0, transformOriginY: 0 },
|
|
92
|
+
"origin-top-right": { transformOriginX: 100, transformOriginY: 0 },
|
|
93
|
+
"origin-bottom-left": { transformOriginX: 0, transformOriginY: 100 },
|
|
94
|
+
"origin-bottom-right": { transformOriginX: 100, transformOriginY: 100 },
|
|
83
95
|
"border-solid": { borderStyle: "solid" },
|
|
84
96
|
"border-dashed": { borderStyle: "dashed" },
|
|
85
97
|
"border-dotted": { borderStyle: "dotted" },
|
package/package.json
CHANGED
package/src/hooks.ts
CHANGED
|
@@ -42,6 +42,30 @@ export function useNativeValue<T = any>(name: string, initial: T): T {
|
|
|
42
42
|
return value;
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
+
export interface RootSize {
|
|
46
|
+
width: number;
|
|
47
|
+
height: number;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* The editor's current size. The native side sends a "resize" event at
|
|
52
|
+
* mount (so this resolves on the first committed frame) and on every
|
|
53
|
+
* host resize — the foundation for resizable editors.
|
|
54
|
+
*/
|
|
55
|
+
export function useRootSize(): RootSize {
|
|
56
|
+
const [size, setSize] = useState<RootSize>({ width: 0, height: 0 });
|
|
57
|
+
|
|
58
|
+
useNativeEvent("resize", (payload) => {
|
|
59
|
+
const width = Number(payload?.width);
|
|
60
|
+
const height = Number(payload?.height);
|
|
61
|
+
|
|
62
|
+
if (Number.isFinite(width) && Number.isFinite(height))
|
|
63
|
+
setSize((s) => (s.width === width && s.height === height ? s : { width, height }));
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
return size;
|
|
67
|
+
}
|
|
68
|
+
|
|
45
69
|
/**
|
|
46
70
|
* The value, but only after it has stopped changing for `delayMs` —
|
|
47
71
|
* classic input debouncing for expensive native calls:
|
package/src/index.ts
CHANGED
|
@@ -4,7 +4,7 @@ import "./runtime";
|
|
|
4
4
|
import "./bridge";
|
|
5
5
|
|
|
6
6
|
/** The SDK version — stamp it on support dumps and analytics. */
|
|
7
|
-
export const VERSION = "0.0.
|
|
7
|
+
export const VERSION = "0.0.25";
|
|
8
8
|
|
|
9
9
|
export { View, Text, Image, TextInput, NativeView, Svg, SvgPath } from "./primitives";
|
|
10
10
|
export type {
|
|
@@ -21,6 +21,7 @@ export { native } from "./native";
|
|
|
21
21
|
export {
|
|
22
22
|
useNativeEvent,
|
|
23
23
|
useNativeValue,
|
|
24
|
+
useRootSize,
|
|
24
25
|
useDebounced,
|
|
25
26
|
useThrottled,
|
|
26
27
|
usePrevious,
|
|
@@ -29,6 +30,7 @@ export {
|
|
|
29
30
|
useHover,
|
|
30
31
|
useLayoutRect,
|
|
31
32
|
} from "./hooks";
|
|
33
|
+
export type { RootSize } from "./hooks";
|
|
32
34
|
export { useOverlay, OverlayLayer } from "./overlay";
|
|
33
35
|
export { Tooltip, Modal } from "./popover";
|
|
34
36
|
export type { TooltipProps, ModalProps } from "./popover";
|
package/src/layout.test.tsx
CHANGED
|
@@ -148,3 +148,22 @@ describe("Svg primitives (0.0.24)", () => {
|
|
|
148
148
|
expect(pathProps[2]).toMatchObject({ d: "M2 12 H22", fill: "none", stroke: "#00ff00", strokeWidth: 2 });
|
|
149
149
|
});
|
|
150
150
|
});
|
|
151
|
+
|
|
152
|
+
describe("useRootSize (0.0.25)", () => {
|
|
153
|
+
test("tracks resize events, ignores junk", async () => {
|
|
154
|
+
const { useRootSize } = require("./index");
|
|
155
|
+
let seen: any = null;
|
|
156
|
+
function Probe() {
|
|
157
|
+
seen = useRootSize();
|
|
158
|
+
return <View />;
|
|
159
|
+
}
|
|
160
|
+
render(<Probe />);
|
|
161
|
+
await new Promise((r) => setTimeout(r, 0));
|
|
162
|
+
|
|
163
|
+
expect(seen).toEqual({ width: 0, height: 0 });
|
|
164
|
+
dispatch({ kind: "native", name: "resize", payload: { width: 793, height: 496 } });
|
|
165
|
+
expect(seen).toEqual({ width: 793, height: 496 });
|
|
166
|
+
dispatch({ kind: "native", name: "resize", payload: { width: "nope" } });
|
|
167
|
+
expect(seen).toEqual({ width: 793, height: 496 });
|
|
168
|
+
});
|
|
169
|
+
});
|
package/src/tw.test.ts
CHANGED
|
@@ -262,3 +262,17 @@ describe("input & media classes (0.0.23)", () => {
|
|
|
262
262
|
expect(tw("cursor-grab").style).toEqual({ cursor: "grab" });
|
|
263
263
|
});
|
|
264
264
|
});
|
|
265
|
+
|
|
266
|
+
describe("layout & robustness classes (0.0.25)", () => {
|
|
267
|
+
test("hidden vs invisible", () => {
|
|
268
|
+
expect(tw("hidden").style).toEqual({ display: "none" });
|
|
269
|
+
expect(tw("invisible").style).toEqual({ visibility: "hidden" });
|
|
270
|
+
expect(tw("visible").style).toEqual({ visibility: "visible" });
|
|
271
|
+
});
|
|
272
|
+
|
|
273
|
+
test("percent translate and transform origin", () => {
|
|
274
|
+
expect(tw("translate-x-1/2").style).toEqual({ translateX: "50%" });
|
|
275
|
+
expect(tw("-translate-y-1/2").style).toEqual({ translateY: "-50%" });
|
|
276
|
+
expect(tw("origin-top-left").style).toEqual({ transformOriginX: 0, transformOriginY: 0 });
|
|
277
|
+
});
|
|
278
|
+
});
|
package/src/tw.ts
CHANGED
|
@@ -91,6 +91,18 @@ const staticClasses: Record<string, Style> = {
|
|
|
91
91
|
"cursor-not-allowed": { cursor: "not-allowed" },
|
|
92
92
|
"pointer-events-none": { pointerEvents: "none" },
|
|
93
93
|
"pointer-events-auto": { pointerEvents: "auto" },
|
|
94
|
+
hidden: { display: "none" },
|
|
95
|
+
invisible: { visibility: "hidden" },
|
|
96
|
+
visible: { visibility: "visible" },
|
|
97
|
+
"origin-center": { transformOriginX: 50, transformOriginY: 50 },
|
|
98
|
+
"origin-top": { transformOriginX: 50, transformOriginY: 0 },
|
|
99
|
+
"origin-bottom": { transformOriginX: 50, transformOriginY: 100 },
|
|
100
|
+
"origin-left": { transformOriginX: 0, transformOriginY: 50 },
|
|
101
|
+
"origin-right": { transformOriginX: 100, transformOriginY: 50 },
|
|
102
|
+
"origin-top-left": { transformOriginX: 0, transformOriginY: 0 },
|
|
103
|
+
"origin-top-right": { transformOriginX: 100, transformOriginY: 0 },
|
|
104
|
+
"origin-bottom-left": { transformOriginX: 0, transformOriginY: 100 },
|
|
105
|
+
"origin-bottom-right": { transformOriginX: 100, transformOriginY: 100 },
|
|
94
106
|
"border-solid": { borderStyle: "solid" },
|
|
95
107
|
"border-dashed": { borderStyle: "dashed" },
|
|
96
108
|
"border-dotted": { borderStyle: "dotted" },
|