Skip to content

fix(item-sliding): options display on rtl #27203

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 27 commits into from
May 9, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
ba1f0ca
fix(item-sliding): apply rtl styles regardless of browser
thetaPC Apr 13, 2023
5224778
chore(): add updated snapshots
Ionitron Apr 13, 2023
176cdd1
Revert "chore(): add updated snapshots"
thetaPC Apr 14, 2023
25d4eec
fix(item-sliding): correct structure for rtl
thetaPC Apr 14, 2023
c6b15df
chore(): add updated snapshots
Ionitron Apr 15, 2023
9f84fff
Revert "chore(): add updated snapshots"
thetaPC Apr 17, 2023
a1a8871
fix(item-sliding): add back selectors for host rtl
thetaPC Apr 17, 2023
59702f3
fix(ion-sliding): rtl for shadow dom
thetaPC Apr 17, 2023
9e49682
fix(item-sliding): rtl from host
thetaPC Apr 18, 2023
f17eb85
chore(): add updated snapshots
Ionitron Apr 18, 2023
1f757d5
fix(item-sliding): removal of console.log
thetaPC Apr 19, 2023
69e527e
fix(item-sliding): update important note
thetaPC Apr 19, 2023
23fe539
fix(item-sliding): split css group
thetaPC Apr 26, 2023
3266e1b
fix(item-sliding): add eol
thetaPC Apr 26, 2023
e5d68c0
fix(item-sliding): removal of unneeded code
thetaPC Apr 26, 2023
d62e233
fix(item-sliding): removal of unused mixin
thetaPC Apr 26, 2023
006adaa
chore(): add updated snapshots
Ionitron Apr 26, 2023
11eacc7
Revert "chore(): add updated snapshots"
liamdebeasi Apr 26, 2023
12d9dcf
Revert "chore(): add updated snapshots"
liamdebeasi Apr 26, 2023
e153766
remove old screenshots
liamdebeasi Apr 26, 2023
2cebf66
Merge branch 'main' of github.com:ionic-team/ionic-framework into FW-…
thetaPC Apr 26, 2023
93f14c9
Merge branch 'main' of github.com:ionic-team/ionic-framework into FW-…
thetaPC Apr 27, 2023
e3e1089
fix(item-sliding): split for :dir()
thetaPC Apr 28, 2023
d01fa77
fix(item-sliding): grouped similar selectors
thetaPC May 3, 2023
38b97fe
Merge branch 'main' of github.com:ionic-team/ionic-framework into FW-…
thetaPC May 3, 2023
bb1679e
Merge remote-tracking branch 'origin/main' into FW-2608
liamdebeasi May 9, 2023
5786f92
chore(): add updated snapshots
Ionitron May 9, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
80 changes: 53 additions & 27 deletions core/src/themes/ionic.functions.string.scss
Original file line number Diff line number Diff line change
Expand Up @@ -84,23 +84,7 @@

// Add Root Selector
// --------------------------------------------------------------------------------
// Adds a root selector using host-context based on the selector passed
//
// Examples
// --------------------------------------------------------------------------------
// @include add-root-selector("[dir=rtl]", ":host")
// --> :host-context([dir=rtl])
//
// @include add-root-selector("[dir=rtl]", ":host(.fixed)")
// --> :host-context([dir=rtl]):host(.fixed)
// --> :host-context([dir=rtl]).fixed
//
// @include add-root-selector("[dir=rtl]", ":host(.tab-layout-icon-hide) ::slotted(ion-badge)")
// --> :host-context([dir=rtl]).tab-layout-icon-hide ::slotted(ion-badge)
//
// @include add-root-selector("[dir=rtl]", ".shadow")
// --> [dir=rtl] .shadow
// --> :host-context([dir=rtl]) .shadow
// Adds a root selector using host based on the selector passed
// --------------------------------------------------------------------------------

