@supermousejs/core 2.4.2 → 2.5.0-beta.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/CHANGELOG.md +46 -0
- package/README.md +158 -334
- package/dist/index.d.ts +137 -55
- package/dist/index.mjs +467 -312
- package/dist/index.umd.js +2 -10
- package/package.json +3 -2
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,42 @@
|
|
|
1
|
-
/**
|
|
2
|
-
export declare
|
|
1
|
+
/** Overall cursor mode. */
|
|
2
|
+
export declare type CursorMode = "auto" | "custom" | "native" | "both";
|
|
3
|
+
|
|
4
|
+
export declare interface CursorPolicy {
|
|
5
|
+
rules: CursorTargetRule[];
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
/** Shorthand form accepted at the public API boundary. */
|
|
9
|
+
export declare type CursorPolicyInput = CursorPolicy | {
|
|
10
|
+
native?: string[];
|
|
11
|
+
hide?: string[];
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* A single rule that ties a CSS selector to native-cursor behaviour
|
|
16
|
+
* and/or native-cursor CSS suppression.
|
|
17
|
+
*/
|
|
18
|
+
export declare interface CursorTargetRule {
|
|
19
|
+
/** CSS selector to match. */
|
|
20
|
+
selector: string;
|
|
21
|
+
/**
|
|
22
|
+
* In `"auto"` cursor mode, an element matching this selector yields to the
|
|
23
|
+
* OS cursor.
|
|
24
|
+
* @default true
|
|
25
|
+
*/
|
|
26
|
+
native?: boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Generate a `cursor: none !important` rule for this selector when the
|
|
29
|
+
* custom cursor is active. Needed for elements whose UA stylesheet sets a
|
|
30
|
+
* cursor value (e.g. `a { cursor: pointer }`) that would otherwise override
|
|
31
|
+
* the container's inherited `cursor: none`.
|
|
32
|
+
* @default true
|
|
33
|
+
*/
|
|
34
|
+
hide?: boolean;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export declare const DEFAULT_CURSOR_POLICY: CursorPolicy;
|
|
3
38
|
|
|
4
|
-
|
|
39
|
+
export declare const DEFAULT_HOVER_SELECTORS: string[];
|
|
5
40
|
|
|
6
41
|
/**
|
|
7
42
|
* Interaction state consumed by plugins.
|
|
@@ -45,7 +80,7 @@ export declare interface MouseState {
|
|
|
45
80
|
/** Native cursor temporarily restored due to native-input heuristics. */
|
|
46
81
|
isNative: boolean;
|
|
47
82
|
/** Current cursor mode: auto, custom, native, or both. */
|
|
48
|
-
cursorMode:
|
|
83
|
+
cursorMode: CursorMode;
|
|
49
84
|
/** Currently hovered DOM element, if any. */
|
|
50
85
|
hoverTarget: HTMLElement | null;
|
|
51
86
|
/** User has `prefers-reduced-motion` enabled. */
|
|
@@ -58,11 +93,7 @@ export declare interface MouseState {
|
|
|
58
93
|
interaction: InteractionState;
|
|
59
94
|
}
|
|
60
95
|
|
|
61
|
-
|
|
62
|
-
* The subset of `SupermouseOptions` guaranteed to have a concrete value once
|
|
63
|
-
* the constructor has merged user input over the defaults.
|
|
64
|
-
*/
|
|
65
|
-
declare type ResolvedOptions = SupermouseOptions & Required<Pick<SupermouseOptions, "smoothness" | "enableTouch" | "autoDisableOnMobile" | "cursor" | "hideOnLeave" | "autoStart" | "container" | "dataPrefix" | "zIndex">>;
|
|
96
|
+
declare type ResolvedOptions = SupermouseOptions & Required<Pick<SupermouseOptions, "smoothness" | "enableTouch" | "autoDisableOnMobile" | "cursor" | "hideOnLeave" | "autoStart" | "container" | "dataPrefix" | "zIndex" | "inheritDataAttributes">>;
|
|
66
97
|
|
|
67
98
|
export declare type RuleDefinition = RuleSet | ((el: HTMLElement) => RuleSet);
|
|
68
99
|
|
|
@@ -70,71 +101,91 @@ export declare type RuleSet = Record<string, RuleValue | ((el: HTMLElement) => R
|
|
|
70
101
|
|
|
71
102
|
export declare type RuleValue = string | boolean | number;
|
|
72
103
|
|
|
104
|
+
/**
|
|
105
|
+
* Configuration for a single scope. A scope owns a container, its cursor
|
|
106
|
+
* mode, its hover selectors, and its plugin set. Scopes stack: the innermost
|
|
107
|
+
* scope whose container contains the pointer is the active one.
|
|
108
|
+
*/
|
|
109
|
+
export declare interface ScopeConfig {
|
|
110
|
+
/** Optional identifier for `getScope(name)` lookups. */
|
|
111
|
+
name?: string;
|
|
112
|
+
/** The element this scope is bound to. */
|
|
113
|
+
container: HTMLElement;
|
|
114
|
+
/** Cursor mode for this scope. Inherits from top-level if omitted. */
|
|
115
|
+
cursor?: CursorMode;
|
|
116
|
+
/** Hover selectors for this scope. Inherits from top-level if omitted. */
|
|
117
|
+
hoverSelectors?: string[];
|
|
118
|
+
/** Custom cursor policy for this scope. Inherits from top-level if omitted. */
|
|
119
|
+
cursorPolicy?: CursorPolicyInput;
|
|
120
|
+
/** Plugins installed when this scope activates. */
|
|
121
|
+
plugins?: SupermousePlugin[];
|
|
122
|
+
/**
|
|
123
|
+
* Whether data attributes and rules on ancestors cascade to the hovered
|
|
124
|
+
* element. Inherits from top-level if omitted.
|
|
125
|
+
* @default true
|
|
126
|
+
*/
|
|
127
|
+
inheritDataAttributes?: boolean;
|
|
128
|
+
/** Stage z-index for this scope. Inherits from top-level if omitted. */
|
|
129
|
+
zIndex?: number;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
export declare interface ScopeHandle {
|
|
133
|
+
readonly name: string | undefined;
|
|
134
|
+
readonly container: HTMLElement;
|
|
135
|
+
remove(): void;
|
|
136
|
+
setCursor(mode: CursorMode): void;
|
|
137
|
+
}
|
|
138
|
+
|
|
73
139
|
export declare interface ShapeState {
|
|
74
140
|
width: number;
|
|
75
141
|
height: number;
|
|
76
142
|
borderRadius: number;
|
|
77
143
|
}
|
|
78
144
|
|
|
79
|
-
/* Excluded from this release type: Stage */
|
|
80
|
-
|
|
81
|
-
/**
|
|
82
|
-
* Orchestrates state, animation loop, and plugin lifecycle.
|
|
83
|
-
*/
|
|
84
145
|
export declare class Supermouse {
|
|
85
146
|
static readonly version: string;
|
|
86
147
|
readonly version: string;
|
|
87
148
|
state: MouseState;
|
|
88
|
-
/** Configuration options, fully resolved with defaults applied. */
|
|
89
149
|
options: ResolvedOptions;
|
|
90
|
-
private
|
|
91
|
-
private
|
|
150
|
+
private _scopes;
|
|
151
|
+
private _activeScope;
|
|
152
|
+
private _installingScope;
|
|
153
|
+
private scopeByContainer;
|
|
92
154
|
private input;
|
|
93
155
|
private rafId;
|
|
94
156
|
private lastTime;
|
|
95
|
-
private isRunning;
|
|
96
|
-
private isSuspended;
|
|
97
157
|
private visibilityAbortController;
|
|
98
|
-
private hoverSelectors;
|
|
99
|
-
private hoverSelectorString;
|
|
100
158
|
private crashedPlugins;
|
|
101
159
|
constructor(options?: SupermouseOptions);
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
/** Whether the instance is not disabled/suspended and is processing input. */
|
|
160
|
+
get container(): HTMLElement;
|
|
161
|
+
get stage(): HTMLDivElement;
|
|
105
162
|
get isEnabled(): boolean;
|
|
106
|
-
|
|
163
|
+
get isRunning(): boolean;
|
|
164
|
+
use(plugin: SupermousePlugin): this;
|
|
165
|
+
getPlugin(name: string): SupermousePlugin | undefined;
|
|
107
166
|
enablePlugin(name: string): void;
|
|
108
|
-
/** Disable a plugin by name and hide its element. */
|
|
109
167
|
disablePlugin(name: string): void;
|
|
110
|
-
/** Toggle a plugin's enabled state by name. */
|
|
111
168
|
togglePlugin(name: string): void;
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
/** The DOM element the instance is scoped to. */
|
|
115
|
-
get container(): HTMLElement;
|
|
116
|
-
/** The stage element that plugins append their visuals into. */
|
|
117
|
-
get stage(): HTMLDivElement;
|
|
118
|
-
/** Set the current cursor mode. */
|
|
119
|
-
setCursor(mode: "auto" | "custom" | "native" | "both"): void;
|
|
120
|
-
private init;
|
|
121
|
-
/** Re‑enable input processing and re‑apply cursor state. */
|
|
169
|
+
setCursor(mode: CursorMode): void;
|
|
170
|
+
addScope(config: ScopeConfig): ScopeHandle;
|
|
122
171
|
enable(): void;
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
/** Resume from `suspend()`. */
|
|
128
|
-
resume(): void;
|
|
129
|
-
/** Register a new plugin. */
|
|
130
|
-
use(plugin: SupermousePlugin): this;
|
|
131
|
-
/** Reset physics; optionally clear all input state. */
|
|
132
|
-
private reset;
|
|
133
|
-
private startLoop;
|
|
134
|
-
/** Start the animation loop. */
|
|
172
|
+
disable(opts?: {
|
|
173
|
+
reset?: boolean;
|
|
174
|
+
}): void;
|
|
175
|
+
reset(): void;
|
|
135
176
|
start(): void;
|
|
136
|
-
/** Manually step the animation loop. */
|
|
137
177
|
step(time: number): void;
|
|
178
|
+
destroy(): void;
|
|
179
|
+
private _running;
|
|
180
|
+
private createScope;
|
|
181
|
+
private removeScope;
|
|
182
|
+
private setScopeCursor;
|
|
183
|
+
private installPlugins;
|
|
184
|
+
private installPlugin;
|
|
185
|
+
private handleActiveScopeChange;
|
|
186
|
+
private activatePlugin;
|
|
187
|
+
private deactivatePlugin;
|
|
188
|
+
private rebuildStylesheet;
|
|
138
189
|
private runPluginSafe;
|
|
139
190
|
private cleanupCrashedPlugins;
|
|
140
191
|
private resolveStageVisibility;
|
|
@@ -142,10 +193,24 @@ export declare class Supermouse {
|
|
|
142
193
|
private resetMotion;
|
|
143
194
|
private update;
|
|
144
195
|
private tick;
|
|
145
|
-
/** Pause rAF loop when tab hidden; resume on visible. */
|
|
146
196
|
private bindVisibilityHandling;
|
|
147
|
-
|
|
148
|
-
|
|
197
|
+
private startLoop;
|
|
198
|
+
/**
|
|
199
|
+
* @deprecated Prefer setting `hoverSelectors` at scope creation, or use
|
|
200
|
+
* `definePlugin`'s `selector` option. This method is kept for raw-object
|
|
201
|
+
* plugins and runtime extension; it mutates the active scope's selector set.
|
|
202
|
+
*/
|
|
203
|
+
registerHoverTarget(selector: string): void;
|
|
204
|
+
/**
|
|
205
|
+
* @deprecated Read from the active scope instead. Exposed for tests and
|
|
206
|
+
* debugging only.
|
|
207
|
+
*/
|
|
208
|
+
get hoverSelectors(): Set<string>;
|
|
209
|
+
/**
|
|
210
|
+
* @deprecated Read from the active scope instead. Exposed for tests and
|
|
211
|
+
* debugging only.
|
|
212
|
+
*/
|
|
213
|
+
get plugins(): SupermousePlugin[];
|
|
149
214
|
}
|
|
150
215
|
|
|
151
216
|
export declare type SupermouseInstance = Supermouse;
|
|
@@ -180,7 +245,23 @@ export declare interface SupermouseOptions {
|
|
|
180
245
|
* - `"both"`: always show custom cursor **and** native cursor together (no suppression).
|
|
181
246
|
* @default "auto"
|
|
182
247
|
*/
|
|
183
|
-
cursor?:
|
|
248
|
+
cursor?: CursorMode;
|
|
249
|
+
/**
|
|
250
|
+
* Custom cursor policy. Defaults to `DEFAULT_CURSOR_POLICY` from `./policy`.
|
|
251
|
+
*/
|
|
252
|
+
cursorPolicy?: CursorPolicyInput;
|
|
253
|
+
/**
|
|
254
|
+
* Additional scopes registered at construction. The primary scope is
|
|
255
|
+
* created from the top-level `container` / `hoverSelectors` / `plugins`
|
|
256
|
+
* options; these are appended after it.
|
|
257
|
+
*/
|
|
258
|
+
scopes?: ScopeConfig[];
|
|
259
|
+
/**
|
|
260
|
+
* Whether data attributes and rules on ancestors cascade to the hovered
|
|
261
|
+
* element. Applies to the primary scope; individual scopes can override.
|
|
262
|
+
* @default true
|
|
263
|
+
*/
|
|
264
|
+
inheritDataAttributes?: boolean;
|
|
184
265
|
/**
|
|
185
266
|
* Whether to hide the custom cursor when the pointer leaves the browser viewport.
|
|
186
267
|
* @default true
|
|
@@ -239,7 +320,8 @@ export declare interface SupermousePlugin {
|
|
|
239
320
|
/** Called when plugin disabled via `.disablePlugin()`. */
|
|
240
321
|
onDisable?: (instance: SupermouseInstance) => void;
|
|
241
322
|
/**
|
|
242
|
-
* Called before the plugin is disabled.
|
|
323
|
+
* Called before the plugin is disabled. Return a Promise to delay hiding
|
|
324
|
+
* until an exit animation completes.
|
|
243
325
|
*/
|
|
244
326
|
onBeforeDisable?(instance: SupermouseInstance): void | Promise<void>;
|
|
245
327
|
}
|