From 8b7d5ab5fc34fa7785b7801ca5de60e69bbf7392 Mon Sep 17 00:00:00 2001 From: Samuel Schultze Date: Thu, 22 Dec 2022 01:27:25 -0300 Subject: [PATCH 01/76] fix(ios): reset additional insets if they're zero (#10134) --- packages/core/ui/core/view/view-helper/index.ios.ts | 2 ++ packages/core/ui/page/index.ios.ts | 2 ++ 2 files changed, 4 insertions(+) diff --git a/packages/core/ui/core/view/view-helper/index.ios.ts b/packages/core/ui/core/view/view-helper/index.ios.ts index 0596c2fbfe..5b8022d39c 100644 --- a/packages/core/ui/core/view/view-helper/index.ios.ts +++ b/packages/core/ui/core/view/view-helper/index.ios.ts @@ -80,6 +80,8 @@ class UILayoutViewController extends UIViewController { right: 0, }); this.additionalSafeAreaInsets = additionalInsets; + } else { + this.additionalSafeAreaInsets = null; } } } diff --git a/packages/core/ui/page/index.ios.ts b/packages/core/ui/page/index.ios.ts index 6b5b54d458..5694d66a06 100644 --- a/packages/core/ui/page/index.ios.ts +++ b/packages/core/ui/page/index.ios.ts @@ -325,6 +325,8 @@ class UIViewControllerImpl extends UIViewController { right: 0, }); this.additionalSafeAreaInsets = additionalInsets; + } else { + this.additionalSafeAreaInsets = null; } } } From 6948f7c03265ebf9b92a7d5f69bfbb4743ce449b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20de=20Dios=20Mart=C3=ADnez=20Vallejo?= Date: Wed, 28 Dec 2022 04:41:34 +0100 Subject: [PATCH 02/76] fix(ios): box shadow border radius (#10142) --- packages/core/ui/styling/background.ios.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/core/ui/styling/background.ios.ts b/packages/core/ui/styling/background.ios.ts index e3eb08627f..6e8f8f3207 100644 --- a/packages/core/ui/styling/background.ios.ts +++ b/packages/core/ui/styling/background.ios.ts @@ -736,7 +736,12 @@ function drawBoxShadow(nativeView: NativeScriptUIView, view: View, boxShadow: CS ); // this should match the view's border radius - const cornerRadius = Length.toDevicePixels(view.style.borderRadius, 0.0); + let cornerRadius: number; + if (typeof view.style.borderRadius !== 'number') { + cornerRadius = Length.toDevicePixels(view.style.borderRadius, 0.0); + } else { + cornerRadius = view.style.borderRadius; + } // apply spreadRadius by expanding shadow layer bounds // prettier-ignore From a4f28b831785c8cf6ba76c170fcd7a5628b12c35 Mon Sep 17 00:00:00 2001 From: farfromrefuge Date: Wed, 28 Dec 2022 17:23:10 +0000 Subject: [PATCH 03/76] fix(ios): navigatingTo event handling (#10120) --- .../src/navigation/navigation-tests.ts | 135 ++++++++++-------- apps/automated/src/test-runner.ts | 4 +- packages/core/ui/frame/index.ios.ts | 11 +- packages/core/ui/page/index.ios.ts | 7 + 4 files changed, 95 insertions(+), 62 deletions(-) diff --git a/apps/automated/src/navigation/navigation-tests.ts b/apps/automated/src/navigation/navigation-tests.ts index 62d943b54d..5f6eec22e7 100644 --- a/apps/automated/src/navigation/navigation-tests.ts +++ b/apps/automated/src/navigation/navigation-tests.ts @@ -32,6 +32,18 @@ function attachEventListeners(page: Page, events: Array) { }); } +function attachFrameEventListeners(frame: Frame, events: Array) { + let argsToString = (args: frame.NavigationData) => { + return `${(args.entry).resolvedPage.id} ${args.eventName} ${args.isBack ? 'back' : 'forward'}`; + }; + frame.on(Page.navigatingToEvent, (args: NavigatedData) => { + events.push(argsToString(args)); + }); + frame.on(Page.navigatedToEvent, (args: NavigatedData) => { + events.push(argsToString(args)); + }); +} + function _test_backstackVisible(transition?: NavigationTransition) { let topmost = Frame.topmost(); let mainTestPage = topmost.currentPage; @@ -186,86 +198,86 @@ export function test_backToEntry_WithTransition() { _test_backToEntry({ name: 'fade', duration: 10 }); } -function _test_ClearHistory(transition?: NavigationTransition) { - let topmost = Frame.topmost(); +// function _test_ClearHistory(transition?: NavigationTransition) { +// let topmost = Frame.topmost(); - helper.navigateWithEntry({ create: pageFactory, clearHistory: true, transition: transition, animated: !!transition }); - TKUnit.assertEqual(topmost.backStack.length, 0, '1.topmost.backStack.length'); - TKUnit.assertEqual(topmost.canGoBack(), false, '1.topmost.canGoBack().'); +// helper.navigateWithEntry({ create: pageFactory, clearHistory: true, transition: transition, animated: !!transition }); +// TKUnit.assertEqual(topmost.backStack.length, 0, '1.topmost.backStack.length'); +// TKUnit.assertEqual(topmost.canGoBack(), false, '1.topmost.canGoBack().'); - helper.navigateWithEntry({ create: pageFactory, transition: transition, animated: !!transition }); - TKUnit.assertEqual(topmost.backStack.length, 1, '2.topmost.backStack.length'); - TKUnit.assertEqual(topmost.canGoBack(), true, '2.topmost.canGoBack().'); +// helper.navigateWithEntry({ create: pageFactory, transition: transition, animated: !!transition }); +// TKUnit.assertEqual(topmost.backStack.length, 1, '2.topmost.backStack.length'); +// TKUnit.assertEqual(topmost.canGoBack(), true, '2.topmost.canGoBack().'); - helper.navigateWithEntry({ create: pageFactory, transition: transition, animated: !!transition }); - TKUnit.assertEqual(topmost.backStack.length, 2, '3.topmost.backStack.length'); - TKUnit.assertEqual(topmost.canGoBack(), true, '3.topmost.canGoBack().'); +// helper.navigateWithEntry({ create: pageFactory, transition: transition, animated: !!transition }); +// TKUnit.assertEqual(topmost.backStack.length, 2, '3.topmost.backStack.length'); +// TKUnit.assertEqual(topmost.canGoBack(), true, '3.topmost.canGoBack().'); - helper.navigateWithEntry({ create: pageFactory, clearHistory: true, transition: transition, animated: !!transition }); - TKUnit.assertEqual(topmost.backStack.length, 0, '4.topmost.backStack.length'); - TKUnit.assertEqual(topmost.canGoBack(), false, '4.topmost.canGoBack().'); -} +// helper.navigateWithEntry({ create: pageFactory, clearHistory: true, transition: transition, animated: !!transition }); +// TKUnit.assertEqual(topmost.backStack.length, 0, '4.topmost.backStack.length'); +// TKUnit.assertEqual(topmost.canGoBack(), false, '4.topmost.canGoBack().'); +// } -export function test_ClearHistory() { - _test_ClearHistory(); -} +// export function test_ClearHistory() { +// _test_ClearHistory(); +// } -export function test_ClearHistory_WithTransition() { - _test_ClearHistory({ name: 'fade', duration: 10 }); -} +// export function test_ClearHistory_WithTransition() { +// _test_ClearHistory({ name: 'fade', duration: 10 }); +// } // Test case for https://github.com/NativeScript/NativeScript/issues/1948 -export function test_ClearHistoryWithTransitionDoesNotBreakNavigation() { - let topmost = Frame.topmost(); - let mainTestPage = new Page(); - let mainPageFactory = function (): Page { - return mainTestPage; - }; +// export function test_ClearHistoryWithTransitionDoesNotBreakNavigation() { +// let topmost = Frame.topmost(); +// let mainTestPage = new Page(); +// let mainPageFactory = function (): Page { +// return mainTestPage; +// }; - // Go to details-page - helper.navigateWithEntry({ create: pageFactory, clearHistory: false, animated: true }); +// // Go to details-page +// helper.navigateWithEntry({ create: pageFactory, clearHistory: false, animated: true }); - // Go back to main-page with clearHistory - topmost.transition = { name: 'fade', duration: 10 }; - helper.navigateWithEntry({ create: mainPageFactory, clearHistory: true, animated: true }); +// // Go back to main-page with clearHistory +// topmost.transition = { name: 'fade', duration: 10 }; +// helper.navigateWithEntry({ create: mainPageFactory, clearHistory: true, animated: true }); - // Go to details-page AGAIN - helper.navigateWithEntry({ create: pageFactory, clearHistory: false, animated: true }); +// // Go to details-page AGAIN +// helper.navigateWithEntry({ create: pageFactory, clearHistory: false, animated: true }); - // Go back to main-page with clearHistory - topmost.transition = { name: 'fade', duration: 10 }; - helper.navigateWithEntry({ create: mainPageFactory, clearHistory: true, animated: true }); +// // Go back to main-page with clearHistory +// topmost.transition = { name: 'fade', duration: 10 }; +// helper.navigateWithEntry({ create: mainPageFactory, clearHistory: true, animated: true }); - // Clean up - topmost.transition = undefined; +// // Clean up +// topmost.transition = undefined; - TKUnit.assertEqual(topmost.currentPage, mainTestPage, 'We should be on the main test page at the end of the test.'); - TKUnit.assertEqual(topmost.backStack.length, 0, 'Back stack should be empty at the end of the test.'); -} +// TKUnit.assertEqual(topmost.currentPage, mainTestPage, 'We should be on the main test page at the end of the test.'); +// TKUnit.assertEqual(topmost.backStack.length, 0, 'Back stack should be empty at the end of the test.'); +// } -export function test_ClearHistoryWithTransitionDoesNotBreakNavigation_WithLocalTransition() { - const topmost = Frame.topmost(); +// export function test_ClearHistoryWithTransitionDoesNotBreakNavigation_WithLocalTransition() { +// const topmost = Frame.topmost(); - let mainTestPage = topmost.currentPage; - let mainPageFactory = function (): Page { - return mainTestPage; - }; +// let mainTestPage = topmost.currentPage; +// let mainPageFactory = function (): Page { +// return mainTestPage; +// }; - // Go to 1st page - helper.navigateWithEntry({ create: pageFactory, clearHistory: false, transition: { name: 'fade', duration: 10 }, animated: true }); +// // Go to 1st page +// helper.navigateWithEntry({ create: pageFactory, clearHistory: false, transition: { name: 'fade', duration: 10 }, animated: true }); - // Go to 2nd page - helper.navigateWithEntry({ create: pageFactory, clearHistory: false, transition: { name: 'fade', duration: 10 }, animated: true }); +// // Go to 2nd page +// helper.navigateWithEntry({ create: pageFactory, clearHistory: false, transition: { name: 'fade', duration: 10 }, animated: true }); - // Go to 3rd page with clearHistory - helper.navigateWithEntry({ create: pageFactory, clearHistory: true, transition: { name: 'fade', duration: 10 }, animated: true }); +// // Go to 3rd page with clearHistory +// helper.navigateWithEntry({ create: pageFactory, clearHistory: true, transition: { name: 'fade', duration: 10 }, animated: true }); - // Go back to main - helper.navigateWithEntry({ create: mainPageFactory, clearHistory: true, transition: { name: 'fade', duration: 10 }, animated: true }); +// // Go back to main +// helper.navigateWithEntry({ create: mainPageFactory, clearHistory: true, transition: { name: 'fade', duration: 10 }, animated: true }); - TKUnit.assertEqual(topmost.currentPage, mainTestPage, 'We should be on the main test page at the end of the test.'); - TKUnit.assertEqual(topmost.backStack.length, 0, 'Back stack should be empty at the end of the test.'); -} +// TKUnit.assertEqual(topmost.currentPage, mainTestPage, 'We should be on the main test page at the end of the test.'); +// TKUnit.assertEqual(topmost.backStack.length, 0, 'Back stack should be empty at the end of the test.'); +// } function _test_NavigationEvents(transition?: NavigationTransition) { const topmost = Frame.topmost(); @@ -274,7 +286,9 @@ function _test_NavigationEvents(transition?: NavigationTransition) { mainTestPage.id = 'main-page'; let actualMainPageEvents = new Array(); + let actualMainFrameEvents = new Array(); attachEventListeners(mainTestPage, actualMainPageEvents); + attachFrameEventListeners(topmost, actualMainFrameEvents); let actualSecondPageEvents = new Array(); let secondPageFactory = function (): Page { @@ -298,6 +312,9 @@ function _test_NavigationEvents(transition?: NavigationTransition) { let expectedMainPageEvents = ['main-page navigatingFrom forward', 'main-page navigatedFrom forward', 'main-page navigatingTo back', 'main-page navigatedTo back']; TKUnit.arrayAssert(actualMainPageEvents, expectedMainPageEvents, 'Actual main-page events are different from expected.'); + let expectedMainFrameEvents = ['second-page navigatingTo forward', 'second-page navigatedTo forward', 'main-page navigatingTo back', 'main-page navigatedTo back']; + TKUnit.arrayAssert(actualMainFrameEvents, expectedMainFrameEvents, 'Actual main-page events are different from expected.'); + let expectedSecondPageEvents = ['second-page navigatingTo forward', 'second-page navigatedTo forward', 'second-page navigatingFrom back', 'second-page navigatedFrom back']; TKUnit.arrayAssert(actualSecondPageEvents, expectedSecondPageEvents, 'Actual second-page events are different from expected.'); diff --git a/apps/automated/src/test-runner.ts b/apps/automated/src/test-runner.ts index 613d8d415e..2e3d54e8ac 100644 --- a/apps/automated/src/test-runner.ts +++ b/apps/automated/src/test-runner.ts @@ -264,8 +264,8 @@ allTests['TRANSITIONS'] = transitionTests; import * as searchBarTests from './ui/search-bar/search-bar-tests'; allTests['SEARCH-BAR'] = searchBarTests; -// import * as navigationTests from './navigation/navigation-tests'; -// allTests['NAVIGATION'] = navigationTests; +import * as navigationTests from './navigation/navigation-tests'; +allTests['NAVIGATION'] = navigationTests; // import * as livesyncTests from './livesync/livesync-tests'; // allTests['LIVESYNC'] = livesyncTests; diff --git a/packages/core/ui/frame/index.ios.ts b/packages/core/ui/frame/index.ios.ts index 3ecc42e92a..547ed22c49 100644 --- a/packages/core/ui/frame/index.ios.ts +++ b/packages/core/ui/frame/index.ios.ts @@ -307,7 +307,16 @@ export class Frame extends FrameBase { } public _onNavigatingTo(backstackEntry: BackstackEntry, isBack: boolean) { - super._onNavigatingTo(backstackEntry, isBack); + // for now to not break iOS events chain (calling navigation events from controller delegates) + // we dont call super(which would also trigger events) but only notify the frame of the navigation + // though it means events are not triggered at the same time (lifecycle) on iOS / Android + this.notify({ + eventName: Page.navigatingToEvent, + object: this, + isBack, + entry: backstackEntry, + fromEntry: this._currentEntry, + }); } } diff --git a/packages/core/ui/page/index.ios.ts b/packages/core/ui/page/index.ios.ts index 5694d66a06..b8ff65664f 100644 --- a/packages/core/ui/page/index.ios.ts +++ b/packages/core/ui/page/index.ios.ts @@ -118,7 +118,14 @@ class UIViewControllerImpl extends UIViewController { } const frame = this.navigationController ? (this.navigationController).owner : null; + const newEntry = this[ENTRY]; + // Don't raise event if currentPage was showing modal page. + if (!owner._presentedViewController && newEntry && (!frame || frame.currentPage !== owner)) { + const isBack = isBackNavigationTo(owner, newEntry); + owner.onNavigatingTo(newEntry.entry.context, isBack, newEntry.entry.bindingContext); + } + if (frame) { if (!owner.parent) { owner._frame = frame; From 6e1e9c4ad55c506e555da3f43257ceb565073565 Mon Sep 17 00:00:00 2001 From: Nathan Walker Date: Wed, 28 Dec 2022 21:58:52 -0800 Subject: [PATCH 04/76] release: @nativescript/core 8.4.2 --- CHANGELOG.md | 15 +++++++++++++++ package.json | 2 +- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index eb647cf433..73f2d36734 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,18 @@ +## [8.4.2](https://github.com/NativeScript/NativeScript/compare/8.4.1-core...8.4.2-core) (2022-12-29) + + +### Bug Fixes + +* **android:** backwards compat Java cast Float to Long for ApplicationSettings.getNumber ([#10140](https://github.com/NativeScript/NativeScript/issues/10140)) ([7c1590a](https://github.com/NativeScript/NativeScript/commit/7c1590abff0127fd1e5254648cdd1d8c7ab49869)) +* **core:** update metadata filtering for IOS 16 ([#10133](https://github.com/NativeScript/NativeScript/issues/10133)) ([c461f1b](https://github.com/NativeScript/NativeScript/commit/c461f1bb551a69e721548fa5ae6ca2c7601d0b87)) +* **ios:** box shadow border radius ([#10142](https://github.com/NativeScript/NativeScript/issues/10142)) ([6948f7c](https://github.com/NativeScript/NativeScript/commit/6948f7c03265ebf9b92a7d5f69bfbb4743ce449b)) +* **ios:** navigatingTo event handling ([#10120](https://github.com/NativeScript/NativeScript/issues/10120)) ([a4f28b8](https://github.com/NativeScript/NativeScript/commit/a4f28b831785c8cf6ba76c170fcd7a5628b12c35)) +* **ios:** reset additional insets if they're zero ([#10134](https://github.com/NativeScript/NativeScript/issues/10134)) ([8b7d5ab](https://github.com/NativeScript/NativeScript/commit/8b7d5ab5fc34fa7785b7801ca5de60e69bbf7392)) +* **listview:** delegate handling removed from unloaded ([#10138](https://github.com/NativeScript/NativeScript/issues/10138)) ([04c3d9a](https://github.com/NativeScript/NativeScript/commit/04c3d9a9795898386f26656018bc05cf697d09e2)) +* **utils:** ios to filter out null values ([#10117](https://github.com/NativeScript/NativeScript/issues/10117)) ([4723114](https://github.com/NativeScript/NativeScript/commit/47231145acb851552d7990e5a75b66dd6d06fee8)) + + + ## [8.4.1](https://github.com/NativeScript/NativeScript/compare/8.4.0-core...8.4.1-core) (2022-11-30) ### Bug Fixes diff --git a/package.json b/package.json index 77d55ccece..1b005e3fa3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "nativescript", - "version": "8.4.1", + "version": "8.4.2", "license": "MIT", "scripts": { "clean": "git clean -f -X -d --exclude=!.idea/ --exclude=!.vscode/* --exclude=!.npmrc", From ed3fe979e66018f127514059d0dd73f66b6be397 Mon Sep 17 00:00:00 2001 From: Nathan Walker Date: Wed, 28 Dec 2022 22:00:15 -0800 Subject: [PATCH 05/76] chore: 8.4.3 next --- packages/core/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/package.json b/packages/core/package.json index 6ffec39f69..a412807456 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@nativescript/core", - "version": "8.4.2", + "version": "8.4.3", "description": "A JavaScript library providing an easy to use api for interacting with iOS and Android platform APIs.", "main": "index", "types": "index.d.ts", From 760bbd06faf3acb7e0694acaf1ad3e029f1cd278 Mon Sep 17 00:00:00 2001 From: Eduardo Speroni Date: Tue, 3 Jan 2023 13:23:32 -0300 Subject: [PATCH 06/76] fix(ios): prevent layout in viewSafeAreaInsetsDidChange until first viewDidLayoutSubviews (#10151) --- packages/core/ui/page/index.ios.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/core/ui/page/index.ios.ts b/packages/core/ui/page/index.ios.ts index b8ff65664f..d6bc163670 100644 --- a/packages/core/ui/page/index.ios.ts +++ b/packages/core/ui/page/index.ios.ts @@ -74,6 +74,7 @@ class UIViewControllerImpl extends UIViewController { public isBackstackSkipped: boolean; public isBackstackCleared: boolean; + private didFirstLayout: boolean; // this is initialized in initWithOwner since the constructor doesn't run on native classes private _isRunningLayout: number; private get isRunningLayout() { @@ -84,6 +85,7 @@ class UIViewControllerImpl extends UIViewController { } private finishRunningLayout() { this._isRunningLayout--; + this.didFirstLayout = true; } private runLayout(cb: () => void) { try { @@ -98,6 +100,7 @@ class UIViewControllerImpl extends UIViewController { const controller = UIViewControllerImpl.new(); controller._owner = owner; controller._isRunningLayout = 0; + controller.didFirstLayout = false; return controller; } @@ -125,7 +128,7 @@ class UIViewControllerImpl extends UIViewController { const isBack = isBackNavigationTo(owner, newEntry); owner.onNavigatingTo(newEntry.entry.context, isBack, newEntry.entry.bindingContext); } - + if (frame) { if (!owner.parent) { owner._frame = frame; @@ -276,7 +279,7 @@ class UIViewControllerImpl extends UIViewController { public viewSafeAreaInsetsDidChange(): void { super.viewSafeAreaInsetsDidChange(); - if (this.isRunningLayout) { + if (this.isRunningLayout || !this.didFirstLayout) { return; } const owner = this._owner?.deref(); From d138ac000df2e2dfc890db992c39a4429e6ed8dc Mon Sep 17 00:00:00 2001 From: Nathan Walker Date: Tue, 3 Jan 2023 15:01:21 -0800 Subject: [PATCH 07/76] fix(ios): prevent transitionCoordinator usage during modal presentation (#10153) closes https://github.com/NativeScript/NativeScript/issues/10115 --- packages/core/ui/frame/index.ios.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/core/ui/frame/index.ios.ts b/packages/core/ui/frame/index.ios.ts index 547ed22c49..60a42befd8 100644 --- a/packages/core/ui/frame/index.ios.ts +++ b/packages/core/ui/frame/index.ios.ts @@ -118,7 +118,9 @@ export class Frame extends FrameBase { if (!this._currentEntry) { // Update action-bar with disabled animations before the initial navigation. this._updateActionBar(backstackEntry.resolvedPage, true); - this.pushViewControllerAnimated(viewController, animated); + // Core defaults modalPresentationStyle to 1 for standard frame navigation + // for all others, it's modal presentation + this.pushViewControllerAnimated(viewController, animated, this._ios?.controller?.modalPresentationStyle !== 1); if (Trace.isEnabled()) { Trace.write(`${this}.pushViewControllerAnimated(${viewController}, ${animated}); depth = ${navDepth}`, Trace.categories.Navigation); } @@ -180,13 +182,14 @@ export class Frame extends FrameBase { } } - private pushViewControllerAnimated(viewController: UIViewController, animated: boolean) { + private pushViewControllerAnimated(viewController: UIViewController, animated: boolean, isModal: boolean) { let transitionCoordinator = this._ios.controller.transitionCoordinator; - if (transitionCoordinator) { + if (!isModal && transitionCoordinator) { transitionCoordinator.animateAlongsideTransitionCompletion(null, () => { this._ios.controller.pushViewControllerAnimated(viewController, animated); }); } else { + // modal should always push immediately without transition coordinator this._ios.controller.pushViewControllerAnimated(viewController, animated); } } From 00944bb1b5b6f4cc8084cf7cde3db6448e28e0bd Mon Sep 17 00:00:00 2001 From: Nathan Walker Date: Tue, 3 Jan 2023 17:36:56 -0800 Subject: [PATCH 08/76] fix(ios): TextField keyboard handling with emoji, autofill, and shortcuts (#10154) closes https://github.com/NativeScript/NativeScript/issues/10108 --- apps/toolbox/src/main-page.xml | 1 + apps/toolbox/src/pages/forms.ts | 16 ++++++++++++++++ apps/toolbox/src/pages/forms.xml | 15 +++++++++++++++ package.json | 1 + packages/core/index.d.ts | 3 ++- packages/core/index.ts | 3 ++- packages/core/package.json | 1 + packages/core/ui/text-field/index.ios.ts | 7 +++++-- packages/core/utils/common.ts | 7 +++++++ 9 files changed, 50 insertions(+), 4 deletions(-) create mode 100644 apps/toolbox/src/pages/forms.ts create mode 100644 apps/toolbox/src/pages/forms.xml diff --git a/apps/toolbox/src/main-page.xml b/apps/toolbox/src/main-page.xml index 28f53ca087..d4d7766e82 100644 --- a/apps/toolbox/src/main-page.xml +++ b/apps/toolbox/src/main-page.xml @@ -10,6 +10,7 @@