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.
- package/LICENSE +21 -0
- package/README.md +106 -0
- package/dist/action-bar.d.ts +25 -0
- package/dist/action-bar.d.ts.map +1 -0
- package/dist/action-bar.js +47 -0
- package/dist/action-bar.js.map +1 -0
- package/dist/action-map.d.ts +4 -0
- package/dist/action-map.d.ts.map +1 -0
- package/dist/action-map.js +46 -0
- package/dist/action-map.js.map +1 -0
- package/dist/bridge.d.ts +43 -0
- package/dist/bridge.d.ts.map +1 -0
- package/dist/bridge.js +255 -0
- package/dist/bridge.js.map +1 -0
- package/dist/canvas-renderer.d.ts +5 -0
- package/dist/canvas-renderer.d.ts.map +1 -0
- package/dist/canvas-renderer.js +73 -0
- package/dist/canvas-renderer.js.map +1 -0
- package/dist/composer.d.ts +4 -0
- package/dist/composer.d.ts.map +1 -0
- package/dist/composer.js +60 -0
- package/dist/composer.js.map +1 -0
- package/dist/gestures.d.ts +6 -0
- package/dist/gestures.d.ts.map +1 -0
- package/dist/gestures.js +47 -0
- package/dist/gestures.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/keep-alive.d.ts +3 -0
- package/dist/keep-alive.d.ts.map +1 -0
- package/dist/keep-alive.js +29 -0
- package/dist/keep-alive.js.map +1 -0
- package/dist/keyboard.d.ts +3 -0
- package/dist/keyboard.d.ts.map +1 -0
- package/dist/keyboard.js +62 -0
- package/dist/keyboard.js.map +1 -0
- package/dist/layout.d.ts +75 -0
- package/dist/layout.d.ts.map +1 -0
- package/dist/layout.js +89 -0
- package/dist/layout.js.map +1 -0
- package/dist/png-utils.d.ts +19 -0
- package/dist/png-utils.d.ts.map +1 -0
- package/dist/png-utils.js +73 -0
- package/dist/png-utils.js.map +1 -0
- package/dist/text-utils.d.ts +28 -0
- package/dist/text-utils.d.ts.map +1 -0
- package/dist/text-utils.js +41 -0
- package/dist/text-utils.js.map +1 -0
- package/dist/timer-display.d.ts +29 -0
- package/dist/timer-display.d.ts.map +1 -0
- package/dist/timer-display.js +74 -0
- package/dist/timer-display.js.map +1 -0
- package/dist/types.d.ts +39 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/dist/useFlashPhase.d.ts +9 -0
- package/dist/useFlashPhase.d.ts.map +1 -0
- package/dist/useFlashPhase.js +24 -0
- package/dist/useFlashPhase.js.map +1 -0
- package/dist/useGlasses.d.ts +18 -0
- package/dist/useGlasses.d.ts.map +1 -0
- package/dist/useGlasses.js +143 -0
- package/dist/useGlasses.js.map +1 -0
- 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 @@
|
|
|
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"}
|
package/dist/bridge.d.ts
ADDED
|
@@ -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"}
|