| | --- |
| | interface Props { |
| | title?: string; |
| | emoji?: string; |
| | class?: string; |
| | variant?: "neutral" | "info" | "success" | "danger"; |
| | } |
| | const { |
| | title, |
| | emoji, |
| | class: className, |
| | variant = "neutral", |
| | ...props |
| | } = Astro.props as Props; |
| | const wrapperClass = ["note", `note--${variant}`, className] |
| | .filter(Boolean) |
| | .join(" "); |
| | const hasHeader = |
| | (emoji && String(emoji).length > 0) || (title && String(title).length > 0); |
| | --- |
| |
|
| | <div class={wrapperClass} {...props}> |
| | {title ? ( |
| | |
| | <div class="note__body"> |
| | <div class="note__header"> |
| | {emoji && <span class="note__emoji-inline" aria-hidden="true">{emoji}</span>} |
| | <div class="note__title">{title}</div> |
| | </div> |
| | <div class="note__content"> |
| | <slot /> |
| | </div> |
| | </div> |
| | ) : ( |
| | |
| | <div class="note__layout"> |
| | { |
| | emoji && ( |
| | <div class="note__icon" aria-hidden="true"> |
| | <span class="note__emoji">{emoji}</span> |
| | </div> |
| | ) |
| | } |
| | <div class="note__body"> |
| | <div class="note__content"> |
| | <slot /> |
| | </div> |
| | </div> |
| | </div> |
| | )} |
| | </div> |
| |
|
| | <style> |
| | .note { |
| | background: var(--surface-bg); |
| | border-left: 2px solid var(--border-color); |
| | border-top-right-radius: 8px; |
| | border-bottom-right-radius: 8px; |
| | padding: 20px 18px; |
| | margin: var(--block-spacing-y) 0; |
| | } |
| | .note__layout { |
| | display: flex; |
| | align-items: flex-start; |
| | gap: 10px; |
| | } |
| | .note__icon { |
| | flex: 0 0 auto; |
| | line-height: 1; |
| | padding-top: 2px; |
| | } |
| | .note__emoji { |
| | font-size: 32px; |
| | line-height: 1; |
| | display: block; |
| | } |
| | .note__body { |
| | flex: 1 1 auto; |
| | min-width: 0; |
| | } |
| | .note__header { |
| | display: flex; |
| | align-items: center; |
| | gap: 8px; |
| | margin-bottom: 6px; |
| | } |
| | .note__emoji-inline { |
| | font-size: 20px; |
| | line-height: 1; |
| | flex-shrink: 0; |
| | } |
| | .note__title { |
| | font-size: 16px; |
| | letter-spacing: 0.2px; |
| | font-weight: 600; |
| | color: var(--text-color); |
| | text-align: left; |
| | } |
| | .note__content { |
| | color: var(--text-color); |
| | font-size: 0.95rem; |
| | text-align: left; |
| | } |
| | |
| | .note .note__content > :global(*:last-child) { |
| | margin-bottom: 0 !important; |
| | } |
| | |
| | |
| | .note.note--neutral { |
| | border-left-color: var(--border-color); |
| | background: var(--surface-bg); |
| | } |
| | .note.note--info { |
| | border-left-color: #f39c12; |
| | background: color-mix(in oklab, #f39c12 10%, var(--surface-bg)); |
| | } |
| | .note.note--success { |
| | border-left-color: #2ecc71; |
| | background: color-mix(in oklab, #2ecc71 8%, var(--surface-bg)); |
| | } |
| | .note.note--danger { |
| | border-left-color: #e74c3c; |
| | background: color-mix(in oklab, #e74c3c 8%, var(--surface-bg)); |
| | } |
| | </style> |
| |
|