@function add-root-selector($root, $addHostSelector) {
Expand All @@ -110,8 +94,13 @@

@each $selector in $selectors {
// If the selector contains :host( it means it is targeting a class on the host
// element so we need to change how we target it
// element so we need to change how we target it:
// @include add-root-selector(":host(.fixed)", "[dir=rtl]")
// --> :host-context([dir=rtl]):host(.fixed)
// --> :host-context([dir=rtl]).fixed
@if str-contains($selector, ":host(") {
// @include add-root-selector(":host(.fixed)", "[dir=rtl]")
// --> :host-context([dir=rtl]):host(.fixed)
$shadow-element: str-replace($selector, ":host(", ":host-context(#{$addHostSelector}):host(");
$list: append($list, $shadow-element, comma);

Expand All @@ -122,26 +111,63 @@
@if str-contains($element, ":host(") {
$scoped-element: $element;

@if str-contains($element, "))") {
$scoped-element: str-replace($scoped-element, "))", ")");
} @else {
$scoped-element: str-replace($scoped-element, ")", "");
}
$scoped-element: str-replace($scoped-element, ":host(", ":host-context(#{$addHostSelector})");
// Replace the :host( and ) so all we have left is the class
// inside of it:
// :host(.fixed) -> .fixed
$scoped-element: str-replace($scoped-element, ")", "");
$scoped-element: str-replace($scoped-element, ":host(", "");

// Add the class back inside of host with the rtl selector:
// .fixed -> :host-context([dir=rtl]).fixed
$scoped-element: str-replace($scoped-element, $scoped-element, ":host-context(#{$addHostSelector})#{$scoped-element}");

// @include add-root-selector(":host(.fixed)", "[dir=rtl]")
// --> :host-context([dir=rtl]).fixed
$new-element: append($new-element, $scoped-element, space);
} @else {
// Add back any selectors that followed the host after transforming the
// first selector:
// :host(.fixed) ::slotted(ion-icon)
// --> :host-context([dir=rtl]):host(.fixed) ::slotted(ion-icon)
// --> :host-context([dir=rtl]).fixed ::slotted(ion-icon)
$new-element: append($new-element, $element, space);
}
}

$list: append($list, $new-element, comma);
// If the selector contains :host it means it is targeting just the host
// If the selector contains :host without a parantheses
// it means it is targeting just the host
// element so we can change it to look for host-context
// @include add-root-selector(":host", "[dir=rtl]")
// --> :host-context([dir=rtl])
// --> :host:dir(rtl)
} @else if str-contains($selector, ":host") {
$list: append($list, ":host-context(#{$addHostSelector})", comma);
$new-element: ();
$elements: str-split($selector, " ");

@each $element in $elements {
@if str-contains($element, ":host") {
// Replace the :host with the addHostSelector:
// :host -> :host-context([dir=rtl])
$updated-element: str-replace($element, ":host", ":host-context(#{$addHostSelector})");

// Add the final selector after all transformations:
// :host -> :host-context([dir=rtl])
$new-element: append($new-element, $updated-element, space);
} @else {
// Add back any selectors that followed the host after transforming the
// first selector:
// :host ::slotted(ion-icon) -> :host-context([dir=rtl]) ::slotted(ion-icon)
$new-element: append($new-element, $element, space);
}
}

$list: append($list, $new-element, comma);
// If the selector does not contain host at all it is either a shadow
// or normal element so append both the dir check and host-context
// or normal element so append both the addHostSelector and host-context
// @include add-root-selector("ion-component", "[dir=rtl]")
// --> :host-context([dir=rtl]) ion-component
// --> [dir=rtl] ion-component
} @else {
$list: append($list, "#{$addHostSelector} #{$selector}", comma);
$list: append($list, ":host-context(#{$addHostSelector}) #{$selector}", comma);
Expand Down
62 changes: 60 additions & 2 deletions core/src/themes/ionic.mixins.scss
Original file line number Diff line number Diff line change
Expand Up @@ -194,8 +194,66 @@
@mixin rtl() {
$root: #{&};

@at-root #{add-root-selector($root, "[dir=rtl]")} {
@content;
$rootSplit: str-split($root, ",");
$selectors: #{add-root-selector($root, "[dir=rtl]")};
$selectorsSplit: str-split($selectors, ",");

$hostContextSelectors: ();
$restSelectors: ();
$dirSelectors: ();

// Selectors must be split into individual selectors in case the browser
// doesn't support a specific selector.
// For example, Firefox and Safari doesn't support `:host-context()`.
// If an invalid selector is used, then the entire group of selectors
// will be ignored.
// @link https://www.w3.org/TR/selectors-3/#grouping
@each $selector in $selectorsSplit {
// Group the selectors back into a single selector to optimize the output.
@if str-index($selector, ":host-context") {
$hostContextSelectors: append($hostContextSelectors, $selector, comma);
} @else {
// Group the selectors back into a single selector to optimize the output.
$restSelectors: append($restSelectors, $selector, comma);
}
}

// Supported by Chrome.
@if length($hostContextSelectors) > 0 {
@at-root #{$hostContextSelectors} {
@content;
}
}

// Supported by all browsers.
@if length($restSelectors) > 0 {
@at-root #{$restSelectors} {
@content;
}
}

// If browser can support `:dir()`, then add the `:dir()` selectors.
@supports selector(:dir(rtl)) {
// Adding :dir() in case the browser doesn't support `:host-context()` and does support `:dir()`.
// `:host-context()` is added:
// - through the `add-root-selector()` function.
// - first so that it takes precedence over `:dir()`.
// For example,
// - Firefox doesn't support `:host-context()`, but does support `:dir()`.
// - Safari doesn't support `:host-context()`, but Safari 16.4+ supports `:dir()`
// @link https://webkit.org/blog/13966/webkit-features-in-safari-16-4/
@each $selector in $rootSplit {
$dirSelector: "#{$selector}:dir(rtl)";
// Group the selectors back into a single selector to optimize the output.
$dirSelectors: append($dirSelectors, $dirSelector, comma);
}

// Supported by Firefox.
@if length($dirSelectors) > 0 {
@at-root #{$dirSelectors} {
@content;
}
}
}
}

Expand Down