diff --git a/CHANGELOG.md b/CHANGELOG.md
index ef752c66c89..00f693c56b1 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,67 @@
+# [4.0.0-rc.1](https://github.com/ionic-team/ionic/compare/v4.0.0-rc.0...v4.0.0-rc.1) (2019-01-09)
+
+
+### Bug Fixes
+
+* **angular:** update [@angular](https://github.com/angular)/router dependency ([#16998](https://github.com/ionic-team/ionic/issues/16998)) ([76e9e02](https://github.com/ionic-team/ionic/commit/76e9e02))
+* **col:** handle RTL offset-*, pull-*, and push-* ([#16702](https://github.com/ionic-team/ionic/issues/16702)) ([6d6472b](https://github.com/ionic-team/ionic/commit/6d6472b))
+* **fab:** fab size when href provided ([b3316d4](https://github.com/ionic-team/ionic/commit/b3316d4)), closes [#16833](https://github.com/ionic-team/ionic/issues/16833)
+* **menu:** swipe-back has higher priority ([f05c599](https://github.com/ionic-team/ionic/commit/f05c599)), closes [#16864](https://github.com/ionic-team/ionic/issues/16864)
+* **overlays:** make them hidden until presented ([#16903](https://github.com/ionic-team/ionic/issues/16903)) ([302be53](https://github.com/ionic-team/ionic/commit/302be53)), closes [#16685](https://github.com/ionic-team/ionic/issues/16685)
+* **popover:** position properly in RTL / MD modes ([#16745](https://github.com/ionic-team/ionic/issues/16745)) ([7846019](https://github.com/ionic-team/ionic/commit/7846019))
+* **ripple-effect:** never capture click ([#16955](https://github.com/ionic-team/ionic/issues/16955)) ([7ee8aa6](https://github.com/ionic-team/ionic/commit/7ee8aa6)), closes [#16939](https://github.com/ionic-team/ionic/issues/16939)
+* **segment:** update indicator and border based on theme ([#16821](https://github.com/ionic-team/ionic/issues/16821)) ([74587db](https://github.com/ionic-team/ionic/commit/74587db)), closes [#16820](https://github.com/ionic-team/ionic/issues/16820)
+* **select:** interfaceOptions can customize mode ([#16826](https://github.com/ionic-team/ionic/issues/16826)) ([1227d57](https://github.com/ionic-team/ionic/commit/1227d57)), closes [#16825](https://github.com/ionic-team/ionic/issues/16825)
+* **tab-button:** allow standalone tab-button ([#16905](https://github.com/ionic-team/ionic/issues/16905)) ([6ca7645](https://github.com/ionic-team/ionic/commit/6ca7645)), closes [#16845](https://github.com/ionic-team/ionic/issues/16845)
+* **tabs:** fix goto root ([#16926](https://github.com/ionic-team/ionic/issues/16926)) ([8ee9205](https://github.com/ionic-team/ionic/commit/8ee9205)), closes [#16917](https://github.com/ionic-team/ionic/issues/16917)
+
+
+### Features
+
+* **radio-group:** add missing implementation for property allowEmptySelection ([#16880](https://github.com/ionic-team/ionic/issues/16880)) ([09726b0](https://github.com/ionic-team/ionic/commit/09726b0)), closes [#16841](https://github.com/ionic-team/ionic/issues/16841)
+* **react:** add missing simple components to react. ([#16836](https://github.com/ionic-team/ionic/issues/16836)) ([696f62c](https://github.com/ionic-team/ionic/commit/696f62c))
+* **react:** create initial portal implementation for overlay ctrls ([#16830](https://github.com/ionic-team/ionic/issues/16830)) ([99bdd1f](https://github.com/ionic-team/ionic/commit/99bdd1f))
+* **react:** Initial implementations of controller required elements. ([#16817](https://github.com/ionic-team/ionic/issues/16817)) ([e30c5f1](https://github.com/ionic-team/ionic/commit/e30c5f1))
+
+
+### Performance Improvements
+
+* **angular:** bundle size improvements for angular ([#16966](https://github.com/ionic-team/ionic/issues/16966)) ([44fb45e](https://github.com/ionic-team/ionic/commit/44fb45e))
+* **angular:** flat ng modules ([#17007](https://github.com/ionic-team/ionic/issues/17007)) ([0b84e27](https://github.com/ionic-team/ionic/commit/0b84e27)), closes [#17001](https://github.com/ionic-team/ionic/issues/17001)
+* **angular:** proxy fast properties ([#16888](https://github.com/ionic-team/ionic/issues/16888)) ([ca9ec3e](https://github.com/ionic-team/ionic/commit/ca9ec3e))
+
+
+### BREAKING CHANGES
+
+In order to speed up the build and reduce the main bundle size,
+we have moved the ionicons outside the webpack build pipeline.
+
+Instead, a new copy task needs to be added to the `angular.json`, specifically to the
+the `"assets"` option of the `"build"`.
+
+#### angular.json
+
+```diff
+{
+ "projects": {
+ "app": {
+ "architect": {
+ "build": {
+ "options": {
+ "assets": [
+ {
+ "glob": "**/*",
+ "input": "src/assets",
+ "output": "assets"
+ },
++ {
++ "glob": "**/*.svg",
++ "input": "node_modules/ionicons/dist/ionicons/svg",
++ "output": "./svg"
++ }
+```
+
+
# [4.0.0-rc.0](https://github.com/ionic-team/ionic/compare/v4.0.0-beta.19...v4.0.0-rc.0) (2018-12-19)
diff --git a/angular/package.json b/angular/package.json
index 652ecd4f40e..26ea7949837 100644
--- a/angular/package.json
+++ b/angular/package.json
@@ -1,6 +1,6 @@
{
"name": "@ionic/angular",
- "version": "4.0.0-rc.0",
+ "version": "4.0.0-rc.1",
"description": "Angular specific wrappers for @ionic/core",
"keywords": [
"ionic",
@@ -44,7 +44,7 @@
"css/"
],
"dependencies": {
- "@ionic/core": "4.0.0-rc.0",
+ "@ionic/core": "4.0.0-rc.1",
"tslib": "^1.9.3"
},
"peerDependencies": {
diff --git a/core/.stylelintrc.yml b/core/.stylelintrc.yml
index 47cd0e4e0ee..556ee7d5fb1 100644
--- a/core/.stylelintrc.yml
+++ b/core/.stylelintrc.yml
@@ -239,6 +239,7 @@ rules:
- contain
- content
- cursor
+ - direction
- empty-cells
- object-fit
- opacity
@@ -254,7 +255,6 @@ rules:
property-blacklist:
- background-position
- - direction
- right
- left
- float
diff --git a/core/README.md b/core/README.md
index 89023f5b313..658f67b3a7f 100644
--- a/core/README.md
+++ b/core/README.md
@@ -23,8 +23,8 @@ The Ionic Core package contains the Web Components that make up the reusable UI
Easiest way to start using Ionic Core is by adding a script tag to the CDN:
```html
-
-
+
+
```
Any Ionic component added to the webpage will automatically load. This includes writing the component tag directly in HTML, or using JavaScript such as `document.createElement('ion-toggle')`.
diff --git a/core/package.json b/core/package.json
index 84c1ed799b8..cc46e84da69 100644
--- a/core/package.json
+++ b/core/package.json
@@ -1,6 +1,6 @@
{
"name": "@ionic/core",
- "version": "4.0.0-rc.0",
+ "version": "4.0.0-rc.1",
"description": "Base components for Ionic",
"keywords": [
"ionic",
diff --git a/core/src/components/avatar/test/preview/index.html b/core/src/components/avatar/test/preview/index.html
index f69b47f8c88..9249937fe5c 100644
--- a/core/src/components/avatar/test/preview/index.html
+++ b/core/src/components/avatar/test/preview/index.html
@@ -22,19 +22,19 @@
-
+
-
+
Chip Avatar
-
+
Item Avatar
diff --git a/core/src/components/datetime/test/basic/e2e.ts b/core/src/components/datetime/test/basic/e2e.ts
index f0ce389dae3..dc85a43cfad 100644
--- a/core/src/components/datetime/test/basic/e2e.ts
+++ b/core/src/components/datetime/test/basic/e2e.ts
@@ -18,3 +18,19 @@ test('datetime: basic', async () => {
compare = await page.compareScreenshot('should open custom picker');
expect(compare).toMatchScreenshot();
});
+
+test('datetime: basic-rtl', async () => {
+ const page = await newE2EPage({
+ url: '/src/components/datetime/test/basic?ionic:_testing=true&rtl=true'
+ });
+
+ const datetime = await page.find('#customPickerOptions');
+ await datetime.click();
+
+ const picker = await page.find('ion-picker');
+ await picker.waitForVisible();
+ await page.waitFor(250);
+
+ const compare = await page.compareScreenshot('should open custom picker');
+ expect(compare).toMatchScreenshot();
+});
diff --git a/core/src/components/datetime/test/basic/index.html b/core/src/components/datetime/test/basic/index.html
index a8ea7bc041c..cbbaa87efc7 100644
--- a/core/src/components/datetime/test/basic/index.html
+++ b/core/src/components/datetime/test/basic/index.html
@@ -101,7 +101,7 @@
h:mm a
-
+
diff --git a/core/src/components/item/item.tsx b/core/src/components/item/item.tsx
index e78df24047a..df31a67df42 100644
--- a/core/src/components/item/item.tsx
+++ b/core/src/components/item/item.tsx
@@ -142,13 +142,18 @@ export class Item implements ComponentInterface {
}
render() {
- const { href, detail, mode, win, detailIcon, routerDirection, type } = this;
+ const { href, detail, mode, win, routerDirection, type } = this;
+ let detailIcon = this.detailIcon;
const clickable = this.isClickable();
const TagType = clickable ? (href === undefined ? 'button' : 'a') : 'div' as any;
const attrs = TagType === 'button' ? { type } : { href };
const showDetail = detail !== undefined ? detail : mode === 'ios' && clickable;
+ if (showDetail && detailIcon === 'ios-arrow-forward' && document.dir === 'rtl') {
+ detailIcon = 'ios-arrow-back';
+ }
+
return [
{
const compare = await page.compareScreenshot();
expect(compare).toMatchScreenshot();
});
+
+test('item: icons-rtl', async () => {
+ const page = await newE2EPage({
+ url: '/src/components/item/test/icons?ionic:_testing=true&rtl=true'
+ });
+
+ const compare = await page.compareScreenshot();
+ expect(compare).toMatchScreenshot();
+});
diff --git a/core/src/components/nav/test/basic/e2e.ts b/core/src/components/nav/test/basic/e2e.ts
index dc889a03c32..a597d0db89f 100644
--- a/core/src/components/nav/test/basic/e2e.ts
+++ b/core/src/components/nav/test/basic/e2e.ts
@@ -10,13 +10,13 @@ test('nav: basic', async () => {
expect(await page.compareScreenshot()).toMatchScreenshot();
- await page.click('page-one ion-button.next');
+ page.click('page-one ion-button.next');
await page.waitFor(navChanged);
- await page.click('page-two ion-button.next');
+ page.click('page-two ion-button.next');
await page.waitFor(navChanged);
- await page.click('page-three ion-back-button');
+ page.click('page-three ion-back-button');
await page.waitFor(navChanged);
- await page.click('page-two ion-back-button');
+ page.click('page-two ion-back-button');
await page.waitFor(navChanged);
expect(await page.compareScreenshot('stack traversal')).toMatchScreenshot();
diff --git a/core/src/components/nav/test/routing/e2e.ts b/core/src/components/nav/test/routing/e2e.ts
index 0dd745e33b0..ad6a83ac62e 100644
--- a/core/src/components/nav/test/routing/e2e.ts
+++ b/core/src/components/nav/test/routing/e2e.ts
@@ -10,17 +10,17 @@ test('nav: routing', async () => {
expect(await page.compareScreenshot()).toMatchScreenshot();
- await page.click('page-root ion-button.next');
+ page.click('page-root ion-button.next');
await page.waitFor(navChanged);
- await page.click('page-one ion-button.next');
+ page.click('page-one ion-button.next');
await page.waitFor(navChanged);
- await page.click('page-two ion-button.next');
+ page.click('page-two ion-button.next');
await page.waitFor(navChanged);
- await page.click('page-three ion-back-button');
+ page.click('page-three ion-back-button');
await page.waitFor(navChanged);
- await page.click('page-two ion-back-button');
+ page.click('page-two ion-back-button');
await page.waitFor(navChanged);
- await page.click('page-one ion-back-button');
+ page.click('page-one ion-back-button');
await page.waitFor(navChanged);
expect(await page.compareScreenshot('stack traversal')).toMatchScreenshot();
diff --git a/core/src/components/picker/picker.scss b/core/src/components/picker/picker.scss
index 52873843fb8..66ddcb0ac05 100644
--- a/core/src/components/picker/picker.scss
+++ b/core/src/components/picker/picker.scss
@@ -108,11 +108,6 @@
// --------------------------------------------------
.picker-columns {
- @include rtl() {
- // Date is the same format in both directions
- flex-direction: row-reverse;
- }
-
display: flex;
position: relative;
@@ -121,6 +116,7 @@
margin-bottom: var(--ion-safe-area-bottom, 0);
contain: strict;
+ direction: ltr;
overflow: hidden;
}
diff --git a/docs/package.json b/docs/package.json
index 345ad5eee19..139b45a4cbc 100644
--- a/docs/package.json
+++ b/docs/package.json
@@ -1,6 +1,6 @@
{
"name": "@ionic/docs",
- "version": "4.0.0-rc.0",
+ "version": "4.0.0-rc.1",
"description": "Pre-packaged API documentation for the Ionic docs.",
"main": "core.json",
"files": [