@layer components { /* Base /* -------------------------------------------------------------------------- */ .card { --avatar-size: 2.75em; --card-bg-color: color-mix(in srgb, var(--card-color) 4%, var(--color-canvas)); --card-padding-inline: var(--inline-space-double); --card-padding-block: var(--block-space); --border-color: transparent; --border-radius: 0.2em; --border-size: 0; aspect-ratio: var(--card-aspect-ratio, auto); background-color: var(--card-bg-color); border-radius: var(--border-radius); box-shadow: var(--shadow); color: color-mix(in srgb, var(--card-color) 40%, var(--color-ink)); display: flex; flex-direction: column; inline-size: 100%; padding: var(--card-padding-block) var(--card-padding-inline); position: relative; text-align: start; z-index: 1; @media (prefers-color-scheme: dark) { box-shadow: 0 0 0 1px var(--color-ink-lighter); } } /* Children /* ------------------------------------------------------------------------ */ .card__background { inset: 0; position: absolute; z-index: -1; img { block-size: 100%; border-radius: var(--border-radius); inline-size: 100%; object-fit: cover; object-position: center; opacity: 1; transition: filter 0.2s ease-in-out, opacity 0.2s ease-in-out; } } .card__body { display: flex; flex-grow: 1; gap: 1ch; inline-size: 100%; padding-block: var(--card-padding-block); @media (min-width: 640px) { gap: var(--card-padding-inline); } } .card__collection { background-color: var(--card-color); border-radius: var(--border-radius) 0 var(--border-radius) 0; color: var(--color-ink-inverted); display: inline-flex; font-weight: 800; max-inline-size: 100%; min-inline-size: 0; padding: var(--block-space-half) var(--inline-space) var(--block-space-half) var(--card-padding-inline); &:has(.collection-picker__button) { cursor: pointer; transition: background-color 100ms ease-out; @media (any-hover: hover) { &:hover { background-color: color-mix(in srgb, var(--card-color) 90%, var(--color-ink)); } } &:has(.btn:focus-visible) { outline: var(--focus-ring-size) solid var(--focus-ring-color); outline-offset: var(--focus-ring-offset); } } } .card__collection-name { border-inline-start: 1px solid color-mix(in srgb, var(--color-ink-inverted) 33%, var(--card-color)); color: currentcolor; display: flex; margin-inline-start: var(--inline-space-half); max-inline-size: 100%; min-inline-size: 0; padding-inline-start: calc(var(--inline-space) * 0.75); text-transform: uppercase; .cards--considering & { border-inline-start: 1px solid color-mix(in srgb, var(--color-ink) 33%, var(--color-canvas)); color: color-mix(in srgb, var(--card-color) 40%, var(--color-ink)); } } .card__content { contain: inline-size; flex: 2 1 auto; max-inline-size: 100%; } .card__description { /* Hide the empty element that Lexical saves when nothing is added to the description


*/ action-text-content p:only-child:has(br:only-child) { display: none; } & ~ .btn { --btn-background: var(--card-color); --btn-color: var(--color-ink-inverted); } } .card-field__description { lexical-toolbar { border-block-start: 1px solid var(--color-ink-light); margin-block-start: var(--block-margin) !important; } } .card__header { align-items: center; border-radius: var(--border-radius) 0 0 0; display: flex; flex-wrap: nowrap; gap: var(--inline-space); margin-block-start: calc(-1 * var(--card-padding-block)); margin-inline: calc(-1 * var(--card-padding-inline)) calc(-0.5 * var(--card-padding-inline)); max-inline-size: unset; min-inline-size: 0; .workflow-stage { display: none; } } .card__id { flex-shrink: 0; margin-inline-start: calc(var(--inline-space) * -1); .card-perma &:before { content: "No."; opacity: 0.5; } } .card__link { content: ""; inset: 0; position: absolute; z-index: -1; } .card__stages { display: flex; flex: 0 1 auto; flex-direction: column; justify-self: end; max-inline-size: 20ch; padding-block: var(--block-space-half); } .card__tag { color: var(--card-color); font-weight: 700; } .card__tags { align-items: center; color: var(--card-color); display: flex; min-inline-size: 0; } .card__title { --input-border-radius: 0; --input-color: color-mix(in srgb, var(--card-color) 40%, var(--color-ink)); --lines: 3; color: inherit; font-size: var(--text-xx-large); font-weight: 900; line-height: 1.2; text-wrap: balance; @supports not (field-sizing: content) { &:has(textarea) { text-wrap: unset; /* Safari is annoying if you have text-wrap: balance in textareas */ } } .card-field__title { &:is(textarea)::placeholder { color: inherit; opacity: 0.66; } } .card__title-link { color: inherit; } } .card--new-card-button:is(.btn) { --btn-padding: var(--block-space) var(--inline-space-double); --btn-border-size: 0; --btn-color: var(--color-link); --btn-icon-size: 1em; --card-padding-block: calc(var(--block-space) * 1.25); box-shadow: 0 0 0 1px oklch(var(--lch-blue-lighter)); color: var(--btn-color); font-weight: 700; transition: box-shadow 100ms ease-out; @media (any-hover: hover) { &:hover { filter: none; box-shadow: 0 0 0 1px oklch(var(--lch-blue-lighter)), var(--shadow); } } } .card__move-button { --btn-background: color-mix(in srgb, inherit 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__footer { .avatar + .avatar { margin-inline-start: -0.8em; } } .card__meta { --meta-border: 1px solid var(--card-color); align-items: center; display: flex; max-inline-size: 100%; min-inline-size: 0; text-transform: uppercase; strong, .local-time-value { font-weight: 900; } @media (max-width: 639px) { .avatar { display: none; } } } .card__meta-grid { column-gap: var(--inline-space); display: grid; } .card__meta-grid--author { border-inline-end: var(--meta-border); grid-template-areas: "avatar top" "avatar bottom"; grid-template-columns: auto 1fr; .card__meta-author { grid-area: avatar; } .card__meta-text--added { grid-area: top; } .card__meta-text--author { grid-area: bottom; } .card__meta-text { padding-inline-end: var(--inline-space); } } .card__meta-grid--assigned { grid-template-areas: "top avatar" "bottom avatar"; grid-template-columns: 1fr auto; .card__meta-assignees { grid-area: avatar; } .card__meta-text--updated { grid-area: top; } .card__meta-text--assigned { grid-area: bottom; } .card__meta-text { padding-inline-start: var(--inline-space); } .card__meta-assignees { display: flex; flex-shrink: 0; } } .card__meta-text--added, .card__meta-text--updated { border-block-end: var(--meta-border); } .card__meta-author { grid-area: avatar; } .card__timestamp { opacity: 0.66; } .card__closed { --stamp-color: oklch(var(--lch-green-medium) / 0.65); align-items: center; background-color: color-mix(in srgb, var(--card-bg-color) 90%, transparent); border-radius: 0.2em; border: 0.5ch solid var(--stamp-color); color: var(--color-ink-dark); display: flex; flex-direction: column; font-weight: bold; inset: auto 1ch 1ch auto; justify-content: center; max-inline-size: 25ch; min-inline-size: 16ch; padding: 1ch; position: absolute; rotate: 5deg; transform-origin: top right; .card:has(&), .card-perma:has(&) { --card-color: var(--color-card-complete) !important; } } .card__closed-title { color: var(--stamp-color); font-size: 1.3em; font-weight: 900; line-height: 1.2; position: relative; text-align: center; text-transform: uppercase; } .card__closed-date { font-family: var(--font-mono); text-transform: uppercase; } .card__closed-by { border-block-end: 1px dashed currentcolor; } .card:nth-child(2n+1) .bubble { --bubble-rotate: -90deg; } .card:nth-child(3n+1) .bubble { --bubble-rotate: 45deg; } /* Variants /* ------------------------------------------------------------------------ */ .card--notification { --card-color: var(--color-card-default); --card-padding-inline: 1ch; --card-padding-block: 1ch; background-color: var(--color-canvas); &.card--closed { --card-color: var(--color-card-complete) !important; } .card__body { padding-block-end: 0; } .card__collection { font-size: var(--text-xx-small); padding-block: 0.5ch; padding-inline-start: var(--inline-space-double); } .card__header { margin-block-start: calc(-1.1 * var(--card-padding-block)); margin-inline: calc(-1 * var(--card-padding-inline)); max-inline-size: unset; } .card__notification-body { font-size: var(--text-x-small); } .card__notification-meta { font-size: var(--text-xx-small); font-weight: 600; text-transform: uppercase; } .card__title { font-size: var(--text-small); font-weight: bold; min-block-size: 0; } } .card__notification-unread-indicator { --btn-background: var(--color-canvas); --btn-border-color: var(--color-canvas); --btn-icon-size: 0.75em; --btn-padding: 0; --btn-size: 1.25em; position: relative; z-index: 1; &:before, .icon { transition: opacity 150ms ease; } /* The red dot */ &:before { aspect-ratio: 1; background-color: var(--color-marker); border-radius: 50%; content: ""; inline-size: 50%; inset: 50% auto auto 50%; position: absolute; translate: -50% -50%; } /* The X */ .icon { opacity: 0; } @media (hover: hover) { .card:hover & { --btn-background: transparent; &:before { opacity: 0; } .icon { opacity: 1; } } } } .card__collection-public-description { max-inline-size: 66ch; p:first-child { margin-block-start: 0; } p:last-child { margin-block-end: 0; } } .card--search { --card-color: var(--color-ink); --card-padding-block: 0.75rem; --card-padding-inline: 0.75rem; background-color: var(--color-canvas); &:not(&:hover) { box-shadow: 0 0 0 1px var(--color-ink-lighter); } .card__collection { background-color: var(--color-canvas); color: var(--color-ink-medium); font-size: var(--text-x-small); font-weight: 600; padding-block-end: 1ch; } .card__id { margin: 0; } .card__body { padding: 0; } .card__title { font-size: var(--text-medium); } } }