fix(link): improve ionic theme links styles and dev experience (#30375)
Issue number: internal --------- <!-- Please do not submit updates to dependencies unless it fixes an issue. --> <!-- Please try to limit your pull request to one type (bugfix, feature, etc). Submit multiple pull requests if needed. --> ## What is the new behavior? <!-- Please describe the behavior or changes that are being added by this PR. --> - Adjust link styles to match latest Figma UI and tokens. - For default link, make it work without the need of adding a class. - Change `ionic` to `ion` on the class names. - Adjusted tests to reflect the changes. ## Does this introduce a breaking change? - [] Yes - [x] No <!-- If this introduces a breaking change: 1. Describe the impact and migration path for existing applications below. 2. Update the BREAKING.md file with the breaking change. 3. Add "BREAKING CHANGE: [...]" to the commit description when merging. See https://github.com/ionic-team/ionic-framework/blob/main/docs/CONTRIBUTING.md#footer for more information. --> ## Other information <!-- Any other information that is important to this PR such as screenshots of how the component looks before and after the change. --> - [Ionic Link](https://ionic-framework-git-rou-11850-ionic1.vercel.app/src/css/test/link/basic?ionic:theme=ionic) --------- Co-authored-by: ionitron <hi@ionicframework.com>
@ -42,7 +42,7 @@
|
|||||||
Title
|
Title
|
||||||
<p>With list + link</p>
|
<p>With list + link</p>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
<a class="ionic-link" href="#">Clear</a>
|
<a href="#">Clear</a>
|
||||||
</ion-list-header>
|
</ion-list-header>
|
||||||
<ion-item lines="none">
|
<ion-item lines="none">
|
||||||
<ion-label color="primary">List item</ion-label>
|
<ion-label color="primary">List item</ion-label>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 31 KiB |
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 31 KiB |
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 37 KiB After Width: | Height: | Size: 37 KiB |
|
Before Width: | Height: | Size: 32 KiB After Width: | Height: | Size: 32 KiB |
|
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 37 KiB |
|
Before Width: | Height: | Size: 32 KiB After Width: | Height: | Size: 32 KiB |
|
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 26 KiB |
@ -3,6 +3,8 @@
|
|||||||
// Link: Shared Styles (Standalone & Underline)
|
// Link: Shared Styles (Standalone & Underline)
|
||||||
// -------------------------------------------------------------------------------
|
// -------------------------------------------------------------------------------
|
||||||
@mixin link-shared {
|
@mixin link-shared {
|
||||||
|
@include globals.typography(globals.$ion-body-action-sm);
|
||||||
|
|
||||||
display: inline-flex;
|
display: inline-flex;
|
||||||
|
|
||||||
align-items: center;
|
align-items: center;
|
||||||
@ -11,8 +13,6 @@
|
|||||||
|
|
||||||
transition: color globals.$ion-transition-time-200 ease-in-out;
|
transition: color globals.$ion-transition-time-200 ease-in-out;
|
||||||
|
|
||||||
font-weight: globals.$ion-font-weight-regular;
|
|
||||||
|
|
||||||
text-decoration-color: inherit;
|
text-decoration-color: inherit;
|
||||||
|
|
||||||
text-underline-offset: globals.$ion-scale-050;
|
text-underline-offset: globals.$ion-scale-050;
|
||||||
@ -25,6 +25,37 @@
|
|||||||
&:visited {
|
&:visited {
|
||||||
color: globals.$ion-text-link-visited;
|
color: globals.$ion-text-link-visited;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Link: Focus
|
||||||
|
// -------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
&:focus,
|
||||||
|
&.ion-focused {
|
||||||
|
@include globals.focused-state();
|
||||||
|
|
||||||
|
border-radius: globals.$ion-border-radius-100;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Link: Active
|
||||||
|
// -------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
&:active,
|
||||||
|
&.ion-activated {
|
||||||
|
color: globals.$ion-text-link-press;
|
||||||
|
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Link: Hover
|
||||||
|
// -------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
@media (any-hover: hover) {
|
||||||
|
&:hover {
|
||||||
|
color: globals.$ion-text-link-press;
|
||||||
|
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Link: Standalone
|
// Link: Standalone
|
||||||
@ -36,39 +67,10 @@
|
|||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
|
|
||||||
@include link-shared;
|
@include link-shared;
|
||||||
|
|
||||||
// Link: Standalone - Hover
|
|
||||||
// -------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
@media (any-hover: hover) {
|
|
||||||
&:hover {
|
|
||||||
text-decoration: underline;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Link: Standalone - Focus
|
|
||||||
// -------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
&:focus,
|
|
||||||
&.ion-focused {
|
|
||||||
@include globals.focused-state(null, null, globals.$ion-text-link-default);
|
|
||||||
|
|
||||||
text-decoration: underline;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Link: Standalone - Active
|
|
||||||
// -------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
&:active,
|
|
||||||
&.ion-activated {
|
|
||||||
color: globals.$ion-text-link-press;
|
|
||||||
|
|
||||||
text-decoration: underline;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
a.ionic-link,
|
a,
|
||||||
:not(a).ionic-link a {
|
:not(a).ion-link a {
|
||||||
@include ionic-link;
|
@include ionic-link;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -76,41 +78,24 @@ a.ionic-link,
|
|||||||
// -------------------------------------------------------------------------------
|
// -------------------------------------------------------------------------------
|
||||||
|
|
||||||
@mixin ionic-link-underline {
|
@mixin ionic-link-underline {
|
||||||
color: currentColor;
|
color: globals.$ion-text-default;
|
||||||
|
|
||||||
text-decoration: underline;
|
|
||||||
|
|
||||||
@include link-shared;
|
@include link-shared;
|
||||||
|
|
||||||
// Link: Underline - Hover
|
text-decoration: underline;
|
||||||
// -------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
@media (any-hover: hover) {
|
// Link: Focus
|
||||||
&:hover {
|
|
||||||
color: globals.$ion-text-link-press;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Link: Underline - Focus
|
|
||||||
// -------------------------------------------------------------------------------
|
// -------------------------------------------------------------------------------
|
||||||
|
|
||||||
&:focus,
|
&:focus,
|
||||||
&.ion-focused {
|
&.ion-focused {
|
||||||
@include globals.focused-state(null, null, globals.$ion-text-link-default);
|
color: globals.$ion-text-default;
|
||||||
|
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Link: Underline - Active
|
|
||||||
// -------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
&:active,
|
|
||||||
&.ion-activated {
|
|
||||||
color: globals.$ion-text-link-press;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
a.ionic-link-underline,
|
a.ion-link-underline,
|
||||||
:not(a).ionic-link-underline a {
|
:not(a).ion-link-underline a {
|
||||||
@include ionic-link-underline;
|
@include ionic-link-underline;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -28,45 +28,45 @@
|
|||||||
</ion-header>
|
</ion-header>
|
||||||
|
|
||||||
<ion-content class="ionic-padding-space-m">
|
<ion-content class="ionic-padding-space-m">
|
||||||
<h3>Standalone (.ionic-link)</h3>
|
<h3>Standalone (.ion-link)</h3>
|
||||||
<div class="links" id="standalone">
|
<div class="links" id="standalone">
|
||||||
<div><a class="ionic-link" href="#">Link - Default</a></div>
|
<div><a href="#test-visited-link">Link - Default</a></div>
|
||||||
<div><a class="ionic-link ion-activated" href="#">Link - Active</a></div>
|
<div><a class="ion-activated" href="#">Link - Active</a></div>
|
||||||
<div><a class="ionic-link ion-focused" href="#">Link - Focused</a></div>
|
<div><a class="ion-focused" href="#">Link - Focused</a></div>
|
||||||
<div><a class="ionic-link" href="">Link - Visited</a></div>
|
<div><a href="">Link - Visited</a></div>
|
||||||
<div>
|
<div>
|
||||||
<a class="ionic-link" href="#">Link with Icon <ion-icon name="open-outline"></ion-icon></a>
|
<a href="#">Link with Icon <ion-icon name="open-outline"></ion-icon></a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<h3>Underline (.ionic-link-underline)</h3>
|
<h3>Underline (.ion-link-underline)</h3>
|
||||||
<div class="links" id="underline">
|
<div class="links" id="underline">
|
||||||
<div><a class="ionic-link-underline" href="#">Underline - Default</a></div>
|
<div><a class="ion-link-underline" href="#test-visited-link">Underline - Default</a></div>
|
||||||
<div><a class="ionic-link-underline ion-activated" href="#">Underline - Active</a></div>
|
<div><a class="ion-link-underline ion-activated" href="#">Underline - Active</a></div>
|
||||||
<div><a class="ionic-link-underline ion-focused" href="#">Underline - Focused</a></div>
|
<div><a class="ion-link-underline ion-focused" href="#">Underline - Focused</a></div>
|
||||||
<div><a class="ionic-link-underline" href="">Underline - Visited</a></div>
|
<div><a class="ion-link-underline" href="">Underline - Visited</a></div>
|
||||||
<div>
|
<div>
|
||||||
<a class="ionic-link-underline" href="#">Link with Icon <ion-icon name="open-outline"></ion-icon></a>
|
<a class="ion-link-underline" href="#">Link with Icon <ion-icon name="open-outline"></ion-icon></a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<h3>Links in Content</h3>
|
<h3>Links in Content</h3>
|
||||||
<div class="links" id="links-in-content">
|
<div class="links" id="links-in-content">
|
||||||
<div>
|
<div>
|
||||||
Lorem ipsum dolor sit amet consectetur, <a class="ionic-link" href="#">default link</a> adipisicing elit.
|
Lorem ipsum dolor sit amet consectetur, <a class="ion-link" href="#">default link</a> adipisicing elit.
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
Lorem ipsum dolor sit amet consectetur,
|
Lorem ipsum dolor sit amet consectetur,
|
||||||
<a class="ionic-link-underline" href="#">underline link</a> adipisicing elit.
|
<a class="ion-link-underline" href="#">underline link</a> adipisicing elit.
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<h3>Parent Element</h3>
|
<h3>Parent Element</h3>
|
||||||
<div class="links">
|
<div class="links">
|
||||||
<div class="ionic-link" id="standalone-nested">
|
<div class="ion-link" id="standalone-nested">
|
||||||
<p>Lorem ipsum dolor sit amet consectetur, <a href="#">default link</a> adipisicing elit.</p>
|
<p>Lorem ipsum dolor sit amet consectetur, <a href="#">default link</a> adipisicing elit.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="ionic-link-underline" id="underline-nested">
|
<div class="ion-link-underline" id="underline-nested">
|
||||||
<p>Lorem ipsum dolor sit amet consectetur, <a href="#">underline link</a> adipisicing elit.</p>
|
<p>Lorem ipsum dolor sit amet consectetur, <a href="#">underline link</a> adipisicing elit.</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 7.7 KiB After Width: | Height: | Size: 8.0 KiB |
|
Before Width: | Height: | Size: 9.6 KiB After Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 7.9 KiB After Width: | Height: | Size: 8.5 KiB |
|
Before Width: | Height: | Size: 5.5 KiB After Width: | Height: | Size: 5.4 KiB |
|
Before Width: | Height: | Size: 6.5 KiB After Width: | Height: | Size: 6.5 KiB |
|
Before Width: | Height: | Size: 7.2 KiB After Width: | Height: | Size: 7.2 KiB |
|
Before Width: | Height: | Size: 8.9 KiB After Width: | Height: | Size: 9.0 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 4.3 KiB After Width: | Height: | Size: 4.9 KiB |
|
Before Width: | Height: | Size: 5.8 KiB After Width: | Height: | Size: 5.9 KiB |
|
Before Width: | Height: | Size: 6.9 KiB After Width: | Height: | Size: 7.2 KiB |