/
githubmirror
/
tabler
Обзор
Документация
Войти
/
githubmirror
/
tabler
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
dev
core/scss/ui/_cards.scss
767 строк
15 KB
Bartosz-Do
Fix leftover physical CSS properties that break RTL layout (#2846)
11 авг 2026, 22:00
Не верифицирован
11 авг 2026, 22:00
509639c
Код
Авторство
О чём код?
@use 'sass:map'; @use '../config' as *; @property --card-gradient-direction { syntax: '<angle>'; inherits: true; initial-value: 180deg; } @keyframes gradient-animation { 0% { --card-gradient-direction: 180deg; } 100% { --card-gradient-direction: 540deg; } } .card { @include transition(transform $transition-time ease-out, opacity $transition-time ease-out, box-shadow $transition-time ease-out); @include media-print() { border: none; box-shadow: none; } @at-root a#{&} { color: inherit; &:hover { text-decoration: none; box-shadow: var(--shadow-card-hover); } } .card { box-shadow: none; } } // Card borderless .card-borderless { &, .card-header, .card-footer { border-color: transparent; } } // Card dashed .card-dashed { border: var(--border-width) dashed var(--border-color); } // Card transparent .card-transparent { background: transparent; border: var(--border-width) dashed var(--border-color); box-shadow: none; } // Card stamp .card-stamp { --stamp-size: #{$card-stamp-size}; position: absolute; inset-inline-end: 0; top: 0; width: calc(var(--stamp-size) * 1); height: calc(var(--stamp-size) * 1); max-height: 100%; overflow: hidden; pointer-events: none; border-start-end-radius: $border-radius; opacity: $card-stamp-opacity; } .card-stamp-lg { --stamp-size: #{$card-stamp-size-lg}; } .card-stamp-icon { position: relative; inset-inline-end: calc(var(--stamp-size) * -0.25); top: calc(var(--stamp-size) * -0.25); display: flex; align-items: center; justify-content: center; width: calc(var(--stamp-size) * 1); height: calc(var(--stamp-size) * 1); font-size: calc(var(--stamp-size) * 0.75); color: var(--card-bg, var(--bg-surface)); background: var(--secondary); transform: rotate(10deg); @include border-radius(var(--border-radius-pill)); .icon { width: calc(var(--stamp-size) * 0.75); height: calc(var(--stamp-size) * 0.75); stroke-width: 2; } } // Card image .card-img, .card-img-start { @include border-start-radius($card-inner-border-radius); } .card-img, .card-img-end { @include border-end-radius($card-inner-border-radius); } .card-img-overlay { display: flex; flex-direction: column; justify-content: end; } .card-img-overlay-dark { background-image: $overlay-gradient; } .card-inactive { pointer-events: none; box-shadow: none; .card-body { opacity: 0.64; } } .card-active { --card-border-color: var(--primary); --card-bg: var(--active-bg); } .card-btn { display: flex; flex: 1; align-items: center; justify-content: center; padding: $card-spacer-y $card-spacer-x; font-weight: var(--font-weight-medium); color: inherit; text-align: center; border-top: var(--border-width) var(--border-style) var(--border-color); @include transition(background $transition-time); &:hover { text-decoration: none; background: $active-bg; } & + & { border-inline-start: var(--border-width) var(--border-style) var(--border-color); } } /** Stacked card */ .card-stacked { --card-stacked-offset: #{$card-stacked-offset}; position: relative; &::after { position: absolute; inset-inline-start: var(--card-stacked-offset); inset-inline-end: var(--card-stacked-offset); top: calc(-1 * var(--card-stacked-offset)); height: var(--card-stacked-offset); content: ''; background: var(--card-bg, var(--bg-surface)); border: var(--border-width) var(--border-style) var(--card-border-color); @include border-radius(var(--card-border-radius) var(--card-border-radius) 0 0); } } .card-cover { position: relative; padding: $card-spacer-y $card-spacer-x; background: #666 no-repeat center/cover; &::before { position: absolute; inset-inline-start: 0; inset-inline-end: 0; top: 0; bottom: 0; content: ''; background: rgba($dark, 0.48); } &:first-child, &:first-child::before { @include border-radius($border-radius $border-radius 0 0); } } .card-cover-blurred { &::before { backdrop-filter: blur(2px); } } .card-actions { --card-actions-gutter: #{$card-actions-gutter}; padding-inline-start: var(--card-actions-gutter); margin-block: calc(-1 * var(--card-actions-gutter)); margin-inline: auto calc(-1 * var(--card-actions-gutter)); a { text-decoration: none; } } // Card header .card-header { display: flex; align-items: center; color: inherit; background-color: var(--card-header-bg, var(--card-cap-bg)); &:first-child { @include border-radius(var(--card-border-radius) var(--card-border-radius) 0 0); } } .card-header-light { background: var(--bg-surface-tertiary); border-bottom-color: transparent; } .card-header-tabs { flex: 1; padding: calc(var(--card-cap-padding-y) * 0.5) calc(var(--card-cap-padding-x) * 0.5) 0; margin: calc(var(--card-cap-padding-y) * -1) calc(var(--card-cap-padding-x) * -1); background: $card-header-tabs-bg; @include border-radius(var(--card-border-radius) var(--card-border-radius) 0 0); } .card-header-pills { --card-header-pills-margin: #{$card-header-pills-margin}; flex: 1; margin-top: calc(-1 * var(--card-header-pills-margin)); margin-bottom: calc(-1 * var(--card-header-pills-margin)); } // Card rotate .card-rotate-left, .card-rotate-start { transform: rotate(-1.5deg); } .card-rotate-right, .card-rotate-end { transform: rotate(1.5deg); } // Card link .card-link { color: inherit; &:hover { color: inherit; text-decoration: none; box-shadow: 0 1px 6px 0 rgba(0, 0, 0, 0.08); } } .card-link-rotate:hover { opacity: 1; transform: rotate(1.5deg); } .card-link-pop:hover { opacity: 1; transform: translateY(-2px); } // Card footer .card-footer { margin-top: auto; &:last-child { @include border-radius(0 0 var(--card-border-radius) var(--card-border-radius)); } } .card-footer-transparent { padding-top: 0; background: transparent; border-color: transparent; } .card-footer-borderless { border-top: none; } // Card progress .card-progress { --card-progress-height: #{$card-progress-height}; height: var(--card-progress-height); &:last-child { @include border-radius(0 0 2px 2px); } &:first-child { @include border-radius(2px 2px 0 0); } } .card-meta { color: var(--secondary); } .card-title { --card-title-margin-bottom: #{$card-title-margin-bottom}; --card-title-line-height: #{$card-title-line-height}; display: block; margin: 0 0 var(--card-title-margin-bottom); font-size: $h3-font-size; font-weight: var(--font-weight-medium); line-height: var(--card-title-line-height); color: var(--heading-color); @at-root a#{&}:hover { color: inherit; } .card-header & { margin: 0; } } .card-subtitle { --card-subtitle-margin-start: #{$card-subtitle-margin-start}; margin-bottom: $card-title-spacer-y; font-weight: 400; color: var(--secondary); .card-header & { margin: 0; } .card-title & { margin-block: 0; margin-inline: var(--card-subtitle-margin-start) 0; font-size: $h4-font-size; } } .card-body { --card-body-padding-sm: #{$card-body-padding-sm}; --card-body-padding-md: #{$card-body-padding-md}; --card-body-padding-lg: #{$card-body-padding-lg}; --card-body-padding-lg-up: #{$card-body-padding-lg-up}; position: relative; > :last-child { margin-bottom: 0; } .card-sm > & { padding: var(--card-body-padding-sm); } .card-md > & { @include media-breakpoint-up(md) { padding: var(--card-body-padding-md); } } .card-lg > & { @include media-breakpoint-up(md) { padding: var(--card-body-padding-lg); } @include media-breakpoint-up(lg) { padding: var(--card-body-padding-lg-up); } } @include media-print() { padding: 0; } & + & { border-top: var(--border-width) var(--border-style) var(--border-color); } } .card-body-scrollable { overflow: auto; } /** Card optinos */ .card-options { --card-options-top: #{$card-options-top}; --card-options-inset: #{$card-options-inset}; inset-inline-end: var(--card-options-inset); top: var(--card-options-top); display: flex; margin-inline-start: auto; } .card-options-link { --card-options-link-min-width: #{$card-options-link-min-width}; --card-options-link-margin-start: #{$card-options-link-margin-start}; display: inline-block; min-width: var(--card-options-link-min-width); margin-inline-start: var(--card-options-link-margin-start); color: var(--secondary); } /** Card status */ .card-status-top { position: absolute; inset-inline-start: 0; inset-inline-end: 0; top: 0; height: $card-status-size; @include border-radius(var(--card-border-radius) var(--card-border-radius) 0 0); } .card-status-start { position: absolute; inset-inline-end: auto; bottom: 0; width: $card-status-size; height: 100%; @include border-radius(var(--card-border-radius) 0 0 var(--card-border-radius)); } .card-status-bottom { position: absolute; top: initial; bottom: 0; width: 100%; height: $card-status-size; @include border-radius(0 0 var(--card-border-radius) var(--card-border-radius)); } /** Card table */ .card-table { margin-bottom: 0 !important; tr { td, th { &:first-child { padding-inline-start: $card-spacer-x; border-inline-start: 0; border-start-start-radius: var(--card-border-radius); } &:last-child { padding-inline-end: $card-spacer-x; border-inline-end: 0; border-start-end-radius: var(--card-border-radius); } } } thead, tbody, tfoot { &:last-child { tr:last-child { > *:last-child { border-end-end-radius: calc(var(--card-border-radius) - var(--card-border-width)); } > *:first-child { border-end-start-radius: calc(var(--card-border-radius) - var(--card-border-width)); } } } tr { &:first-child { border-top: 0; // Plain semantic table markup (thead/tbody/tfoot > tr > td/th) has no class // hooks to target instead. // stylelint-disable selector-max-type td, th { border-top: 0; } // stylelint-enable selector-max-type } } } tbody { tr { &:last-child { // stylelint-disable-next-line selector-max-type td { border-bottom: 0; } } } } tfoot { tr { &:last-child { border-bottom: 0; } } } .card-body + & { border-top: var(--border-width) var(--border-style) var(--table-border-color); } } /* Card code */ .card-code { padding: 0; .highlight { margin: 0; border: 0; } pre { margin: 0 !important; border: 0 !important; } } /* Card chart */ .card-chart { --card-avatar-height: #{$card-avatar-height}; position: relative; z-index: 1; height: var(--card-avatar-height); } /** Card avatar */ .card-avatar { --card-avatar-ring-width: #{$card-avatar-ring-width}; margin-inline-start: auto; margin-inline-end: auto; margin-top: calc(-1 * calc(var(--avatar-size) * 0.5)); box-shadow: 0 0 0 var(--card-avatar-ring-width) var(--card-bg, var(--bg-surface)); } /* Card list group */ .card-list-group { .card-body + & { border-top: var(--border-width) var(--border-style) var(--border-color); } .list-group-item { padding-inline-start: $card-spacer-x; padding-inline-end: $card-spacer-x; border-inline-start: 0; border-inline-end: 0; border-radius: 0; &:last-child { border-bottom: 0; } &:first-child { border-top: 0; } } } // Card tabs .card-tabs { .nav-tabs { position: relative; z-index: 1; border-bottom: 0; .nav-link { background: $card-cap-bg; border: $card-border-width var(--border-style) $card-border-color; &.active, &:active, &:hover { color: var(--body-color); border-color: $card-border-color; } &.active { color: $headings-color; background: var(--card-bg, var(--bg-surface)); border-bottom-color: transparent; } } .nav-item { &:not(:first-child) { .nav-link { border-start-start-radius: 0; } } &:not(:last-child) { .nav-link { border-start-end-radius: 0; } } + .nav-item { margin-inline-start: calc(-1 * #{$card-border-width}); } } } .nav-tabs-bottom { margin-bottom: 0; .nav-link { margin-bottom: 0; &.active { border-top-color: transparent; } } .nav-item { margin-top: calc(-1 * #{$card-border-width}); margin-bottom: 0; .nav-link { border-bottom: $card-border-width var(--border-style) $card-border-color; @include border-radius(0 0 $card-border-radius $card-border-radius); } &:not(:first-child) .nav-link { border-end-start-radius: 0; } &:not(:last-child) .nav-link { border-end-end-radius: 0; } } } .card { border-end-start-radius: 0; } .nav-tabs + .tab-content .card { border-start-start-radius: 0 !important; border-end-start-radius: var(--card-border-radius); } .tab-content:has(+ .nav-tabs) .card { border-start-start-radius: var(--card-border-radius); border-end-start-radius: 0 !important; } } /** Card note */ .card-note { --card-bg: #fff7dd; --card-border-color: #fff1c9; } /** Card gradient */ // Split out so scss/tests/_cards.test.scss can assert on it directly — a bare // top-level ruleset like .card-gradient can't be @include-d or otherwise // referenced in isolation by sass-true. @mixin card-gradient-background { background: radial-gradient(ellipse at center, var(--card-bg) 0%, color-mix(in sRGB, var(--card-bg) 0%, transparent) 80%) border-box, linear-gradient(var(--card-gradient-direction), color-mix(in sRGB, var(--card-bg) var(--card-gradient-opacity), transparent) 0%, var(--card-bg) 40%) border-box, linear-gradient(calc(270deg + var(--card-gradient-direction)), var(--card-gradient)) border-box; } .card-gradient { --card-gradient-direction: 180deg; --card-gradient-opacity: 86%; --card-gradient: var(--primary), var(--primary); @include card-gradient-background(); } @each $name, $color in map.merge($colors, $theme-colors) { .card-gradient-#{$name} { --card-gradient: var(--#{$name}), var(--#{$name}); } } .card-gradient-rainbow { --card-gradient: #78c5d6, #459ba8, #79c267, #c5d647, #f5d63d, #f08b33, #e868a2, #be61a5; } .card-gradient-sun { --card-gradient: #fd1d1d, #fcb045; } .card-gradient-snow { --card-gradient: #333, #e9ecef; } .card-gradient-ocean { --card-gradient: #1cb5e0, #000851; } .card-gradient-mellow { --card-gradient: #f8ff00, #3ad59f; } .card-gradient-disco { --card-gradient: #fc466b, #3f5efb; } .card-gradient-psychedelic { --card-gradient: #fcc5e4, #fda34b, #ff7882, #c8699e, #7046aa, #0c1db8, #020f75; } .card-gradient-love { --card-gradient: #f235e6, #bc0707; } .card-gradient-gold { --card-gradient: #9d4100, #bf7122, #f59f00, #ffd700; } .card-gradient-animated { animation: gradient-animation 15s linear infinite; } .card-gradient-bottom { --card-gradient-direction: 0deg; } .card-gradient-end { --card-gradient-direction: 270deg; } .card-gradient-start { --card-gradient-direction: 90deg; }