Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 


Quelle  grouped.css   Sprache: unbekannt

 
Spracherkennung für: .css vermutete Sprache: Unknown {[0] [0] [0]} [Methode: Schwerpunktbildung, einfache Gewichte, sechs Dimensionen]

/* =============================================
   GROUPED CHAT LAYOUT (Slack-style)
   ============================================= */

/* Chat Group Layout - default (assistant/other on left) */
.chat-group {
  display: flex;
  gap: 10px;
  align-items: flex-start;
  margin-bottom: 14px;
  margin-left: 4px;
  margin-right: 16px;
}

/* User messages on right */
.chat-group.user {
  flex-direction: row-reverse;
  justify-content: flex-start;
}

.chat-group-messages {
  display: flex;
  flex-direction: column;
  gap: 2px;
  flex: 1 1 auto;
  width: 100%;
  max-width: min(900px, 68%);
  align-items: flex-start;
  min-width: 0;
}

/* User messages align content right */
.chat-group.user .chat-group-messages {
  align-items: flex-end;
}

.chat-group.tool .chat-group-messages {
  max-width: min(980px, calc(100% - 46px));
}

.chat-group.user .chat-group-footer {
  justify-content: flex-end;
}

/* Footer at bottom of message group (role + time) */
.chat-group-footer {
  display: flex;
  gap: 8px;
  align-items: baseline;
  margin-top: 6px;
}

.chat-sender-name {
  font-weight: 500;
  font-size: 12px;
  color: var(--muted);
}

.chat-group-timestamp {
  font-size: 11px;
  color: var(--muted);
  opacity: 0.7;
}

/* ── Group footer action buttons (TTS, delete) ── */
.chat-group-footer button {
  background: none;
  border: none;
  cursor: pointer;
  padding: 4px;
  min-width: 24px;
  min-height: 24px;
  border-radius: var(--radius-sm, 4px);
  color: var(--muted);
  opacity: 0;
  pointer-events: none;
  transition:
    opacity 120ms ease-out,
    color 120ms ease-out,
    background 120ms ease-out;
  display: inline-flex;
  align-items: center;
  justify-content: center;
}

.chat-group:hover .chat-group-footer button {
  opacity: 0.6;
  pointer-events: auto;
}

.chat-group-footer button:hover {
  opacity: 1 !important;
  background: var(--bg-hover, rgba(255, 255, 255, 0.08));
}

.chat-group-footer button svg {
  width: 14px;
  height: 14px;
  fill: none;
  stroke: currentColor;
  stroke-width: 2;
  stroke-linecap: round;
  stroke-linejoin: round;
}

.chat-tts-btn--active {
  opacity: 1 !important;
  pointer-events: auto !important;
  color: var(--accent);
}

.chat-group-delete:hover {
  color: var(--danger) !important;
}

/* Chat divider (e.g., compaction marker) */
.chat-divider {
  display: flex;
  align-items: center;
  gap: 10px;
  margin: 18px 8px;
  color: var(--muted);
  font-size: 11px;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  user-select: none;
}

.chat-divider__line {
  flex: 1 1 0;
  height: 1px;
  background: var(--border);
  opacity: 0.9;
}

.chat-divider__label {
  padding: 2px 10px;
  border: 1px solid var(--border);
  border-radius: var(--radius-full);
  background: rgba(255, 255, 255, 0.02);
}

/* Avatar Styles */
.chat-avatar {
  width: 36px;
  height: 36px;
  border-radius: var(--radius-md);
  background: var(--panel-strong);
  display: grid;
  place-items: center;
  font-weight: 600;
  font-size: 13px;
  flex-shrink: 0;
  align-self: flex-end;
  margin-bottom: 4px;
  border: 1px solid var(--border);
}

.chat-avatar.user {
  background: var(--accent-subtle);
  color: var(--accent);
  border-color: color-mix(in srgb, var(--accent) 20%, transparent);
}

.chat-avatar.assistant {
  background: var(--secondary);
  color: var(--muted);
}

.chat-avatar.other {
  background: var(--secondary);
  color: var(--muted);
}

.chat-avatar.tool {
  background: var(--secondary);
  color: var(--muted);
}

