jjj 0.2.1

A modal interface for Jujutsu.
---
import { BadgeComponentSchema, type BadgeComponentProps } from '../schemas/badge';
import { parseWithFriendlyErrors } from '../utils/error-map';
import type { HTMLAttributes } from 'astro/types';

type Props = BadgeComponentProps & HTMLAttributes<'span'>;

const {
	text,
	variant,
	size,
	class: customClass,
	...attrs
} = parseWithFriendlyErrors(
	BadgeComponentSchema,
	Astro.props,
	'Invalid prop passed to the `<Badge/>` component.'
);
---

<span class:list={['sl-badge', variant, size, customClass]} {...attrs}>{text}</span>

<style>
	:global(:root) {
		--sl-badge-default-border: var(--sl-color-accent);
		--sl-badge-default-bg: var(--sl-color-accent-low);
		--sl-badge-default-text: #fff;

		--sl-badge-note-border: var(--sl-color-blue);
		--sl-badge-note-bg: var(--sl-color-blue-low);
		--sl-badge-note-text: #fff;

		--sl-badge-danger-border: var(--sl-color-red);
		--sl-badge-danger-bg: var(--sl-color-red-low);
		--sl-badge-danger-text: #fff;

		--sl-badge-success-border: var(--sl-color-green);
		--sl-badge-success-bg: var(--sl-color-green-low);
		--sl-badge-success-text: #fff;

		--sl-badge-caution-border: var(--sl-color-orange);
		--sl-badge-caution-bg: var(--sl-color-orange-low);
		--sl-badge-caution-text: #fff;

		--sl-badge-tip-border: var(--sl-color-purple);
		--sl-badge-tip-bg: var(--sl-color-purple-low);
		--sl-badge-tip-text: #fff;
	}

	:global([data-theme='light']:root) {
		--sl-badge-default-bg: var(--sl-color-accent-high);
		--sl-badge-note-bg: var(--sl-color-blue-high);
		--sl-badge-danger-bg: var(--sl-color-red-high);
		--sl-badge-success-bg: var(--sl-color-green-high);
		--sl-badge-caution-bg: var(--sl-color-orange-high);
		--sl-badge-tip-bg: var(--sl-color-purple-high);
	}

	.sl-badge {
		display: inline-block;
		border: 1px solid var(--sl-color-border-badge);
		border-radius: 0.25rem;
		font-family: var(--sl-font-system-mono);
		line-height: normal;
		color: var(--sl-color-text-badge);
		background-color: var(--sl-color-bg-badge);
		overflow-wrap: anywhere;
	}

	/* Sidebar overrides */
	:global(.sidebar-content) .sl-badge {
		line-height: 1;
		font-size: var(--sl-text-xs);
		padding: 0.125rem 0.375rem;
	}

	/* outline variant */
	:global(.sidebar-content a[aria-current='page']) > .sl-badge {
		--sl-color-bg-badge: transparent;
		--sl-color-border-badge: currentColor;
		color: inherit;
	}

	/* Color variants */
	.default {
		--sl-color-bg-badge: var(--sl-badge-default-bg);
		--sl-color-border-badge: var(--sl-badge-default-border);
		--sl-color-text-badge: var(--sl-badge-default-text);
	}

	.note {
		--sl-color-bg-badge: var(--sl-badge-note-bg);
		--sl-color-border-badge: var(--sl-badge-note-border);
		--sl-color-text-badge: var(--sl-badge-note-text);
	}

	.danger {
		--sl-color-bg-badge: var(--sl-badge-danger-bg);
		--sl-color-border-badge: var(--sl-badge-danger-border);
		--sl-color-text-badge: var(--sl-badge-danger-text);
	}

	.success {
		--sl-color-bg-badge: var(--sl-badge-success-bg);
		--sl-color-border-badge: var(--sl-badge-success-border);
		--sl-color-text-badge: var(--sl-badge-success-text);
	}

	.tip {
		--sl-color-bg-badge: var(--sl-badge-tip-bg);
		--sl-color-border-badge: var(--sl-badge-tip-border);
		--sl-color-text-badge: var(--sl-badge-tip-text);
	}

	.caution {
		--sl-color-bg-badge: var(--sl-badge-caution-bg);
		--sl-color-border-badge: var(--sl-badge-caution-border);
		--sl-color-text-badge: var(--sl-badge-caution-text);
	}

	/* Size variants */
	.small {
		font-size: var(--sl-text-xs);
		padding: 0.125rem 0.25rem;
	}

	.medium {
		font-size: var(--sl-text-sm);
		padding: 0.175rem 0.35rem;
	}

	.large {
		font-size: var(--sl-text-base);
		padding: 0.225rem 0.45rem;
	}

	/* Badge in headings */
	:global(.sl-markdown-content :is(h1, h2, h3, h4, h5, h6)) .sl-badge {
		vertical-align: middle;
	}
</style>