mirror of
https://github.com/ionic-team/ionic-framework.git
synced 2025-11-08 07:41:51 +08:00
334 lines
9.6 KiB
SCSS
334 lines
9.6 KiB
SCSS
@use "../../themes/ionic/ionic.globals.scss" as globals;
|
|
@use "./button.common";
|
|
|
|
// Ionic Button
|
|
// -------------------------------------------------------------------------------
|
|
:host {
|
|
--padding-top: #{globals.$ion-space-0};
|
|
--padding-end: #{globals.$ion-space-0};
|
|
--padding-bottom: var(--padding-top);
|
|
--padding-start: var(--padding-end);
|
|
--focus-ring-color: #{globals.$ion-border-focus-default};
|
|
--focus-ring-width: #{globals.$ion-border-size-050};
|
|
|
|
position: relative;
|
|
|
|
// Target area
|
|
&::after {
|
|
@include globals.position(50%, 0, null, 0);
|
|
position: absolute;
|
|
|
|
height: 100%;
|
|
min-height: globals.$ion-scale-1200;
|
|
|
|
transform: translateY(-50%);
|
|
|
|
content: "";
|
|
|
|
cursor: pointer;
|
|
|
|
z-index: 1;
|
|
}
|
|
}
|
|
|
|
// Button Fills
|
|
// -------------------------------------------------------------------------------
|
|
|
|
// Default Clear Color
|
|
:host(.button-clear) {
|
|
--color: #{globals.ion-color(primary, foreground)};
|
|
}
|
|
|
|
// Solid Button
|
|
// --------------------------------------------------
|
|
|
|
:host(.button-solid) {
|
|
--background-activated: #{globals.ion-color(primary, shade)};
|
|
--background-hover: #{globals.ion-color(primary, shade)};
|
|
--background-focused: transparent;
|
|
--background-hover-opacity: 1;
|
|
--background: #{globals.ion-color(primary, base)};
|
|
--color: #{globals.ion-color(primary, contrast)};
|
|
--ripple-opacity: var(--background-activated-opacity, 1);
|
|
--ripple-color: var(--background-activated);
|
|
}
|
|
|
|
// Outline Button
|
|
// --------------------------------------------------
|
|
|
|
:host(.button-outline) {
|
|
--border-width: #{globals.$ion-border-size-025};
|
|
--border-style: #{globals.$ion-border-style-solid};
|
|
--background-activated: #{globals.current-color(shade, $subtle: true)};
|
|
--background-focused: transparent;
|
|
--background-hover: #{globals.current-color(shade, $subtle: true)};
|
|
--background-hover-opacity: 1;
|
|
--border-color: var(--ion-color-base, #{globals.ion-color(primary, base)});
|
|
--color: var(--ion-color-base, #{globals.ion-color(primary, base)});
|
|
--ripple-opacity: var(--background-activated-opacity, 1);
|
|
--ripple-color: var(--background-activated);
|
|
}
|
|
|
|
// Provide fallbacks for ion-color-base for all colors
|
|
:host(.button-outline.ion-color.ion-color-warning) {
|
|
.button-native {
|
|
--ion-color-base: #{globals.$ion-text-warning};
|
|
}
|
|
ion-ripple-effect {
|
|
--ion-color-base: var(--ion-color-base, #{globals.current-color(shade, $subtle: true)});
|
|
}
|
|
}
|
|
|
|
// Clear Button
|
|
// --------------------------------------------------
|
|
|
|
:host(.button-clear) {
|
|
--background-activated: var(--ion-color-subtle-shade, #{globals.current-color(shade, $subtle: true)});
|
|
--background-focused: transparent;
|
|
--background-hover: var(--ion-color-subtle-shade, #{globals.current-color(shade, $subtle: true)});
|
|
--background-hover-opacity: 1;
|
|
--color: #{globals.ion-color(primary, foreground)};
|
|
--ripple-opacity: var(--background-activated-opacity, 1);
|
|
--ripple-color: var(--background-activated);
|
|
}
|
|
|
|
:host(.button-clear.ion-color) {
|
|
.button-native {
|
|
--ion-color-base: var(--ion-color-foreground, #{globals.current-color(foreground)});
|
|
}
|
|
}
|
|
|
|
// Ripple Effect
|
|
// -------------------------------------------------------------------------------
|
|
|
|
:host(.button-solid.ion-color) ion-ripple-effect {
|
|
color: var(--ion-color-shade, #{globals.ion-color(primary, shade)});
|
|
}
|
|
|
|
:host(.button-outline.ion-color) ion-ripple-effect,
|
|
:host(.button-clear.ion-color) ion-ripple-effect {
|
|
color: var(--ion-color-subtle-shade, #{globals.current-color(shade, $subtle: true)});
|
|
}
|
|
|
|
// Button Sizes
|
|
// -------------------------------------------------------------------------------
|
|
|
|
/* Small Button */
|
|
:host(.button-small) {
|
|
--padding-end: #{globals.$ion-space-400};
|
|
|
|
@include globals.typography(globals.$ion-body-action-sm);
|
|
min-width: globals.$ion-scale-1600;
|
|
|
|
min-height: #{globals.$ion-scale-1000};
|
|
}
|
|
|
|
/* Medium Button */
|
|
:host(.button-medium) {
|
|
--padding-end: #{globals.$ion-space-500};
|
|
|
|
@include globals.typography(globals.$ion-body-action-md);
|
|
min-width: globals.$ion-scale-1800;
|
|
|
|
min-height: #{globals.$ion-scale-1200};
|
|
}
|
|
|
|
/* Large Button */
|
|
:host(.button-large) {
|
|
--padding-end: #{globals.$ion-space-700};
|
|
|
|
@include globals.typography(globals.$ion-body-action-lg);
|
|
min-width: globals.$ion-scale-2000;
|
|
|
|
min-height: #{globals.$ion-scale-1400};
|
|
}
|
|
|
|
// Button with Icons
|
|
// -------------------------------------------------------------------------------
|
|
|
|
/* Button containing only an icon */
|
|
:host(.button-small),
|
|
:host(.button-medium) {
|
|
::slotted(ion-icon[slot="start"]),
|
|
::slotted(ion-icon[slot="end"]),
|
|
::slotted(ion-icon[slot="icon-only"]) {
|
|
width: globals.$ion-scale-500;
|
|
height: globals.$ion-scale-500;
|
|
}
|
|
}
|
|
|
|
:host(.button-large) {
|
|
::slotted(ion-icon[slot="start"]),
|
|
::slotted(ion-icon[slot="end"]),
|
|
::slotted(ion-icon[slot="icon-only"]) {
|
|
width: globals.$ion-scale-600;
|
|
height: globals.$ion-scale-600;
|
|
}
|
|
}
|
|
|
|
:host(.button-has-icon-only) {
|
|
--padding-end: var(--padding-top);
|
|
min-width: unset;
|
|
|
|
aspect-ratio: 1 / 1;
|
|
}
|
|
|
|
// Button with Spinner
|
|
// -------------------------------------------------------------------------------
|
|
::slotted(ion-spinner) {
|
|
--color: currentColor;
|
|
}
|
|
|
|
/* Button containing only a spinner */
|
|
::slotted(ion-spinner[slot="start"]),
|
|
::slotted(ion-spinner[slot="end"]),
|
|
::slotted(ion-spinner[slot="icon-only"]) {
|
|
width: globals.$ion-scale-500;
|
|
height: globals.$ion-scale-500;
|
|
}
|
|
|
|
// Button Shapes
|
|
// -------------------------------------------------------------------------------
|
|
|
|
// Soft Button
|
|
// --------------------------------------------------
|
|
|
|
:host(.button-soft) {
|
|
--border-radius: #{globals.$ion-border-radius-200};
|
|
}
|
|
|
|
// Round Button
|
|
// --------------------------------------------------
|
|
|
|
:host(.button-round) {
|
|
--border-radius: #{globals.$ion-border-radius-full};
|
|
}
|
|
|
|
// Rectangular Button
|
|
// --------------------------------------------------
|
|
|
|
:host(.button-rectangular) {
|
|
--border-radius: #{globals.$ion-border-radius-0};
|
|
}
|
|
|
|
// Button: Focus
|
|
// -------------------------------------------------------------------------------
|
|
|
|
// Only show the focus ring when the button is focused
|
|
:host(.ion-focused) .button-native {
|
|
outline: var(--focus-ring-width) globals.$ion-border-style-solid var(--focus-ring-color);
|
|
outline-offset: globals.$ion-border-size-050;
|
|
}
|
|
|
|
// Button: Activated
|
|
// --------------------------------------------------
|
|
|
|
:host(.button-solid.ion-color.ion-activated) .button-native::after {
|
|
background: globals.current-color(shade);
|
|
}
|
|
|
|
:host(.ion-activated) .button-native:has(ion-ripple-effect)::after,
|
|
:host(.button-solid.ion-color.ion-activated) .button-native:has(ion-ripple-effect)::after {
|
|
background: transparent;
|
|
}
|
|
|
|
// Button: Hover
|
|
// --------------------------------------------------
|
|
|
|
@media (any-hover: hover) {
|
|
:host(.button-solid.ion-color:hover) .button-native::after {
|
|
background: globals.current-color(shade);
|
|
}
|
|
}
|
|
|
|
// Button: Disabled
|
|
// --------------------------------------------------
|
|
|
|
:host(.button-disabled) .button-native::after {
|
|
@include globals.disabled-state();
|
|
|
|
width: inherit;
|
|
height: inherit;
|
|
}
|
|
|
|
// Button Icons
|
|
// --------------------------------------------------
|
|
|
|
::slotted(ion-icon) {
|
|
font-size: globals.$ion-font-size-500;
|
|
}
|
|
|
|
:host(.button-small) ::slotted(ion-icon[slot="start"]),
|
|
:host(.button-small) ::slotted(ion-spinner[slot="start"]) {
|
|
@include globals.margin-horizontal(null, globals.$ion-space-200);
|
|
}
|
|
|
|
::slotted(ion-icon[slot="start"]),
|
|
::slotted(ion-spinner[slot="start"]) {
|
|
@include globals.margin-horizontal(null, globals.$ion-space-250);
|
|
}
|
|
|
|
:host(.button-large) ::slotted(ion-icon[slot="start"]),
|
|
:host(.button-large) ::slotted(ion-spinner[slot="start"]) {
|
|
@include globals.margin-horizontal(null, globals.$ion-space-300);
|
|
}
|
|
|
|
:host(.button-small) ::slotted(ion-icon[slot="end"]),
|
|
:host(.button-small) ::slotted(ion-spinner[slot="end"]) {
|
|
@include globals.margin-horizontal(globals.$ion-space-200, null);
|
|
}
|
|
|
|
::slotted(ion-icon[slot="end"]),
|
|
::slotted(ion-spinner[slot="end"]) {
|
|
@include globals.margin-horizontal(globals.$ion-space-250, null);
|
|
}
|
|
|
|
:host(.button-large) ::slotted(ion-icon[slot="end"]),
|
|
:host(.button-large) ::slotted(ion-spinner[slot="end"]) {
|
|
@include globals.margin-horizontal(globals.$ion-space-300, null);
|
|
}
|
|
|
|
// Button with Badge
|
|
// --------------------------------------------------
|
|
|
|
:host(.button-has-badge) {
|
|
--padding-top: #{globals.$ion-space-0};
|
|
--padding-bottom: #{globals.$ion-space-0};
|
|
}
|
|
|
|
:host(.button-small) ::slotted(ion-badge) {
|
|
@include globals.position(null, calc(-1 * globals.$ion-space-050), null, null);
|
|
}
|
|
|
|
:host(.button-medium) {
|
|
::slotted(ion-badge.long-badge.badge-vertical-top) {
|
|
@include globals.position($top: globals.$ion-space-100);
|
|
}
|
|
::slotted(ion-badge.long-badge.badge-vertical-bottom) {
|
|
@include globals.position($bottom: globals.$ion-space-100);
|
|
}
|
|
|
|
::slotted(ion-badge:not(.long-badge).badge-vertical-top) {
|
|
@include globals.position(globals.$ion-space-100, globals.$ion-space-150, null, null);
|
|
}
|
|
::slotted(ion-badge:not(.long-badge).badge-vertical-bottom) {
|
|
@include globals.position(null, globals.$ion-space-150, globals.$ion-space-100, null);
|
|
}
|
|
}
|
|
|
|
:host(.button-large) {
|
|
::slotted(ion-badge.long-badge.badge-vertical-top) {
|
|
@include globals.position($top: globals.$ion-space-200);
|
|
}
|
|
::slotted(ion-badge.long-badge.badge-vertical-bottom) {
|
|
@include globals.position($bottom: globals.$ion-space-200);
|
|
}
|
|
|
|
::slotted(ion-badge:not(.long-badge).badge-vertical-top) {
|
|
@include globals.position(globals.$ion-space-200, globals.$ion-space-200, null, null);
|
|
}
|
|
::slotted(ion-badge:not(.long-badge).badge-vertical-bottom) {
|
|
@include globals.position(null, globals.$ion-space-200, globals.$ion-space-200, null);
|
|
}
|
|
}
|