/* Image avatar support */
img.chat-avatar {
  display: block;
  object-fit: cover;
  object-position: center;
}

/* Minimal Bubble Design - dynamic width based on content */
.chat-bubble {
  position: relative;
  display: block;
  border: 1px solid var(--border);
  background: var(--card);
  border-radius: var(--radius-lg);
  padding: 10px 14px;
  box-shadow: none;
  transition:
    background var(--duration-fast) ease-out,
    border-color var(--duration-fast) ease-out;
  width: auto;
  max-width: 100%;
  box-sizing: border-box;
  min-width: 0;
  word-wrap: break-word;
}

.chat-bubble--tool-shell {
  align-self: stretch;
  width: min(100%, 760px);
  padding: 0;
  border: 0;
  background: transparent;
  box-shadow: none;
}

.chat-bubble--tool-shell:hover {
  background: transparent;
}

.chat-bubble.has-copy {
  padding-right: 70px;
}

.chat-bubble-actions {
  position: absolute;
  top: 6px;
  right: 8px;
  display: flex;
  gap: 4px;
  opacity: 0;
  pointer-events: none;
  transition: opacity 120ms ease-out;
}

.chat-bubble:hover .chat-bubble-actions {
  opacity: 1;
  pointer-events: auto;
}

@media (hover: none) {
  .chat-bubble-actions {
    opacity: 1;
    pointer-events: auto;
  }
}

.chat-copy-btn,
.chat-expand-btn {
  background: var(--bg);
  color: var(--muted);
}

.chat-copy-btn__icon {
  display: inline-flex;
  width: 14px;
  height: 14px;
  position: relative;
}

.chat-copy-btn__icon svg,
.chat-expand-btn__icon svg {
  width: 14px;
  height: 14px;
}

.chat-copy-btn__icon-copy,
.chat-copy-btn__icon-check {
  position: absolute;
  top: 0;
  left: 0;
  transition: opacity 150ms ease;
}

.chat-copy-btn__icon-check {
  opacity: 0;
}

.chat-copy-btn[data-copied="1"] .chat-copy-btn__icon-copy {
  opacity: 0;
}

.chat-copy-btn[data-copied="1"] .chat-copy-btn__icon-check {
  opacity: 1;
}

.chat-copy-btn[data-copying="1"] {
  opacity: 0;
  pointer-events: none;
}

.chat-copy-btn[data-error="1"] {
  border-color: var(--danger-subtle);
  background: var(--danger-subtle);
  color: var(--danger);
}

.chat-copy-btn[data-copied="1"] {
  border-color: var(--ok-subtle);
  background: var(--ok-subtle);
  color: var(--ok);
}

.chat-copy-btn:focus-visible,
.chat-expand-btn:focus-visible {
  outline: 2px solid var(--accent);
  outline-offset: 2px;
}

.chat-expand-btn__icon {
  display: inline-flex;
  width: 14px;
  height: 14px;
}

/* Light mode: restore borders */
:root[data-theme-mode="light"] .chat-bubble {
  border-color: var(--border);
  box-shadow: inset 0 1px 0 var(--card-highlight);
}

:root[data-theme-mode="light"] .chat-bubble--tool-shell {
  border-color: transparent;
  box-shadow: none;
}

.chat-bubble:hover {
  background: var(--bg-hover);
}

.chat-bubble--tool-shell:hover {
  background: transparent;
}

/* User bubbles have different styling */
.chat-group.user .chat-bubble {
  background: var(--accent-subtle);
  border-color: transparent;
}

:root[data-theme-mode="light"] .chat-group.user .chat-bubble {
  border-color: color-mix(in srgb, var(--accent) 20%, transparent);
  background: var(--accent-subtle);
}

.chat-group.user .chat-bubble:hover {
  background: color-mix(in srgb, var(--accent) 20%, transparent);
}

/* Streaming animation */
.chat-bubble.streaming {
  animation: pulsing-border 1.5s ease-out infinite;
}

@keyframes pulsing-border {
  0%,
  100% {
    border-color: var(--border);
  }

  50% {
    border-color: var(--accent);
  }
}

