@layer components { .buzz-side-panel-enter { animation: buzz-side-panel-enter 260ms cubic-bezier(0.32, 0.72, 0, 1) both; transform-origin: right center; will-change: transform, opacity; } .buzz-huddle-shell { --buzz-huddle-drawer-height: 5rem; --buzz-huddle-drawer-radius: 24px; --buzz-huddle-drawer-ease: cubic-bezier(0.32, 0.72, 0, 1); --buzz-huddle-drawer-surface: var(--huddle-drawer-surface, 0 0% 0%); /* Keep the drawer surface behind the lifted app so the dark background * remains visible through its rounded lower corners. */ background: hsl(var(--buzz-huddle-drawer-surface)); } .buzz-huddle-app-surface { border-bottom-left-radius: 0; border-bottom-right-radius: 0; bottom: 0; box-shadow: none; left: 0; position: absolute; right: 0; top: 0; transition: bottom 260ms var(--buzz-huddle-drawer-ease), border-bottom-left-radius 260ms var(--buzz-huddle-drawer-ease), border-bottom-right-radius 260ms var(--buzz-huddle-drawer-ease), box-shadow 260ms var(--buzz-huddle-drawer-ease); will-change: bottom, border-bottom-left-radius, border-bottom-right-radius, box-shadow; } .buzz-huddle-app-surface::after { background: hsl(var(--buzz-huddle-drawer-surface)); bottom: -1px; content: ""; height: 2px; left: 0; opacity: 0; pointer-events: none; position: absolute; right: 0; transition: opacity 260ms var(--buzz-huddle-drawer-ease); z-index: 60; } .buzz-huddle-app-surface-open { border-bottom-left-radius: var(--buzz-huddle-drawer-radius); border-bottom-right-radius: var(--buzz-huddle-drawer-radius); bottom: var(--buzz-huddle-drawer-height); box-shadow: 0 10px 24px -12px rgb(0 0 0 / 62%), 0 2px 7px -4px rgb(0 0 0 / 42%); } .buzz-huddle-app-surface-open::after { opacity: 1; } .buzz-huddle-drawer-backdrop { background: hsl(var(--buzz-huddle-drawer-surface)); bottom: 0; height: calc( var(--buzz-huddle-drawer-height) + var(--buzz-huddle-drawer-radius) ); left: 0; opacity: 0; pointer-events: none; position: absolute; right: 0; transition: opacity 260ms var(--buzz-huddle-drawer-ease); z-index: 1; } .buzz-huddle-drawer-backdrop-open { opacity: 1; } /* The dedicated companion keeps room for the controls without making the * transcript look like a raised card. */ .buzz-huddle-app-surface-room-open { bottom: var(--buzz-huddle-drawer-height); } .buzz-huddle-drawer { --buzz-huddle-drawer-surface: var(--huddle-drawer-surface, 0 0% 0%); --background: var(--buzz-huddle-drawer-surface); --foreground: 0 0% 98%; --primary: 0 0% 98%; --primary-foreground: 0 0% 9%; --secondary: var(--huddle-control-surface, 0 0% 14.9%); --secondary-foreground: var(--huddle-control-foreground, 0 0% 98%); --muted: var(--huddle-control-chevron-surface, 0 0% 14.9%); --muted-foreground: 0 0% 63.9%; --accent: var( --huddle-control-hover-surface, var(--huddle-control-surface, 0 0% 14.9%) ); --accent-foreground: 0 0% 98%; --popover: var(--buzz-huddle-drawer-surface); --popover-foreground: 0 0% 98%; --destructive: 0 84.2% 60.2%; --destructive-foreground: 0 0% 98%; --border: 0 0% 14.9%; --input: 0 0% 14.9%; --ring: 0 0% 83.1%; color-scheme: dark; background: hsl(var(--buzz-huddle-drawer-surface)); overflow-x: auto; overflow-y: hidden; } .buzz-huddle-drawer::-webkit-scrollbar { display: none; } .buzz-huddle-popover { --buzz-huddle-popover-surface: var( --huddle-popover-surface, var(--huddle-control-chevron-surface, 0 0% 16%) ); --background: var(--buzz-huddle-popover-surface); --foreground: var(--huddle-control-foreground, 0 0% 98%); --popover: var(--buzz-huddle-popover-surface); --popover-foreground: var(--foreground); --border: var( --huddle-popover-border, var(--huddle-control-hover-surface, 0 0% 24%) ); background: hsl(var(--buzz-huddle-popover-surface)); border-color: hsl(var(--border) / 0.6); box-shadow: 0 6px 18px lch(0% 0 0 / 0.02), 0 3px 9px lch(0% 0 0 / 0.04), 0 1px 1px lch(0% 0 0 / 0.04); color: hsl(var(--foreground)); } .buzz-huddle-headphones-hint { --background: var( --huddle-tooltip-surface, var(--huddle-control-surface, var(--secondary)) ); --foreground: var( --huddle-tooltip-foreground, var(--huddle-control-foreground, var(--secondary-foreground)) ); --popover: var(--background); --popover-foreground: var(--foreground); background: hsl(var(--background)); box-shadow: 0 6px 18px lch(0% 0 0 / 0.02), 0 3px 9px lch(0% 0 0 / 0.04), 0 1px 1px lch(0% 0 0 / 0.04); color: hsl(var(--foreground)); } .buzz-huddle-mic-meter-bar { border-radius: 9999px; height: var(--buzz-huddle-meter-height, 0.25rem); transition: none; width: 0.25rem; } .buzz-huddle-speaking-avatar { isolation: isolate; } .buzz-huddle-speaking-avatar::after { border: 2px solid hsl(142 71% 45%); border-radius: inherit; content: ""; inset: -2px; opacity: var(--buzz-huddle-speaker-opacity, 0); pointer-events: none; position: absolute; transform: scale(var(--buzz-huddle-speaker-scale, 1.02)); transition: opacity 80ms linear, transform 90ms cubic-bezier(0.2, 0, 0, 1); will-change: opacity, transform; z-index: 1; } @keyframes buzz-huddle-participant-tile-enter { from { opacity: 0; transform: scale(0.95); } to { opacity: 1; transform: scale(1); } } .buzz-huddle-participant-tile { animation: buzz-huddle-participant-tile-enter 180ms cubic-bezier(0.23, 1, 0.32, 1) both; transform-origin: center; will-change: opacity, transform; } @media (prefers-reduced-motion: reduce) { .buzz-side-panel-enter { animation: none; will-change: auto; } .buzz-huddle-app-surface { transition: none; } .buzz-huddle-drawer-backdrop { transition: none; } .buzz-huddle-mic-meter-bar { transition: none; } .buzz-huddle-speaking-avatar { isolation: auto; } .buzz-huddle-speaking-avatar::after { transform: scale(1.04); transition: none; will-change: auto; } .buzz-huddle-participant-tile { animation: none; will-change: auto; } } .buzz-startup-shell { min-height: 100dvh; width: 100%; } .buzz-onboarding-step-frame { min-height: min(1000px, max(0px, calc(100dvh - 106px - 7rem))); max-height: 1000px; } .buzz-onboarding-step-frame > .buzz-onboarding-slide, .buzz-onboarding-step-frame > .buzz-onboarding-slide > .buzz-onboarding-transition-line { display: flex; flex: 1 1 auto; min-height: 0; } .buzz-onboarding-neutral-theme.buzz-startup-shell { /* Dot grid over the chartreuse→light-blue gradient (dots layer first so they sit on top). The welcome page overrides this with dots over a flat chartreuse fill below. */ background-image: radial-gradient(circle, rgb(0 0 0 / 0.08) 1px, transparent 1px), linear-gradient( to bottom, var(--buzz-welcome-chartreuse), var(--buzz-onboarding-shell-bottom) ); background-size: 24px 24px, auto; } .buzz-onboarding-neutral-theme.buzz-startup-shell.buzz-onboarding-welcome { background-color: var(--buzz-welcome-chartreuse); /* Landing is a flat chartreuse field, so the docked-footer scrim must match it (not the gradient's light-blue bottom) to stay invisible. */ --buzz-onboarding-shell-bottom: var(--buzz-welcome-chartreuse); /* Subtle dot grid: 2px dots spaced on a 24px lattice. */ background-image: radial-gradient( circle, rgb(0 0 0 / 0.08) 1px, transparent 1px ); background-size: 24px 24px; } .buzz-onboarding-neutral-theme { /* Landing "chartreuse" — the welcome background; reused for the CTA label. */ --buzz-welcome-chartreuse: #d7d72e; /* Bottom stop of the onboarding shell gradient; also the docked-footer scrim color so content scrolling under the CTA fades into the page. */ --buzz-onboarding-shell-bottom: #d7e7f6; /* Label color for the primary onboarding CTA (light blue on the dark pill). */ --buzz-onboarding-cta-label: #d7e6f0; /* Olive ink for the backup step's private key and its "never share" caption, reading against the fuzzy-white key frame. */ --buzz-onboarding-backup-ink: #717106; --background: 0 0% 100%; --foreground: 0 0% 9%; --primary: 0 0% 9%; --primary-foreground: 0 0% 98%; --secondary: 0 0% 96.1%; --secondary-foreground: 0 0% 9%; --muted: 0 0% 96.1%; --muted-foreground: 0 0% 45.1%; --accent: 0 0% 96.1%; --accent-foreground: 0 0% 9%; --border: 0 0% 89.8%; --input: 0 0% 89.8%; --ring: 0 0% 9%; --buzz-onboarding-emoji-picker-background: 245, 245, 245; --buzz-onboarding-emoji-picker-color: 23, 23, 23; --buzz-onboarding-emoji-picker-input: 255, 255, 255; --buzz-onboarding-avatar-dialog-bg: 255 255 255; --buzz-onboarding-avatar-accent-bg: 240 240 205; --buzz-onboarding-avatar-accent-fg: 113 113 6; --buzz-onboarding-avatar-action-bg: 23 23 23; --buzz-onboarding-avatar-action-fg: 240 240 205; --buzz-onboarding-avatar-control-fg: 113 113 6; --buzz-onboarding-avatar-dialog-shadow: 0 0 0; } /* * Backup options and password backup intentionally leave the bright * onboarding world for a dark security-focused subview. Keep these semantic * overrides on a reusable class as well as the shell so portaled * popovers/dialogs can opt into the same treatment. */ .buzz-onboarding-security-theme { color-scheme: dark; --buzz-onboarding-shell-bottom: #082b49; --buzz-onboarding-cta-label: #f5f5f5; --background: 222 45% 4%; --foreground: 0 0% 96%; --card: 220 14% 11%; --card-foreground: 0 0% 96%; --popover: 220 14% 9%; --popover-foreground: 0 0% 96%; --primary: 0 0% 16%; --primary-foreground: 0 0% 96%; --secondary: 0 0% 12%; --secondary-foreground: 0 0% 96%; --muted: 0 0% 12%; --muted-foreground: 0 0% 72%; --accent: 0 0% 16%; --accent-foreground: 0 0% 96%; --destructive: 0 84% 70%; --destructive-foreground: 0 0% 4%; --border: 0 0% 22%; --input: 0 0% 22%; --ring: 0 0% 84%; } .buzz-onboarding-neutral-theme.buzz-startup-shell.buzz-onboarding-security-theme { background-color: #010103; background-image: radial-gradient(circle, rgb(143 211 255 / 0.11) 1px, transparent 1px), radial-gradient( ellipse at 50% 58%, rgb(28 112 196 / 0.24) 0%, rgb(18 76 138 / 0.1) 38%, transparent 66% ), linear-gradient(to bottom, #010103 0%, #040914 46%, #082b49 100%); background-size: 24px 24px, auto, auto; } .buzz-onboarding-key-text { @apply w-full break-all [overflow-wrap:anywhere] font-mono text-nsec-key; color: var(--buzz-onboarding-backup-ink); } .dark .buzz-onboarding-neutral-theme:not(.buzz-startup-shell) { --background: 0 0% 3.9%; --foreground: 0 0% 98%; --primary: 0 0% 98%; --primary-foreground: 0 0% 9%; --secondary: 0 0% 14.9%; --secondary-foreground: 0 0% 98%; --muted: 0 0% 14.9%; --muted-foreground: 0 0% 63.9%; --accent: 0 0% 14.9%; --accent-foreground: 0 0% 98%; --border: 0 0% 14.9%; --input: 0 0% 14.9%; --ring: 0 0% 83.1%; --buzz-onboarding-emoji-picker-background: 38, 38, 38; --buzz-onboarding-emoji-picker-color: 250, 250, 250; --buzz-onboarding-emoji-picker-input: 10, 10, 10; --buzz-onboarding-avatar-dialog-bg: 24 24 20; --buzz-onboarding-avatar-accent-bg: 211 211 163; --buzz-onboarding-avatar-accent-fg: 24 24 20; --buzz-onboarding-avatar-action-bg: 113 113 6; --buzz-onboarding-avatar-action-fg: 240 240 205; --buzz-onboarding-avatar-control-fg: 224 224 176; --buzz-onboarding-avatar-dialog-shadow: 0 0 0; } .buzz-onboarding-neutral-theme[data-system-color-scheme="light"], .dark .buzz-onboarding-neutral-theme[data-system-color-scheme="light"]:not( .buzz-startup-shell ) { --background: 0 0% 100%; --foreground: 0 0% 9%; --primary: 0 0% 9%; --primary-foreground: 0 0% 98%; --secondary: 0 0% 96.1%; --secondary-foreground: 0 0% 9%; --muted: 0 0% 96.1%; --muted-foreground: 0 0% 45.1%; --accent: 0 0% 96.1%; --accent-foreground: 0 0% 9%; --border: 0 0% 89.8%; --input: 0 0% 89.8%; --ring: 0 0% 9%; --buzz-onboarding-emoji-picker-background: 245, 245, 245; --buzz-onboarding-emoji-picker-color: 23, 23, 23; --buzz-onboarding-emoji-picker-input: 255, 255, 255; --buzz-onboarding-avatar-dialog-bg: 255 255 255; --buzz-onboarding-avatar-accent-bg: 240 240 205; --buzz-onboarding-avatar-accent-fg: 113 113 6; --buzz-onboarding-avatar-action-bg: 23 23 23; --buzz-onboarding-avatar-action-fg: 240 240 205; --buzz-onboarding-avatar-control-fg: 113 113 6; --buzz-onboarding-avatar-dialog-shadow: 0 0 0; } .buzz-onboarding-neutral-theme[data-system-color-scheme="dark"]:not( .buzz-startup-shell ) { --background: 0 0% 3.9%; --foreground: 0 0% 98%; --primary: 0 0% 98%; --primary-foreground: 0 0% 9%; --secondary: 0 0% 14.9%; --secondary-foreground: 0 0% 98%; --muted: 0 0% 14.9%; --muted-foreground: 0 0% 63.9%; --accent: 0 0% 14.9%; --accent-foreground: 0 0% 98%; --border: 0 0% 14.9%; --input: 0 0% 14.9%; --ring: 0 0% 83.1%; --buzz-onboarding-emoji-picker-background: 38, 38, 38; --buzz-onboarding-emoji-picker-color: 250, 250, 250; --buzz-onboarding-emoji-picker-input: 10, 10, 10; --buzz-onboarding-avatar-dialog-bg: 24 24 20; --buzz-onboarding-avatar-accent-bg: 211 211 163; --buzz-onboarding-avatar-accent-fg: 24 24 20; --buzz-onboarding-avatar-action-bg: 113 113 6; --buzz-onboarding-avatar-action-fg: 240 240 205; --buzz-onboarding-avatar-control-fg: 224 224 176; --buzz-onboarding-avatar-dialog-shadow: 0 0 0; } /* The key-import card is viewport-centered on ordinary windows, independent of the top heading and bottom-docked actions. Short windows return it to document flow so the shell can grow and scroll instead of overlapping. */ .buzz-onboarding-key-import-position { position: absolute; left: 50%; top: calc(50dvh - 6.625rem); transform: translate(-50%, -50%); } @media (max-height: 44rem) { .buzz-onboarding-key-import-position { position: static; margin-top: 3rem; transform: none; } } .buzz-onboarding-transition-content { animation-delay: var(--buzz-onboarding-transition-delay, 0ms); } .buzz-onboarding-transition-line[data-onboarding-effect="fade"] > .buzz-onboarding-transition-content { animation: buzz-onboarding-fade-in 300ms ease-out backwards; animation-delay: var(--buzz-onboarding-transition-delay, 0ms); } .buzz-onboarding-transition-line[data-onboarding-effect="line-slide"] > .buzz-onboarding-transition-content { animation-duration: 650ms; animation-fill-mode: backwards; animation-timing-function: cubic-bezier(0.22, 1, 0.36, 1); } .buzz-onboarding-transition-line[data-onboarding-effect="line-slide"][data-onboarding-direction="forward"] > .buzz-onboarding-transition-content { animation-name: buzz-onboarding-line-slide-forward; } .buzz-onboarding-transition-line[data-onboarding-effect="line-slide"][data-onboarding-direction="backward"] > .buzz-onboarding-transition-content { animation-name: buzz-onboarding-line-slide-backward; } .buzz-onboarding-transition-line[data-onboarding-effect="mask-reveal-down"], .buzz-onboarding-transition-line[data-onboarding-effect="mask-reveal-up"] { overflow: visible; } .buzz-onboarding-transition-line[data-onboarding-effect="mask-reveal-down"] > .buzz-onboarding-transition-content, .buzz-onboarding-transition-line[data-onboarding-effect="mask-reveal-up"] > .buzz-onboarding-transition-content { /* `backwards` (not `both`): the reveal ends on an identity transform, so holding it forward is visually a no-op but leaves a lingering transform that establishes a containing block and traps `position: fixed` descendants (the bottom-docked onboarding footer). Reverting to no transform at rest looks identical and frees fixed positioning. */ animation-duration: 760ms; animation-fill-mode: backwards; animation-timing-function: cubic-bezier(0.22, 1, 0.36, 1); animation-delay: var(--buzz-onboarding-transition-delay, 0ms); transform-origin: 50% 70%; } .buzz-onboarding-transition-line[data-onboarding-effect="mask-reveal-down"] > .buzz-onboarding-transition-content { animation-name: buzz-onboarding-mask-reveal-down; } .buzz-onboarding-transition-line[data-onboarding-effect="mask-reveal-up"] > .buzz-onboarding-transition-content { animation-name: buzz-onboarding-mask-reveal-up; } .buzz-onboarding-name-placeholder-caret { animation: buzz-onboarding-caret-blink 1.1s steps(1, end) infinite; } .buzz-onboarding-runtime-pill { animation: buzz-onboarding-runtime-pill-in 180ms cubic-bezier(0.22, 1, 0.36, 1) both; font-size: 0.625rem; letter-spacing: 0; line-height: 1; text-transform: uppercase; transform-origin: top center; will-change: opacity, transform; } .buzz-onboarding-runtime-setup { isolation: isolate; position: relative; } .buzz-onboarding-runtime-setup[data-setup-flash="true"] { animation: buzz-onboarding-runtime-setup-bump 560ms cubic-bezier(0.22, 1, 0.36, 1) both; transform-origin: center; will-change: transform; } .buzz-onboarding-runtime-setup[data-setup-flash="true"]::after { animation: buzz-onboarding-runtime-setup-ring 560ms cubic-bezier(0.22, 1, 0.36, 1) both; border: 1px solid var(--buzz-welcome-chartreuse); border-radius: inherit; content: ""; inset: -0.25rem; opacity: 0; pointer-events: none; position: absolute; transform: scale(0.9); will-change: opacity, transform; } @keyframes buzz-onboarding-runtime-pill-in { from { opacity: 0; transform: translateY(-0.25rem) scale(0.94); } to { opacity: 1; transform: translateY(0) scale(1); } } @keyframes buzz-onboarding-runtime-setup-bump { 0%, 100% { transform: translateZ(0) scale(1); } 35% { transform: translateZ(0) scale(1.06); } 70% { transform: translateZ(0) scale(0.99); } } @keyframes buzz-onboarding-runtime-setup-ring { 0% { opacity: 0; transform: scale(0.9); } 28% { opacity: 0.55; transform: scale(1); } 100% { opacity: 0; transform: scale(1.28); } } @keyframes buzz-onboarding-caret-blink { 0%, 55% { opacity: 1; } 56%, 100% { opacity: 0; } } @keyframes buzz-onboarding-fade-in { from { opacity: 0; } to { opacity: 1; } } @keyframes buzz-onboarding-line-slide-forward { from { opacity: 0; transform: translateX(48px); } to { opacity: 1; transform: translateX(0); } } @keyframes buzz-onboarding-line-slide-backward { from { opacity: 0; transform: translateX(-48px); } to { opacity: 1; transform: translateX(0); } } @keyframes buzz-onboarding-mask-reveal-up { from { filter: blur(8px); opacity: 0; transform: translate3d(0, 30px, 0) scale(0.985); } 56% { filter: blur(2px); opacity: 0.86; } to { filter: blur(0); opacity: 1; transform: translate3d(0, 0, 0) scale(1); } } @keyframes buzz-onboarding-mask-reveal-down { from { filter: blur(8px); opacity: 0; transform: translate3d(0, -30px, 0) scale(0.985); } 56% { filter: blur(2px); opacity: 0.86; } to { filter: blur(0); opacity: 1; transform: translate3d(0, 0, 0) scale(1); } } @media (prefers-reduced-motion: reduce) { .buzz-onboarding-runtime-check, .buzz-onboarding-runtime-checkmark { transition: none; } .buzz-onboarding-runtime-pill { animation: none; will-change: auto; } .buzz-onboarding-runtime-setup[data-setup-flash="true"] { animation: none; outline: 2px solid var(--buzz-welcome-chartreuse); outline-offset: 2px; will-change: auto; } .buzz-onboarding-runtime-setup[data-setup-flash="true"]::after { animation: none; content: none; will-change: auto; } } @media (max-width: 640px) { @keyframes buzz-onboarding-line-slide-forward { from { opacity: 0; transform: translateX(24px); } to { opacity: 1; transform: translateX(0); } } @keyframes buzz-onboarding-line-slide-backward { from { opacity: 0; transform: translateX(-24px); } to { opacity: 1; transform: translateX(0); } } } @media (prefers-reduced-motion: reduce) { .buzz-onboarding-transition-content { animation: none; filter: none; opacity: 1; transform: none; } .buzz-onboarding-name-placeholder-caret { animation: none; } } }