@symbiote-native/symbols 0.0.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 (114) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +52 -0
  3. package/build/angular/index.d.ts +2 -0
  4. package/build/angular/index.js +3 -0
  5. package/build/angular/symbol-view.d.ts +22 -0
  6. package/build/angular/symbol-view.js +147 -0
  7. package/build/core/android/index.d.ts +11 -0
  8. package/build/core/android/index.js +10 -0
  9. package/build/core/android/symbols.json +4057 -0
  10. package/build/core/android/weights/bold/index.d.ts +3 -0
  11. package/build/core/android/weights/bold/index.js +6 -0
  12. package/build/core/android/weights/extraLight/index.d.ts +3 -0
  13. package/build/core/android/weights/extraLight/index.js +6 -0
  14. package/build/core/android/weights/light/index.d.ts +3 -0
  15. package/build/core/android/weights/light/index.js +6 -0
  16. package/build/core/android/weights/medium/index.d.ts +3 -0
  17. package/build/core/android/weights/medium/index.js +6 -0
  18. package/build/core/android/weights/regular/index.d.ts +3 -0
  19. package/build/core/android/weights/regular/index.js +6 -0
  20. package/build/core/android/weights/semiBold/index.d.ts +3 -0
  21. package/build/core/android/weights/semiBold/index.js +6 -0
  22. package/build/core/android/weights/thin/index.d.ts +3 -0
  23. package/build/core/android/weights/thin/index.js +6 -0
  24. package/build/core/index.d.ts +5 -0
  25. package/build/core/index.js +2 -0
  26. package/build/core/symbol-types.d.ts +95 -0
  27. package/build/core/symbol-types.js +1 -0
  28. package/build/core/symbols.d.ts +29 -0
  29. package/build/core/symbols.js +153 -0
  30. package/build/react/index.d.ts +3 -0
  31. package/build/react/index.js +3 -0
  32. package/build/react/symbol-view.d.ts +10 -0
  33. package/build/react/symbol-view.js +14 -0
  34. package/build/solid/index.d.ts +3 -0
  35. package/build/solid/index.js +3 -0
  36. package/build/solid/symbol-view.d.ts +11 -0
  37. package/build/solid/symbol-view.js +28 -0
  38. package/build/svelte/index.d.ts +3 -0
  39. package/build/svelte/index.js +3 -0
  40. package/build/svelte/symbol-props.d.ts +7 -0
  41. package/build/svelte/symbol-props.js +1 -0
  42. package/build/svelte/symbol-view.svelte +26 -0
  43. package/build/svelte/symbol-view.svelte.d.ts +4 -0
  44. package/build/vue/index.d.ts +3 -0
  45. package/build/vue/index.js +3 -0
  46. package/build/vue/symbol-view.d.ts +6 -0
  47. package/build/vue/symbol-view.js +26 -0
  48. package/build-ngc/angular/index.d.ts +2 -0
  49. package/build-ngc/angular/index.js +4 -0
  50. package/build-ngc/angular/index.js.map +1 -0
  51. package/build-ngc/angular/symbol-view.d.ts +25 -0
  52. package/build-ngc/angular/symbol-view.js +82 -0
  53. package/build-ngc/angular/symbol-view.js.map +1 -0
  54. package/build-ngc/core/android/index.d.ts +11 -0
  55. package/build-ngc/core/android/index.js +11 -0
  56. package/build-ngc/core/android/index.js.map +1 -0
  57. package/build-ngc/core/android/symbols.json +4057 -0
  58. package/build-ngc/core/android/weights/bold/index.d.ts +3 -0
  59. package/build-ngc/core/android/weights/bold/index.js +7 -0
  60. package/build-ngc/core/android/weights/bold/index.js.map +1 -0
  61. package/build-ngc/core/android/weights/extraLight/index.d.ts +3 -0
  62. package/build-ngc/core/android/weights/extraLight/index.js +7 -0
  63. package/build-ngc/core/android/weights/extraLight/index.js.map +1 -0
  64. package/build-ngc/core/android/weights/light/index.d.ts +3 -0
  65. package/build-ngc/core/android/weights/light/index.js +7 -0
  66. package/build-ngc/core/android/weights/light/index.js.map +1 -0
  67. package/build-ngc/core/android/weights/medium/index.d.ts +3 -0
  68. package/build-ngc/core/android/weights/medium/index.js +7 -0
  69. package/build-ngc/core/android/weights/medium/index.js.map +1 -0
  70. package/build-ngc/core/android/weights/regular/index.d.ts +3 -0
  71. package/build-ngc/core/android/weights/regular/index.js +7 -0
  72. package/build-ngc/core/android/weights/regular/index.js.map +1 -0
  73. package/build-ngc/core/android/weights/semiBold/index.d.ts +3 -0
  74. package/build-ngc/core/android/weights/semiBold/index.js +7 -0
  75. package/build-ngc/core/android/weights/semiBold/index.js.map +1 -0
  76. package/build-ngc/core/android/weights/thin/index.d.ts +3 -0
  77. package/build-ngc/core/android/weights/thin/index.js +7 -0
  78. package/build-ngc/core/android/weights/thin/index.js.map +1 -0
  79. package/build-ngc/core/index.d.ts +5 -0
  80. package/build-ngc/core/index.js +3 -0
  81. package/build-ngc/core/index.js.map +1 -0
  82. package/build-ngc/core/symbol-types.d.ts +95 -0
  83. package/build-ngc/core/symbol-types.js +2 -0
  84. package/build-ngc/core/symbol-types.js.map +1 -0
  85. package/build-ngc/core/symbols.d.ts +29 -0
  86. package/build-ngc/core/symbols.js +154 -0
  87. package/build-ngc/core/symbols.js.map +1 -0
  88. package/native-link.json +5 -0
  89. package/package.json +155 -0
  90. package/src/angular/index.ts +18 -0
  91. package/src/angular/symbol-view.ts +71 -0
  92. package/src/core/android/index.ts +15 -0
  93. package/src/core/android/symbols.json +4057 -0
  94. package/src/core/android/weights/bold/index.ts +8 -0
  95. package/src/core/android/weights/extraLight/index.ts +8 -0
  96. package/src/core/android/weights/light/index.ts +8 -0
  97. package/src/core/android/weights/medium/index.ts +8 -0
  98. package/src/core/android/weights/regular/index.ts +8 -0
  99. package/src/core/android/weights/semiBold/index.ts +8 -0
  100. package/src/core/android/weights/thin/index.ts +8 -0
  101. package/src/core/index.ts +25 -0
  102. package/src/core/symbol-types.ts +147 -0
  103. package/src/core/symbols.ts +192 -0
  104. package/src/react/index.ts +18 -0
  105. package/src/react/symbol-view.ts +33 -0
  106. package/src/solid/index.ts +18 -0
  107. package/src/solid/symbol-view.ts +53 -0
  108. package/src/svelte/index.ts +18 -0
  109. package/src/svelte/svelte-ambient.d.ts +6 -0
  110. package/src/svelte/svelte-compile.test-helper.ts +6 -0
  111. package/src/svelte/symbol-props.ts +10 -0
  112. package/src/svelte/symbol-view.svelte +26 -0
  113. package/src/vue/index.ts +18 -0
  114. package/src/vue/symbol-view.ts +45 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 A. Prokopenko
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,52 @@
1
+ # @symbiote-native/symbols
2
+
3
+ [`expo-symbols`](https://docs.expo.dev/versions/latest/sdk/symbols/) for **every**
4
+ [SymbioteNative](../../README.md) adapter: React, Vue, Svelte, Solid and Angular. SF Symbols on iOS,
5
+ Material Symbols on Android drawn from a font loaded through `@symbiote-native/font`.
6
+
7
+ ## Install
8
+
9
+ ```bash
10
+ npx @symbiote-native/cli new my-app --symbols # new app
11
+ npx @symbiote-native/cli add --symbols # existing app
12
+ ```
13
+
14
+ Manual: `npm install @symbiote-native/symbols`, then wire `expo-modules-autolinking` once per app.
15
+ Never install `expo-symbols`, `expo-font` or the `expo` meta-package yourself, the Android font path
16
+ comes with the `@symbiote-native/font` dependency.
17
+
18
+ ## Usage
19
+
20
+ ```tsx
21
+ import { SymbolView } from '@symbiote-native/symbols/react';
22
+ import bold from '@symbiote-native/symbols/androidWeights/bold';
23
+
24
+ <SymbolView
25
+ name={{ ios: 'star.fill', android: 'star' }}
26
+ weight={{ ios: 'bold', android: bold }}
27
+ tintColor="orange"
28
+ size={32}
29
+ fallback={<Text>star</Text>}
30
+ />;
31
+ ```
32
+
33
+ Same props on every adapter: `name`, `type`, `scale`, `weight`, `colors`, `size`, `tintColor`,
34
+ `resizeMode`, `animationSpec` and the View surface. `fallback` is a prop on React and Solid, a slot
35
+ named `fallback` on Vue, a `fallback` snippet on Svelte and projected content on Angular. It renders
36
+ when the symbol has no name for the current platform.
37
+
38
+ ## Platforms
39
+
40
+ | Platform | What renders |
41
+ | -------- | --------------------------------------------------------------------- |
42
+ | iOS | the native `SymbolView` with every prop forwarded |
43
+ | Android | an empty sized `View`, then the glyph in the Material Symbols font |
44
+
45
+ The font loads once on mount. If loading fails the symbol stays an empty `View`.
46
+ `unstable_getMaterialSymbolSourceAsync(symbol, size, color)` renders a Material Symbol to an image
47
+ source for APIs that take an image, such as tab bar icons.
48
+
49
+ ## Not ported
50
+
51
+ The macOS entry (`SymbolView.macos.tsx`) and the web build. Upstream ships no tests, so the suites here
52
+ are written against its behavior.
@@ -0,0 +1,2 @@
1
+ export { SymbolView } from './symbol-view';
2
+ export { SYMBOL_MODULE_NAME, androidSymbolToString, symbolViewName, unstable_getMaterialSymbolSourceAsync, type IAndroidSymbol, type IAnimationSpec, type IContentMode, type ISymbolName, type ISymbolScale, type ISymbolType, type ISymbolViewProps, type ISymbolWeight, type SFSymbol, } from '../core';
@@ -0,0 +1,3 @@
1
+ // @symbiote-native/symbols/angular: компонент `SymbolView` поверх общего ядра
2
+ export { SymbolView } from './symbol-view.js';
3
+ export { SYMBOL_MODULE_NAME, androidSymbolToString, symbolViewName, unstable_getMaterialSymbolSourceAsync, } from '../core/index.js';
@@ -0,0 +1,22 @@
1
+ import { type OnDestroy, type OnInit } from '@angular/core';
2
+ import { NativeViewBase } from '@symbiote-native/angular';
3
+ import type { IDescriptor } from '@symbiote-native/components';
4
+ import type { ISymbolViewProps } from '../core';
5
+ /** Angular twin of `expo-symbols`' `SymbolView`, projected content is the fallback without a symbol */
6
+ export declare class SymbolView extends NativeViewBase implements OnInit, OnDestroy {
7
+ name: ISymbolViewProps['name'];
8
+ type?: ISymbolViewProps['type'];
9
+ scale?: ISymbolViewProps['scale'];
10
+ weight?: ISymbolViewProps['weight'];
11
+ colors?: ISymbolViewProps['colors'];
12
+ size?: ISymbolViewProps['size'];
13
+ tintColor?: ISymbolViewProps['tintColor'];
14
+ resizeMode?: ISymbolViewProps['resizeMode'];
15
+ animationSpec?: ISymbolViewProps['animationSpec'];
16
+ protected readonly propNames: readonly ["name", "type", "scale", "weight", "colors", "size", "tintColor", "resizeMode", "animationSpec"];
17
+ private isFontLoaded;
18
+ private cancelWatch;
19
+ protected renderView(props: object): IDescriptor | null;
20
+ ngOnInit(): void;
21
+ protected disposeView(): void;
22
+ }
@@ -0,0 +1,147 @@
1
+ var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
2
+ function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
3
+ var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
4
+ var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
5
+ var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
6
+ var _, done = false;
7
+ for (var i = decorators.length - 1; i >= 0; i--) {
8
+ var context = {};
9
+ for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
10
+ for (var p in contextIn.access) context.access[p] = contextIn.access[p];
11
+ context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
12
+ var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
13
+ if (kind === "accessor") {
14
+ if (result === void 0) continue;
15
+ if (result === null || typeof result !== "object") throw new TypeError("Object expected");
16
+ if (_ = accept(result.get)) descriptor.get = _;
17
+ if (_ = accept(result.set)) descriptor.set = _;
18
+ if (_ = accept(result.init)) initializers.unshift(_);
19
+ }
20
+ else if (_ = accept(result)) {
21
+ if (kind === "field") initializers.unshift(_);
22
+ else descriptor[key] = _;
23
+ }
24
+ }
25
+ if (target) Object.defineProperty(target, contextIn.name, descriptor);
26
+ done = true;
27
+ };
28
+ var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
29
+ var useValue = arguments.length > 2;
30
+ for (var i = 0; i < initializers.length; i++) {
31
+ value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
32
+ }
33
+ return useValue ? value : void 0;
34
+ };
35
+ import { ChangeDetectionStrategy, Component, Input, } from '@angular/core';
36
+ import { DescriptorOutlet, NativeViewBase } from '@symbiote-native/angular';
37
+ import { renderSymbolView, watchSymbolFont } from '../core/index.js';
38
+ /** Angular twin of `expo-symbols`' `SymbolView`, projected content is the fallback without a symbol */
39
+ let SymbolView = (() => {
40
+ let _classDecorators = [Component({
41
+ selector: 'SymbolView',
42
+ standalone: true,
43
+ imports: [DescriptorOutlet],
44
+ changeDetection: ChangeDetectionStrategy.OnPush,
45
+ template: `@if (descriptor; as node) {
46
+ <symbiote-descriptor-outlet [node]="node" />
47
+ } @else {
48
+ <ng-content />
49
+ }`,
50
+ })];
51
+ let _classDescriptor;
52
+ let _classExtraInitializers = [];
53
+ let _classThis;
54
+ let _classSuper = NativeViewBase;
55
+ let _name_decorators;
56
+ let _name_initializers = [];
57
+ let _name_extraInitializers = [];
58
+ let _type_decorators;
59
+ let _type_initializers = [];
60
+ let _type_extraInitializers = [];
61
+ let _scale_decorators;
62
+ let _scale_initializers = [];
63
+ let _scale_extraInitializers = [];
64
+ let _weight_decorators;
65
+ let _weight_initializers = [];
66
+ let _weight_extraInitializers = [];
67
+ let _colors_decorators;
68
+ let _colors_initializers = [];
69
+ let _colors_extraInitializers = [];
70
+ let _size_decorators;
71
+ let _size_initializers = [];
72
+ let _size_extraInitializers = [];
73
+ let _tintColor_decorators;
74
+ let _tintColor_initializers = [];
75
+ let _tintColor_extraInitializers = [];
76
+ let _resizeMode_decorators;
77
+ let _resizeMode_initializers = [];
78
+ let _resizeMode_extraInitializers = [];
79
+ let _animationSpec_decorators;
80
+ let _animationSpec_initializers = [];
81
+ let _animationSpec_extraInitializers = [];
82
+ var SymbolView = class extends _classSuper {
83
+ static { _classThis = this; }
84
+ static {
85
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
86
+ _name_decorators = [Input({ required: true })];
87
+ _type_decorators = [Input()];
88
+ _scale_decorators = [Input()];
89
+ _weight_decorators = [Input()];
90
+ _colors_decorators = [Input()];
91
+ _size_decorators = [Input()];
92
+ _tintColor_decorators = [Input()];
93
+ _resizeMode_decorators = [Input()];
94
+ _animationSpec_decorators = [Input()];
95
+ __esDecorate(null, null, _name_decorators, { kind: "field", name: "name", static: false, private: false, access: { has: obj => "name" in obj, get: obj => obj.name, set: (obj, value) => { obj.name = value; } }, metadata: _metadata }, _name_initializers, _name_extraInitializers);
96
+ __esDecorate(null, null, _type_decorators, { kind: "field", name: "type", static: false, private: false, access: { has: obj => "type" in obj, get: obj => obj.type, set: (obj, value) => { obj.type = value; } }, metadata: _metadata }, _type_initializers, _type_extraInitializers);
97
+ __esDecorate(null, null, _scale_decorators, { kind: "field", name: "scale", static: false, private: false, access: { has: obj => "scale" in obj, get: obj => obj.scale, set: (obj, value) => { obj.scale = value; } }, metadata: _metadata }, _scale_initializers, _scale_extraInitializers);
98
+ __esDecorate(null, null, _weight_decorators, { kind: "field", name: "weight", static: false, private: false, access: { has: obj => "weight" in obj, get: obj => obj.weight, set: (obj, value) => { obj.weight = value; } }, metadata: _metadata }, _weight_initializers, _weight_extraInitializers);
99
+ __esDecorate(null, null, _colors_decorators, { kind: "field", name: "colors", static: false, private: false, access: { has: obj => "colors" in obj, get: obj => obj.colors, set: (obj, value) => { obj.colors = value; } }, metadata: _metadata }, _colors_initializers, _colors_extraInitializers);
100
+ __esDecorate(null, null, _size_decorators, { kind: "field", name: "size", static: false, private: false, access: { has: obj => "size" in obj, get: obj => obj.size, set: (obj, value) => { obj.size = value; } }, metadata: _metadata }, _size_initializers, _size_extraInitializers);
101
+ __esDecorate(null, null, _tintColor_decorators, { kind: "field", name: "tintColor", static: false, private: false, access: { has: obj => "tintColor" in obj, get: obj => obj.tintColor, set: (obj, value) => { obj.tintColor = value; } }, metadata: _metadata }, _tintColor_initializers, _tintColor_extraInitializers);
102
+ __esDecorate(null, null, _resizeMode_decorators, { kind: "field", name: "resizeMode", static: false, private: false, access: { has: obj => "resizeMode" in obj, get: obj => obj.resizeMode, set: (obj, value) => { obj.resizeMode = value; } }, metadata: _metadata }, _resizeMode_initializers, _resizeMode_extraInitializers);
103
+ __esDecorate(null, null, _animationSpec_decorators, { kind: "field", name: "animationSpec", static: false, private: false, access: { has: obj => "animationSpec" in obj, get: obj => obj.animationSpec, set: (obj, value) => { obj.animationSpec = value; } }, metadata: _metadata }, _animationSpec_initializers, _animationSpec_extraInitializers);
104
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
105
+ SymbolView = _classThis = _classDescriptor.value;
106
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
107
+ __runInitializers(_classThis, _classExtraInitializers);
108
+ }
109
+ name = __runInitializers(this, _name_initializers, void 0);
110
+ type = (__runInitializers(this, _name_extraInitializers), __runInitializers(this, _type_initializers, void 0));
111
+ scale = (__runInitializers(this, _type_extraInitializers), __runInitializers(this, _scale_initializers, void 0));
112
+ weight = (__runInitializers(this, _scale_extraInitializers), __runInitializers(this, _weight_initializers, void 0));
113
+ colors = (__runInitializers(this, _weight_extraInitializers), __runInitializers(this, _colors_initializers, void 0));
114
+ size = (__runInitializers(this, _colors_extraInitializers), __runInitializers(this, _size_initializers, void 0));
115
+ tintColor = (__runInitializers(this, _size_extraInitializers), __runInitializers(this, _tintColor_initializers, void 0));
116
+ resizeMode = (__runInitializers(this, _tintColor_extraInitializers), __runInitializers(this, _resizeMode_initializers, void 0));
117
+ animationSpec = (__runInitializers(this, _resizeMode_extraInitializers), __runInitializers(this, _animationSpec_initializers, void 0));
118
+ propNames = (__runInitializers(this, _animationSpec_extraInitializers), [
119
+ 'name',
120
+ 'type',
121
+ 'scale',
122
+ 'weight',
123
+ 'colors',
124
+ 'size',
125
+ 'tintColor',
126
+ 'resizeMode',
127
+ 'animationSpec',
128
+ ]);
129
+ isFontLoaded = false;
130
+ cancelWatch = () => { };
131
+ renderView(props) {
132
+ return renderSymbolView(props, this.isFontLoaded);
133
+ }
134
+ // Шрифт грузится один раз при создании, как в upstream
135
+ ngOnInit() {
136
+ this.cancelWatch = watchSymbolFont(Object.fromEntries(this.propNames.map(propName => [propName, Reflect.get(this, propName)])), isLoaded => {
137
+ this.isFontLoaded = isLoaded;
138
+ this.changeDetector.markForCheck();
139
+ });
140
+ }
141
+ disposeView() {
142
+ this.cancelWatch();
143
+ }
144
+ };
145
+ return SymbolView = _classThis;
146
+ })();
147
+ export { SymbolView };
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Regenerate this file using a request captured from https://fonts.google.com/icons and this script:
3
+ * https://gist.github.com/aleqsio/63a2f378286c727780ef6056d66d8e43
4
+ */
5
+ import symbols from './symbols.json';
6
+ export type IAndroidSymbol = keyof typeof symbols;
7
+ export type IAndroidSymbolWeight = {
8
+ name: string;
9
+ font: number;
10
+ };
11
+ export declare function androidSymbolToString(symbol: IAndroidSymbol | null): string | null;
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Regenerate this file using a request captured from https://fonts.google.com/icons and this script:
3
+ * https://gist.github.com/aleqsio/63a2f378286c727780ef6056d66d8e43
4
+ */
5
+ import symbols from './symbols.json';
6
+ export function androidSymbolToString(symbol) {
7
+ if (!symbol)
8
+ return null;
9
+ return String.fromCharCode(symbols[symbol]);
10
+ }