@buoy-gg/tv-remote 7.0.40 → 7.0.41

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
@@ -59,3 +59,7 @@ For custom integrations, exports include `arm`, `disarm`, `clear`, `setMenuCaptu
59
59
  React Native connections require `@buoy-gg/external-sync`. Follow the [Desktop connection guide](https://buoy.gg/buoy/latest/docs/desktop), sign in to Desktop separately, and confirm the selected device. [MCP](https://buoy.gg/buoy/latest/docs/mcp) also needs a process account and Pro access.
60
60
 
61
61
  Device data can travel over your LAN to the configured broker. Account validation makes network requests. See [Telemetry](https://buoy.gg/buoy/latest/docs/telemetry) for data-flow details.
62
+
63
+ ## Web support (unreleased)
64
+
65
+ Browser capture observes keyboard events without consuming them. It does not reproduce a TV’s native focus behavior. The browser build is available in this checkout and has not been published yet. See the [web setup guide](https://buoy.gg/buoy/latest/docs/web-preview) for registration, dependencies, and browser boundaries.
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.remotePlatform = void 0;
7
+ var ReactNative = _interopRequireWildcard(require("react-native"));
8
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
9
+ const remotePlatform = exports.remotePlatform = ReactNative;
10
+ //# sourceMappingURL=remotePlatform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["ReactNative","_interopRequireWildcard","require","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","remotePlatform","exports"],"sourceRoot":"../../../src","sources":["store/remotePlatform.ts"],"mappings":";;;;;;AAAA,IAAAA,WAAA,GAAAC,uBAAA,CAAAC,OAAA;AAA4C,SAAAD,wBAAAE,CAAA,EAAAC,CAAA,6BAAAC,OAAA,MAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAJ,uBAAA,YAAAA,CAAAE,CAAA,EAAAC,CAAA,SAAAA,CAAA,IAAAD,CAAA,IAAAA,CAAA,CAAAK,UAAA,SAAAL,CAAA,MAAAM,CAAA,EAAAC,CAAA,EAAAC,CAAA,KAAAC,SAAA,QAAAC,OAAA,EAAAV,CAAA,iBAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,SAAAQ,CAAA,MAAAF,CAAA,GAAAL,CAAA,GAAAG,CAAA,GAAAD,CAAA,QAAAG,CAAA,CAAAK,GAAA,CAAAX,CAAA,UAAAM,CAAA,CAAAM,GAAA,CAAAZ,CAAA,GAAAM,CAAA,CAAAO,GAAA,CAAAb,CAAA,EAAAQ,CAAA,gBAAAP,CAAA,IAAAD,CAAA,gBAAAC,CAAA,OAAAa,cAAA,CAAAC,IAAA,CAAAf,CAAA,EAAAC,CAAA,OAAAM,CAAA,IAAAD,CAAA,GAAAU,MAAA,CAAAC,cAAA,KAAAD,MAAA,CAAAE,wBAAA,CAAAlB,CAAA,EAAAC,CAAA,OAAAM,CAAA,CAAAK,GAAA,IAAAL,CAAA,CAAAM,GAAA,IAAAP,CAAA,CAAAE,CAAA,EAAAP,CAAA,EAAAM,CAAA,IAAAC,CAAA,CAAAP,CAAA,IAAAD,CAAA,CAAAC,CAAA,WAAAO,CAAA,KAAAR,CAAA,EAAAC,CAAA;AACrC,MAAMkB,cAAc,GAAAC,OAAA,CAAAD,cAAA,GAAGtB,WAAW","ignoreList":[]}
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.remotePlatform = void 0;
7
+ const keys = {
8
+ ArrowUp: 'up',
9
+ ArrowDown: 'down',
10
+ ArrowLeft: 'left',
11
+ ArrowRight: 'right',
12
+ Enter: 'select',
13
+ ' ': 'select',
14
+ Escape: 'menu',
15
+ MediaPlayPause: 'playPause'
16
+ };
17
+ const remotePlatform = exports.remotePlatform = {
18
+ Platform: {
19
+ OS: 'web',
20
+ isTV: false
21
+ },
22
+ TVEventHandler: {
23
+ addListener(listener) {
24
+ if (typeof document === 'undefined') return {
25
+ remove() {}
26
+ };
27
+ const onKey = event => {
28
+ const eventType = keys[event.key];
29
+ if (eventType) listener({
30
+ eventType,
31
+ eventKeyAction: 1
32
+ });
33
+ };
34
+ document.addEventListener('keyup', onKey, true);
35
+ return {
36
+ remove() {
37
+ document.removeEventListener('keyup', onKey, true);
38
+ }
39
+ };
40
+ }
41
+ }
42
+ };
43
+ //# sourceMappingURL=remotePlatform.web.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["keys","ArrowUp","ArrowDown","ArrowLeft","ArrowRight","Enter","Escape","MediaPlayPause","remotePlatform","exports","Platform","OS","isTV","TVEventHandler","addListener","listener","document","remove","onKey","event","eventType","key","eventKeyAction","addEventListener","removeEventListener"],"sourceRoot":"../../../src","sources":["store/remotePlatform.web.ts"],"mappings":";;;;;;AAAA,MAAMA,IAA4B,GAAG;EAAEC,OAAO,EAAE,IAAI;EAAEC,SAAS,EAAE,MAAM;EAAEC,SAAS,EAAE,MAAM;EAAEC,UAAU,EAAE,OAAO;EAAEC,KAAK,EAAE,QAAQ;EAAE,GAAG,EAAE,QAAQ;EAAEC,MAAM,EAAE,MAAM;EAAEC,cAAc,EAAE;AAAY,CAAC;AACvL,MAAMC,cAAc,GAAAC,OAAA,CAAAD,cAAA,GAAG;EAC5BE,QAAQ,EAAE;IAAEC,EAAE,EAAE,KAAK;IAAEC,IAAI,EAAE;EAAM,CAAC;EACpCC,cAAc,EAAE;IAAEC,WAAWA,CAACC,QAAkC,EAAE;MAChE,IAAI,OAAOC,QAAQ,KAAK,WAAW,EAAE,OAAO;QAAEC,MAAMA,CAAA,EAAG,CAAC;MAAE,CAAC;MAC3D,MAAMC,KAAK,GAAIC,KAAoB,IAAK;QAAE,MAAMC,SAAS,GAAGpB,IAAI,CAACmB,KAAK,CAACE,GAAG,CAAC;QAAE,IAAID,SAAS,EAAEL,QAAQ,CAAC;UAAEK,SAAS;UAAEE,cAAc,EAAE;QAAE,CAAC,CAAC;MAAE,CAAC;MACzIN,QAAQ,CAACO,gBAAgB,CAAC,OAAO,EAAEL,KAAK,EAAE,IAAI,CAAC;MAC/C,OAAO;QAAED,MAAMA,CAAA,EAAG;UAAED,QAAQ,CAACQ,mBAAmB,CAAC,OAAO,EAAEN,KAAK,EAAE,IAAI,CAAC;QAAE;MAAE,CAAC;IAC7E;EAAE;AACJ,CAAC","ignoreList":[]}
@@ -10,8 +10,7 @@ exports.getEventsSince = getEventsSince;
10
10
  exports.getState = getState;
11
11
  exports.setMenuCapture = setMenuCapture;
12
12
  exports.subscribe = subscribe;
13
- var ReactNative = _interopRequireWildcard(require("react-native"));
14
- function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
13
+ var _remotePlatform = require("./remotePlatform");
15
14
  /**
16
15
  * tvEventStore — the whole device-side half of the TV remote tool.
17
16
  *
@@ -50,8 +49,9 @@ const IGNORED_EVENT_TYPES = new Set(["pan", "swipeUp", "swipeDown", "swipeLeft",
50
49
  * A namespace read (rather than a named import) keeps this module importable on
51
50
  * stock react-native, where those exports are absent.
52
51
  */
53
- const RN = ReactNative;
52
+ const RN = _remotePlatform.remotePlatform;
54
53
  const isTV = RN.Platform?.isTV === true;
54
+ const supportsInput = isTV || RN.Platform?.OS === "web";
55
55
  let events = [];
56
56
  let seq = 0;
57
57
  let armed = false;
@@ -97,7 +97,7 @@ function handleEvent(raw) {
97
97
  function arm() {
98
98
  if (armed) return;
99
99
  armed = true;
100
- if (isTV && RN.TVEventHandler && !subscription) {
100
+ if (supportsInput && RN.TVEventHandler && !subscription) {
101
101
  subscription = RN.TVEventHandler.addListener(handleEvent);
102
102
  }
103
103
  emitChange();
@@ -149,7 +149,7 @@ function getEventsSince(sinceSeq) {
149
149
  }
150
150
  function getState() {
151
151
  return {
152
- supported: isTV,
152
+ supported: supportsInput,
153
153
  platform: RN.Platform?.OS ?? "unknown",
154
154
  captureArmed: armed,
155
155
  listening: subscription !== null,
@@ -1 +1 @@
1
- {"version":3,"names":["ReactNative","_interopRequireWildcard","require","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","MAX_EVENTS","IGNORED_EVENT_TYPES","Set","RN","isTV","Platform","events","seq","armed","menuCaptureArmed","subscription","listeners","emitChange","forEach","listener","handleEvent","raw","event","eventType","eventKeyAction","next","Date","now","length","slice","arm","TVEventHandler","addListener","disarm","remove","setMenuCapture","on","OS","TVEventControl","enableTVMenuKey","disableTVMenuKey","clear","getEventsSince","sinceSeq","Number","isFinite","filter","getState","supported","platform","captureArmed","listening","recent","subscribe","add","delete"],"sourceRoot":"../../../src","sources":["store/tvEventStore.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_remotePlatform","require","MAX_EVENTS","IGNORED_EVENT_TYPES","Set","RN","ReactNative","isTV","Platform","supportsInput","OS","events","seq","armed","menuCaptureArmed","subscription","listeners","emitChange","forEach","listener","handleEvent","raw","event","eventType","has","eventKeyAction","next","t","Date","now","length","slice","arm","TVEventHandler","addListener","disarm","remove","setMenuCapture","on","TVEventControl","enableTVMenuKey","disableTVMenuKey","clear","getEventsSince","sinceSeq","Number","isFinite","filter","getState","supported","platform","captureArmed","listening","recent","subscribe","add","delete"],"sourceRoot":"../../../src","sources":["store/tvEventStore.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+
3
+ import * as ReactNative from 'react-native';
4
+ export const remotePlatform = ReactNative;
5
+ //# sourceMappingURL=remotePlatform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["ReactNative","remotePlatform"],"sourceRoot":"../../../src","sources":["store/remotePlatform.ts"],"mappings":";;AAAA,OAAO,KAAKA,WAAW,MAAM,cAAc;AAC3C,OAAO,MAAMC,cAAc,GAAGD,WAAW","ignoreList":[]}
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+
3
+ const keys = {
4
+ ArrowUp: 'up',
5
+ ArrowDown: 'down',
6
+ ArrowLeft: 'left',
7
+ ArrowRight: 'right',
8
+ Enter: 'select',
9
+ ' ': 'select',
10
+ Escape: 'menu',
11
+ MediaPlayPause: 'playPause'
12
+ };
13
+ export const remotePlatform = {
14
+ Platform: {
15
+ OS: 'web',
16
+ isTV: false
17
+ },
18
+ TVEventHandler: {
19
+ addListener(listener) {
20
+ if (typeof document === 'undefined') return {
21
+ remove() {}
22
+ };
23
+ const onKey = event => {
24
+ const eventType = keys[event.key];
25
+ if (eventType) listener({
26
+ eventType,
27
+ eventKeyAction: 1
28
+ });
29
+ };
30
+ document.addEventListener('keyup', onKey, true);
31
+ return {
32
+ remove() {
33
+ document.removeEventListener('keyup', onKey, true);
34
+ }
35
+ };
36
+ }
37
+ }
38
+ };
39
+ //# sourceMappingURL=remotePlatform.web.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["keys","ArrowUp","ArrowDown","ArrowLeft","ArrowRight","Enter","Escape","MediaPlayPause","remotePlatform","Platform","OS","isTV","TVEventHandler","addListener","listener","document","remove","onKey","event","eventType","key","eventKeyAction","addEventListener","removeEventListener"],"sourceRoot":"../../../src","sources":["store/remotePlatform.web.ts"],"mappings":";;AAAA,MAAMA,IAA4B,GAAG;EAAEC,OAAO,EAAE,IAAI;EAAEC,SAAS,EAAE,MAAM;EAAEC,SAAS,EAAE,MAAM;EAAEC,UAAU,EAAE,OAAO;EAAEC,KAAK,EAAE,QAAQ;EAAE,GAAG,EAAE,QAAQ;EAAEC,MAAM,EAAE,MAAM;EAAEC,cAAc,EAAE;AAAY,CAAC;AAC9L,OAAO,MAAMC,cAAc,GAAG;EAC5BC,QAAQ,EAAE;IAAEC,EAAE,EAAE,KAAK;IAAEC,IAAI,EAAE;EAAM,CAAC;EACpCC,cAAc,EAAE;IAAEC,WAAWA,CAACC,QAAkC,EAAE;MAChE,IAAI,OAAOC,QAAQ,KAAK,WAAW,EAAE,OAAO;QAAEC,MAAMA,CAAA,EAAG,CAAC;MAAE,CAAC;MAC3D,MAAMC,KAAK,GAAIC,KAAoB,IAAK;QAAE,MAAMC,SAAS,GAAGnB,IAAI,CAACkB,KAAK,CAACE,GAAG,CAAC;QAAE,IAAID,SAAS,EAAEL,QAAQ,CAAC;UAAEK,SAAS;UAAEE,cAAc,EAAE;QAAE,CAAC,CAAC;MAAE,CAAC;MACzIN,QAAQ,CAACO,gBAAgB,CAAC,OAAO,EAAEL,KAAK,EAAE,IAAI,CAAC;MAC/C,OAAO;QAAED,MAAMA,CAAA,EAAG;UAAED,QAAQ,CAACQ,mBAAmB,CAAC,OAAO,EAAEN,KAAK,EAAE,IAAI,CAAC;QAAE;MAAE,CAAC;IAC7E;EAAE;AACJ,CAAC","ignoreList":[]}
@@ -18,7 +18,7 @@
18
18
  * `Platform.isTV` is true, so the cost on a phone is one boolean.
19
19
  */
20
20
 
21
- import * as ReactNative from "react-native";
21
+ import { remotePlatform as ReactNative } from "./remotePlatform";
22
22
 
23
23
  /** One captured remote event, as it goes over the wire to the dashboard. */
24
24
 
@@ -42,6 +42,7 @@ const IGNORED_EVENT_TYPES = new Set(["pan", "swipeUp", "swipeDown", "swipeLeft",
42
42
  */
43
43
  const RN = ReactNative;
44
44
  const isTV = RN.Platform?.isTV === true;
45
+ const supportsInput = isTV || RN.Platform?.OS === "web";
45
46
  let events = [];
46
47
  let seq = 0;
47
48
  let armed = false;
@@ -87,7 +88,7 @@ function handleEvent(raw) {
87
88
  export function arm() {
88
89
  if (armed) return;
89
90
  armed = true;
90
- if (isTV && RN.TVEventHandler && !subscription) {
91
+ if (supportsInput && RN.TVEventHandler && !subscription) {
91
92
  subscription = RN.TVEventHandler.addListener(handleEvent);
92
93
  }
93
94
  emitChange();
@@ -139,7 +140,7 @@ export function getEventsSince(sinceSeq) {
139
140
  }
140
141
  export function getState() {
141
142
  return {
142
- supported: isTV,
143
+ supported: supportsInput,
143
144
  platform: RN.Platform?.OS ?? "unknown",
144
145
  captureArmed: armed,
145
146
  listening: subscription !== null,
@@ -1 +1 @@
1
- {"version":3,"names":["ReactNative","MAX_EVENTS","IGNORED_EVENT_TYPES","Set","RN","isTV","Platform","events","seq","armed","menuCaptureArmed","subscription","listeners","emitChange","forEach","listener","handleEvent","raw","event","eventType","has","eventKeyAction","next","t","Date","now","length","slice","arm","TVEventHandler","addListener","disarm","remove","setMenuCapture","on","OS","TVEventControl","enableTVMenuKey","disableTVMenuKey","clear","getEventsSince","sinceSeq","Number","isFinite","filter","getState","supported","platform","captureArmed","listening","recent","subscribe","add","delete"],"sourceRoot":"../../../src","sources":["store/tvEventStore.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["remotePlatform","ReactNative","MAX_EVENTS","IGNORED_EVENT_TYPES","Set","RN","isTV","Platform","supportsInput","OS","events","seq","armed","menuCaptureArmed","subscription","listeners","emitChange","forEach","listener","handleEvent","raw","event","eventType","has","eventKeyAction","next","t","Date","now","length","slice","arm","TVEventHandler","addListener","disarm","remove","setMenuCapture","on","TVEventControl","enableTVMenuKey","disableTVMenuKey","clear","getEventsSince","sinceSeq","Number","isFinite","filter","getState","supported","platform","captureArmed","listening","recent","subscribe","add","delete"],"sourceRoot":"../../../src","sources":["store/tvEventStore.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,3 @@
1
+ import * as ReactNative from 'react-native';
2
+ export declare const remotePlatform: typeof ReactNative;
3
+ //# sourceMappingURL=remotePlatform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remotePlatform.d.ts","sourceRoot":"","sources":["../../../src/store/remotePlatform.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,WAAW,MAAM,cAAc,CAAC;AAC5C,eAAO,MAAM,cAAc,oBAAc,CAAC"}
@@ -0,0 +1,12 @@
1
+ export declare const remotePlatform: {
2
+ Platform: {
3
+ OS: string;
4
+ isTV: boolean;
5
+ };
6
+ TVEventHandler: {
7
+ addListener(listener: (event: unknown) => void): {
8
+ remove(): void;
9
+ };
10
+ };
11
+ };
12
+ //# sourceMappingURL=remotePlatform.web.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remotePlatform.web.d.ts","sourceRoot":"","sources":["../../../src/store/remotePlatform.web.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,cAAc;;;;;;8BAEe,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI;;;;CAMjE,CAAC"}
@@ -27,7 +27,7 @@ export interface TvRemoteEvent {
27
27
  eventKeyAction?: number;
28
28
  }
29
29
  export interface TvRemoteState {
30
- /** False on phones/tablets/web — the tool renders as unavailable. */
30
+ /** Available on TV devices and browsers with keyboard input. */
31
31
  supported: boolean;
32
32
  platform: string;
33
33
  captureArmed: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"tvEventStore.d.ts","sourceRoot":"","sources":["../../../src/store/tvEventStore.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH,4EAA4E;AAC5E,MAAM,WAAW,aAAa;IAC5B,kEAAkE;IAClE,GAAG,EAAE,MAAM,CAAC;IACZ,+BAA+B;IAC/B,CAAC,EAAE,MAAM,CAAC;IACV,+GAA+G;IAC/G,SAAS,EAAE,MAAM,CAAC;IAClB,wDAAwD;IACxD,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,qEAAqE;IACrE,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,OAAO,CAAC;IACtB;;;;;OAKG;IACH,SAAS,EAAE,OAAO,CAAC;IACnB,0EAA0E;IAC1E,gBAAgB,EAAE,OAAO,CAAC;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,aAAa,EAAE,CAAC;CACzB;AAwFD,+DAA+D;AAC/D,wBAAgB,GAAG,IAAI,IAAI,CAO1B;AAED;;;;GAIG;AACH,wBAAgB,MAAM,IAAI,IAAI,CAS7B;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,OAAO,GAAG,IAAI,CAUhD;AAED,wBAAgB,KAAK,IAAI,IAAI,CAI5B;AAED,sEAAsE;AACtE,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,EAAE,CAGhE;AAED,wBAAgB,QAAQ,IAAI,aAAa,CAUxC;AAED,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAK1D"}
1
+ {"version":3,"file":"tvEventStore.d.ts","sourceRoot":"","sources":["../../../src/store/tvEventStore.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH,4EAA4E;AAC5E,MAAM,WAAW,aAAa;IAC5B,kEAAkE;IAClE,GAAG,EAAE,MAAM,CAAC;IACZ,+BAA+B;IAC/B,CAAC,EAAE,MAAM,CAAC;IACV,+GAA+G;IAC/G,SAAS,EAAE,MAAM,CAAC;IAClB,wDAAwD;IACxD,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,gEAAgE;IAChE,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,OAAO,CAAC;IACtB;;;;;OAKG;IACH,SAAS,EAAE,OAAO,CAAC;IACnB,0EAA0E;IAC1E,gBAAgB,EAAE,OAAO,CAAC;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,aAAa,EAAE,CAAC;CACzB;AAyFD,+DAA+D;AAC/D,wBAAgB,GAAG,IAAI,IAAI,CAO1B;AAED;;;;GAIG;AACH,wBAAgB,MAAM,IAAI,IAAI,CAS7B;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,OAAO,GAAG,IAAI,CAUhD;AAED,wBAAgB,KAAK,IAAI,IAAI,CAI5B;AAED,sEAAsE;AACtE,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,EAAE,CAGhE;AAED,wBAAgB,QAAQ,IAAI,aAAa,CAUxC;AAED,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAK1D"}
@@ -0,0 +1,2 @@
1
+ "use client";
2
+ typeof window<"u"&&typeof globalThis.global>"u"&&(globalThis.global=globalThis);var V={ArrowUp:"up",ArrowDown:"down",ArrowLeft:"left",ArrowRight:"right",Enter:"select"," ":"select",Escape:"menu",MediaPlayPause:"playPause"},S={Platform:{OS:"web",isTV:!1},TVEventHandler:{addListener(e){if(typeof document>"u")return{remove(){}};let t=i=>{let u=V[i.key];u&&e({eventType:u,eventKeyAction:1})};return document.addEventListener("keyup",t,!0),{remove(){document.removeEventListener("keyup",t,!0)}}}}};var w=50,A=new Set(["pan","swipeUp","swipeDown","swipeLeft","swipeRight"]),n=S,g=n.Platform?.isTV===!0,R=g||n.Platform?.OS==="web",r=[],d=0,a=!1,l=!1,s=null,p=new Set;function v(){p.forEach(e=>{e()})}function x(e){if(!a)return;let t=e,i=t?.eventType;if(typeof i!="string"||A.has(i)||t?.eventKeyAction===0)return;d+=1;let u={seq:d,t:Date.now(),eventType:i,eventKeyAction:t?.eventKeyAction};r=r.length>=w?[...r.slice(1),u]:[...r,u],v()}function f(){a||(a=!0,R&&n.TVEventHandler&&!s&&(s=n.TVEventHandler.addListener(x)),v())}function T(){s&&(s.remove(),s=null),l&&c(!1),a&&(a=!1,v())}function c(e){!g||n.Platform.OS!=="ios"||!n.TVEventControl||e!==l&&(e?n.TVEventControl.enableTVMenuKey():n.TVEventControl.disableTVMenuKey(),l=e,v())}function b(){r.length!==0&&(r=[],v())}function E(e){return Number.isFinite(e)?r.filter(t=>t.seq>e):r.slice()}function o(){return{supported:R,platform:n.Platform?.OS??"unknown",captureArmed:a,listening:s!==null,menuCaptureArmed:l,seq:d,recent:r.slice()}}function y(e){return p.add(e),()=>{p.delete(e)}}var M={version:1,getSnapshot(){return o()},subscribe(e){return y(e)},actions:{arm(){return f(),o()},disarm(){return T(),o()},getEventsSince(e){let t=typeof e?.seq=="number"?e.seq:0;return{seq:o().seq,events:E(t)}},setMenuCapture(e){return c(e?.on===!0),o()},clear(){return b(),o()}}};export{f as arm,b as clear,T as disarm,E as getEventsSince,o as getState,c as setMenuCapture,y as subscribe,M as tvRemoteSyncAdapter};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@buoy-gg/tv-remote",
3
- "version": "7.0.40",
3
+ "version": "7.0.41",
4
4
  "description": "TV remote capture for React Native TV apps — records the D-pad/select/menu events the app actually receives, so Buoy Desktop can drive and replay real remote presses. Part of Buoy devtools.",
5
5
  "main": "lib/commonjs/index.js",
6
6
  "module": "lib/module/index.js",
@@ -13,7 +13,9 @@
13
13
  "sideEffects": false,
14
14
  "peerDependencies": {
15
15
  "react": "*",
16
- "react-native": "*"
16
+ "react-native": "*",
17
+ "react-native-web": "^0.21.0",
18
+ "react-dom": ">=18"
17
19
  },
18
20
  "devDependencies": {
19
21
  "@types/react": "^19.1.0",
@@ -60,11 +62,43 @@
60
62
  "d-pad",
61
63
  "focus"
62
64
  ],
65
+ "exports": {
66
+ ".": {
67
+ "browser": {
68
+ "types": "./lib/typescript/index.d.ts",
69
+ "default": "./lib/web/index.mjs"
70
+ },
71
+ "import": {
72
+ "types": "./lib/typescript/index.d.ts",
73
+ "default": "./lib/module/index.js"
74
+ },
75
+ "require": {
76
+ "types": "./lib/typescript/index.d.ts",
77
+ "default": "./lib/commonjs/index.js"
78
+ }
79
+ },
80
+ "./web": {
81
+ "types": "./lib/typescript/index.d.ts",
82
+ "default": "./lib/web/index.mjs"
83
+ }
84
+ },
85
+ "peerDependenciesMeta": {
86
+ "react-native": {
87
+ "optional": true
88
+ },
89
+ "react-native-web": {
90
+ "optional": true
91
+ },
92
+ "react-dom": {
93
+ "optional": true
94
+ }
95
+ },
63
96
  "scripts": {
64
- "build": "bob build",
97
+ "build": "bob build && pnpm run build:web",
65
98
  "typecheck": "tsc --noEmit",
66
99
  "clean": "rimraf lib",
67
100
  "test": "pnpm run typecheck",
68
- "postinstall": "echo \"Run pnpm build to compile this package\""
101
+ "postinstall": "echo \"Run pnpm build to compile this package\"",
102
+ "build:web": "node ../../scripts/build-web.mjs tv-remote"
69
103
  }
70
104
  }