@yomotech/view-toolkit 1.0.15 → 1.0.17

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yomotech/view-toolkit",
3
- "version": "1.0.15",
3
+ "version": "1.0.17",
4
4
  "peerDependencies": {
5
5
  "@angular/cdk": "^21.0.0",
6
6
  "@angular/common": "^21.0.0",
@@ -26,7 +26,8 @@
26
26
  "primeflex": "^4.0.0",
27
27
  "primeicons": "^7.0.0",
28
28
  "primeng": "^21.1.3",
29
- "rxjs": "^7.8.1"
29
+ "rxjs": "^7.8.1",
30
+ "@aparajita/capacitor-secure-storage": "^7.1.6"
30
31
  },
31
32
  "dependencies": {
32
33
  "tslib": "^2.8.0"
@@ -45,9 +45,17 @@ declare class UtilityService {
45
45
  };
46
46
  setStorage(key: string, value: any): Promise<void>;
47
47
  getStorage(key: string): Promise<string | null>;
48
+ /**
49
+ * Keys that hold a saved sign-in; on the devices they live in the keychain / keystore.
50
+ * keycloak: KeycloakInfo, oktaAuth: loginedUser, jwtToken: <project>Logined.
51
+ */
52
+ private readonly secureKeys;
53
+ private isSecureKey;
48
54
  setLocalStorage(key: string, value: any): Promise<void>;
49
55
  removeLocalStorage(keyName: string): Promise<void>;
50
56
  removeStorage(key: string): Promise<void>;
57
+ /** Reads a credential key from the keychain, moving a value stored the old way on first read. */
58
+ private getSecureItem;
51
59
  getLocalStorage<T = unknown>(key: string): Promise<any>;
52
60
  showAllProjects(): Promise<void>;
53
61
  parseBodyObject(obj: any): any;
@@ -126,24 +134,6 @@ declare class Couchdb {
126
134
  private getReadHeaders;
127
135
  private buildTenantHeaders;
128
136
  getImageSrcFromCouchDb(couchDbName: string, filePath: string): Promise<string>;
129
- /**
130
- * Returns a URL that a <video>, <audio> or <img> element can load directly.
131
- *
132
- * Unlike getImageSrcFromCouchDb above, this never reads the file. It asks
133
- * jwt-auth for a short-lived signed URL and hands that back, so the browser
134
- * fetches the attachment itself - with Range requests, so a video starts on
135
- * the first chunk and a seek costs one request instead of the whole file.
136
- *
137
- * The reason a signed URL is needed at all: a media element issues its own
138
- * HTTP requests, for the initial load and again for every seek, and those
139
- * requests carry none of the tenant headers buildTenantHeaders adds here.
140
- * The token in the query string is the only credential the element can pass.
141
- *
142
- * The path comes back from the endpoint and is used as given. The signature
143
- * covers the raw, still-encoded path, so rebuilding it here with a different
144
- * encoding would produce a URL that fails with a bare 403.
145
- */
146
- getMediaUrlFromCouchDb(couchDbName: string, filePath: string, attachmentName?: string): Promise<string>;
147
137
  static ɵfac: i0.ɵɵFactoryDeclaration<Couchdb, never>;
148
138
  static ɵprov: i0.ɵɵInjectableDeclaration<Couchdb>;
149
139
  }
@@ -169,6 +159,7 @@ declare class ConfigService {
169
159
  logoutRedirectUri: any;
170
160
  scope: any;
171
161
  responseType: any;
162
+ offlineAccess: boolean;
172
163
  } | null;
173
164
  private updateLoaderValue;
174
165
  currentLoader$: rxjs.Observable<any>;
@@ -188,6 +179,142 @@ declare class NotificationService {
188
179
  static ɵprov: i0.ɵɵInjectableDeclaration<NotificationService>;
189
180
  }
190
181
 
182
+ type CustomKeyboardType = 'email' | 'numeric' | 'alpha' | 'string' | 'date' | 'time';
183
+ declare function normalizeCustomKeyboardType(value: unknown): CustomKeyboardType | null;
184
+ /**
185
+ * Keyboard for a field: option.keyboardType when the layout sets one, otherwise derived from the
186
+ * attribute (property schema) type. Returns null where the system keyboard stays in charge.
187
+ */
188
+ declare function resolveCustomKeyboardType(option: any, property: any): CustomKeyboardType | null;
189
+
190
+ type CustomKeyboardTarget = HTMLInputElement | HTMLTextAreaElement;
191
+ interface CustomKeyboardSession {
192
+ target: CustomKeyboardTarget;
193
+ type: CustomKeyboardType;
194
+ originalReadOnly: boolean;
195
+ originalInputMode: string | null;
196
+ originalInputType: string | null;
197
+ }
198
+ declare class CustomKeyboardService {
199
+ private openingSuspendedUntil;
200
+ private lastKeyboardHeight;
201
+ private pickerOverlayOpen;
202
+ private pickerTriggerPressedUntil;
203
+ readonly interactionBlocked: i0.WritableSignal<boolean>;
204
+ private interactionUnlockTimer;
205
+ readonly activeSession: i0.WritableSignal<CustomKeyboardSession | null>;
206
+ isNativeMobile(): boolean;
207
+ open(target: CustomKeyboardTarget, type: CustomKeyboardType): Promise<void>;
208
+ private blockInitialInteraction;
209
+ private scrollTargetIntoDialogView;
210
+ private updateKeyboardHeight;
211
+ private canProcessKeyboardAction;
212
+ insert(character: string): void;
213
+ backspace(): void;
214
+ clear(): void;
215
+ close(option?: {
216
+ blurTarget?: boolean;
217
+ restoreAccessoryBar?: boolean;
218
+ keepBottomArea?: boolean;
219
+ }): void;
220
+ closeIfTargetInside(container: HTMLElement): void;
221
+ private updateTarget;
222
+ private isValidValue;
223
+ private moveCursorToEnd;
224
+ private readonly documentPointerDownHandler;
225
+ private readonly activeTargetBlurHandler;
226
+ private handleDocumentPointerDown;
227
+ private handleActiveTargetBlur;
228
+ private insertDateTimeDigit;
229
+ private removeDateTimeDigit;
230
+ private setCaret;
231
+ /** Number of digits left of the cursor; the end when the field has no usable selection. */
232
+ private digitsBeforeCaret;
233
+ private updateDateTimeTarget;
234
+ /** String position right after the given number of digits, separators included. */
235
+ private positionAfterDigits;
236
+ private formatDateDigits;
237
+ private formatTimeDigits;
238
+ beginPickerOverlay(): void;
239
+ endPickerOverlay(option?: {
240
+ suspendReopen?: boolean;
241
+ keepBottomArea?: boolean;
242
+ }): void;
243
+ /**
244
+ * A panel docked at the bottom (date or time picker) takes the keyboard's place: the same body
245
+ * class and height variable let the dialog end above it.
246
+ */
247
+ reserveBottomArea(panel: HTMLElement | null): void;
248
+ releaseBottomArea(): void;
249
+ getActiveValue(type: CustomKeyboardType, targetName?: string): string | null;
250
+ static ɵfac: i0.ɵɵFactoryDeclaration<CustomKeyboardService, never>;
251
+ static ɵprov: i0.ɵɵInjectableDeclaration<CustomKeyboardService>;
252
+ }
253
+
254
+ declare class DateTimePickerService {
255
+ private readonly keyboard;
256
+ /** On the devices the date picker docks at the bottom like a keyboard; in a browser it drops down. */
257
+ readonly isNativeMobile: boolean;
258
+ /** panelStyleClass of a date picker. */
259
+ readonly datePanelClass: string;
260
+ /** panelStyleClass of a time picker: compact and attached to its field everywhere. */
261
+ readonly timePanelClass = "model-datepicker-panel model-timepicker-panel";
262
+ /**
263
+ * The docked date picker runs without PrimeNG's open/close animation. The animation scales the
264
+ * wrapper around the panel, and a transformed wrapper becomes the reference of the panel's
265
+ * position: fixed - the docked calendar flew up next to its field while closing.
266
+ */
267
+ readonly dockedMotion: {
268
+ disabled: boolean;
269
+ } | undefined;
270
+ private activePicker;
271
+ private activePickerRequest;
272
+ private pickerOpening;
273
+ private lockedPickerInput;
274
+ constructor(keyboard: CustomKeyboardService);
275
+ /** (onShow) of a picker. */
276
+ onShown(): void;
277
+ /** (onClose) of a picker; pass the picker so a late close of a replaced one is ignored. */
278
+ onClose(picker?: any): void;
279
+ /** (pointerdown) of the calendar or clock icon inside a .picker-field. */
280
+ openFromIcon(event: PointerEvent, picker: any): Promise<void>;
281
+ /** (click) of the icon. */
282
+ blockIconClick(event: MouseEvent): void;
283
+ /** (pointerdown) of the p-datepicker: a tap into its field while a picker is open. */
284
+ onFieldPointerDown(event: PointerEvent, picker: any): void;
285
+ /** (onFocus) of the p-datepicker. */
286
+ onFieldFocus(event: any): void;
287
+ /**
288
+ * For ngOnDestroy of a container: a picker can still be open when its dialog or page goes away.
289
+ * Without this the keyboard service keeps "picker open" and the reserved bottom area: no
290
+ * toolkit keyboard opens any more and the next dialog is cut short above an empty strip.
291
+ */
292
+ closeIfWithin(container: HTMLElement): void;
293
+ /**
294
+ * A month has five or six week rows, so the docked calendar grew and shrank while paging
295
+ * through the months and its upper edge went up and down. It keeps the height of six rows.
296
+ */
297
+ private keepSixWeekHeight;
298
+ /**
299
+ * Scrolls the dialog so the field sits right above the docked picker: the eye and the thumb
300
+ * move a short way from the value to the picker instead of across the whole screen.
301
+ */
302
+ private scrollFieldAbovePicker;
303
+ private configureDateTimeInput;
304
+ private lockPickerInput;
305
+ private unlockPickerInput;
306
+ /**
307
+ * The pointerdown on the icon closes the toolkit keyboard and the layout below the finger can
308
+ * change. The click that follows lands wherever the finger is now - in the emulator it opened
309
+ * the autocomplete list of the field that had moved under it. A click that no longer hits the
310
+ * icon is dropped; one on the icon passes, so other lists still close on it.
311
+ */
312
+ private swallowShiftedClick;
313
+ private closeActivePicker;
314
+ static ɵfac: i0.ɵɵFactoryDeclaration<DateTimePickerService, never>;
315
+ static ɵprov: i0.ɵɵInjectableDeclaration<DateTimePickerService>;
316
+ }
317
+
191
318
  declare class CardComponent {
192
319
  private utilityService;
193
320
  private platform;
@@ -199,6 +326,9 @@ declare class CardComponent {
199
326
  private notificationService;
200
327
  private oauthService;
201
328
  private requestService;
329
+ /** Date and time picker behaviour shared by all containers. */
330
+ readonly picker: DateTimePickerService;
331
+ private readonly pickerHost;
202
332
  /** Keep existing checkbox data objects usable; new objects use boolean. */
203
333
  renderFieldType(type: string | undefined): string | undefined;
204
334
  itemInfo: any;
@@ -291,7 +421,11 @@ declare class CardComponent {
291
421
  static ɵcmp: i0.ɵɵComponentDeclaration<CardComponent, "vl-card", never, { "itemInfo": { "alias": "itemInfo"; "required": false; }; "currentPage": { "alias": "currentPage"; "required": false; }; "pageSize": { "alias": "pageSize"; "required": false; }; "selectedLanguageInfo": { "alias": "selectedLanguageInfo"; "required": false; }; "mobileDisplay": { "alias": "mobileDisplay"; "required": false; }; "scrollPagination": { "alias": "scrollPagination"; "required": false; }; "pages": { "alias": "pages"; "required": false; }; "paginationMode": { "alias": "paginationMode"; "required": false; }; "paginationLoading": { "alias": "paginationLoading"; "required": false; }; }, { "cardButtonClick": "cardButtonClick"; "cardHeaderButtonClick": "cardHeaderButtonClick"; "linkDetails": "linkDetails"; "imageDetails": "imageDetails"; "onPageSizeChange": "onPageSizeChange"; "onPageChange": "onPageChange"; "cardDataChange": "cardDataChange"; }, never, never, true, never>;
292
422
  }
293
423
 
294
- declare class FormComponent implements OnInit, OnChanges, AfterViewInit {
424
+ declare class FormComponent implements OnInit, OnChanges, AfterViewInit, OnDestroy {
425
+ /** Date and time picker behaviour shared by all containers. */
426
+ readonly picker: DateTimePickerService;
427
+ private readonly host;
428
+ ngOnDestroy(): void;
295
429
  /** Keep existing checkbox data objects usable; new objects use boolean. */
296
430
  renderFieldType(type: string | undefined): string | undefined;
297
431
  customEmailPattern: string;
@@ -324,16 +458,9 @@ declare class FormComponent implements OnInit, OnChanges, AfterViewInit {
324
458
  setValidations(): void;
325
459
  matchData: any;
326
460
  getLabel(formField: any): any;
327
- onPickerContainerPointerDown(event: any, datePicker: any): void;
328
- onPickerInputFocus(event: any, datePicker: any): void;
329
- openPickerFromIcon(event: any, datePicker: any): void;
330
- onPickerShown(): void;
331
- onPickerClose(): void;
332
461
  dateChangeEvent(formField: any, event: any): void;
333
462
  onDateTyping(event: any): void;
334
463
  onTimeTyping(event: any): void;
335
- onTimePanelShow(formField: any): void;
336
- blockPickerIconClick(event: any): void;
337
464
  timeChangeEvent(formField: any, event: any): void;
338
465
  autocompChangeEvent(event: any, formfield: any): void;
339
466
  autocompFocusOutEvent(event: any, formfield: any): void;
@@ -345,11 +472,15 @@ interface GridColumnFilterState {
345
472
  operator: string;
346
473
  value: string;
347
474
  }
348
- declare class GridComponent implements AfterViewInit {
475
+ declare class GridComponent implements AfterViewInit, OnDestroy {
349
476
  private requestService;
350
477
  private utilityService;
351
478
  private notificationService;
352
479
  private oktaAuthService;
480
+ /** Date and time picker behaviour shared by all containers. */
481
+ readonly picker: DateTimePickerService;
482
+ private readonly host;
483
+ ngOnDestroy(): void;
353
484
  /** New data objects use boolean; older projects may still use checkbox. */
354
485
  isLegacyCheckboxFieldType(type: string | undefined): boolean;
355
486
  isLogined: boolean;
@@ -479,69 +610,20 @@ declare class LogsComponent {
479
610
  static ɵcmp: i0.ɵɵComponentDeclaration<LogsComponent, "vl-logs", never, {}, {}, never, never, true, never>;
480
611
  }
481
612
 
482
- type CustomKeyboardType = 'email' | 'numeric' | 'alpha' | 'string' | 'date' | 'time';
483
- declare function normalizeCustomKeyboardType(value: unknown): CustomKeyboardType | null;
484
-
485
- type CustomKeyboardTarget = HTMLInputElement | HTMLTextAreaElement;
486
- interface CustomKeyboardSession {
487
- target: CustomKeyboardTarget;
488
- type: CustomKeyboardType;
489
- originalReadOnly: boolean;
490
- originalInputMode: string | null;
491
- originalInputType: string | null;
492
- }
493
- declare class CustomKeyboardService {
494
- private openingSuspendedUntil;
495
- private pickerOverlayOpen;
496
- private pickerTriggerPressedUntil;
497
- readonly interactionBlocked: i0.WritableSignal<boolean>;
498
- private interactionUnlockTimer;
499
- readonly activeSession: i0.WritableSignal<CustomKeyboardSession | null>;
500
- isNativeMobile(): boolean;
501
- open(target: CustomKeyboardTarget, type: CustomKeyboardType): Promise<void>;
502
- private blockInitialInteraction;
503
- private scrollTargetIntoDialogView;
504
- private updateKeyboardHeight;
505
- private canProcessKeyboardAction;
506
- insert(character: string): void;
507
- backspace(): void;
508
- clear(): void;
509
- close(option?: {
510
- blurTarget?: boolean;
511
- restoreAccessoryBar?: boolean;
512
- }): void;
513
- closeIfTargetInside(container: HTMLElement): void;
514
- private updateTarget;
515
- private isValidValue;
516
- private moveCursorToEnd;
517
- private readonly documentPointerDownHandler;
518
- private readonly activeTargetBlurHandler;
519
- private handleDocumentPointerDown;
520
- private handleActiveTargetBlur;
521
- private insertDateTimeDigit;
522
- private formatDateDigits;
523
- private formatTimeDigits;
524
- private removeDateTimeDigit;
525
- beginPickerOverlay(): void;
526
- endPickerOverlay(): void;
527
- getActiveValue(type: CustomKeyboardType, targetName?: string): string | null;
528
- static ɵfac: i0.ɵɵFactoryDeclaration<CustomKeyboardService, never>;
529
- static ɵprov: i0.ɵɵInjectableDeclaration<CustomKeyboardService>;
530
- }
531
-
532
- declare class ModelComponent implements OnChanges {
613
+ declare class ModelComponent implements OnChanges, OnDestroy {
533
614
  private cdr;
534
615
  private readonly dialogRef;
535
616
  private readonly dialogConfig;
536
617
  private utilityService;
537
- private readonly customKeyboardService;
538
618
  /** Keep existing checkbox data objects usable; new objects use boolean. */
539
619
  renderFieldType(type: string | undefined): string | undefined;
540
- private activePickerRequest;
620
+ /** Date and time picker behaviour shared by all containers. */
621
+ readonly picker: DateTimePickerService;
622
+ private readonly host;
623
+ /** The toolkit keyboard for a field, from option.keyboardType or the attribute type. */
624
+ keyboardTypeFor(formField: any): CustomKeyboardType | null;
541
625
  matchData: any[];
542
626
  date2: Date | undefined;
543
- private pickerOpening;
544
- private lockedPickerInput;
545
627
  errorMessages: any;
546
628
  modalItemInfo: any;
547
629
  selectedLanguageInfo: any;
@@ -550,8 +632,9 @@ declare class ModelComponent implements OnChanges {
550
632
  copyLayoutSchema: any;
551
633
  isLoading: boolean;
552
634
  projectLanguage: any;
553
- constructor(cdr: ChangeDetectorRef, dialogRef: DynamicDialogRef, dialogConfig: DynamicDialogConfig, utilityService: UtilityService, customKeyboardService: CustomKeyboardService);
635
+ constructor(cdr: ChangeDetectorRef, dialogRef: DynamicDialogRef, dialogConfig: DynamicDialogConfig, utilityService: UtilityService);
554
636
  ngAfterViewInit(): void;
637
+ ngOnDestroy(): void;
555
638
  ngOnChanges(changes: SimpleChanges): void;
556
639
  private initializeDialogContent;
557
640
  private updateDialogHeader;
@@ -602,16 +685,6 @@ declare class ModelComponent implements OnChanges {
602
685
  invokeFormBtnClick(option: any, propertySchema: any, form: NgForm): void;
603
686
  checkValidty(form: NgForm): boolean;
604
687
  onCancel(): void;
605
- onPickerShown(): void;
606
- onPickerClose(): void;
607
- openPickerFromIcon(event: PointerEvent, picker: any): Promise<void>;
608
- onPickerInputFocus(event: any): void;
609
- forceNumericKeyboard(event: any): void;
610
- private configureDateTimeInput;
611
- private lockPickerInput;
612
- private unlockPickerInput;
613
- blockPickerIconClick(event: MouseEvent): void;
614
- onPickerContainerPointerDown(event: PointerEvent, picker: any): void;
615
688
  static ɵfac: i0.ɵɵFactoryDeclaration<ModelComponent, never>;
616
689
  static ɵcmp: i0.ɵɵComponentDeclaration<ModelComponent, "vl-model", never, { "errorMessages": { "alias": "errorMessages"; "required": false; }; "modalItemInfo": { "alias": "modalItemInfo"; "required": false; }; "selectedLanguageInfo": { "alias": "selectedLanguageInfo"; "required": false; }; "userInfo": { "alias": "userInfo"; "required": false; }; "setFormDataHandler": { "alias": "setFormDataHandler"; "required": false; }; }, {}, never, never, true, never>;
617
690
  }
@@ -662,6 +735,13 @@ declare class MobileKeycloakService {
662
735
  private tokens;
663
736
  constructor(config: ConfigService, http: HttpClient, utilityService: UtilityService, platform: Platform);
664
737
  login(): Promise<any>;
738
+ /** The configured scope plus offline_access, without duplicating it. */
739
+ private withOfflineAccess;
740
+ /**
741
+ * New tokens from the refresh token (grant_type=refresh_token). Returns them in the stored token
742
+ * shape, or null when Keycloak refuses - then the caller falls back to the login.
743
+ */
744
+ refreshTokens(stored: MobileAuthTokens | any): Promise<any | null>;
665
745
  getUserInfo(accessToken: any, issuer: any): Promise<any>;
666
746
  getAccessToken(): string | null;
667
747
  getRefreshToken(): string | null;
@@ -690,6 +770,8 @@ declare class SideMenuComponent implements AfterViewInit, OnChanges, OnDestroy {
690
770
  menuItemsCopy: any[];
691
771
  settingMenu: any;
692
772
  setLanguage: boolean;
773
+ /** Translations of the last language change, for menu items that arrive after it. */
774
+ private lastMenuTranslations;
693
775
  tenantKey: string;
694
776
  scrollPagination: any;
695
777
  private oktaAuthStateSubscription?;
@@ -851,6 +933,8 @@ declare class Textbox {
851
933
  classes: any;
852
934
  style: any;
853
935
  };
936
+ /** The toolkit keyboard for this field, from option.keyboardType or the attribute type. */
937
+ keyboardTypeFor(formField: any): CustomKeyboardType | null;
854
938
  getPlaceholder(formField: any): any;
855
939
  static ɵfac: i0.ɵɵFactoryDeclaration<Textbox, never>;
856
940
  static ɵcmp: i0.ɵɵComponentDeclaration<Textbox, "vl-textbox", never, { "formField": { "alias": "formField"; "required": false; }; "modalItemInfo": { "alias": "modalItemInfo"; "required": false; }; }, {}, never, never, true, never>;
@@ -880,13 +964,21 @@ declare class AppVersionResetService {
880
964
  declare class CustomKeyboardComponent {
881
965
  readonly keyboard: CustomKeyboardService;
882
966
  readonly uppercase: i0.WritableSignal<boolean>;
883
- private readonly digitRow;
884
- private readonly letterRows;
967
+ /** true while the ?123 page is shown instead of the letters. */
968
+ readonly symbols: i0.WritableSignal<boolean>;
969
+ private readonly languageCode;
970
+ private readonly projectLayout;
971
+ constructor();
885
972
  get keyboardType(): CustomKeyboardType | null;
973
+ /** The symbol page exists where free text is typed. */
974
+ get hasSymbolPage(): boolean;
886
975
  get rows(): string[][];
976
+ /** ß has no single-letter capital in common use ("SS"), so it keeps its form. */
977
+ private toUpper;
887
978
  enterKey(key: string): void;
888
979
  enterSpace(): void;
889
980
  toggleCase(): void;
981
+ toggleSymbols(): void;
890
982
  static ɵfac: i0.ɵɵFactoryDeclaration<CustomKeyboardComponent, never>;
891
983
  static ɵcmp: i0.ɵɵComponentDeclaration<CustomKeyboardComponent, "vl-custom-keyboard", never, {}, {}, never, never, true, never>;
892
984
  }
@@ -905,5 +997,5 @@ declare class CustomKeyboardDirective implements OnDestroy {
905
997
  static ɵdir: i0.ɵɵDirectiveDeclaration<CustomKeyboardDirective, "[vlCustomKeyboard]", never, { "keyboardType": { "alias": "vlCustomKeyboard"; "required": false; }; }, {}, never, never, true, never>;
906
998
  }
907
999
 
908
- export { AppVersionResetService, CardComponent, ConfigService, Couchdb, CustomKeyboardComponent, CustomKeyboardDirective, CustomKeyboardService, FormComponent, GridComponent, HeaderMenuComponent, LogsComponent, MobileKeycloakService, ModelComponent, NetworkLogService, NotificationService, PaginationComponent, RequestService, SideMenuComponent, UtilityService, ViewToolkitModule, normalizeCustomKeyboardType };
1000
+ export { AppVersionResetService, CardComponent, ConfigService, Couchdb, CustomKeyboardComponent, CustomKeyboardDirective, CustomKeyboardService, FormComponent, GridComponent, HeaderMenuComponent, LogsComponent, MobileKeycloakService, ModelComponent, NetworkLogService, NotificationService, PaginationComponent, RequestService, SideMenuComponent, UtilityService, ViewToolkitModule, normalizeCustomKeyboardType, resolveCustomKeyboardType };
909
1001
  export type { CustomKeyboardTarget, CustomKeyboardType, MobileAuthTokens };