/* * : M3's small and large badges, and the library's status label. * * BadgeTokens (androidx Compose Material 3, Apache-2.0): the small badge is a 6px dot * (`data-md-dot`), the large badge 16px tall and at least 16px wide with 4px either side of a * `label-small` count in tabular figures, both fully round and `error` by default. A floating * badge sits on M3's anchor geometry at the top-end corner of its `position: relative` parent: the * dot flush in the corner, the count 2px above it with its start 12px in from the parent's end. * * The status label (`data-md-variant`) is not an M3 badge: 24px tall, small corner, 8px either * side, 4px between an icon and its word, `label-medium`. `tonal` draws it in the colour's * container, `solid` in the colour itself, `outline` as a 1px `outline` edge around * `on-surface-variant` text — `outline` rather than `outline-variant`, because M3 asks a badge for * 3:1 against what is behind it and `outline-variant` is the decorative role dividers use. * * `data-md-color` picks the pair of roles; `neutral` has no hue of its own (`on-surface-variant` * and `surface`, or `surface-container-high` behind `on-surface-variant` text), and `plain` sets * no colour at all, so the caller's CSS paints it. */ @layer material.reset, material.tokens, material.base, material.layout, material.components, material.text, material.visibility; @layer material.components { [data-md-badge] { --md-badge-color: var(--md-sys-color-error); --md-badge-on-color: var(--md-sys-color-on-error); --md-badge-container: var(--md-sys-color-error-container); --md-badge-on-container: var(--md-sys-color-on-error-container); display: inline-flex; flex-shrink: 0; align-items: center; justify-content: center; white-space: nowrap; } [data-md-badge][data-md-dot] { inline-size: 6px; block-size: 6px; border-radius: var(--md-sys-shape-corner-full); } [data-md-badge]:not([data-md-dot], [data-md-variant]) { min-inline-size: 16px; block-size: 16px; border-radius: var(--md-sys-shape-corner-full); padding-inline: var(--md-sys-measurement-space50); font: var(--md-sys-typescale-label-sm); letter-spacing: var(--md-sys-typescale-label-sm-tracking); font-variation-settings: normal; font-variant-numeric: tabular-nums; } [data-md-badge][data-md-variant] { gap: var(--md-sys-measurement-space50); block-size: 24px; border-radius: var(--md-sys-shape-corner-sm); padding-inline: var(--md-sys-measurement-space100); font: var(--md-sys-typescale-label-md); letter-spacing: var(--md-sys-typescale-label-md-tracking); font-variation-settings: normal; } [data-md-badge][data-md-variant='outline'] { border: 1px solid; } [data-md-badge][data-md-color='primary'] { --md-badge-color: var(--md-sys-color-primary); --md-badge-on-color: var(--md-sys-color-on-primary); --md-badge-container: var(--md-sys-color-primary-container); --md-badge-on-container: var(--md-sys-color-on-primary-container); } [data-md-badge][data-md-color='secondary'] { --md-badge-color: var(--md-sys-color-secondary); --md-badge-on-color: var(--md-sys-color-on-secondary); --md-badge-container: var(--md-sys-color-secondary-container); --md-badge-on-container: var(--md-sys-color-on-secondary-container); } [data-md-badge][data-md-color='tertiary'] { --md-badge-color: var(--md-sys-color-tertiary); --md-badge-on-color: var(--md-sys-color-on-tertiary); --md-badge-container: var(--md-sys-color-tertiary-container); --md-badge-on-container: var(--md-sys-color-on-tertiary-container); } [data-md-badge][data-md-color='success'] { --md-badge-color: var(--md-sys-color-success); --md-badge-on-color: var(--md-sys-color-on-success); --md-badge-container: var(--md-sys-color-success-container); --md-badge-on-container: var(--md-sys-color-on-success-container); } [data-md-badge][data-md-color='warning'] { --md-badge-color: var(--md-sys-color-warning); --md-badge-on-color: var(--md-sys-color-on-warning); --md-badge-container: var(--md-sys-color-warning-container); --md-badge-on-container: var(--md-sys-color-on-warning-container); } [data-md-badge][data-md-color='info'] { --md-badge-color: var(--md-sys-color-info); --md-badge-on-color: var(--md-sys-color-on-info); --md-badge-container: var(--md-sys-color-info-container); --md-badge-on-container: var(--md-sys-color-on-info-container); } [data-md-badge][data-md-color='neutral'] { --md-badge-color: var(--md-sys-color-on-surface-variant); --md-badge-on-color: var(--md-sys-color-surface); --md-badge-container: var(--md-sys-color-surface-container-high); --md-badge-on-container: var(--md-sys-color-on-surface-variant); } [data-md-badge]:not([data-md-color='plain']) { background-color: var(--md-badge-color); color: var(--md-badge-on-color); &[data-md-variant='tonal'] { background-color: var(--md-badge-container); color: var(--md-badge-on-container); } &[data-md-variant='outline'] { border-color: var(--md-sys-color-outline); background-color: transparent; color: var(--md-sys-color-on-surface-variant); } } [data-md-badge][data-md-floating] { position: absolute; inset-block-start: calc(-1 * var(--md-sys-measurement-space25)); inset-inline-start: calc(100% - 12px); } [data-md-badge][data-md-floating][data-md-dot] { inset-block-start: 0; inset-inline: auto 0; } }