@supermousejs/core 2.4.3 → 2.5.0-beta.1

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/index.d.ts CHANGED
@@ -1,7 +1,42 @@
1
- /** Default selectors that trigger `state.isHover`. Override with `hoverSelectors`. */
2
- export declare const DEFAULT_HOVER_SELECTORS: string[];
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
- /* Excluded from this release type: Input */
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: "auto" | "custom" | "native" | "both";
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 plugins;
91
- private _stage;
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
- /** Look up a registered plugin by name. */
103
- getPlugin(name: string): SupermousePlugin | undefined;
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
- /** Enable a plugin by name. */
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
- /** Add a selector to hover detection and cursor suppression. */
113
- registerHoverTarget(selector: string): void;
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
- /** Disable input processing and restore native cursor. */
124
- disable(): void;
125
- /** Temporarily yield to a scoped instance. */
126
- suspend(): void;
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
- /** Destroy the instance, freeing all resources. */
148
- destroy(): void;
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?: "auto" | "custom" | "native" | "both";
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
  }