@gtkx/animated 1.3.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/LICENSE +373 -0
- package/README.md +173 -0
- package/dist/animated.d.ts +20 -0
- package/dist/animated.d.ts.map +1 -0
- package/dist/animated.js +44 -0
- package/dist/animated.js.map +1 -0
- package/dist/apply-animated-values.d.ts +4 -0
- package/dist/apply-animated-values.d.ts.map +1 -0
- package/dist/apply-animated-values.js +84 -0
- package/dist/apply-animated-values.js.map +1 -0
- package/dist/bootstrap.d.ts +2 -0
- package/dist/bootstrap.d.ts.map +1 -0
- package/dist/bootstrap.js +11 -0
- package/dist/bootstrap.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/reduced-motion.d.ts +13 -0
- package/dist/reduced-motion.d.ts.map +1 -0
- package/dist/reduced-motion.js +59 -0
- package/dist/reduced-motion.js.map +1 -0
- package/dist/request-frame.d.ts +4 -0
- package/dist/request-frame.d.ts.map +1 -0
- package/dist/request-frame.js +155 -0
- package/dist/request-frame.js.map +1 -0
- package/dist/types.d.ts +38 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/with-animated.d.ts +6 -0
- package/dist/with-animated.d.ts.map +1 -0
- package/dist/with-animated.js +181 -0
- package/dist/with-animated.js.map +1 -0
- package/package.json +77 -0
- package/src/animated.ts +62 -0
- package/src/apply-animated-values.ts +116 -0
- package/src/bootstrap.ts +12 -0
- package/src/index.ts +110 -0
- package/src/reduced-motion.ts +82 -0
- package/src/request-frame.ts +214 -0
- package/src/types.ts +64 -0
- package/src/with-animated.tsx +254 -0
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import * as Gtk from "@gtkx/gi/gtk";
|
|
2
|
+
import { applyStyle, applyWrite } from "@gtkx/react/internal";
|
|
3
|
+
import { coerceObjectProperty } from "@gtkx/runtime";
|
|
4
|
+
const setterCache = new WeakMap();
|
|
5
|
+
const hasSetterInChain = (prototype, name) => {
|
|
6
|
+
for (let current = prototype; current !== null; current = Object.getPrototypeOf(current)) {
|
|
7
|
+
const descriptor = Object.getOwnPropertyDescriptor(current, name);
|
|
8
|
+
if (descriptor !== undefined) {
|
|
9
|
+
return descriptor.set !== undefined;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
return false;
|
|
13
|
+
};
|
|
14
|
+
const hasSetter = (instance, name) => {
|
|
15
|
+
const prototype = Object.getPrototypeOf(instance);
|
|
16
|
+
if (prototype === null) {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
let known = setterCache.get(prototype);
|
|
20
|
+
if (known === undefined) {
|
|
21
|
+
known = new Map();
|
|
22
|
+
setterCache.set(prototype, known);
|
|
23
|
+
}
|
|
24
|
+
let isWritable = known.get(name);
|
|
25
|
+
if (isWritable === undefined) {
|
|
26
|
+
isWritable = hasSetterInChain(prototype, name);
|
|
27
|
+
known.set(name, isWritable);
|
|
28
|
+
}
|
|
29
|
+
return isWritable;
|
|
30
|
+
};
|
|
31
|
+
const isText = (value) => typeof value === "string" || typeof value === "number";
|
|
32
|
+
const getText = (value) => {
|
|
33
|
+
if (isText(value)) {
|
|
34
|
+
return String(value);
|
|
35
|
+
}
|
|
36
|
+
if (!Array.isArray(value)) {
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
const texts = value.map((item) => getText(item));
|
|
40
|
+
return texts.every((item) => item !== null) ? texts.join("") : null;
|
|
41
|
+
};
|
|
42
|
+
const didApplyText = (instance, value) => {
|
|
43
|
+
const text = getText(value);
|
|
44
|
+
if (text === null || !(instance instanceof Gtk.Label)) {
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
applyWrite(() => {
|
|
48
|
+
instance.setLabel(text);
|
|
49
|
+
});
|
|
50
|
+
return true;
|
|
51
|
+
};
|
|
52
|
+
const didApplyStyle = (instance, value) => {
|
|
53
|
+
if (!(instance instanceof Gtk.Widget)) {
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
applyStyle(instance, value);
|
|
57
|
+
return true;
|
|
58
|
+
};
|
|
59
|
+
const didApplyValue = (instance, name, value) => {
|
|
60
|
+
if (name === "children") {
|
|
61
|
+
return didApplyText(instance, value);
|
|
62
|
+
}
|
|
63
|
+
if (name === "style") {
|
|
64
|
+
return didApplyStyle(instance, value);
|
|
65
|
+
}
|
|
66
|
+
if (!hasSetter(instance, name)) {
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
applyWrite(() => {
|
|
70
|
+
Reflect.set(instance, name, coerceObjectProperty(instance, name, value));
|
|
71
|
+
});
|
|
72
|
+
return true;
|
|
73
|
+
};
|
|
74
|
+
const didApplyAnimatedValues = (instance, values) => {
|
|
75
|
+
let isApplied = true;
|
|
76
|
+
for (const name in values) {
|
|
77
|
+
if (!didApplyValue(instance, name, values[name])) {
|
|
78
|
+
isApplied = false;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return isApplied;
|
|
82
|
+
};
|
|
83
|
+
export { didApplyAnimatedValues };
|
|
84
|
+
//# sourceMappingURL=apply-animated-values.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apply-animated-values.js","sourceRoot":"","sources":["../src/apply-animated-values.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Lookup } from \"@react-spring/types\";\nimport * as Gtk from \"@gtkx/gi/gtk\";\nimport { applyStyle, applyWrite } from \"@gtkx/react/internal\";\nimport { coerceObjectProperty } from \"@gtkx/runtime\";\n\nconst setterCache: WeakMap<object, Map<string, boolean>> = new WeakMap();\n\nconst hasSetterInChain = (prototype: object | null, name: string): boolean => {\n for (let current = prototype; current !== null; current = Object.getPrototypeOf(current) as object | null) {\n const descriptor = Object.getOwnPropertyDescriptor(current, name);\n\n if (descriptor !== undefined) {\n return descriptor.set !== undefined;\n }\n }\n\n return false;\n};\n\nconst hasSetter = (instance: object, name: string): boolean => {\n const prototype = Object.getPrototypeOf(instance) as object | null;\n\n if (prototype === null) {\n return false;\n }\n\n let known = setterCache.get(prototype);\n\n if (known === undefined) {\n known = new Map();\n setterCache.set(prototype, known);\n }\n\n let isWritable = known.get(name);\n\n if (isWritable === undefined) {\n isWritable = hasSetterInChain(prototype, name);\n known.set(name, isWritable);\n }\n\n return isWritable;\n};\n\nconst isText = (value: unknown): value is string | number => typeof value === \"string\" || typeof value === \"number\";\n\nconst getText = (value: unknown): string | null => {\n if (isText(value)) {\n return String(value);\n }\n\n if (!Array.isArray(value)) {\n return null;\n }\n\n const texts = value.map((item) => getText(item));\n\n return texts.every((item) => item !== null) ? texts.join(\"\") : null;\n};\n\nconst didApplyText = (instance: object, value: unknown): boolean => {\n const text = getText(value);\n\n if (text === null || !(instance instanceof Gtk.Label)) {\n return false;\n }\n\n applyWrite(() => {\n instance.setLabel(text);\n });\n\n return true;\n};\n\nconst didApplyStyle = (instance: object, value: unknown): boolean => {\n if (!(instance instanceof Gtk.Widget)) {\n return false;\n }\n\n applyStyle(instance, value);\n\n return true;\n};\n\nconst didApplyValue = (instance: object, name: string, value: unknown): boolean => {\n if (name === \"children\") {\n return didApplyText(instance, value);\n }\n\n if (name === \"style\") {\n return didApplyStyle(instance, value);\n }\n\n if (!hasSetter(instance, name)) {\n return false;\n }\n\n applyWrite(() => {\n Reflect.set(instance, name, coerceObjectProperty(instance, name, value));\n });\n\n return true;\n};\n\nconst didApplyAnimatedValues = (instance: object, values: Lookup): boolean => {\n let isApplied = true;\n\n for (const name in values) {\n if (!didApplyValue(instance, name, values[name])) {\n isApplied = false;\n }\n }\n\n return isApplied;\n};\n\nexport { didApplyAnimatedValues };\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Globals } from "@react-spring/core";
|
|
2
|
+
import { colors, createStringInterpolator } from "@react-spring/shared";
|
|
3
|
+
import { trackReducedMotion } from "./reduced-motion.js";
|
|
4
|
+
import { requestFrame } from "./request-frame.js";
|
|
5
|
+
Globals.assign({
|
|
6
|
+
colors,
|
|
7
|
+
createStringInterpolator,
|
|
8
|
+
requestAnimationFrame: requestFrame,
|
|
9
|
+
});
|
|
10
|
+
trackReducedMotion();
|
|
11
|
+
//# sourceMappingURL=bootstrap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,CAAC,MAAM,CAAC;IACX,MAAM;IACN,wBAAwB;IACxB,qBAAqB,EAAE,YAAY;CACtC,CAAC,CAAC;AAEH,kBAAkB,EAAE,CAAC","sourcesContent":["import { Globals } from \"@react-spring/core\";\nimport { colors, createStringInterpolator } from \"@react-spring/shared\";\nimport { trackReducedMotion } from \"./reduced-motion.js\";\nimport { requestFrame } from \"./request-frame.js\";\n\nGlobals.assign({\n colors,\n createStringInterpolator,\n requestAnimationFrame: requestFrame,\n});\n\ntrackReducedMotion();\n"]}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import "./bootstrap.js";
|
|
2
|
+
export { animated, type Animated } from "./animated.js";
|
|
3
|
+
export { useReducedMotion } from "./reduced-motion.js";
|
|
4
|
+
export type { AnimatedComponent, AnimatedElements, AnimatedItems, AnimatedProp, AnimatedProps, AnimatedStyle, } from "./types.js";
|
|
5
|
+
export { BailSignal, config, Controller, createInterpolator, easings, FrameValue, Globals, inferTo, Interpolation, Spring, SpringContext, SpringRef, SpringValue, to, Trail, Transition, update, useChain, useSpring, useSpringRef, useSprings, useSpringValue, useTrail, useTransition, } from "@react-spring/core";
|
|
6
|
+
export type { AnimationConfig, AnimationProps, AnimationResult, AsyncResult, Change, ControllerFlushFn, ControllerProps, ControllerUpdate, EventProp, ForwardProps, GoalProp, GoalValue, GoalValues, InferTo, InlineToProps, Interpolated, Interpolator, ItemKeys, LoopProp, MatchProp, OnChange, OnPause, OnProps, OnResolve, OnRest, OnResume, OnStart, PickAnimated, ReservedEventProps, ReservedProps, SpringChain, SpringComponentProps, SpringConfig, SpringProps, SpringsUpdate, SpringTo, SpringToFn, SpringUpdate, SpringUpdateFn, SpringValues, Springify, ToProps, ToValues, TrailComponentProps, TransitionComponentProps, TransitionFn, TransitionFrom, TransitionKey, TransitionRenderFn, TransitionState, TransitionTo, TransitionValues, UseSpringProps, UseSpringsProps, UseTrailProps, UseTransitionProps, VelocityProp, } from "@react-spring/core";
|
|
7
|
+
export type { FluidValue } from "@react-spring/shared";
|
|
8
|
+
export type { Animatable, EasingFunction, ExtrapolateType, InterpolatorArgs, InterpolatorConfig, InterpolatorFactory, InterpolatorFn, Lookup, OneOrMore, UnknownProps, } from "@react-spring/types";
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,gBAAgB,CAAC;AAExB,OAAO,EAAE,QAAQ,EAAE,KAAK,QAAQ,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,YAAY,EACR,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,EACb,YAAY,EACZ,aAAa,EACb,aAAa,GAChB,MAAM,YAAY,CAAC;AACpB,OAAO,EACH,UAAU,EACV,MAAM,EACN,UAAU,EACV,kBAAkB,EAClB,OAAO,EACP,UAAU,EACV,OAAO,EACP,OAAO,EACP,aAAa,EACb,MAAM,EACN,aAAa,EACb,SAAS,EACT,WAAW,EACX,EAAE,EACF,KAAK,EACL,UAAU,EACV,MAAM,EACN,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,UAAU,EACV,cAAc,EACd,QAAQ,EACR,aAAa,GAChB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EACR,eAAe,EACf,cAAc,EACd,eAAe,EACf,WAAW,EACX,MAAM,EACN,iBAAiB,EACjB,eAAe,EACf,gBAAgB,EAChB,SAAS,EACT,YAAY,EACZ,QAAQ,EACR,SAAS,EACT,UAAU,EACV,OAAO,EACP,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,OAAO,EACP,OAAO,EACP,SAAS,EACT,MAAM,EACN,QAAQ,EACR,OAAO,EACP,YAAY,EACZ,kBAAkB,EAClB,aAAa,EACb,WAAW,EACX,oBAAoB,EACpB,YAAY,EACZ,WAAW,EACX,aAAa,EACb,QAAQ,EACR,UAAU,EACV,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,SAAS,EACT,OAAO,EACP,QAAQ,EACR,mBAAmB,EACnB,wBAAwB,EACxB,YAAY,EACZ,cAAc,EACd,aAAa,EACb,kBAAkB,EAClB,eAAe,EACf,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,aAAa,EACb,kBAAkB,EAClB,YAAY,GACf,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,YAAY,EACR,UAAU,EACV,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,EACnB,cAAc,EACd,MAAM,EACN,SAAS,EACT,YAAY,GACf,MAAM,qBAAqB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import "./bootstrap.js";
|
|
2
|
+
export { animated } from "./animated.js";
|
|
3
|
+
export { useReducedMotion } from "./reduced-motion.js";
|
|
4
|
+
export { BailSignal, config, Controller, createInterpolator, easings, FrameValue, Globals, inferTo, Interpolation, Spring, SpringContext, SpringRef, SpringValue, to, Trail, Transition, update, useChain, useSpring, useSpringRef, useSprings, useSpringValue, useTrail, useTransition, } from "@react-spring/core";
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,gBAAgB,CAAC;AAExB,OAAO,EAAE,QAAQ,EAAiB,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AASvD,OAAO,EACH,UAAU,EACV,MAAM,EACN,UAAU,EACV,kBAAkB,EAClB,OAAO,EACP,UAAU,EACV,OAAO,EACP,OAAO,EACP,aAAa,EACb,MAAM,EACN,aAAa,EACb,SAAS,EACT,WAAW,EACX,EAAE,EACF,KAAK,EACL,UAAU,EACV,MAAM,EACN,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,UAAU,EACV,cAAc,EACd,QAAQ,EACR,aAAa,GAChB,MAAM,oBAAoB,CAAC","sourcesContent":["import \"./bootstrap.js\";\n\nexport { animated, type Animated } from \"./animated.js\";\nexport { useReducedMotion } from \"./reduced-motion.js\";\nexport type {\n AnimatedComponent,\n AnimatedElements,\n AnimatedItems,\n AnimatedProp,\n AnimatedProps,\n AnimatedStyle,\n} from \"./types.js\";\nexport {\n BailSignal,\n config,\n Controller,\n createInterpolator,\n easings,\n FrameValue,\n Globals,\n inferTo,\n Interpolation,\n Spring,\n SpringContext,\n SpringRef,\n SpringValue,\n to,\n Trail,\n Transition,\n update,\n useChain,\n useSpring,\n useSpringRef,\n useSprings,\n useSpringValue,\n useTrail,\n useTransition,\n} from \"@react-spring/core\";\nexport type {\n AnimationConfig,\n AnimationProps,\n AnimationResult,\n AsyncResult,\n Change,\n ControllerFlushFn,\n ControllerProps,\n ControllerUpdate,\n EventProp,\n ForwardProps,\n GoalProp,\n GoalValue,\n GoalValues,\n InferTo,\n InlineToProps,\n Interpolated,\n Interpolator,\n ItemKeys,\n LoopProp,\n MatchProp,\n OnChange,\n OnPause,\n OnProps,\n OnResolve,\n OnRest,\n OnResume,\n OnStart,\n PickAnimated,\n ReservedEventProps,\n ReservedProps,\n SpringChain,\n SpringComponentProps,\n SpringConfig,\n SpringProps,\n SpringsUpdate,\n SpringTo,\n SpringToFn,\n SpringUpdate,\n SpringUpdateFn,\n SpringValues,\n Springify,\n ToProps,\n ToValues,\n TrailComponentProps,\n TransitionComponentProps,\n TransitionFn,\n TransitionFrom,\n TransitionKey,\n TransitionRenderFn,\n TransitionState,\n TransitionTo,\n TransitionValues,\n UseSpringProps,\n UseSpringsProps,\n UseTrailProps,\n UseTransitionProps,\n VelocityProp,\n} from \"@react-spring/core\";\nexport type { FluidValue } from \"@react-spring/shared\";\nexport type {\n Animatable,\n EasingFunction,\n ExtrapolateType,\n InterpolatorArgs,\n InterpolatorConfig,\n InterpolatorFactory,\n InterpolatorFn,\n Lookup,\n OneOrMore,\n UnknownProps,\n} from \"@react-spring/types\";\n"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
declare const trackReducedMotion: () => boolean | null;
|
|
2
|
+
/**
|
|
3
|
+
* Reports whether the desktop asks for less motion: `true` while GTK's `gtk-enable-animations`
|
|
4
|
+
* setting is off, which is when every spring already jumps straight to its target, and also while
|
|
5
|
+
* the `gtk-interface-reduced-motion` setting of GTK 4.22 asks to reduce motion, the preference
|
|
6
|
+
* behind the `prefers-reduced-motion` media query, which leaves springs running so that components
|
|
7
|
+
* can trade a slide for a fade themselves. Returns `null` until a display is open.
|
|
8
|
+
*
|
|
9
|
+
* @returns `true` when motion should be reduced, `false` when it should not, `null` when unknown.
|
|
10
|
+
*/
|
|
11
|
+
declare const useReducedMotion: () => boolean | null;
|
|
12
|
+
export { trackReducedMotion, useReducedMotion };
|
|
13
|
+
//# sourceMappingURL=reduced-motion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reduced-motion.d.ts","sourceRoot":"","sources":["../src/reduced-motion.ts"],"names":[],"mappings":"AAgDA,QAAA,MAAM,kBAAkB,QAAO,OAAO,GAAG,IAYxC,CAAC;AAUF;;;;;;;;GAQG;AACH,QAAA,MAAM,gBAAgB,QAAO,OAAO,GAAG,IAA2D,CAAC;AAEnG,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import * as Gtk from "@gtkx/gi/gtk";
|
|
2
|
+
import { Globals } from "@react-spring/core";
|
|
3
|
+
import { useSyncExternalStore } from "react";
|
|
4
|
+
const REDUCED_MOTION_MINOR = 22;
|
|
5
|
+
const tracker = { settings: null, isReduced: null };
|
|
6
|
+
const listeners = new Set();
|
|
7
|
+
const hasReducedMotionSetting = () => Gtk.checkVersion(4, REDUCED_MOTION_MINOR, 0) === null;
|
|
8
|
+
const isReduceMotionPreferred = (settings) => hasReducedMotionSetting() && settings.gtkInterfaceReducedMotion === Gtk.ReducedMotion.REDUCE;
|
|
9
|
+
const sync = () => {
|
|
10
|
+
const { settings } = tracker;
|
|
11
|
+
if (settings === null) {
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
const isReduced = !settings.gtkEnableAnimations || isReduceMotionPreferred(settings);
|
|
15
|
+
Globals.assign({ skipAnimation: !settings.gtkEnableAnimations });
|
|
16
|
+
if (isReduced === tracker.isReduced) {
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
tracker.isReduced = isReduced;
|
|
20
|
+
for (const listener of listeners) {
|
|
21
|
+
listener();
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
const watch = (settings) => {
|
|
25
|
+
tracker.settings = settings;
|
|
26
|
+
settings.on("notify::gtk-enable-animations", sync);
|
|
27
|
+
if (hasReducedMotionSetting()) {
|
|
28
|
+
settings.on("notify::gtk-interface-reduced-motion", sync);
|
|
29
|
+
}
|
|
30
|
+
sync();
|
|
31
|
+
};
|
|
32
|
+
const trackReducedMotion = () => {
|
|
33
|
+
if (tracker.settings === null) {
|
|
34
|
+
const settings = Gtk.Settings.getDefault();
|
|
35
|
+
if (settings === null) {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
watch(settings);
|
|
39
|
+
}
|
|
40
|
+
return tracker.isReduced;
|
|
41
|
+
};
|
|
42
|
+
const subscribe = (listener) => {
|
|
43
|
+
listeners.add(listener);
|
|
44
|
+
return () => {
|
|
45
|
+
listeners.delete(listener);
|
|
46
|
+
};
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* Reports whether the desktop asks for less motion: `true` while GTK's `gtk-enable-animations`
|
|
50
|
+
* setting is off, which is when every spring already jumps straight to its target, and also while
|
|
51
|
+
* the `gtk-interface-reduced-motion` setting of GTK 4.22 asks to reduce motion, the preference
|
|
52
|
+
* behind the `prefers-reduced-motion` media query, which leaves springs running so that components
|
|
53
|
+
* can trade a slide for a fade themselves. Returns `null` until a display is open.
|
|
54
|
+
*
|
|
55
|
+
* @returns `true` when motion should be reduced, `false` when it should not, `null` when unknown.
|
|
56
|
+
*/
|
|
57
|
+
const useReducedMotion = () => useSyncExternalStore(subscribe, trackReducedMotion);
|
|
58
|
+
export { trackReducedMotion, useReducedMotion };
|
|
59
|
+
//# sourceMappingURL=reduced-motion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reduced-motion.js","sourceRoot":"","sources":["../src/reduced-motion.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,cAAc,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAK7C,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAChC,MAAM,OAAO,GAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AAC7D,MAAM,SAAS,GAAkB,IAAI,GAAG,EAAE,CAAC;AAE3C,MAAM,uBAAuB,GAAG,GAAY,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,EAAE,oBAAoB,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC;AAErG,MAAM,uBAAuB,GAAG,CAAC,QAAsB,EAAW,EAAE,CAChE,uBAAuB,EAAE,IAAI,QAAQ,CAAC,yBAAyB,KAAK,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC;AAEjG,MAAM,IAAI,GAAG,GAAS,EAAE;IACpB,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IAE7B,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACpB,OAAO;IACX,CAAC;IAED,MAAM,SAAS,GAAG,CAAC,QAAQ,CAAC,mBAAmB,IAAI,uBAAuB,CAAC,QAAQ,CAAC,CAAC;IACrF,OAAO,CAAC,MAAM,CAAC,EAAE,aAAa,EAAE,CAAC,QAAQ,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAEjE,IAAI,SAAS,KAAK,OAAO,CAAC,SAAS,EAAE,CAAC;QAClC,OAAO;IACX,CAAC;IAED,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;IAE9B,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QAC/B,QAAQ,EAAE,CAAC;IACf,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,KAAK,GAAG,CAAC,QAAsB,EAAQ,EAAE;IAC3C,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC5B,QAAQ,CAAC,EAAE,CAAC,+BAA+B,EAAE,IAAI,CAAC,CAAC;IAEnD,IAAI,uBAAuB,EAAE,EAAE,CAAC;QAC5B,QAAQ,CAAC,EAAE,CAAC,sCAAsC,EAAE,IAAI,CAAC,CAAC;IAC9D,CAAC;IAED,IAAI,EAAE,CAAC;AACX,CAAC,CAAC;AAEF,MAAM,kBAAkB,GAAG,GAAmB,EAAE;IAC5C,IAAI,OAAO,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;QAE3C,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;YACpB,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,KAAK,CAAC,QAAQ,CAAC,CAAC;IACpB,CAAC;IAED,OAAO,OAAO,CAAC,SAAS,CAAC;AAC7B,CAAC,CAAC;AAEF,MAAM,SAAS,GAAG,CAAC,QAAkB,EAAgB,EAAE;IACnD,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAExB,OAAO,GAAG,EAAE;QACR,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC,CAAC;AACN,CAAC,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,gBAAgB,GAAG,GAAmB,EAAE,CAAC,oBAAoB,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAC;AAEnG,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,CAAC","sourcesContent":["import * as Gtk from \"@gtkx/gi/gtk\";\nimport { Globals } from \"@react-spring/core\";\nimport { useSyncExternalStore } from \"react\";\n\ntype Listener = () => void;\ntype Tracker = { settings: Gtk.Settings | null; isReduced: boolean | null };\n\nconst REDUCED_MOTION_MINOR = 22;\nconst tracker: Tracker = { settings: null, isReduced: null };\nconst listeners: Set<Listener> = new Set();\n\nconst hasReducedMotionSetting = (): boolean => Gtk.checkVersion(4, REDUCED_MOTION_MINOR, 0) === null;\n\nconst isReduceMotionPreferred = (settings: Gtk.Settings): boolean =>\n hasReducedMotionSetting() && settings.gtkInterfaceReducedMotion === Gtk.ReducedMotion.REDUCE;\n\nconst sync = (): void => {\n const { settings } = tracker;\n\n if (settings === null) {\n return;\n }\n\n const isReduced = !settings.gtkEnableAnimations || isReduceMotionPreferred(settings);\n Globals.assign({ skipAnimation: !settings.gtkEnableAnimations });\n\n if (isReduced === tracker.isReduced) {\n return;\n }\n\n tracker.isReduced = isReduced;\n\n for (const listener of listeners) {\n listener();\n }\n};\n\nconst watch = (settings: Gtk.Settings): void => {\n tracker.settings = settings;\n settings.on(\"notify::gtk-enable-animations\", sync);\n\n if (hasReducedMotionSetting()) {\n settings.on(\"notify::gtk-interface-reduced-motion\", sync);\n }\n\n sync();\n};\n\nconst trackReducedMotion = (): boolean | null => {\n if (tracker.settings === null) {\n const settings = Gtk.Settings.getDefault();\n\n if (settings === null) {\n return null;\n }\n\n watch(settings);\n }\n\n return tracker.isReduced;\n};\n\nconst subscribe = (listener: Listener): (() => void) => {\n listeners.add(listener);\n\n return () => {\n listeners.delete(listener);\n };\n};\n\n/**\n * Reports whether the desktop asks for less motion: `true` while GTK's `gtk-enable-animations`\n * setting is off, which is when every spring already jumps straight to its target, and also while\n * the `gtk-interface-reduced-motion` setting of GTK 4.22 asks to reduce motion, the preference\n * behind the `prefers-reduced-motion` media query, which leaves springs running so that components\n * can trade a slide for a fade themselves. Returns `null` until a display is open.\n *\n * @returns `true` when motion should be reduced, `false` when it should not, `null` when unknown.\n */\nconst useReducedMotion = (): boolean | null => useSyncExternalStore(subscribe, trackReducedMotion);\n\nexport { trackReducedMotion, useReducedMotion };\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request-frame.d.ts","sourceRoot":"","sources":["../src/request-frame.ts"],"names":[],"mappings":"AAGA,KAAK,aAAa,GAAG,MAAM,IAAI,CAAC;AA0MhC,QAAA,MAAM,YAAY,GAAI,UAAU,aAAa,KAAG,IAM/C,CAAC;AAEF,OAAO,EAAE,YAAY,EAAE,CAAC"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import * as GLib from "@gtkx/gi/glib";
|
|
2
|
+
import * as Gtk from "@gtkx/gi/gtk";
|
|
3
|
+
const FALLBACK_FRAME_MS = 16;
|
|
4
|
+
const MIN_FRAME_MS = 1;
|
|
5
|
+
const STALL_MS = 250;
|
|
6
|
+
const STALL_COOLDOWN_MS = 1000;
|
|
7
|
+
const scheduler = {
|
|
8
|
+
callbacks: [],
|
|
9
|
+
driver: null,
|
|
10
|
+
fallbackTimer: null,
|
|
11
|
+
flushedAt: 0,
|
|
12
|
+
isTicking: false,
|
|
13
|
+
stalledUntil: new WeakMap(),
|
|
14
|
+
ticks: 0,
|
|
15
|
+
};
|
|
16
|
+
const isSuspended = (widget) => widget instanceof Gtk.Window && widget.isSuspended();
|
|
17
|
+
const hasClock = (widget) => widget.getMapped() && widget.getFrameClock() !== null && !isSuspended(widget);
|
|
18
|
+
const isCoolingDown = (widget) => {
|
|
19
|
+
const until = scheduler.stalledUntil.get(widget);
|
|
20
|
+
if (until === undefined) {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
if (performance.now() < until) {
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
scheduler.stalledUntil.delete(widget);
|
|
27
|
+
return false;
|
|
28
|
+
};
|
|
29
|
+
const findDriverWidget = () => {
|
|
30
|
+
const candidates = Gtk.Window.listToplevels().filter((widget) => hasClock(widget));
|
|
31
|
+
return candidates.find((widget) => !scheduler.stalledUntil.has(widget)) ??
|
|
32
|
+
candidates.find((widget) => !isCoolingDown(widget)) ??
|
|
33
|
+
null;
|
|
34
|
+
};
|
|
35
|
+
const flush = () => {
|
|
36
|
+
const pending = scheduler.callbacks;
|
|
37
|
+
scheduler.callbacks = [];
|
|
38
|
+
scheduler.isTicking = true;
|
|
39
|
+
scheduler.flushedAt = performance.now();
|
|
40
|
+
try {
|
|
41
|
+
for (const callback of pending) {
|
|
42
|
+
callback();
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
finally {
|
|
46
|
+
scheduler.isTicking = false;
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
const armStallSource = () => GLib.timeoutAdd(GLib.PRIORITY_DEFAULT_IDLE, STALL_MS, shouldRepeatStallCheck);
|
|
50
|
+
const cancelStallSource = (driver) => {
|
|
51
|
+
if (driver.stallSource === 0) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
GLib.Source.remove(driver.stallSource);
|
|
55
|
+
driver.stallSource = 0;
|
|
56
|
+
};
|
|
57
|
+
const finishDriver = (driver) => {
|
|
58
|
+
cancelStallSource(driver);
|
|
59
|
+
driver.widget.off("unmap", onDriverUnmapped);
|
|
60
|
+
scheduler.driver = null;
|
|
61
|
+
};
|
|
62
|
+
const releaseDriver = (driver) => {
|
|
63
|
+
finishDriver(driver);
|
|
64
|
+
driver.widget.removeTickCallback(driver.tickId);
|
|
65
|
+
};
|
|
66
|
+
const flushThenArm = () => {
|
|
67
|
+
try {
|
|
68
|
+
flush();
|
|
69
|
+
}
|
|
70
|
+
finally {
|
|
71
|
+
arm();
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
const shouldContinueTicking = (driver) => {
|
|
75
|
+
if (scheduler.driver !== driver) {
|
|
76
|
+
arm();
|
|
77
|
+
return GLib.SOURCE_REMOVE;
|
|
78
|
+
}
|
|
79
|
+
if (scheduler.callbacks.length === 0) {
|
|
80
|
+
finishDriver(driver);
|
|
81
|
+
return GLib.SOURCE_REMOVE;
|
|
82
|
+
}
|
|
83
|
+
driver.stallSource = armStallSource();
|
|
84
|
+
return GLib.SOURCE_CONTINUE;
|
|
85
|
+
};
|
|
86
|
+
const shouldKeepTicking = () => {
|
|
87
|
+
const { driver } = scheduler;
|
|
88
|
+
if (driver === null) {
|
|
89
|
+
return GLib.SOURCE_REMOVE;
|
|
90
|
+
}
|
|
91
|
+
if (performance.now() - scheduler.flushedAt < MIN_FRAME_MS) {
|
|
92
|
+
return GLib.SOURCE_CONTINUE;
|
|
93
|
+
}
|
|
94
|
+
cancelStallSource(driver);
|
|
95
|
+
scheduler.ticks += 1;
|
|
96
|
+
scheduler.stalledUntil.delete(driver.widget);
|
|
97
|
+
try {
|
|
98
|
+
flush();
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
finishDriver(driver);
|
|
102
|
+
arm();
|
|
103
|
+
throw error;
|
|
104
|
+
}
|
|
105
|
+
return shouldContinueTicking(driver);
|
|
106
|
+
};
|
|
107
|
+
const onFallbackFrame = () => {
|
|
108
|
+
scheduler.fallbackTimer = null;
|
|
109
|
+
flushThenArm();
|
|
110
|
+
};
|
|
111
|
+
const armDriver = (widget) => {
|
|
112
|
+
const tickId = widget.addTickCallback(shouldKeepTicking);
|
|
113
|
+
scheduler.driver = { widget, tickId, stallSource: armStallSource() };
|
|
114
|
+
widget.on("unmap", onDriverUnmapped);
|
|
115
|
+
};
|
|
116
|
+
function shouldRepeatStallCheck() {
|
|
117
|
+
const { driver } = scheduler;
|
|
118
|
+
if (driver !== null) {
|
|
119
|
+
driver.stallSource = 0;
|
|
120
|
+
releaseDriver(driver);
|
|
121
|
+
scheduler.stalledUntil.set(driver.widget, performance.now() + STALL_COOLDOWN_MS);
|
|
122
|
+
flushThenArm();
|
|
123
|
+
}
|
|
124
|
+
return GLib.SOURCE_REMOVE;
|
|
125
|
+
}
|
|
126
|
+
function onDriverUnmapped() {
|
|
127
|
+
const { driver } = scheduler;
|
|
128
|
+
if (driver === null) {
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
scheduler.stalledUntil.delete(driver.widget);
|
|
132
|
+
releaseDriver(driver);
|
|
133
|
+
if (!scheduler.isTicking) {
|
|
134
|
+
arm();
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
function arm() {
|
|
138
|
+
if (scheduler.callbacks.length === 0 || scheduler.driver !== null || scheduler.fallbackTimer !== null) {
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
const widget = findDriverWidget();
|
|
142
|
+
if (widget === null) {
|
|
143
|
+
scheduler.fallbackTimer = setTimeout(onFallbackFrame, FALLBACK_FRAME_MS);
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
armDriver(widget);
|
|
147
|
+
}
|
|
148
|
+
const requestFrame = (callback) => {
|
|
149
|
+
scheduler.callbacks.push(callback);
|
|
150
|
+
if (!scheduler.isTicking) {
|
|
151
|
+
arm();
|
|
152
|
+
}
|
|
153
|
+
};
|
|
154
|
+
export { requestFrame };
|
|
155
|
+
//# sourceMappingURL=request-frame.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request-frame.js","sourceRoot":"","sources":["../src/request-frame.ts"],"names":[],"mappings":"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","sourcesContent":["import * as GLib from \"@gtkx/gi/glib\";\nimport * as Gtk from \"@gtkx/gi/gtk\";\n\ntype FrameCallback = () => void;\ntype Timer = ReturnType<typeof setTimeout>;\ntype Driver = { widget: Gtk.Widget; tickId: number; stallSource: number };\n\ntype Scheduler = {\n callbacks: FrameCallback[];\n driver: Driver | null;\n fallbackTimer: Timer | null;\n flushedAt: number;\n isTicking: boolean;\n stalledUntil: WeakMap<Gtk.Widget, number>;\n ticks: number;\n};\n\nconst FALLBACK_FRAME_MS = 16;\nconst MIN_FRAME_MS = 1;\nconst STALL_MS = 250;\nconst STALL_COOLDOWN_MS = 1000;\n\nconst scheduler: Scheduler = {\n callbacks: [],\n driver: null,\n fallbackTimer: null,\n flushedAt: 0,\n isTicking: false,\n stalledUntil: new WeakMap(),\n ticks: 0,\n};\n\nconst isSuspended = (widget: Gtk.Widget): boolean => widget instanceof Gtk.Window && widget.isSuspended();\n\nconst hasClock = (widget: Gtk.Widget): boolean =>\n widget.getMapped() && widget.getFrameClock() !== null && !isSuspended(widget);\n\nconst isCoolingDown = (widget: Gtk.Widget): boolean => {\n const until = scheduler.stalledUntil.get(widget);\n\n if (until === undefined) {\n return false;\n }\n\n if (performance.now() < until) {\n return true;\n }\n\n scheduler.stalledUntil.delete(widget);\n\n return false;\n};\n\nconst findDriverWidget = (): Gtk.Widget | null => {\n const candidates = Gtk.Window.listToplevels().filter((widget) => hasClock(widget));\n\n return candidates.find((widget) => !scheduler.stalledUntil.has(widget)) ??\n candidates.find((widget) => !isCoolingDown(widget)) ??\n null;\n};\n\nconst flush = (): void => {\n const pending = scheduler.callbacks;\n scheduler.callbacks = [];\n scheduler.isTicking = true;\n scheduler.flushedAt = performance.now();\n\n try {\n for (const callback of pending) {\n callback();\n }\n } finally {\n scheduler.isTicking = false;\n }\n};\n\nconst armStallSource = (): number => GLib.timeoutAdd(GLib.PRIORITY_DEFAULT_IDLE, STALL_MS, shouldRepeatStallCheck);\n\nconst cancelStallSource = (driver: Driver): void => {\n if (driver.stallSource === 0) {\n return;\n }\n\n GLib.Source.remove(driver.stallSource);\n driver.stallSource = 0;\n};\n\nconst finishDriver = (driver: Driver): void => {\n cancelStallSource(driver);\n driver.widget.off(\"unmap\", onDriverUnmapped);\n scheduler.driver = null;\n};\n\nconst releaseDriver = (driver: Driver): void => {\n finishDriver(driver);\n driver.widget.removeTickCallback(driver.tickId);\n};\n\nconst flushThenArm = (): void => {\n try {\n flush();\n } finally {\n arm();\n }\n};\n\nconst shouldContinueTicking = (driver: Driver): boolean => {\n if (scheduler.driver !== driver) {\n arm();\n\n return GLib.SOURCE_REMOVE;\n }\n\n if (scheduler.callbacks.length === 0) {\n finishDriver(driver);\n\n return GLib.SOURCE_REMOVE;\n }\n\n driver.stallSource = armStallSource();\n\n return GLib.SOURCE_CONTINUE;\n};\n\nconst shouldKeepTicking = (): boolean => {\n const { driver } = scheduler;\n\n if (driver === null) {\n return GLib.SOURCE_REMOVE;\n }\n\n if (performance.now() - scheduler.flushedAt < MIN_FRAME_MS) {\n return GLib.SOURCE_CONTINUE;\n }\n\n cancelStallSource(driver);\n scheduler.ticks += 1;\n scheduler.stalledUntil.delete(driver.widget);\n\n try {\n flush();\n } catch (error) {\n finishDriver(driver);\n arm();\n throw error;\n }\n\n return shouldContinueTicking(driver);\n};\n\nconst onFallbackFrame = (): void => {\n scheduler.fallbackTimer = null;\n flushThenArm();\n};\n\nconst armDriver = (widget: Gtk.Widget): void => {\n const tickId = widget.addTickCallback(shouldKeepTicking);\n scheduler.driver = { widget, tickId, stallSource: armStallSource() };\n widget.on(\"unmap\", onDriverUnmapped);\n};\n\nfunction shouldRepeatStallCheck(): boolean {\n const { driver } = scheduler;\n\n if (driver !== null) {\n driver.stallSource = 0;\n releaseDriver(driver);\n scheduler.stalledUntil.set(driver.widget, performance.now() + STALL_COOLDOWN_MS);\n flushThenArm();\n }\n\n return GLib.SOURCE_REMOVE;\n}\n\nfunction onDriverUnmapped(): void {\n const { driver } = scheduler;\n\n if (driver === null) {\n return;\n }\n\n scheduler.stalledUntil.delete(driver.widget);\n releaseDriver(driver);\n\n if (!scheduler.isTicking) {\n arm();\n }\n}\n\nfunction arm(): void {\n if (scheduler.callbacks.length === 0 || scheduler.driver !== null || scheduler.fallbackTimer !== null) {\n return;\n }\n\n const widget = findDriverWidget();\n\n if (widget === null) {\n scheduler.fallbackTimer = setTimeout(onFallbackFrame, FALLBACK_FRAME_MS);\n\n return;\n }\n\n armDriver(widget);\n}\n\nconst requestFrame = (callback: FrameCallback): void => {\n scheduler.callbacks.push(callback);\n\n if (!scheduler.isTicking) {\n arm();\n }\n};\n\nexport { requestFrame };\n"]}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type * as Gtk from "@gtkx/gi/gtk";
|
|
2
|
+
import type * as elements from "@gtkx/jsx";
|
|
3
|
+
import type { FluidValue } from "@react-spring/shared";
|
|
4
|
+
import type { ComponentPropsWithRef, ElementType, FunctionComponent, Ref } from "react";
|
|
5
|
+
/** An array-valued prop whose items may each be a spring or an interpolation, such as mixed text children. */
|
|
6
|
+
type AnimatedItems<T> = [Exclude<Extract<T, Iterable<unknown>>, string>] extends [never] ? never : Exclude<Extract<T, Iterable<unknown>>, string> extends Iterable<infer Item> ? Iterable<AnimatedProp<Item>> : never;
|
|
7
|
+
/** A prop value that an animated component also accepts as a spring or an interpolation. */
|
|
8
|
+
type AnimatedProp<T> = T | FluidValue<Exclude<T, undefined>> | AnimatedItems<Exclude<T, undefined>>;
|
|
9
|
+
/**
|
|
10
|
+
* A `style` object whose declarations may each be a spring or an interpolation, nested blocks
|
|
11
|
+
* included, so the object a spring hook returns can be handed to `style` as it is.
|
|
12
|
+
*/
|
|
13
|
+
type AnimatedStyle<T> = {
|
|
14
|
+
[K in keyof T]: T[K] extends string | number | undefined | null ? AnimatedProp<T[K]> : AnimatedProp<T[K]> | AnimatedStyle<NonNullable<T[K]>>;
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* The props of an animated component: every prop of the wrapped component, each also accepting a
|
|
18
|
+
* {@link FluidValue} such as a `SpringValue` or an `Interpolation`, while `ref` and `key` keep
|
|
19
|
+
* their original types.
|
|
20
|
+
*/
|
|
21
|
+
type AnimatedProps<Props extends object> = {
|
|
22
|
+
[P in keyof Props]: P extends "key" | "ref" ? Props[P] : P extends "style" ? AnimatedProp<Props[P]> | AnimatedStyle<NonNullable<Props[P]>> : AnimatedProp<Props[P]>;
|
|
23
|
+
};
|
|
24
|
+
/** A component returned by {@link animated}: the wrapped component with animated props. */
|
|
25
|
+
type AnimatedComponent<T extends Exclude<ElementType, string>> = FunctionComponent<AnimatedProps<ComponentPropsWithRef<T>>>;
|
|
26
|
+
/**
|
|
27
|
+
* The widget components of the generated `@gtkx/jsx` store, keyed by element name, each wrapped as
|
|
28
|
+
* an {@link AnimatedComponent}. Only components whose `ref` exposes a `Gtk.Widget` subclass are
|
|
29
|
+
* included, so `animated.GtkLabel` is available while non-widget elements such as `GtkAdjustment`
|
|
30
|
+
* are wrapped explicitly through the `animated(...)` call instead.
|
|
31
|
+
*/
|
|
32
|
+
type AnimatedElements = {
|
|
33
|
+
readonly [K in keyof typeof elements as (typeof elements)[K] extends Exclude<ElementType, string> ? ComponentPropsWithRef<(typeof elements)[K]> extends {
|
|
34
|
+
ref?: Ref<infer Instance> | undefined;
|
|
35
|
+
} ? [NonNullable<Instance>] extends [never] ? never : NonNullable<Instance> extends Gtk.Widget ? K : never : never : never]: (typeof elements)[K] extends Exclude<ElementType, string> ? AnimatedComponent<(typeof elements)[K]> : never;
|
|
36
|
+
};
|
|
37
|
+
export type { AnimatedComponent, AnimatedElements, AnimatedItems, AnimatedProp, AnimatedProps, AnimatedStyle };
|
|
38
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"","sourcesContent":["import type * as Gtk from \"@gtkx/gi/gtk\";\nimport type * as elements from \"@gtkx/jsx\";\nimport type { FluidValue } from \"@react-spring/shared\";\nimport type { ComponentPropsWithRef, ElementType, FunctionComponent, Ref } from \"react\";\n\n/** An array-valued prop whose items may each be a spring or an interpolation, such as mixed text children. */\ntype AnimatedItems<T> = [Exclude<Extract<T, Iterable<unknown>>, string>] extends [never]\n ? never\n : Exclude<Extract<T, Iterable<unknown>>, string> extends Iterable<infer Item>\n ? Iterable<AnimatedProp<Item>>\n : never;\n\n/** A prop value that an animated component also accepts as a spring or an interpolation. */\ntype AnimatedProp<T> = T | FluidValue<Exclude<T, undefined>> | AnimatedItems<Exclude<T, undefined>>;\n\n/**\n * A `style` object whose declarations may each be a spring or an interpolation, nested blocks\n * included, so the object a spring hook returns can be handed to `style` as it is.\n */\ntype AnimatedStyle<T> = {\n [K in keyof T]: T[K] extends string | number | undefined | null\n ? AnimatedProp<T[K]>\n : AnimatedProp<T[K]> | AnimatedStyle<NonNullable<T[K]>>;\n};\n\n/**\n * The props of an animated component: every prop of the wrapped component, each also accepting a\n * {@link FluidValue} such as a `SpringValue` or an `Interpolation`, while `ref` and `key` keep\n * their original types.\n */\ntype AnimatedProps<Props extends object> = {\n [P in keyof Props]: P extends \"key\" | \"ref\"\n ? Props[P]\n : P extends \"style\"\n ? AnimatedProp<Props[P]> | AnimatedStyle<NonNullable<Props[P]>>\n : AnimatedProp<Props[P]>;\n};\n\n/** A component returned by {@link animated}: the wrapped component with animated props. */\ntype AnimatedComponent<T extends Exclude<ElementType, string>> = FunctionComponent<\n AnimatedProps<ComponentPropsWithRef<T>>\n>;\n\n/**\n * The widget components of the generated `@gtkx/jsx` store, keyed by element name, each wrapped as\n * an {@link AnimatedComponent}. Only components whose `ref` exposes a `Gtk.Widget` subclass are\n * included, so `animated.GtkLabel` is available while non-widget elements such as `GtkAdjustment`\n * are wrapped explicitly through the `animated(...)` call instead.\n */\ntype AnimatedElements = {\n readonly [K in keyof typeof elements as (typeof elements)[K] extends Exclude<ElementType, string>\n ? ComponentPropsWithRef<(typeof elements)[K]> extends { ref?: Ref<infer Instance> | undefined }\n ? [NonNullable<Instance>] extends [never]\n ? never\n : NonNullable<Instance> extends Gtk.Widget\n ? K\n : never\n : never\n : never]: (typeof elements)[K] extends Exclude<ElementType, string>\n ? AnimatedComponent<(typeof elements)[K]>\n : never;\n};\n\nexport type { AnimatedComponent, AnimatedElements, AnimatedItems, AnimatedProp, AnimatedProps, AnimatedStyle };\n"]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type ElementType } from "react";
|
|
2
|
+
import type { AnimatedComponent } from "./types.js";
|
|
3
|
+
type Wrappable = Exclude<ElementType, string>;
|
|
4
|
+
declare function withAnimated<T extends Wrappable>(component: T): AnimatedComponent<T>;
|
|
5
|
+
export { withAnimated };
|
|
6
|
+
//# sourceMappingURL=with-animated.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"with-animated.d.ts","sourceRoot":"","sources":["../src/with-animated.tsx"],"names":[],"mappings":"AAYA,OAAO,EAAE,KAAK,WAAW,EAAqE,MAAM,OAAO,CAAC;AAC5G,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAKpD,KAAK,SAAS,GAAG,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;AA+M9C,iBAAS,YAAY,CAAC,CAAC,SAAS,SAAS,EAAE,SAAS,EAAE,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAS7E;AAmBD,OAAO,EAAE,YAAY,EAAE,CAAC"}
|