// Copyright (C) 2026 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

// Callout strip: a leading icon plus a one-line message, tinted by intent.
// Mirrors the colour treatment of the shared `widgets/callout` Callout
// (pf-color-primary/success/warning/danger via the `pf-intent-*` classes), with
// a Memscope-specific geometry — slightly larger padding/gap to match the
// page's panel rhythm.

.pf-memscope-callout {
  @mixin color-theme($base-color) {
    color: $base-color;
    background: color-mix(in srgb, $base-color 15%, transparent);
  }

  display: flex;
  align-items: center;
  gap: 10px;
  padding: 10px 14px;
  background: var(--pf-color-background-secondary);
  border: solid 1px color-mix(in srgb, currentColor, transparent 50%);
  border-radius: 8px;
  font-size: var(--pf-font-size-s);

  & > .pf-left-icon {
    flex-shrink: 0;
    align-self: center;
  }

  &__content {
    flex: 1;
  }

  &.pf-intent-primary {
    @include color-theme(var(--pf-color-primary));
  }

  &.pf-intent-danger {
    @include color-theme(var(--pf-color-danger));
  }

  &.pf-intent-success {
    @include color-theme(var(--pf-color-success));
  }

  &.pf-intent-warning {
    @include color-theme(var(--pf-color-warning));
  }
}