/* Fade-in animation for new messages */
.chat-bubble.fade-in {
  animation: fade-in 200ms ease-out;
}

@keyframes fade-in {
  from {
    opacity: 0;
    transform: translateY(4px);
  }

  to {
    opacity: 1;
    transform: translateY(0);
  }
}

/* ── Message metadata (tokens, cost, model, context %) ── */
.msg-meta {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  font-size: 11px;
  line-height: 1;
  color: var(--muted);
  margin-top: 4px;
  flex-wrap: wrap;
}

.msg-meta__tokens,
.msg-meta__cache,
.msg-meta__cost,
.msg-meta__ctx,
.msg-meta__model {
  display: inline-flex;
  align-items: center;
  gap: 2px;
  white-space: nowrap;
}

.msg-meta__model {
  background: var(--bg-hover, rgba(255, 255, 255, 0.06));
  padding: 1px 6px;
  border-radius: var(--radius-sm, 4px);
  font-family: var(--font-mono, monospace);
}

.msg-meta__cost {
  color: var(--ok);
}

.msg-meta__ctx--warn {
  color: var(--warn);
}

.msg-meta__ctx--danger {
  color: var(--danger);
}

/* ── Delete confirmation popover ── */
.chat-delete-wrap {
  position: relative;
  display: inline-flex;
}

.chat-delete-confirm {
  position: absolute;
  bottom: calc(100% + 6px);
  background: var(--card, #1a1a1a);
  border: 1px solid var(--border, rgba(255, 255, 255, 0.1));
  border-radius: var(--radius-md, 8px);
  padding: 12px;
  min-width: 200px;
  max-width: calc(100vw - 48px);
  box-shadow: 0 8px 24px rgba(0, 0, 0, 0.4);
  z-index: 100;
  animation: scale-in 0.15s ease-out;
}

.chat-delete-confirm--left {
  right: 0;
}

.chat-delete-confirm--right {
  left: 0;
}

.chat-delete-confirm__text {
  margin: 0 0 8px;
  font-size: 13px;
  font-weight: 500;
  color: var(--fg, #fff);
}

.chat-delete-confirm__remember {
  display: flex;
  align-items: center;
  gap: 6px;
  font-size: 11px;
  color: var(--muted, #888);
  margin-bottom: 10px;
  cursor: pointer;
  user-select: none;
}

.chat-delete-confirm__check {
  width: 14px;
  height: 14px;
  accent-color: var(--accent);
  cursor: pointer;
}

.chat-delete-confirm__actions {
  display: flex;
  gap: 6px;
  justify-content: flex-end;
}

.chat-delete-confirm__cancel,
.chat-delete-confirm__yes {
  border: none;
  border-radius: var(--radius-sm, 4px);
  padding: 4px 12px;
  font-size: 12px;
  font-weight: 500;
  cursor: pointer;
  transition: background 120ms ease-out;
}

.chat-delete-confirm__cancel {
  background: var(--bg-hover, rgba(255, 255, 255, 0.08));
  color: var(--muted, #888);
}

.chat-delete-confirm__cancel:hover {
  background: rgba(255, 255, 255, 0.12);
}

.chat-delete-confirm__yes {
  background: var(--danger);
  color: #fff;
}

.chat-delete-confirm__yes:hover {
  background: #dc2626;
}

@media (max-width: 768px) {
  .chat-group {
    margin-left: 0;
    margin-right: 0;
  }

  .chat-group-messages {
    max-width: 82%;
  }

  .chat-group.tool .chat-group-messages {
    max-width: calc(100% - 46px);
  }
}

@media (max-width: 400px) {
  .chat-group-messages {
    max-width: 100%;
  }

  .chat-avatar,
  img.chat-avatar {
    display: none;
  }
}

[Dauer der Verarbeitung: 0.21 Sekunden, vorverarbeitet 2026-04-28]

                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Software

     Produkte
     Quellcodebibliothek

Aktivitäten

     Artikel über Sicherheit
     Anleitung zur Aktivierung von SSL

Muße

     Gedichte
     Musik
     Bilder

Jenseits des Üblichen ....

Besucherstatistik

Besucherstatistik

Monitoring

Montastic status badge