Files
fizzy/app/assets/stylesheets/cards.css
T
2025-04-10 17:14:04 -05:00

524 lines
11 KiB
CSS

@layer components {
.cards {
--block-space: 2cqi;
--container-gap: var(--block-space);
--container-padding: calc(var(--block-space) * 1.5);
container-type: inline-size;
padding: var(--block-space-half) 0;
justify-content: start;
:where(.card) {
--block-space: 1em;
--block-space-half: 0.5em;
--card-size: calc(100% - (var(--container-padding) * 2) / 2);
--text-xx-large: 2em;
font-size: 1.8cqi;
flex: 0 1 var(--card-size);
inline-size: var(--card-size);
margin: var(--block-space) auto calc(var(--block-space) * 1.5);
}
:is(.card--mini) {
--text-xx-large: 1.6em;
--text-small: 1.1em;
aspect-ratio: unset;
border: 1px solid var(--color-subtle) !important;
line-height: 1.2;
padding: 0;
margin: var(--block-space) auto calc(var(--block-space) * 1.5);
@media (prefers-color-scheme: dark) {
border-color: var(--color-subtle-dark) !important;
}
.card__title {
margin-block-start: 0.1em;
min-block-size: 0;
}
.card__body {
padding-inline: 0;
.card--mini & {
padding: 0 var(--inline-space-double) var(--block-space);
}
}
.card__tags {
font-size: var(--text-small);
}
}
}
.cards--columns {
border-block: 1px solid var(--color-subtle);
display: grid;
grid-template-columns: repeat(2, 50%);
margin: auto;
max-inline-size: 100ch;
padding-block: var(--block-space-half);
.card {
aspect-ratio: unset;
z-index: unset;
}
}
.card {
--border-color: transparent;
--border-radius: 0.2em;
--border-size: 0;
aspect-ratio: 2/0.95;
background-color: color-mix(in srgb, var(--card-color) 4%, var(--color-bg));
color: color-mix(in srgb, var(--card-color) 40%, var(--color-ink));
max-inline-size: 75ch;
z-index: 1;
.card__container & {
inline-size: calc(100dvw - var(--actions-inline-inset) * 2 - var(--btn-size) * 2);
}
.local-time-value {
font-weight: bold;
}
.avatar {
block-size: 2.75em;
inline-size: 2.75em;
}
@media (prefers-color-scheme: dark) {
--border-color: var(--color-subtle-dark);
--border-size: 1px;
}
}
.card--golden {
--border-color: var(--color-bg) !important;
background-color: var(--color-bg);
background-image: linear-gradient(90deg, oklch(var(--lch-golden) / 0.5) 0%, oklch(var(--lch-golden) / 0.1) 50%, oklch(var(--lch-golden) / 0.75) 100%);
box-shadow:
0 0 0.5em 0.2em var(--color-golden),
0 0 1em 0.4em var(--color-golden) !important;
outline: 1px solid var(--color-golden);
}
.card__actions {
position: absolute;
inset: var(--actions-block-inset) auto auto calc(var(--actions-inline-inset) * -1);
z-index: 0;
&:has(dialog[open]) {
z-index: 1;
}
}
.card__actions--right {
inset: var(--actions-block-inset) calc(var(--actions-inline-inset) * -1) auto auto;
}
.card__actions-container {
--border-radius: 6em;
background-color: var(--color-bg);
color: color-mix(in srgb, var(--card-color) 40%, var(--color-ink));
margin-block: calc(var(--block-space) * -1.66) calc(var(--block-space) * 1.66);
padding: calc(var(--block-space) * 0.75) calc(var(--block-space) * 0.66);
position: relative;
z-index: 0;
&:has([open]) {
z-index: 1;
}
.btn:not(.popup__item, .btn--plain, :has(input[type="radio"])) {
--btn-background: var(--card-color);
--btn-color: var(--color-ink-reversed);
}
.btn--plain {
--btn-color: var(--card-color);
text-decoration: underline;
}
.card__closure-message {
color: var(--card-color);
}
&.card__actions-container--top {
margin: calc(var(--block-space) * 1) auto calc(var(--block-space) * -0.66);
min-inline-size: 30ch;
#header:has(&) {
position: relative;
z-index: 1;
}
.btn {
--btn-border-color: var(--card-color);
--btn-color: var(--card-color);
text-align: center;
&:has(input:checked) {
--btn-background: var(--card-color);
--btn-color: var(--color-ink-reversed);
}
}
}
}
.cards .card__assignees:not(:has(.avatar)) {
.txt-uppercase {
display: none;
}
}
.card__background {
inset: 0;
position: absolute;
z-index: -1;
img {
block-size: 100%;
inline-size: 100%;
object-fit: cover;
object-position: center;
opacity: 0.2;
transition: opacity 0.2s ease-in-out;
}
@media (hover: hover) {
.card:hover & {
img:not([src=""]) {
opacity: 1;
}
}
}
}
.card__body {
padding-inline: var(--inline-space-double);
}
.card__body-header {
flex: 2 1 75%;
padding-block: var(--block-space);
}
.card__collection {
background-color: var(--card-color);
font-weight: 800;
letter-spacing: 0.5ch;
padding: var(--block-space-half) var(--inline-space-double);
}
.card-collection__filter {
> button {
--hover-size: 0;
}
}
.card-column__filter {
> button {
--hover-size: 0;
inline-size: auto;
padding: 0 2em 0 0;
margin-inline-start: 2em;
}
}
.card-sorting__filter {
inset: auto 50% calc(var(--btn-size) * -0.66);
margin-inline-start: -1em;
position: absolute;
transform: translate(-50%, 50%);
#header:has(&) {
position: relative;
z-index: 1;
}
}
.card__container {
--actions-block-inset: 1.5rem;
--actions-inline-inset: 4rem;
--padding-inline: calc(var(--block-space-double) + var(--block-space));
--padding-block: var(--block-space-double) calc(var(--block-space-double) + var(--block-space-half));
background-color: color-mix(in srgb, var(--card-color) 33%, var(--color-bg));
border-radius: 0.2em;
display: inline-flex;
margin-block: calc(var(--block-space) * -1) calc(var(--block-space) * -0.33);
padding: var(--padding-block) var(--padding-inline);
}
.card__container--pointing {
--arrow-size: 20em;
--aspect-ratio: 7;
position: relative;
margin-block-end: calc(var(--arrow-size) / var(--aspect-ratio));
&::after {
aspect-ratio: var(--aspect-ratio);
background: color-mix(in srgb, var(--card-color) 33%, var(--color-bg));
clip-path: polygon(50% 100%, 100% 0, 0 0);
inline-size: var(--arrow-size);
content: "";
display: block;
inset-block-start: 99%;
inset-inline-start: 50%;
position: absolute;
transform: translateX(-50%);
z-index: -1;
}
}
.card__delete-btn {
.cards & {
display: none;
}
}
.card__footer {
margin-block-end: var(--block-space);
}
.cards--grid {
--block-space: 2cqi;
--container-gap: var(--block-space-double);
--container-padding: calc(var(--block-space) * 1.5);
container-type: inline-size;
display: flex;
flex-wrap: wrap;
gap: var(--container-gap);
inline-size: 100%;
margin: 0 auto;
max-inline-size: 120ch;
padding: var(--container-padding);
place-content: center;
position: relative;
z-index: 0;
.card {
--block-space: 1em;
--block-space-half: 0.5em;
--card-size: calc(100% - (var(--container-padding) * 2) / 2);
--text-xx-large: 1.8em;
block-size: 50%;
font-size: 3cqi;
flex: 0 0 var(--card-size);
inline-size: var(--card-size);
z-index: 0;
}
.card__meta,
.card__stages {
display: none;
}
@media (min-width: 1ch) {
--block-space: 1cqi;
--container-gap: calc(var(--block-space) * 2);
--container-padding: calc(var(--block-space) * 2.5);
.card {
--card-size: calc(50% - var(--container-gap) - (var(--container-padding) * 2) / 4);
--text-xx-large: 1.6em;
font-size: 1.5cqi;
}
.card__footer,
.card__header,
.card__stages {
font-size: 0.85em;
}
}
@media (min-width: 120ch) {
--block-space: 0.9cqi;
--container-gap: calc(var(--block-space) * 2);
--container-padding: calc(var(--block-space) * 2.5);
.card {
--card-size: calc(33% - var(--container-gap) / 2 - (var(--container-padding) * 2) / 6);
--text-xx-large: 1.8em;
font-size: 1cqi;
}
.card__footer,
.card__header,
.card__stages {
font-size: 0.85em;
}
}
}
.card__header {
padding-inline-end: var(--inline-space);
}
.card__hide-on-index {
.cards &,
.cards--grid & {
display: none;
}
}
.card__link {
--hover-size: 0;
content: "";
inset: 0;
position: absolute;
z-index: -1;
.cards &,
.cards--grid & {
z-index: 1;
}
}
.card__meta {
--border-color: var(--card-color);
--border-size: 1px;
--row-gap: 0.25em;
margin-inline: var(--inline-space-double);
strong {
font-weight: 900;
}
.separator {
height: calc(2lh + 2ex);
}
.card--mini & {
margin-inline-start: 0;
}
}
.card__move-button {
--btn-background: color-mix(in srgb, var(--card-color) 40%, var(--color-ink));
margin-block-start: calc(var(--block-space) * 1.2);
margin-inline-end: calc(var(--inline-space) * -4);
padding-inline-end: var(--inline-space);
}
.card__stages {
flex: 1 1 25%;
}
.card__tag {
color: var(--card-color);
font-weight: 700;
}
.card__tags {
color: var(--card-color);
}
.card__title {
--hover-size: 0;
--input-border-radius: 0;
font-size: var(--text-xx-large);
font-weight: 900;
line-height: 1.1;
min-block-size: 3lh;
text-wrap: balance;
.cards & {
pointer-events: none;
}
.card__title-field {
&:is(textarea) {
&::placeholder {
color: inherit;
opacity: 0.5;
}
}
}
.card__title-link {
--lines: 3;
color: inherit;
}
}
.input.boost__input {
--hover-size: 0;
--input-border-radius: 0;
--input-border-size: 0;
--input-padding: 0;
--outline-size: 0;
color: inherit;
font-size: inherit;
font-weight: inherit;
inline-size: min-content;
max-inline-size: 3ch;
min-inline-size: 1ch;
outline: none;
@supports (field-sizing: content) {
field-sizing: content;
max-inline-size: unset;
}
&:focus {
background-color: var(--color-highlight);
}
&::-webkit-outer-spin-button,
&::-webkit-inner-spin-button {
-webkit-appearance: none;
margin: 0;
}
}
.card__closed {
align-items: center;
aspect-ratio: 7/4;
border: var(--block-space-half) solid var(--card-color);
position: absolute;
inset: auto var(--block-space) var(--block-space-double) auto;
justify-content: space-between;
padding: var(--block-space-half) calc(var(--inline-space) * 1.5);
transform: rotate(-10deg);
z-index: -1;
}
.card__closed-by {
border-block-end: 1px dashed currentcolor;
}
.card__closed-title {
color: var(--color-ink-reversed);
font-size: var(--text-rel-large);
font-weight: 900;
text-shadow:
-2px -2px 0 var(--card-color),
2px -2px 0 var(--card-color),
-2px 2px 0 var(--card-color),
2px 2px 0 var(--card-color);
}
}