even-toolkit 0.1.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.
Files changed (67) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +106 -0
  3. package/dist/action-bar.d.ts +25 -0
  4. package/dist/action-bar.d.ts.map +1 -0
  5. package/dist/action-bar.js +47 -0
  6. package/dist/action-bar.js.map +1 -0
  7. package/dist/action-map.d.ts +4 -0
  8. package/dist/action-map.d.ts.map +1 -0
  9. package/dist/action-map.js +46 -0
  10. package/dist/action-map.js.map +1 -0
  11. package/dist/bridge.d.ts +43 -0
  12. package/dist/bridge.d.ts.map +1 -0
  13. package/dist/bridge.js +255 -0
  14. package/dist/bridge.js.map +1 -0
  15. package/dist/canvas-renderer.d.ts +5 -0
  16. package/dist/canvas-renderer.d.ts.map +1 -0
  17. package/dist/canvas-renderer.js +73 -0
  18. package/dist/canvas-renderer.js.map +1 -0
  19. package/dist/composer.d.ts +4 -0
  20. package/dist/composer.d.ts.map +1 -0
  21. package/dist/composer.js +60 -0
  22. package/dist/composer.js.map +1 -0
  23. package/dist/gestures.d.ts +6 -0
  24. package/dist/gestures.d.ts.map +1 -0
  25. package/dist/gestures.js +47 -0
  26. package/dist/gestures.js.map +1 -0
  27. package/dist/index.d.ts +6 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +8 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/keep-alive.d.ts +3 -0
  32. package/dist/keep-alive.d.ts.map +1 -0
  33. package/dist/keep-alive.js +29 -0
  34. package/dist/keep-alive.js.map +1 -0
  35. package/dist/keyboard.d.ts +3 -0
  36. package/dist/keyboard.d.ts.map +1 -0
  37. package/dist/keyboard.js +62 -0
  38. package/dist/keyboard.js.map +1 -0
  39. package/dist/layout.d.ts +75 -0
  40. package/dist/layout.d.ts.map +1 -0
  41. package/dist/layout.js +89 -0
  42. package/dist/layout.js.map +1 -0
  43. package/dist/png-utils.d.ts +19 -0
  44. package/dist/png-utils.d.ts.map +1 -0
  45. package/dist/png-utils.js +73 -0
  46. package/dist/png-utils.js.map +1 -0
  47. package/dist/text-utils.d.ts +28 -0
  48. package/dist/text-utils.d.ts.map +1 -0
  49. package/dist/text-utils.js +41 -0
  50. package/dist/text-utils.js.map +1 -0
  51. package/dist/timer-display.d.ts +29 -0
  52. package/dist/timer-display.d.ts.map +1 -0
  53. package/dist/timer-display.js +74 -0
  54. package/dist/timer-display.js.map +1 -0
  55. package/dist/types.d.ts +39 -0
  56. package/dist/types.d.ts.map +1 -0
  57. package/dist/types.js +8 -0
  58. package/dist/types.js.map +1 -0
  59. package/dist/useFlashPhase.d.ts +9 -0
  60. package/dist/useFlashPhase.d.ts.map +1 -0
  61. package/dist/useFlashPhase.js +24 -0
  62. package/dist/useFlashPhase.js.map +1 -0
  63. package/dist/useGlasses.d.ts +18 -0
  64. package/dist/useGlasses.d.ts.map +1 -0
  65. package/dist/useGlasses.js +143 -0
  66. package/dist/useGlasses.js.map +1 -0
  67. package/package.json +115 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 fabioglimb
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,106 @@
1
+ # even-toolkit
2
+
3
+ Shared library for building **Even Realities G2 glasses** apps. Provides the bridge, display rendering, gesture handling, UI components, and utilities used across G2 web apps.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install even-toolkit
9
+ ```
10
+
11
+ Peer dependencies (install in your app):
12
+ ```bash
13
+ npm install @evenrealities/even_hub_sdk @jappyjan/even-better-sdk react react-router
14
+ ```
15
+
16
+ ## Modules
17
+
18
+ ### Core
19
+
20
+ | Import | Description |
21
+ |--------|------------|
22
+ | `even-toolkit/types` | `DisplayData`, `DisplayLine`, `GlassAction`, `GlassNavState`, `line()`, `separator()` |
23
+ | `even-toolkit/bridge` | `EvenHubBridge` — wraps the SDK for text, column, chart, and image pages |
24
+ | `even-toolkit/useGlasses` | React hook to connect any app to G2 glasses (display, events, polling) |
25
+ | `even-toolkit/layout` | Display constants: `DISPLAY_W=576`, `DISPLAY_H=288`, image tile positions |
26
+
27
+ ### Input
28
+
29
+ | Import | Description |
30
+ |--------|------------|
31
+ | `even-toolkit/action-map` | Maps raw SDK events to `GlassAction` (click→SELECT, scroll→HIGHLIGHT_MOVE, double-click→GO_BACK) |
32
+ | `even-toolkit/keyboard` | Keyboard bindings (arrows, enter, escape) + mouse wheel for simulator |
33
+ | `even-toolkit/gestures` | Tap/scroll debouncing tuned for G2 hardware |
34
+
35
+ ### UI Components
36
+
37
+ | Import | Description |
38
+ |--------|------------|
39
+ | `even-toolkit/action-bar` | `buildActionBar()` — blinking `▶Name◀`/`▷Name◁` button bar, `buildStaticActionBar()` |
40
+ | `even-toolkit/timer-display` | `renderTimerLines()` — `█ 02:00` + progress bar for countdown timers |
41
+ | `even-toolkit/text-utils` | `truncate()`, `buildHeaderLine()`, `applyScrollIndicators()`, `SCROLL_UP`/`SCROLL_DOWN` |
42
+ | `even-toolkit/useFlashPhase` | React hook — 500ms boolean toggle for blinking indicators |
43
+
44
+ ### Image Pipeline
45
+
46
+ | Import | Description |
47
+ |--------|------------|
48
+ | `even-toolkit/canvas-renderer` | Canvas-based chart/image rendering |
49
+ | `even-toolkit/composer` | Image composition utilities |
50
+ | `even-toolkit/png-utils` | 4-bit greyscale PNG encoding with upng-js |
51
+
52
+ ### Other
53
+
54
+ | Import | Description |
55
+ |--------|------------|
56
+ | `even-toolkit/keep-alive` | Heartbeat to prevent SDK/webview sleep |
57
+
58
+ ## Quick Start
59
+
60
+ ```tsx
61
+ import { useGlasses } from 'even-toolkit/useGlasses';
62
+ import { line } from 'even-toolkit/types';
63
+ import { buildActionBar } from 'even-toolkit/action-bar';
64
+ import { renderTimerLines } from 'even-toolkit/timer-display';
65
+ import { useFlashPhase } from 'even-toolkit/useFlashPhase';
66
+
67
+ function MyGlasses() {
68
+ const flashPhase = useFlashPhase(isActiveMode);
69
+
70
+ useGlasses({
71
+ getSnapshot: () => myAppState,
72
+ toDisplayData: (snapshot, nav) => ({
73
+ lines: [
74
+ line(buildHeaderLine('My App', buildActionBar(['Action1', 'Action2'], 0, null, flashPhase)), 'normal'),
75
+ line('Content here', 'meta'),
76
+ ],
77
+ }),
78
+ onGlassAction: (action, nav, snapshot) => nav,
79
+ deriveScreen: (path) => 'home',
80
+ appName: 'my-app',
81
+ });
82
+
83
+ return null;
84
+ }
85
+ ```
86
+
87
+ ## G2 Display Constraints
88
+
89
+ - Display: 576x288 pixels, monospace green-on-black
90
+ - `█` (full block) and `─` (horizontal line) render correctly
91
+ - `░▒▓` (shading), `╔═╗║` (double box drawing), `▀▄` (half blocks) do NOT work
92
+ - Emoji codepoints are NOT supported
93
+ - Multi-line character art does NOT align across rows
94
+ - Image tiles: max 4 at 200x100 each, 4-bit greyscale PNG
95
+
96
+ ## Used By
97
+
98
+ - [EvenKitchen](https://github.com/fabioglimb/even-kitchen) — Hands-free cooking companion
99
+ - [EvenMarket](https://github.com/fabioglimb/even-market) — Real-time stock market HUD
100
+ - EvenWorkout — Guided workout tracker
101
+ - EvenPlants — Plant care companion
102
+ - EvenCopilot — AI assistant
103
+
104
+ ## License
105
+
106
+ MIT
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Shared action button bar for G2 glasses display.
3
+ *
4
+ * Renders a row of named buttons with triangle indicators:
5
+ * ▶Timer◀ Scroll ▷Steps◁
6
+ *
7
+ * - Selected button (in button-select mode): solid triangles ▶Name◀
8
+ * - Active button (mode entered): blinking triangles ▶Name◀ / ▷Name◁
9
+ * - Inactive button: plain Name
10
+ */
11
+ /**
12
+ * Build an action bar string from a list of button names.
13
+ *
14
+ * @param buttons Array of button label strings, e.g. ['Timer', 'Scroll', 'Steps']
15
+ * @param selectedIndex Index of the currently highlighted button (in button-select mode)
16
+ * @param activeLabel Label of the currently active mode button (e.g. 'Scroll'), or null if in button-select mode
17
+ * @param flashPhase Current blink phase (true = filled triangles, false = empty)
18
+ */
19
+ export declare function buildActionBar(buttons: string[], selectedIndex: number, activeLabel: string | null, flashPhase: boolean): string;
20
+ /**
21
+ * Build a static action bar (no blinking, always solid triangles on selected).
22
+ * Useful for screens like recipe detail or completion where there's no mode switching.
23
+ */
24
+ export declare function buildStaticActionBar(buttons: string[], selectedIndex: number): string;
25
+ //# sourceMappingURL=action-bar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action-bar.d.ts","sourceRoot":"","sources":["../action-bar.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EAAE,EACjB,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,GAAG,IAAI,EAC1B,UAAU,EAAE,OAAO,GAClB,MAAM,CAgBR;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,EAAE,EACjB,aAAa,EAAE,MAAM,GACpB,MAAM,CAOR"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Shared action button bar for G2 glasses display.
3
+ *
4
+ * Renders a row of named buttons with triangle indicators:
5
+ * ▶Timer◀ Scroll ▷Steps◁
6
+ *
7
+ * - Selected button (in button-select mode): solid triangles ▶Name◀
8
+ * - Active button (mode entered): blinking triangles ▶Name◀ / ▷Name◁
9
+ * - Inactive button: plain Name
10
+ */
11
+ /**
12
+ * Build an action bar string from a list of button names.
13
+ *
14
+ * @param buttons Array of button label strings, e.g. ['Timer', 'Scroll', 'Steps']
15
+ * @param selectedIndex Index of the currently highlighted button (in button-select mode)
16
+ * @param activeLabel Label of the currently active mode button (e.g. 'Scroll'), or null if in button-select mode
17
+ * @param flashPhase Current blink phase (true = filled triangles, false = empty)
18
+ */
19
+ export function buildActionBar(buttons, selectedIndex, activeLabel, flashPhase) {
20
+ const activeIdx = activeLabel ? buttons.indexOf(activeLabel) : -1;
21
+ return buttons.map((name, i) => {
22
+ if (activeIdx === i) {
23
+ // Active mode: blink between filled and empty triangles
24
+ const L = flashPhase ? '\u25B6' : '\u25B7'; // ▶ / ▷
25
+ const R = flashPhase ? '\u25C0' : '\u25C1'; // ◀ / ◁
26
+ return `${L}${name}${R}`;
27
+ }
28
+ if (activeIdx < 0 && i === selectedIndex) {
29
+ // Selected in button-select mode: solid triangles
30
+ return `\u25B6${name}\u25C0`;
31
+ }
32
+ return ` ${name} `;
33
+ }).join(' ');
34
+ }
35
+ /**
36
+ * Build a static action bar (no blinking, always solid triangles on selected).
37
+ * Useful for screens like recipe detail or completion where there's no mode switching.
38
+ */
39
+ export function buildStaticActionBar(buttons, selectedIndex) {
40
+ return buttons.map((name, i) => {
41
+ if (i === selectedIndex) {
42
+ return `\u25B6${name}\u25C0`;
43
+ }
44
+ return ` ${name} `;
45
+ }).join(' ');
46
+ }
47
+ //# sourceMappingURL=action-bar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action-bar.js","sourceRoot":"","sources":["../action-bar.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAC5B,OAAiB,EACjB,aAAqB,EACrB,WAA0B,EAC1B,UAAmB;IAEnB,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAElE,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;QAC7B,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;YACpB,wDAAwD;YACxD,MAAM,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAE,QAAQ;YACrD,MAAM,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAE,QAAQ;YACrD,OAAO,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC;QAC3B,CAAC;QACD,IAAI,SAAS,GAAG,CAAC,IAAI,CAAC,KAAK,aAAa,EAAE,CAAC;YACzC,kDAAkD;YAClD,OAAO,SAAS,IAAI,QAAQ,CAAC;QAC/B,CAAC;QACD,OAAO,IAAI,IAAI,GAAG,CAAC;IACrB,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAClC,OAAiB,EACjB,aAAqB;IAErB,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;QAC7B,IAAI,CAAC,KAAK,aAAa,EAAE,CAAC;YACxB,OAAO,SAAS,IAAI,QAAQ,CAAC;QAC/B,CAAC;QACD,OAAO,IAAI,IAAI,GAAG,CAAC;IACrB,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { EvenHubEvent } from '@evenrealities/even_hub_sdk';
2
+ import type { GlassAction } from './types';
3
+ export declare function mapGlassEvent(event: EvenHubEvent): GlassAction | null;
4
+ //# sourceMappingURL=action-map.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action-map.d.ts","sourceRoot":"","sources":["../action-map.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAEhE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAG3C,wBAAgB,aAAa,CAAC,KAAK,EAAE,YAAY,GAAG,WAAW,GAAG,IAAI,CASrE"}
@@ -0,0 +1,46 @@
1
+ import { OsEventTypeList } from '@evenrealities/even_hub_sdk';
2
+ import { tryConsumeTap, isScrollSuppressed, isScrollDebounced } from './gestures';
3
+ export function mapGlassEvent(event) {
4
+ if (!event)
5
+ return null;
6
+ try {
7
+ const ev = event.listEvent ?? event.textEvent ?? event.sysEvent;
8
+ if (!ev)
9
+ return null;
10
+ return mapEvent(ev);
11
+ }
12
+ catch {
13
+ return null;
14
+ }
15
+ }
16
+ function mapEvent(event) {
17
+ const et = event.eventType;
18
+ switch (et) {
19
+ case OsEventTypeList.CLICK_EVENT:
20
+ if (!tryConsumeTap('tap'))
21
+ return null;
22
+ return { type: 'SELECT_HIGHLIGHTED' };
23
+ case OsEventTypeList.DOUBLE_CLICK_EVENT:
24
+ if (!tryConsumeTap('double'))
25
+ return null;
26
+ return { type: 'GO_BACK' };
27
+ case OsEventTypeList.SCROLL_TOP_EVENT:
28
+ if (isScrollDebounced('prev') || isScrollSuppressed())
29
+ return null;
30
+ return { type: 'HIGHLIGHT_MOVE', direction: 'up' };
31
+ case OsEventTypeList.SCROLL_BOTTOM_EVENT:
32
+ if (isScrollDebounced('next') || isScrollSuppressed())
33
+ return null;
34
+ return { type: 'HIGHLIGHT_MOVE', direction: 'down' };
35
+ default:
36
+ // Simulator omits eventType for CLICK_EVENT (value 0).
37
+ // Catch: currentSelectItemIndex present, or eventType missing entirely.
38
+ if (et == null || (event.currentSelectItemIndex != null && et === 0)) {
39
+ if (!tryConsumeTap('tap'))
40
+ return null;
41
+ return { type: 'SELECT_HIGHLIGHTED' };
42
+ }
43
+ return null;
44
+ }
45
+ }
46
+ //# sourceMappingURL=action-map.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action-map.js","sourceRoot":"","sources":["../action-map.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAE9D,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAElF,MAAM,UAAU,aAAa,CAAC,KAAmB;IAC/C,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,QAAQ,CAAC;QAChE,IAAI,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC;QACrB,OAAO,QAAQ,CAAC,EAAE,CAAC,CAAC;IACtB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,KAA8D;IAC9E,MAAM,EAAE,GAAG,KAAK,CAAC,SAAS,CAAC;IAC3B,QAAQ,EAAE,EAAE,CAAC;QACX,KAAK,eAAe,CAAC,WAAW;YAC9B,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;gBAAE,OAAO,IAAI,CAAC;YACvC,OAAO,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC;QACxC,KAAK,eAAe,CAAC,kBAAkB;YACrC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC;gBAAE,OAAO,IAAI,CAAC;YAC1C,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QAC7B,KAAK,eAAe,CAAC,gBAAgB;YACnC,IAAI,iBAAiB,CAAC,MAAM,CAAC,IAAI,kBAAkB,EAAE;gBAAE,OAAO,IAAI,CAAC;YACnE,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QACrD,KAAK,eAAe,CAAC,mBAAmB;YACtC,IAAI,iBAAiB,CAAC,MAAM,CAAC,IAAI,kBAAkB,EAAE;gBAAE,OAAO,IAAI,CAAC;YACnE,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;QACvD;YACE,uDAAuD;YACvD,wEAAwE;YACxE,IAAI,EAAE,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,sBAAsB,IAAI,IAAI,IAAK,EAAa,KAAK,CAAC,CAAC,EAAE,CAAC;gBACjF,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;oBAAE,OAAO,IAAI,CAAC;gBACvC,OAAO,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC;YACxC,CAAC;YACD,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC"}
@@ -0,0 +1,43 @@
1
+ import { type EvenHubEvent } from '@evenrealities/even_hub_sdk';
2
+ import type { PageMode } from './types';
3
+ export interface ColumnConfig {
4
+ x: number;
5
+ w: number;
6
+ }
7
+ export declare class EvenHubBridge {
8
+ private sdk;
9
+ private rawBridge;
10
+ private _currentMode;
11
+ private _pageReady;
12
+ private textPage;
13
+ private textContent;
14
+ private columnPage;
15
+ private columnElements;
16
+ private chartDummyPage;
17
+ constructor(columns?: ColumnConfig[]);
18
+ get pageReady(): boolean;
19
+ get currentMode(): PageMode | null;
20
+ /** Alias matching even-market naming convention */
21
+ get currentLayout(): PageMode | null;
22
+ private createPages;
23
+ init(): Promise<void>;
24
+ setupTextPage(): Promise<boolean>;
25
+ showTextPage(content: string): Promise<void>;
26
+ updateText(content: string): Promise<void>;
27
+ showColumnPage(columns: string[]): Promise<void>;
28
+ updateColumns(columns: string[]): Promise<void>;
29
+ switchToWatchlist(colSym: string, colPrice: string, colPct: string): Promise<boolean>;
30
+ updateWatchlist(colSym: string, colPrice: string, colPct: string): Promise<void>;
31
+ switchToSettings(text: string): Promise<boolean>;
32
+ updateSettings(text: string): Promise<void>;
33
+ switchToHomeLayout(menuText: string): Promise<boolean>;
34
+ showHomePage(menuText: string): Promise<void>;
35
+ updateHomeText(content: string): Promise<void>;
36
+ switchToChartLayout(topText: string): Promise<boolean>;
37
+ showChartPage(topText: string): Promise<void>;
38
+ updateChartText(content: string): Promise<void>;
39
+ sendImage(containerID: number, containerName: string, pngBytes: Uint8Array): Promise<void>;
40
+ onEvent(handler: (event: EvenHubEvent) => void): void;
41
+ dispose(): void;
42
+ }
43
+ //# sourceMappingURL=bridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridge.d.ts","sourceRoot":"","sources":["../bridge.ts"],"names":[],"mappings":"AAEA,OAAO,EAOL,KAAK,YAAY,EAClB,MAAM,6BAA6B,CAAC;AAErC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAOxC,MAAM,WAAW,YAAY;IAC3B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,GAAG,CAAgB;IAC3B,OAAO,CAAC,SAAS,CAA8B;IAC/C,OAAO,CAAC,YAAY,CAAyB;IAC7C,OAAO,CAAC,UAAU,CAAS;IAK3B,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,WAAW,CAAyB;IAG5C,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,cAAc,CAA+B;IAGrD,OAAO,CAAC,cAAc,CAAkB;gBAE5B,OAAO,CAAC,EAAE,YAAY,EAAE;IAUpC,IAAI,SAAS,IAAI,OAAO,CAA4B;IACpD,IAAI,WAAW,IAAI,QAAQ,GAAG,IAAI,CAA8B;IAChE,mDAAmD;IACnD,IAAI,aAAa,IAAI,QAAQ,GAAG,IAAI,CAA8B;IAElE,OAAO,CAAC,WAAW;IAsCb,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAOrB,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC;IAYjC,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ5C,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAS1C,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAUhD,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAW/C,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAQrF,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMhF,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAQhD,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM3C,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAQtD,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgC7C,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAa9C,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAStD,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA2B7C,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAa/C,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAShG,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,GAAG,IAAI;IAIrD,OAAO,IAAI,IAAI;CAGhB"}
package/dist/bridge.js ADDED
@@ -0,0 +1,255 @@
1
+ import { EvenBetterSdk } from '@jappyjan/even-better-sdk';
2
+ import { RebuildPageContainer, ImageContainerProperty, ImageRawDataUpdate, TextContainerProperty, TextContainerUpgrade, } from '@evenrealities/even_hub_sdk';
3
+ import { DISPLAY_W, DISPLAY_H, CHART_TEXT, IMAGE_TILES } from './layout';
4
+ import { notifyTextUpdate } from './gestures';
5
+ function noBorder(el) {
6
+ return el.setBorder(b => b.setWidth(0).setColor('0').setRadius(0));
7
+ }
8
+ export class EvenHubBridge {
9
+ constructor(columns) {
10
+ this.rawBridge = null;
11
+ this._currentMode = null;
12
+ this._pageReady = false;
13
+ this.columnElements = [];
14
+ this.sdk = new EvenBetterSdk();
15
+ const cols = columns ?? [
16
+ { x: 0, w: 192 },
17
+ { x: 192, w: 192 },
18
+ { x: 384, w: DISPLAY_W - 384 },
19
+ ];
20
+ this.createPages(cols);
21
+ }
22
+ get pageReady() { return this._pageReady; }
23
+ get currentMode() { return this._currentMode; }
24
+ /** Alias matching even-market naming convention */
25
+ get currentLayout() { return this._currentMode; }
26
+ createPages(cols) {
27
+ // ── Text page: empty overlay (event capture, no bounce) + visible content ──
28
+ this.textPage = this.sdk.createPage('text');
29
+ const textOverlay = noBorder(this.textPage.addTextElement(''));
30
+ textOverlay
31
+ .setPosition(p => p.setX(0).setY(0))
32
+ .setSize(s => s.setWidth(DISPLAY_W).setHeight(DISPLAY_H));
33
+ textOverlay.markAsEventCaptureElement();
34
+ this.textContent = noBorder(this.textPage.addTextElement(''));
35
+ this.textContent
36
+ .setPosition(p => p.setX(0).setY(0))
37
+ .setSize(s => s.setWidth(DISPLAY_W).setHeight(DISPLAY_H));
38
+ // ── Column page: empty overlay + N column text elements (max 3 columns + overlay = 4 containers) ──
39
+ this.columnPage = this.sdk.createPage('columns');
40
+ const colOverlay = noBorder(this.columnPage.addTextElement(''));
41
+ colOverlay
42
+ .setPosition(p => p.setX(0).setY(0))
43
+ .setSize(s => s.setWidth(DISPLAY_W).setHeight(DISPLAY_H));
44
+ colOverlay.markAsEventCaptureElement();
45
+ this.columnElements = cols.map((col) => {
46
+ const el = noBorder(this.columnPage.addTextElement(''));
47
+ el.setPosition(p => p.setX(col.x).setY(0))
48
+ .setSize(s => s.setWidth(col.w).setHeight(DISPLAY_H));
49
+ return el;
50
+ });
51
+ // ── Chart dummy page (for SDK state tracking) ──
52
+ this.chartDummyPage = this.sdk.createPage('chart-dummy');
53
+ const dummyText = noBorder(this.chartDummyPage.addTextElement(''));
54
+ dummyText
55
+ .setPosition(p => p.setX(0).setY(0))
56
+ .setSize(s => s.setWidth(1).setHeight(1));
57
+ dummyText.markAsEventCaptureElement();
58
+ }
59
+ async init() {
60
+ this.rawBridge = await EvenBetterSdk.getRawBridge();
61
+ this._pageReady = true;
62
+ }
63
+ // ── Setup (required before chart/home layout switch) ──
64
+ async setupTextPage() {
65
+ if (!this._pageReady)
66
+ return false;
67
+ try {
68
+ this.textContent.setContent('');
69
+ await this.sdk.renderPage(this.textPage);
70
+ this._currentMode = 'text';
71
+ return true;
72
+ }
73
+ catch {
74
+ return false;
75
+ }
76
+ }
77
+ // ── Text page (single full-screen text, no bounce) ──
78
+ async showTextPage(content) {
79
+ if (!this._pageReady)
80
+ return;
81
+ this.textContent.setContent(content);
82
+ notifyTextUpdate();
83
+ await this.sdk.renderPage(this.textPage);
84
+ this._currentMode = 'text';
85
+ }
86
+ async updateText(content) {
87
+ if (!this._pageReady)
88
+ return;
89
+ this.textContent.setContent(content);
90
+ notifyTextUpdate();
91
+ await this.sdk.renderPage(this.textPage);
92
+ }
93
+ // ── Column page (multi-column text, no bounce) ──
94
+ async showColumnPage(columns) {
95
+ if (!this._pageReady)
96
+ return;
97
+ for (let i = 0; i < this.columnElements.length && i < columns.length; i++) {
98
+ this.columnElements[i].setContent(columns[i]);
99
+ }
100
+ notifyTextUpdate();
101
+ await this.sdk.renderPage(this.columnPage);
102
+ this._currentMode = 'columns';
103
+ }
104
+ async updateColumns(columns) {
105
+ if (!this._pageReady)
106
+ return;
107
+ for (let i = 0; i < this.columnElements.length && i < columns.length; i++) {
108
+ this.columnElements[i].setContent(columns[i]);
109
+ }
110
+ notifyTextUpdate();
111
+ await this.sdk.renderPage(this.columnPage);
112
+ }
113
+ // ── Convenience: Watchlist (3-column layout) ──
114
+ async switchToWatchlist(colSym, colPrice, colPct) {
115
+ if (!this._pageReady)
116
+ return false;
117
+ try {
118
+ await this.showColumnPage([colSym, colPrice, colPct]);
119
+ return true;
120
+ }
121
+ catch {
122
+ return false;
123
+ }
124
+ }
125
+ async updateWatchlist(colSym, colPrice, colPct) {
126
+ await this.updateColumns([colSym, colPrice, colPct]);
127
+ }
128
+ // ── Convenience: Settings (full-screen text) ──
129
+ async switchToSettings(text) {
130
+ if (!this._pageReady)
131
+ return false;
132
+ try {
133
+ await this.showTextPage(text);
134
+ return true;
135
+ }
136
+ catch {
137
+ return false;
138
+ }
139
+ }
140
+ async updateSettings(text) {
141
+ await this.updateText(text);
142
+ }
143
+ // ── Home page (1 image + empty overlay + menu text = 3 containers, no bounce) ──
144
+ async switchToHomeLayout(menuText) {
145
+ if (!this.rawBridge || !this._pageReady)
146
+ return false;
147
+ try {
148
+ await this.showHomePage(menuText);
149
+ return true;
150
+ }
151
+ catch {
152
+ return false;
153
+ }
154
+ }
155
+ async showHomePage(menuText) {
156
+ if (!this.rawBridge || !this._pageReady)
157
+ return;
158
+ await this.sdk.renderPage(this.chartDummyPage);
159
+ const tile = IMAGE_TILES[0];
160
+ await this.rawBridge.rebuildPageContainer(new RebuildPageContainer({
161
+ containerTotalNum: 3,
162
+ textObject: [
163
+ new TextContainerProperty({
164
+ containerID: 1, containerName: 'overlay',
165
+ xPosition: 0, yPosition: 0, width: DISPLAY_W, height: DISPLAY_H,
166
+ borderWidth: 0, borderColor: 0, paddingLength: 0,
167
+ content: '', isEventCapture: 1,
168
+ }),
169
+ new TextContainerProperty({
170
+ containerID: 5, containerName: 'menu',
171
+ xPosition: 0, yPosition: 100, width: DISPLAY_W, height: DISPLAY_H - 100,
172
+ borderWidth: 0, borderColor: 0, paddingLength: 6,
173
+ content: menuText, isEventCapture: 0,
174
+ }),
175
+ ],
176
+ imageObject: [
177
+ new ImageContainerProperty({
178
+ containerID: tile.id, containerName: tile.name,
179
+ xPosition: tile.x, yPosition: tile.y, width: tile.w, height: tile.h,
180
+ }),
181
+ ],
182
+ }));
183
+ this._currentMode = 'home';
184
+ }
185
+ async updateHomeText(content) {
186
+ if (!this.rawBridge || !this._pageReady || this._currentMode !== 'home')
187
+ return;
188
+ notifyTextUpdate();
189
+ await this.rawBridge.textContainerUpgrade(new TextContainerUpgrade({
190
+ containerID: 5, containerName: 'menu',
191
+ contentOffset: 0, contentLength: 2000, content,
192
+ }));
193
+ }
194
+ // ── Chart page (3 image tiles + 1 text = 4 containers) ──
195
+ async switchToChartLayout(topText) {
196
+ if (!this.rawBridge || !this._pageReady)
197
+ return false;
198
+ if (this._currentMode === 'chart')
199
+ return true;
200
+ try {
201
+ await this.showChartPage(topText);
202
+ return true;
203
+ }
204
+ catch {
205
+ return false;
206
+ }
207
+ }
208
+ async showChartPage(topText) {
209
+ if (!this.rawBridge || !this._pageReady)
210
+ return;
211
+ if (this._currentMode === 'chart')
212
+ return;
213
+ await this.sdk.renderPage(this.chartDummyPage);
214
+ await this.rawBridge.rebuildPageContainer(new RebuildPageContainer({
215
+ containerTotalNum: 4,
216
+ textObject: [
217
+ new TextContainerProperty({
218
+ containerID: CHART_TEXT.id, containerName: CHART_TEXT.name,
219
+ xPosition: CHART_TEXT.x, yPosition: CHART_TEXT.y,
220
+ width: CHART_TEXT.w, height: CHART_TEXT.h,
221
+ borderWidth: 0, borderColor: 0, paddingLength: 0,
222
+ content: topText, isEventCapture: 1,
223
+ }),
224
+ ],
225
+ imageObject: IMAGE_TILES.map((t) => new ImageContainerProperty({
226
+ containerID: t.id, containerName: t.name,
227
+ xPosition: t.x, yPosition: t.y, width: t.w, height: t.h,
228
+ })),
229
+ }));
230
+ this._currentMode = 'chart';
231
+ }
232
+ async updateChartText(content) {
233
+ if (!this.rawBridge || !this._pageReady || this._currentMode !== 'chart')
234
+ return;
235
+ notifyTextUpdate();
236
+ await this.rawBridge.textContainerUpgrade(new TextContainerUpgrade({
237
+ containerID: CHART_TEXT.id, containerName: CHART_TEXT.name,
238
+ contentOffset: 0, contentLength: 2000, content,
239
+ }));
240
+ }
241
+ // ── Image sending (for home + chart modes) ──
242
+ async sendImage(containerID, containerName, pngBytes) {
243
+ if (!this.rawBridge || !this._pageReady || this._currentMode === 'text' || this._currentMode === 'columns' || pngBytes.length === 0)
244
+ return;
245
+ await this.rawBridge.updateImageRawData(new ImageRawDataUpdate({ containerID, containerName, imageData: pngBytes }));
246
+ }
247
+ // ── Events ──
248
+ onEvent(handler) {
249
+ this.sdk.addEventListener(handler);
250
+ }
251
+ dispose() {
252
+ this.rawBridge = null;
253
+ }
254
+ }
255
+ //# sourceMappingURL=bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridge.js","sourceRoot":"","sources":["../bridge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { DisplayData } from './types';
2
+ export declare function getCanvas(): HTMLCanvasElement;
3
+ export declare function drawToCanvas(data: DisplayData): void;
4
+ export declare function renderToImage(data: DisplayData): Promise<number[]>;
5
+ //# sourceMappingURL=canvas-renderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvas-renderer.d.ts","sourceRoot":"","sources":["../canvas-renderer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAe,MAAM,SAAS,CAAC;AAyBxD,wBAAgB,SAAS,IAAI,iBAAiB,CAG7C;AAuCD,wBAAgB,YAAY,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAWpD;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAGxE"}