@fluxlay/react 1.3.2 → 1.3.4

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/README.md CHANGED
@@ -371,10 +371,10 @@ import { notify } from "@fluxlay/react";
371
371
  await notify({ title: "Build finished", body: "All tests passed" });
372
372
  ```
373
373
 
374
- | Option | Type | Description |
375
- | ------- | -------- | ---------------------------------------- |
374
+ | Option | Type | Description |
375
+ | ------- | -------- | ------------------------------------------ |
376
376
  | `title` | `string` | Required. Shown as the notification title. |
377
- | `body` | `string` | Optional. Shown as the notification body. |
377
+ | `body` | `string` | Optional. Shown as the notification body. |
378
378
 
379
379
  The first call from a freshly installed Fluxlay app may trigger an OS-level permission prompt; subsequent calls succeed silently if the user grants notification permission.
380
380
 
package/dist/index.d.mts CHANGED
@@ -1,7 +1,5 @@
1
- import * as _$react from "react";
2
1
  import { RefObject } from "react";
3
2
  import { FitAddon } from "@xterm/addon-fit";
4
- import * as _$_xterm_xterm0 from "@xterm/xterm";
5
3
  import { ITheme, Terminal } from "@xterm/xterm";
6
4
  //#region ../sdk-core/dist/index.d.mts
7
5
  //#region src/caret-position.d.ts
@@ -698,36 +696,36 @@ declare const defaultTransport: HttpTransport; //#endregion
698
696
  */
699
697
  declare const TerminalThemes: {
700
698
  /** Dark themes with a transparent background. */readonly dark: {
701
- /** Default dark theme using Tailwind color palette. */readonly default: _$_xterm_xterm0.ITheme; /** Modern dark theme using Slate/Rose color palette. */
702
- readonly modern: _$_xterm_xterm0.ITheme;
699
+ /** Default dark theme using Tailwind color palette. */readonly default: import("@xterm/xterm").ITheme; /** Modern dark theme using Slate/Rose color palette. */
700
+ readonly modern: import("@xterm/xterm").ITheme;
703
701
  }; /** Light themes. */
704
702
  readonly light: {
705
- /** Default light theme. */readonly default: _$_xterm_xterm0.ITheme; /** Modern light theme. */
706
- readonly modern: _$_xterm_xterm0.ITheme;
703
+ /** Default light theme. */readonly default: import("@xterm/xterm").ITheme; /** Modern light theme. */
704
+ readonly modern: import("@xterm/xterm").ITheme;
707
705
  }; /** Nord theme — an arctic, north-bluish color palette. */
708
- readonly nord: _$_xterm_xterm0.ITheme; /** Dracula theme — a dark theme with vivid accent colors. */
709
- readonly dracula: _$_xterm_xterm0.ITheme; /** Gruvbox themes — a retro groove color scheme. */
706
+ readonly nord: import("@xterm/xterm").ITheme; /** Dracula theme — a dark theme with vivid accent colors. */
707
+ readonly dracula: import("@xterm/xterm").ITheme; /** Gruvbox themes — a retro groove color scheme. */
710
708
  readonly gruvbox: {
711
- /** Gruvbox dark variant. */readonly dark: _$_xterm_xterm0.ITheme; /** Gruvbox light variant. */
712
- readonly light: _$_xterm_xterm0.ITheme;
709
+ /** Gruvbox dark variant. */readonly dark: import("@xterm/xterm").ITheme; /** Gruvbox light variant. */
710
+ readonly light: import("@xterm/xterm").ITheme;
713
711
  }; /** Solarized themes — a precision color scheme with reduced brightness. */
714
712
  readonly solarized: {
715
- /** Solarized dark variant. */readonly dark: _$_xterm_xterm0.ITheme; /** Solarized light variant. */
716
- readonly light: _$_xterm_xterm0.ITheme;
713
+ /** Solarized dark variant. */readonly dark: import("@xterm/xterm").ITheme; /** Solarized light variant. */
714
+ readonly light: import("@xterm/xterm").ITheme;
717
715
  }; /** One Dark theme — based on Atom's One Dark syntax theme. */
718
- readonly oneDark: _$_xterm_xterm0.ITheme; /** Catppuccin themes — a soothing pastel color scheme. */
716
+ readonly oneDark: import("@xterm/xterm").ITheme; /** Catppuccin themes — a soothing pastel color scheme. */
719
717
  readonly catppuccin: {
720
- /** Catppuccin Latte — the light variant. */readonly latte: _$_xterm_xterm0.ITheme; /** Catppuccin Frappé — a cool medium-dark variant. */
721
- readonly frappe: _$_xterm_xterm0.ITheme; /** Catppuccin Macchiato — a warm medium-dark variant. */
722
- readonly macchiato: _$_xterm_xterm0.ITheme; /** Catppuccin Mocha — the darkest variant. */
723
- readonly mocha: _$_xterm_xterm0.ITheme;
718
+ /** Catppuccin Latte — the light variant. */readonly latte: import("@xterm/xterm").ITheme; /** Catppuccin Frappé — a cool medium-dark variant. */
719
+ readonly frappe: import("@xterm/xterm").ITheme; /** Catppuccin Macchiato — a warm medium-dark variant. */
720
+ readonly macchiato: import("@xterm/xterm").ITheme; /** Catppuccin Mocha — the darkest variant. */
721
+ readonly mocha: import("@xterm/xterm").ITheme;
724
722
  }; /** Monokai Pro theme — a refined dark theme inspired by Monokai. */
725
- readonly monokaiPro: _$_xterm_xterm0.ITheme; /** Tokyo Night theme — a dark theme inspired by Tokyo city lights. */
726
- readonly tokyoNight: _$_xterm_xterm0.ITheme; /** Night Owl theme — optimized for late-night coding with low brightness. */
727
- readonly nightOwl: _$_xterm_xterm0.ITheme; /** Everforest themes — a green-tinted theme inspired by forests. */
723
+ readonly monokaiPro: import("@xterm/xterm").ITheme; /** Tokyo Night theme — a dark theme inspired by Tokyo city lights. */
724
+ readonly tokyoNight: import("@xterm/xterm").ITheme; /** Night Owl theme — optimized for late-night coding with low brightness. */
725
+ readonly nightOwl: import("@xterm/xterm").ITheme; /** Everforest themes — a green-tinted theme inspired by forests. */
728
726
  readonly everforest: {
729
- /** Everforest dark variant. */readonly dark: _$_xterm_xterm0.ITheme; /** Everforest light variant. */
730
- readonly light: _$_xterm_xterm0.ITheme;
727
+ /** Everforest dark variant. */readonly dark: import("@xterm/xterm").ITheme; /** Everforest light variant. */
728
+ readonly light: import("@xterm/xterm").ITheme;
731
729
  };
732
730
  }; //#endregion
733
731
  //#endregion
@@ -983,7 +981,7 @@ interface TerminalInstance {
983
981
  * - `instance` – the {@link TerminalInstance} once the terminal is mounted, or `null`.
984
982
  */
985
983
  declare function useTerminal(options?: UseTerminalOptions): {
986
- terminalRef: _$react.RefObject<HTMLDivElement | null>;
984
+ terminalRef: import("react").RefObject<HTMLDivElement | null>;
987
985
  instance: TerminalInstance | null;
988
986
  };
989
987
  //#endregion
@@ -1068,4 +1066,4 @@ interface SystemMonitorOptions {
1068
1066
  */
1069
1067
  declare function useSystemMonitor(options?: SystemMonitorOptions): SystemMonitorInfo;
1070
1068
  //#endregion
1071
- export { AudioInfo, AudioOptions, CaretRect, DiskInfo, HttpTransport, ImeCommitHandler, type ImeCommitPayload, type ImeCompositionPayload, ImeInlineController, ImeInlineControllerOptions, ImeInputApi, InvokeMethodMap, type KeyEvent, type KeyModifiers, KeyboardHandlers, ManifestInfo, MediaMetadataInfo, MediaMetadataOptions, type MouseButton, type MouseButtonEvent, MouseEventHandlers, type MouseInputEvent, MousePosition, type MouseWheelEvent, NotifyOptions, PropertyValue, PropertyValues, SelectionRect, ShellOptions, type ShellResult, SubscribeEventMap, SystemMonitorInfo, SystemMonitorOptions, TerminalInstance, TerminalThemes, Transport, UseShellOptions, UseTerminalOptions, caretIndexFromClientPoint, defaultTransport, getPropertyFileUrl, isImeAutoTarget, measureCaretRect, measureSelectionRects, normalizedToPixel, notify, openUrl, pixelToNormalized, proxiedFetch, runShell, useActiveElement, useAudio, useImeInput, useIsFocused, useKeyboard, useMediaMetadata, useMouseEvents, useMousePosition, useProperties, useShell, useSystemMonitor, useTerminal };
1069
+ export { AudioInfo, AudioOptions, CaretRect, DiskInfo, HttpTransport, ImeCommitHandler, ImeCommitPayload, ImeCompositionPayload, ImeInlineController, ImeInlineControllerOptions, ImeInputApi, InvokeMethodMap, KeyEvent, KeyModifiers, KeyboardHandlers, ManifestInfo, MediaMetadataInfo, MediaMetadataOptions, MouseButton, MouseButtonEvent, MouseEventHandlers, MouseInputEvent, MousePosition, MouseWheelEvent, NotifyOptions, PropertyValue, PropertyValues, SelectionRect, ShellOptions, ShellResult, SubscribeEventMap, SystemMonitorInfo, SystemMonitorOptions, TerminalInstance, TerminalThemes, Transport, UseShellOptions, UseTerminalOptions, caretIndexFromClientPoint, defaultTransport, getPropertyFileUrl, isImeAutoTarget, measureCaretRect, measureSelectionRects, normalizedToPixel, notify, openUrl, pixelToNormalized, proxiedFetch, runShell, useActiveElement, useAudio, useImeInput, useIsFocused, useKeyboard, useMediaMetadata, useMouseEvents, useMousePosition, useProperties, useShell, useSystemMonitor, useTerminal };
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import{_ as e,a as t,c as n,d as r,f as i,g as a,h as o,i as s,l as c,m as l,n as u,o as d,p as f,r as p,s as m,t as h,u as g,v as _}from"./use-mouse-events-7jatubKJ.mjs";import{useCallback as v,useEffect as y,useRef as b,useState as x}from"react";import{FitAddon as S}from"@xterm/addon-fit";import{Terminal as C}from"@xterm/xterm";import"@xterm/xterm/css/xterm.css";function w(){let[e,t]=x(()=>typeof document>`u`?null:T());return y(()=>{let e=()=>t(T());return e(),document.addEventListener(`focusin`,e),document.addEventListener(`focusout`,e),()=>{document.removeEventListener(`focusin`,e),document.removeEventListener(`focusout`,e)}},[]),e}function T(){let e=document.activeElement;return!e||e===document.body||e===document.documentElement?null:e}const E=new m;function D(e){let[t,n]=x({rms:0,peak:0,spectrum:[]}),r=e?.numBands;return y(()=>{let e={};r!==void 0&&(e.num_bands=String(r));let t=E.subscribe(`audio-stream`,e=>n(e),e);return()=>{t()}},[r]),t}function O(){let[e,t]=x(null),[n,r]=x(0),a=b(new Set),o=b(!1);y(()=>{let e=i.subscribe(`ime-composition-stream`,e=>{t(e.text===``?null:e.text),r(e.cursor)}),n=i.subscribe(`ime-commit-stream`,e=>{if(e.type===`commit`)for(let t of a.current)t(e.text)});return()=>{e(),n()}},[]);let s=v(e=>{o.current=!0;let t;if(e instanceof HTMLElement){let n=e.getBoundingClientRect();t={x:n.left,y:n.top,height:n.height}}else e&&typeof e==`object`&&(t=e);i.invoke(`ime-activate`,t?{caret:t}:{}).catch(()=>{})},[]),c=v(()=>{o.current=!1,i.invoke(`ime-deactivate`,{}).catch(()=>{})},[]),l=v(e=>(a.current.add(e),()=>{a.current.delete(e)}),[]);return y(()=>()=>{o.current&&=(i.invoke(`ime-deactivate`,{}).catch(()=>{}),!1)},[]),{composition:e,cursor:n,activate:s,deactivate:c,onCommit:l}}function k(e){let[t,n]=x(!1);return y(()=>{let t=e.current;if(!t)return;n(document.activeElement===t);let r=()=>n(!0),i=()=>n(!1);return t.addEventListener(`focus`,r),t.addEventListener(`blur`,i),()=>{t.removeEventListener(`focus`,r),t.removeEventListener(`blur`,i)}},[e]),t}const A=new m;function j(e){let[t,n]=x({title:null,artist:null,album:null,artwork:null,duration:null,elapsedTime:null,playbackRate:null,isPlaying:!1}),r=e?.intervalMs;return y(()=>{let e={};r!==void 0&&(e.interval_ms=String(r));let t=A.subscribe(`media-metadata-stream`,e=>n(e),e);return()=>{t()}},[r]),t}const M=new m;function N(){let[e,t]=x({});return y(()=>{M.invoke(`properties`,{}).then(e=>t(e));let e=M.subscribe(`properties-stream`,e=>t(e));return()=>{e()}},[]),e}function P(e,t={}){let{showStdout:n=!0,showStderr:r=!1,refreshInterval:i=3e4,terminal:a}=t,[o,c]=x(!1),[l,u]=x(null),[d,f]=x(null),p=b(t);y(()=>{p.current=t},[t]);let m=v(async()=>{if(!o){c(!0),u(null);try{let t=p.current,n=t.columns,r=t.lines;a&&(a.fitAddon.fit(),n=a.terminal.cols,r=a.terminal.rows);let i=await s(e,{...t,columns:n,lines:r});f(i),i.success||u(`Command failed with status ${i.statusCode}: ${i.stderr}`)}catch(e){u(String(e))}finally{c(!1)}}},[e,a]);return y(()=>{if(!a||!d)return;let{terminal:e}=a;if(e.reset(),d.success){let t=``;n&&(t+=d.stdout),r&&(t+=d.stderr);let i=t.trimEnd();if(i){e.write(i);let t=i.split(`
1
+ import{_ as e,a as t,c as n,d as r,f as i,g as a,h as o,i as s,l as c,m as l,n as u,o as d,p as f,r as p,s as m,t as h,u as g,v as _}from"./use-mouse-events-NW_Jq8L8.mjs";import{useCallback as v,useEffect as y,useRef as b,useState as x}from"react";import{FitAddon as S}from"@xterm/addon-fit";import{Terminal as C}from"@xterm/xterm";import"@xterm/xterm/css/xterm.css";function w(){let[e,t]=x(()=>typeof document>`u`?null:T());return y(()=>{let e=()=>t(T());return e(),document.addEventListener(`focusin`,e),document.addEventListener(`focusout`,e),()=>{document.removeEventListener(`focusin`,e),document.removeEventListener(`focusout`,e)}},[]),e}function T(){let e=document.activeElement;return!e||e===document.body||e===document.documentElement?null:e}const E=new m;function D(e){let[t,n]=x({rms:0,peak:0,spectrum:[]}),r=e?.numBands;return y(()=>{let e={};r!==void 0&&(e.num_bands=String(r));let t=E.subscribe(`audio-stream`,e=>n(e),e);return()=>{t()}},[r]),t}function O(){let[e,t]=x(null),[n,r]=x(0),a=b(new Set),o=b(!1);y(()=>{let e=i.subscribe(`ime-composition-stream`,e=>{t(e.text===``?null:e.text),r(e.cursor)}),n=i.subscribe(`ime-commit-stream`,e=>{if(e.type===`commit`)for(let t of a.current)t(e.text)});return()=>{e(),n()}},[]);let s=v(e=>{o.current=!0;let t;if(e instanceof HTMLElement){let n=e.getBoundingClientRect();t={x:n.left,y:n.top,height:n.height}}else e&&typeof e==`object`&&(t=e);i.invoke(`ime-activate`,t?{caret:t}:{}).catch(()=>{})},[]),c=v(()=>{o.current=!1,i.invoke(`ime-deactivate`,{}).catch(()=>{})},[]),l=v(e=>(a.current.add(e),()=>{a.current.delete(e)}),[]);return y(()=>()=>{o.current&&=(i.invoke(`ime-deactivate`,{}).catch(()=>{}),!1)},[]),{composition:e,cursor:n,activate:s,deactivate:c,onCommit:l}}function k(e){let[t,n]=x(!1);return y(()=>{let t=e.current;if(!t)return;n(document.activeElement===t);let r=()=>n(!0),i=()=>n(!1);return t.addEventListener(`focus`,r),t.addEventListener(`blur`,i),()=>{t.removeEventListener(`focus`,r),t.removeEventListener(`blur`,i)}},[e]),t}const A=new m;function j(e){let[t,n]=x({title:null,artist:null,album:null,artwork:null,duration:null,elapsedTime:null,playbackRate:null,isPlaying:!1}),r=e?.intervalMs;return y(()=>{let e={};r!==void 0&&(e.interval_ms=String(r));let t=A.subscribe(`media-metadata-stream`,e=>n(e),e);return()=>{t()}},[r]),t}const M=new m;function N(){let[e,t]=x({});return y(()=>{M.invoke(`properties`,{}).then(e=>t(e));let e=M.subscribe(`properties-stream`,e=>t(e));return()=>{e()}},[]),e}function P(e,t={}){let{showStdout:n=!0,showStderr:r=!1,refreshInterval:i=3e4,terminal:a}=t,[o,c]=x(!1),[l,u]=x(null),[d,f]=x(null),p=b(t);y(()=>{p.current=t},[t]);let m=v(async()=>{if(!o){c(!0),u(null);try{let t=p.current,n=t.columns,r=t.lines;a&&(a.fitAddon.fit(),n=a.terminal.cols,r=a.terminal.rows);let i=await s(e,{...t,columns:n,lines:r});f(i),i.success||u(`Command failed with status ${i.statusCode}: ${i.stderr}`)}catch(e){u(String(e))}finally{c(!1)}}},[e,a]);return y(()=>{if(!a||!d)return;let{terminal:e}=a;if(e.reset(),d.success){let t=``;n&&(t+=d.stdout),r&&(t+=d.stderr);let i=t.trimEnd();if(i){e.write(i);let t=i.split(`
2
2
  `).length;e.resize(e.cols,Math.max(1,t))}else e.resize(e.cols,1)}else{let t=`Command failed with status ${d.statusCode}: ${d.stderr}`;e.write(`\x1b[31m${t.trimEnd()}\x1b[0m`),e.resize(e.cols,1)}},[a,d,n,r]),y(()=>{m()},[e]),y(()=>{if(!i)return;let e=setInterval(m,i);return()=>clearInterval(e)},[m,i]),{execute:m,isRunning:o,error:l,result:d}}const F=new m;function I(e){let[t,n]=x({cpuUsage:0,cpuPerCore:[],cpuFrequencyMhz:[],memoryTotal:0,memoryUsed:0,memoryUsage:0,swapTotal:0,swapUsed:0,swapUsage:0,batteryLevel:null,batteryCharging:null,networkRxBytesPerSec:0,networkTxBytesPerSec:0,diskReadBytesPerSec:0,diskWriteBytesPerSec:0,processCount:0,uptimeSecs:0,loadAverage:[0,0,0],disks:[],hostname:``,osName:``,cpuBrand:``,physicalCoreCount:0,logicalCoreCount:0,cpuArch:``,kernelVersion:``}),r=e?.cpuIntervalMs,i=e?.memoryIntervalMs,a=e?.networkIntervalMs,o=e?.diskIoIntervalMs,s=e?.diskSpaceIntervalMs,c=e?.batteryIntervalMs,l=e?.processIntervalMs,u=e?.loadAverageIntervalMs;return y(()=>{let e={};r!==void 0&&(e.cpu_interval_ms=String(r)),i!==void 0&&(e.memory_interval_ms=String(i)),a!==void 0&&(e.network_interval_ms=String(a)),o!==void 0&&(e.disk_io_interval_ms=String(o)),s!==void 0&&(e.disk_space_interval_ms=String(s)),c!==void 0&&(e.battery_interval_ms=String(c)),l!==void 0&&(e.process_interval_ms=String(l)),u!==void 0&&(e.load_average_interval_ms=String(u));let t=F.subscribe(`system-monitor-stream`,e=>n(e),e);return()=>{t()}},[r,i,a,o,s,c,l,u]),t}function L(e={}){let{fontSize:t=12,fontFamily:n=`ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace`,theme:r=d.dark.default}=e,i=b(null),[a,o]=x(null);return y(()=>{if(!i.current)return;let e=document.createElement(`style`);e.textContent=`
3
3
  .xterm-char-measure-element {
4
4
  position: absolute !important;
@@ -1,6 +1,4 @@
1
- import * as _$react from "react";
2
1
  import { ReactNode } from "react";
3
- import * as _$react_jsx_runtime0 from "react/jsx-runtime";
4
2
 
5
3
  //#region ../../mimo/core/dist/index.d.mts
6
4
  //#region src/pointer/cursor.d.ts
@@ -232,7 +230,7 @@ declare class MimoForwarder {
232
230
  //#endregion
233
231
  //#region ../../mimo/react/dist/index.d.mts
234
232
  //#region src/context.d.ts
235
- declare const MimoForwarderContext: _$react.Context<MimoForwarder | null>; //#endregion
233
+ declare const MimoForwarderContext: import("react").Context<MimoForwarder | null>; //#endregion
236
234
  //#region src/MimoProvider.d.ts
237
235
  interface MimoProviderProps extends MimoForwarderOptions {
238
236
  children?: ReactNode;
@@ -254,7 +252,7 @@ interface MimoProviderProps extends MimoForwarderOptions {
254
252
  declare function MimoProvider({
255
253
  children,
256
254
  ...options
257
- }: MimoProviderProps): _$react_jsx_runtime0.JSX.Element; //#endregion
255
+ }: MimoProviderProps): import("react/jsx-runtime").JSX.Element; //#endregion
258
256
  //#region src/useMimoForwarder.d.ts
259
257
  /**
260
258
  * Read the {@link MimoForwarder} instance owned by the nearest
@@ -297,6 +295,6 @@ declare function MimoProvider$1({
297
295
  keyboard,
298
296
  children,
299
297
  ...rest
300
- }: MimoProviderProps$1): _$react_jsx_runtime0.JSX.Element;
298
+ }: MimoProviderProps$1): import("react/jsx-runtime").JSX.Element;
301
299
  //#endregion
302
300
  export { type CursorOptions, type KeyboardModifiers, type KeyboardSource, type KeyboardSourceEvent, type KeyboardTargetStrategy, MimoForwarder, MimoForwarderContext, type MimoForwarderOptions, MimoProvider as MimoForwarderProvider, type MimoProviderProps as MimoForwarderProviderProps, MimoProvider$1 as MimoProvider, type MimoProviderProps$1 as MimoProviderProps, type PointerButton, type PointerSource, type PointerSourceButtonEvent, type PointerSourceCancelEvent, type PointerSourceEvent, type PointerSourceMoveEvent, type PointerSourceWheelEvent, type PointerType, type Unsubscribe, useMimoForwarder };
@@ -1,2 +1,2 @@
1
- import{d as e,n as t,r as n,t as r}from"../use-mouse-events-7jatubKJ.mjs";import{createContext as i,use as a,useEffect as o,useState as s}from"react";import{jsx as c,jsxs as ee}from"react/jsx-runtime";function l(e){return{view:window,bubbles:!0,cancelable:!0,composed:!0,code:e.code,key:e.key??``,repeat:e.repeat??!1,shiftKey:e.modifiers?.shift??!1,ctrlKey:e.modifiers?.ctrl??!1,altKey:e.modifiers?.alt??!1,metaKey:e.modifiers?.meta??!1}}function u(e,t){let n=t.pressed?`keydown`:`keyup`;e.dispatchEvent(new KeyboardEvent(n,l(t)))}function d(e,t){if(!t.pressed||!e||!(e instanceof Element)||t.modifiers?.ctrl||t.modifiers?.meta||!te(e))return;if(t.code===`Backspace`){g(e,`deleteContentBackward`);return}if(t.code===`Delete`){g(e,`deleteContentForward`);return}if(t.code===`Enter`||t.code===`NumpadEnter`){(e instanceof HTMLTextAreaElement||e instanceof HTMLElement&&e.isContentEditable)&&h(e,`
1
+ import{d as e,n as t,r as n,t as r}from"../use-mouse-events-NW_Jq8L8.mjs";import{createContext as i,use as a,useEffect as o,useState as s}from"react";import{jsx as c,jsxs as ee}from"react/jsx-runtime";function l(e){return{view:window,bubbles:!0,cancelable:!0,composed:!0,code:e.code,key:e.key??``,repeat:e.repeat??!1,shiftKey:e.modifiers?.shift??!1,ctrlKey:e.modifiers?.ctrl??!1,altKey:e.modifiers?.alt??!1,metaKey:e.modifiers?.meta??!1}}function u(e,t){let n=t.pressed?`keydown`:`keyup`;e.dispatchEvent(new KeyboardEvent(n,l(t)))}function d(e,t){if(!t.pressed||!e||!(e instanceof Element)||t.modifiers?.ctrl||t.modifiers?.meta||!te(e))return;if(t.code===`Backspace`){g(e,`deleteContentBackward`);return}if(t.code===`Delete`){g(e,`deleteContentForward`);return}if(t.code===`Enter`||t.code===`NumpadEnter`){(e instanceof HTMLTextAreaElement||e instanceof HTMLElement&&e.isContentEditable)&&h(e,`
2
2
  `);return}if(t.code===`Tab`){(e instanceof HTMLTextAreaElement||e instanceof HTMLElement&&e.isContentEditable)&&h(e,` `);return}let n=ne(t);n!==null&&h(e,n)}function te(e){if(e instanceof HTMLInputElement){if(e.disabled||e.readOnly)return!1;let t=e.type.toLowerCase();return t===``||f.has(t)}return e instanceof HTMLTextAreaElement?!e.disabled&&!e.readOnly:e instanceof HTMLElement&&e.isContentEditable}const f=new Set([`text`,`search`,`url`,`tel`,`email`,`password`,`number`]);function ne(e){return e.key&&e.key.length===1?e.key:re(e.code,e.modifiers?.shift??!1)}function re(e,t){let n=e.match(/^Key([A-Z])$/);if(n)return t?n[1]:n[1].toLowerCase();let r=e.match(/^Digit(\d)$/);if(r)return t?p[parseInt(r[1],10)]:r[1];let i=e.match(/^Numpad(\d)$/);return i?i[1]:m[e]?.[+!!t]??null}const p=[`)`,`!`,`@`,`#`,`$`,`%`,`^`,`&`,`*`,`(`],m={Space:[` `,` `],Minus:[`-`,`_`],Equal:[`=`,`+`],BracketLeft:[`[`,`{`],BracketRight:[`]`,`}`],Backslash:[`\\`,`|`],Semicolon:[`;`,`:`],Quote:[`'`,`"`],Comma:[`,`,`<`],Period:[`.`,`>`],Slash:[`/`,`?`],Backquote:["`",`~`],NumpadMultiply:[`*`,`*`],NumpadAdd:[`+`,`+`],NumpadSubtract:[`-`,`-`],NumpadDivide:[`/`,`/`],NumpadDecimal:[`.`,`.`]};function h(e,t){if(e instanceof HTMLInputElement||e instanceof HTMLTextAreaElement){let n=e.selectionStart??e.value.length,r=e.selectionEnd??e.value.length;_(e,e.value.slice(0,n)+t+e.value.slice(r));let i=n+t.length;try{e.setSelectionRange(i,i)}catch{}v(e,`insertText`,t)}else if(e instanceof HTMLElement&&e.isContentEditable){let n=e.ownerDocument,r=n.getSelection();if(!r)return;if(r.rangeCount===0){let t=n.createRange();t.selectNodeContents(e),t.collapse(!1),r.removeAllRanges(),r.addRange(t)}let i=r.getRangeAt(0);i.deleteContents();let a=n.createTextNode(t);i.insertNode(a),i.setStartAfter(a),i.setEndAfter(a),r.removeAllRanges(),r.addRange(i),v(e,`insertText`,t)}}function g(e,t){if(e instanceof HTMLInputElement||e instanceof HTMLTextAreaElement){let n=e.selectionStart??e.value.length,r=e.selectionEnd??e.value.length;if(n===r)if(t===`deleteContentBackward`){if(n===0)return;--n}else{if(r>=e.value.length)return;r+=1}_(e,e.value.slice(0,n)+e.value.slice(r));try{e.setSelectionRange(n,n)}catch{}v(e,t,null)}else if(e instanceof HTMLElement&&e.isContentEditable){let n=e.ownerDocument.getSelection();if(!n||n.rangeCount===0)return;let r=n.getRangeAt(0);if(r.collapsed)try{t===`deleteContentBackward`?r.setStart(r.startContainer,Math.max(0,r.startOffset-1)):r.setEnd(r.endContainer,r.endOffset+1)}catch{return}r.deleteContents(),v(e,t,null)}}function _(e,t){let n=e instanceof HTMLInputElement?HTMLInputElement.prototype:HTMLTextAreaElement.prototype,r=Object.getOwnPropertyDescriptor(n,`value`);r?.set?r.set.call(e,t):e.value=t}function v(e,t,n){e.dispatchEvent(new InputEvent(`beforeinput`,{bubbles:!0,cancelable:!0,composed:!0,inputType:t,data:n})),e.dispatchEvent(new InputEvent(`input`,{bubbles:!0,composed:!0,inputType:t,data:n}))}const y={left:0,middle:1,right:2,aux1:3,aux2:4},b={left:1,right:2,middle:4,aux1:8,aux2:16};function x(e){return y[e]}function S(e){return b[e]}function C(e,t,n,r,i=!0){return{view:window,bubbles:i,cancelable:!0,composed:!0,clientX:e,clientY:t,screenX:r.screenX,screenY:r.screenY,movementX:r.movementX,movementY:r.movementY,button:n,buttons:r.buttons,pointerId:1,pointerType:r.pointerType,isPrimary:!0,pressure:r.pressure,tiltX:r.tiltX,tiltY:r.tiltY,shiftKey:r.modifiers.shiftKey,ctrlKey:r.modifiers.ctrlKey,altKey:r.modifiers.altKey,metaKey:r.modifiers.metaKey}}function w(e,t,n,r,i=!0){return{view:window,bubbles:i,cancelable:!0,composed:!0,clientX:e,clientY:t,screenX:r.screenX,screenY:r.screenY,movementX:r.movementX,movementY:r.movementY,button:n,buttons:r.buttons,shiftKey:r.modifiers.shiftKey,ctrlKey:r.modifiers.ctrlKey,altKey:r.modifiers.altKey,metaKey:r.modifiers.metaKey}}function T(e,t,n,r){e.dispatchEvent(new PointerEvent(`pointermove`,C(t,n,-1,r))),e.dispatchEvent(new MouseEvent(`mousemove`,w(t,n,0,r)))}function ie(e,t,n,r){e.dispatchEvent(new PointerEvent(`pointerout`,C(t,n,-1,r))),e.dispatchEvent(new MouseEvent(`mouseout`,w(t,n,0,r)))}function E(e,t,n,r){e.dispatchEvent(new PointerEvent(`pointerover`,C(t,n,-1,r))),e.dispatchEvent(new MouseEvent(`mouseover`,w(t,n,0,r)))}function D(e,t,n,r){e.dispatchEvent(new PointerEvent(`pointerleave`,C(t,n,-1,r,!1))),e.dispatchEvent(new MouseEvent(`mouseleave`,w(t,n,0,r,!1)))}function O(e,t,n,r){e.dispatchEvent(new PointerEvent(`pointerenter`,C(t,n,-1,r,!1))),e.dispatchEvent(new MouseEvent(`mouseenter`,w(t,n,0,r,!1)))}function k(e,t,n,r,i){let a=x(r);e.dispatchEvent(new PointerEvent(`pointerdown`,C(t,n,a,i))),e.dispatchEvent(new MouseEvent(`mousedown`,w(t,n,a,i)))}function A(e,t,n,r,i){let a=x(r);e.dispatchEvent(new PointerEvent(`pointerup`,C(t,n,a,i))),e.dispatchEvent(new MouseEvent(`mouseup`,w(t,n,a,i)))}function j(e,t,n,r,i,a){let o={...w(t,n,x(r),i),detail:a};r===`left`?(e.dispatchEvent(new MouseEvent(`click`,o)),a===2&&e.dispatchEvent(new MouseEvent(`dblclick`,o))):r===`right`?e.dispatchEvent(new MouseEvent(`contextmenu`,o)):e.dispatchEvent(new MouseEvent(`auxclick`,o))}function M(e,t,n,r,i,a,o){e.dispatchEvent(new WheelEvent(`wheel`,{...w(t,n,0,o),deltaX:r,deltaY:i,deltaMode:a}))}function N(e,t,n,r){e.dispatchEvent(new PointerEvent(`pointercancel`,C(t,n,-1,r)))}function P(e,t,n,r){e.dispatchEvent(new PointerEvent(`gotpointercapture`,C(t,n,-1,r)))}function F(e,t,n,r){e.dispatchEvent(new PointerEvent(`lostpointercapture`,C(t,n,-1,r)))}const I=[];let L=!1,R,z,B;function ae(){L||(L=!0,R=Element.prototype.setPointerCapture,z=Element.prototype.releasePointerCapture,B=Element.prototype.hasPointerCapture,Element.prototype.setPointerCapture=function(e){let t=I[I.length-1];if(t&&e===1){t.markCaptured(this);return}return R.call(this,e)},Element.prototype.releasePointerCapture=function(e){let t=I[I.length-1];if(t&&e===1&&t.getCaptured()===this){t.markReleased();return}return z.call(this,e)},Element.prototype.hasPointerCapture=function(e){let t=I[I.length-1];return t&&e===1?t.getCaptured()===this:B.call(this,e)})}var V=class{captured=null;justCaptured=null;justReleased=null;install(){ae(),I.push(this)}uninstall(){let e=I.lastIndexOf(this);e>=0&&I.splice(e,1),this.reset()}reset(){this.captured=null,this.justCaptured=null,this.justReleased=null}getCaptured(){return this.captured}markCaptured(e){this.captured!==e&&(this.captured&&(this.justReleased=this.captured),this.captured=e,this.justCaptured=e)}markReleased(){this.captured&&=(this.justReleased=this.captured,null)}consumeTransitions(){let e=this.justCaptured,t=this.justReleased;return this.justCaptured=null,this.justReleased=null,{gained:e,lost:t}}},H=class{el=null;doc;resolved;constructor(e,t={}){this.doc=e,this.resolved={size:t.size??16,color:t.color??`rgba(0, 0, 0, 0.7)`,className:t.className??`mimo-cursor`}}attach(){if(this.el)return;let e=this.doc.createElement(`div`);e.className=this.resolved.className,Object.assign(e.style,{position:`fixed`,top:`0`,left:`0`,width:`${this.resolved.size}px`,height:`${this.resolved.size}px`,borderRadius:`50%`,background:this.resolved.color,pointerEvents:`none`,zIndex:`2147483647`,transform:`translate(-50%, -50%)`,willChange:`transform`}),this.doc.body.appendChild(e),this.el=e}move(e,t){this.el&&(this.el.style.transform=`translate(${e}px, ${t}px) translate(-50%, -50%)`)}detach(){this.el?.remove(),this.el=null}};function U(e,t,n){let r=e.elementFromPoint(t,n);for(let e=0;e<64;e++){if(!r?.shadowRoot)return r;let e=r.shadowRoot.elementFromPoint(t,n);if(!e||e===r)return r;r=e}return r}function W(e){let t=[],n=e;for(;n;)t.push(n),n=n.parentElement;return t}function G(e,t){let n=new Set(t);for(let t of e)if(n.has(t))return t;return null}function K(e,t,n,r,i){if(e===t)return;let a=W(e),o=W(t),s=G(a,o);if(e){ie(e,n,r,i);for(let e of a){if(e===s)break;D(e,n,r,i)}}if(t){E(t,n,r,i);for(let e of o){if(e===s)break;O(e,n,r,i)}}}var q=class{current=null;resolve(e,t,n){return U(e,t,n)}update(e,t,n,r,i=null){if(i)return T(i,t,n,r),i;let a=this.resolve(e,t,n);return a!==this.current&&(K(this.current,a,t,n,r),this.current=a),a&&T(a,t,n,r),a}reset(){this.current=null}};const J=[`a[href]`,`button:not([disabled])`,`input:not([disabled])`,`select:not([disabled])`,`textarea:not([disabled])`,`[tabindex]:not([tabindex="-1"])`,`[contenteditable="true"]`].join(`,`);function oe(e){let t=e;for(;t;){if(t instanceof HTMLElement&&t.matches(J))return t;t=t.parentElement}return null}const Y={shiftKey:!1,ctrlKey:!1,altKey:!1,metaKey:!1};var X=class{options;doc;hitTest=new q;capture=new V;cursor=null;buttons=0;lastX=0;lastY=0;modifiers=Y;downRecords=new Map;clickRecords=new Map;pointerUnsub=null;keyboardUnsub=null;running=!1;constructor(e={}){this.options=e,this.doc=e.document??globalThis.document}start(){this.running||(this.running=!0,this.options.pointerCapture!==!1&&this.capture.install(),this.options.cursor&&(this.cursor=new H(this.doc,typeof this.options.cursor==`object`?this.options.cursor:{}),this.cursor.attach()),this.options.pointerSource&&(this.pointerUnsub=this.options.pointerSource(e=>{this.handlePointer(e)})),this.options.keyboardSource&&(this.keyboardUnsub=this.options.keyboardSource(e=>{this.handleKeyboard(e)})))}stop(){this.running&&(this.running=!1,this.pointerUnsub?.(),this.pointerUnsub=null,this.keyboardUnsub?.(),this.keyboardUnsub=null,this.cursor?.detach(),this.cursor=null,this.capture.uninstall(),this.hitTest.reset(),this.buttons=0,this.modifiers=Y,this.downRecords.clear(),this.clickRecords.clear())}setPointerSource(e){this.pointerUnsub?.(),this.pointerUnsub=null,this.options.pointerSource=e??void 0,this.running&&e&&(this.pointerUnsub=e(e=>{this.handlePointer(e)}))}injectPointer(e){this.running&&this.handlePointer(e)}injectKeyboard(e){this.running&&this.handleKeyboard(e)}setKeyboardSource(e){this.keyboardUnsub?.(),this.keyboardUnsub=null,this.options.keyboardSource=e??void 0,this.running&&e&&(this.keyboardUnsub=e(e=>{this.handleKeyboard(e)}))}handlePointer(e){let t=e.x-this.lastX,n=e.y-this.lastY;if(this.lastX=e.x,this.lastY=e.y,this.cursor?.move(e.x,e.y),e.kind===`cancel`){this.handleCancel(e.x,e.y,this.makeContext(e,t,n));return}let r=this.makeContext(e,t,n);if(e.kind===`move`){let t=this.hitTest.update(this.doc,e.x,e.y,r,this.capture.getCaptured());this.flushCaptureTransitions(t,e.x,e.y,r);return}let i=this.hitTest.update(this.doc,e.x,e.y,r,this.capture.getCaptured());if(i)if(e.kind===`button`){let t=S(e.button);if(e.pressed){if(this.buttons|=t,r.buttons=this.buttons,r.pressure=r.pressure||.5,k(i,e.x,e.y,e.button,r),this.downRecords.set(e.button,{target:i,x:e.x,y:e.y}),this.options.autoFocus!==!1){let e=oe(i);if(e)e.focus();else{let e=this.doc.activeElement;e instanceof HTMLElement&&e!==this.doc.body&&e.blur()}}this.flushCaptureTransitions(i,e.x,e.y,r)}else{this.buttons&=~t,r.buttons=this.buttons,r.pressure=this.buttons===0?0:r.pressure,A(i,e.x,e.y,e.button,r),this.flushCaptureTransitions(i,e.x,e.y,r);let n=this.downRecords.get(e.button);if(this.downRecords.delete(e.button),n&&this.shouldFireClick(n,i,e.x,e.y)){let t=se(n.target,i),a=this.bumpClickCount(e.button,t,e.x,e.y);j(t,e.x,e.y,e.button,r,a)}this.buttons===0&&this.capture.getCaptured()&&(this.capture.markReleased(),this.flushCaptureTransitions(i,e.x,e.y,r))}}else M(i,e.x,e.y,e.deltaX,e.deltaY,e.deltaMode??0,r)}handleCancel(e,t,n){let r=this.capture.getCaptured(),i=r??this.hitTest.resolve(this.doc,e,t);i&&N(i,e,t,n),r&&(this.capture.markReleased(),this.flushCaptureTransitions(r,e,t,n)),this.buttons=0,this.downRecords.clear()}flushCaptureTransitions(e,t,n,r){let{gained:i,lost:a}=this.capture.consumeTransitions();a&&F(a,t,n,r),i&&P(i,t,n,r)}makeContext(e,t,n){return{buttons:this.buttons,modifiers:this.modifiers,pointerType:e.pointerType??`mouse`,pressure:e.pressure??(this.buttons>0?.5:0),tiltX:e.tiltX??0,tiltY:e.tiltY??0,movementX:t,movementY:n,screenX:e.screenX??e.x,screenY:e.screenY??e.y}}shouldFireClick(e,t,n,r){let i=this.options.clickMoveThresholdPx??5;return Math.abs(n-e.x)>i||Math.abs(r-e.y)>i?!1:e.target.contains(t)||t.contains(e.target)}bumpClickCount(e,t,n,r){let i=performance.now(),a=this.options.doubleClickThresholdMs??500,o=this.clickRecords.get(e),s=1;return o&&o.target===t&&i-o.time<=a&&Math.abs(o.x-n)<=5&&Math.abs(o.y-r)<=5&&(s=o.count+1),this.clickRecords.set(e,{target:t,x:n,y:r,time:i,count:s}),s}handleKeyboard(e){e.modifiers?this.modifiers={shiftKey:e.modifiers.shift??!1,ctrlKey:e.modifiers.ctrl??!1,altKey:e.modifiers.alt??!1,metaKey:e.modifiers.meta??!1}:this.modifiers=le(e.code,e.pressed,this.modifiers);let t=this.resolveKeyboardTarget();t&&(u(t,e),this.options.editableTextInput!==!1&&d(t,e))}resolveKeyboardTarget(){let e=this.options.keyboardTarget??`active-element`;return e===`document`?this.doc:e===`pointer-target`?U(this.doc,this.lastX,this.lastY)??this.doc:this.doc.activeElement??this.doc.body??this.doc}};function se(e,t){return e===t||e.contains(t)?e:t.contains(e)?t:e}const ce={ShiftLeft:`shiftKey`,ShiftRight:`shiftKey`,ControlLeft:`ctrlKey`,ControlRight:`ctrlKey`,AltLeft:`altKey`,AltRight:`altKey`,MetaLeft:`metaKey`,MetaRight:`metaKey`,OSLeft:`metaKey`,OSRight:`metaKey`};function le(e,t,n){let r=ce[e];return!r||n[r]===t?n:{...n,[r]:t}}const Z=i(null);function Q({children:e,...t}){let[n]=s(()=>new X(t)),{pointerSource:r,keyboardSource:i}=t;return o(()=>{n.setPointerSource(r??null)},[n,r]),o(()=>{n.setKeyboardSource(i??null)},[n,i]),o(()=>(n.start(),()=>n.stop()),[n]),c(Z,{value:n,children:e})}function $(){let e=a(Z);if(!e)throw Error(`useMimoForwarder must be used inside <MimoProvider>`);return e}function ue({pointer:i,keyboard:a}){let s=$(),c=t();return o(()=>{if(!i)return;let{x:t,y:n}=e(c.x,c.y);s.injectPointer({kind:`move`,x:t,y:n})},[s,i,c.x,c.y]),r({onButton:t=>{if(!i)return;let{x:n,y:r}=e(t.x,t.y),a=t.button===`other`?`aux1`:t.button;s.injectPointer({kind:`button`,x:n,y:r,button:a,pressed:t.pressed})},onWheel:t=>{if(!i)return;let{x:n,y:r}=e(t.x,t.y);s.injectPointer({kind:`wheel`,x:n,y:r,deltaX:t.deltaX,deltaY:t.deltaY})}}),n({onKeyDown:e=>{a&&s.injectKeyboard({code:e.code,pressed:!0,repeat:e.repeat,modifiers:{shift:e.modifiers.shift,ctrl:e.modifiers.control,alt:e.modifiers.alt,meta:e.modifiers.meta}})},onKeyUp:e=>{a&&s.injectKeyboard({code:e.code,pressed:!1,modifiers:{shift:e.modifiers.shift,ctrl:e.modifiers.control,alt:e.modifiers.alt,meta:e.modifiers.meta}})}}),null}function de({pointer:e=!0,keyboard:t=!0,children:n,...r}){return ee(Q,{...r,children:[c(ue,{pointer:e,keyboard:t}),n]})}export{X as MimoForwarder,Z as MimoForwarderContext,Q as MimoForwarderProvider,de as MimoProvider,$ as useMimoForwarder};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fluxlay/react",
3
- "version": "1.3.2",
3
+ "version": "1.3.4",
4
4
  "description": "SDK for building Fluxlay wallpapers with React",
5
5
  "keywords": [
6
6
  "desktop",
@@ -38,10 +38,10 @@
38
38
  "devDependencies": {
39
39
  "@fluxlay/sdk-core": "1.2.0",
40
40
  "@mimo/react": "0.1.0",
41
- "@types/react": "^19.2.14",
42
- "react": "^19.2.5",
43
- "tsdown": "^0.21.10",
44
- "typescript": "^5.9.3"
41
+ "@types/react": "^19.2.15",
42
+ "react": "^19.2.6",
43
+ "tsdown": "^0.22.0",
44
+ "typescript": "^6.0.3"
45
45
  },
46
46
  "peerDependencies": {
47
47
  "react": "^19.0.0"