openhands / src /tailwind.css
SaylorTwift's picture
SaylorTwift HF Staff
Add files using upload-large-folder tool
c0af099 verified
Raw
History Blame Contribute Delete
17.7 kB
@import "tailwindcss";
@plugin '../hero.ts';
@config "../tailwind.config.js";
@source '../node_modules/@heroui/theme/dist/**/*.{js,ts,jsx,tsx}';
@plugin 'tailwind-scrollbar' {
nocompatible: true;
preferredstrategy: "pseudoelements";
}
@theme inline {
--color-primary: var(--oh-color-primary);
--color-logo: var(--oh-color-logo);
--color-base: var(--oh-color-base);
--color-base-secondary: var(--oh-color-base-secondary);
--color-danger: var(--oh-color-danger);
--color-success: var(--oh-color-success);
--color-basic: var(--oh-color-basic);
--color-tertiary: var(--oh-color-tertiary);
--color-tertiary-light: var(--oh-color-tertiary-light);
--color-tertiary-alt: var(--oh-text-dim);
--color-content: var(--oh-color-content);
--color-content-2: var(--oh-color-content-2);
/* Semantic surface aliases */
--color-surface: var(--oh-surface);
--color-surface-raised: var(--oh-surface-raised);
--color-surface-deep: var(--oh-surface-deep);
/* Semantic text aliases */
--color-foreground: var(--oh-foreground);
--color-text-secondary: var(--oh-text-secondary);
--color-text-tertiary: var(--oh-text-tertiary);
--color-muted: var(--oh-muted);
--color-text-dim: var(--oh-text-dim);
--color-text-subtle: var(--oh-text-subtle);
--color-modal-title: var(--oh-modal-title-foreground);
/* Semantic border aliases */
--color-border-input: var(--oh-border-input);
--color-border-subtle: var(--oh-border-subtle);
/* Interactive state aliases */
--color-interactive-hover: var(--oh-interactive-hover);
--color-interactive-hover-low: var(--oh-interactive-hover-low);
--color-interactive-active: var(--oh-interactive-active);
/* Cool Grey scale */
--color-cool-grey-50: var(--cool-grey-50);
--color-cool-grey-100: var(--cool-grey-100);
--color-cool-grey-200: var(--cool-grey-200);
--color-cool-grey-300: var(--cool-grey-300);
--color-cool-grey-400: var(--cool-grey-400);
--color-cool-grey-500: var(--cool-grey-500);
--color-cool-grey-600: var(--cool-grey-600);
--color-cool-grey-700: var(--cool-grey-700);
--color-cool-grey-800: var(--cool-grey-800);
--color-cool-grey-900: var(--cool-grey-900);
--color-cool-grey-925: var(--cool-grey-925);
--color-cool-grey-950: var(--cool-grey-950);
--color-cool-grey-975: var(--cool-grey-975);
}
:root {
color-scheme: dark;
--oh-color-primary: #c9b974;
--oh-color-logo: #cfb755;
--oh-color-base: var(--cool-grey-950);
--oh-color-base-secondary: var(--cool-grey-925);
--oh-color-danger: #e76a5e;
--oh-color-success: #a5e75e;
--oh-color-basic: var(--cool-grey-400);
--oh-color-tertiary: var(--cool-grey-800);
--oh-color-tertiary-light: var(--cool-grey-300);
--oh-color-content: var(--cool-grey-100);
--oh-color-content-2: var(--cool-grey-50);
--oh-background: var(--cool-grey-950);
--oh-foreground: var(--cool-grey-100);
--oh-surface: var(--cool-grey-925);
--oh-surface-foreground: var(--cool-grey-100);
--oh-surface-raised: var(--cool-grey-900); /* elevated within a panel */
--oh-surface-deep: var(--cool-grey-975); /* deep inset, context menus */
--oh-overlay: var(--cool-grey-925);
--oh-overlay-foreground: var(--cool-grey-100);
--oh-modal-title-foreground: #ffffff;
--oh-muted: var(--cool-grey-400);
--oh-text-secondary: var(--cool-grey-300); /* readable secondary text */
--oh-text-tertiary: var(--cool-grey-200); /* tertiary, slightly dimmer */
--oh-text-dim: var(--cool-grey-500); /* placeholders, very muted */
--oh-text-subtle: var(--cool-grey-600); /* subtle labels, breadcrumbs */
--oh-interactive-hover: var(--cool-grey-700); /* hover on mid surfaces (800 bg) */
--oh-interactive-hover-low: var(--cool-grey-900); /* hover on dark base (950 bg) */
--oh-interactive-active: var(--cool-grey-800); /* selected/active on dark base */
--oh-interactive-selected: var(--cool-grey-600); /* selected within a panel (on 800/925 bg) */
--oh-scrollbar: color-mix(in srgb, var(--cool-grey-400) 30%, transparent);
--oh-scrollbar-hover: color-mix(in srgb, var(--cool-grey-400) 50%, transparent);
--oh-default: var(--cool-grey-800);
--oh-default-foreground: var(--cool-grey-100);
--oh-accent: #c9b974;
--oh-accent-foreground: var(--cool-grey-950);
--oh-success: #a5e75e;
--oh-success-foreground: var(--cool-grey-950);
--oh-warning: #c9b974;
--oh-warning-foreground: var(--cool-grey-950);
--oh-danger: #e76a5e;
--oh-danger-foreground: var(--cool-grey-50);
--oh-segment: var(--cool-grey-925);
--oh-segment-foreground: var(--cool-grey-100);
--oh-border-width: 1px;
--oh-field-border-width: 1px;
--oh-border: var(--cool-grey-700);
--oh-border-input: var(--cool-grey-700); /* unified with --oh-border; same stroke weight everywhere */
--oh-border-subtle: var(--cool-grey-800); /* within-panel separators, list dividers */
--oh-separator: rgba(113, 120, 136, 0.5);
--oh-focus: #ffffff;
--oh-status-success: #1FBD53;
--oh-status-error: #FF684E;
--oh-link: var(--cool-grey-100);
--oh-radius: 8px;
--oh-field-radius: 8px;
--oh-surface-shadow: none;
--oh-overlay-shadow: none;
--oh-field-shadow: none;
--background: var(--oh-background);
--foreground: var(--oh-foreground);
--surface: var(--oh-surface);
--surface-raised: var(--oh-surface-raised);
--surface-deep: var(--oh-surface-deep);
--surface-foreground: var(--oh-surface-foreground);
--overlay: var(--oh-overlay);
--overlay-foreground: var(--oh-overlay-foreground);
--muted: var(--oh-muted);
--scrollbar: var(--oh-scrollbar);
--default: var(--oh-default);
--default-foreground: var(--oh-default-foreground);
--accent: var(--oh-accent);
--accent-foreground: var(--oh-accent-foreground);
--success: var(--oh-success);
--success-foreground: var(--oh-success-foreground);
--warning: var(--oh-warning);
--warning-foreground: var(--oh-warning-foreground);
--danger: var(--oh-danger);
--danger-foreground: var(--oh-danger-foreground);
--segment: var(--oh-segment);
--segment-foreground: var(--oh-segment-foreground);
--border-width: var(--oh-border-width);
--field-border-width: var(--oh-field-border-width);
--border: var(--oh-border);
--separator: var(--oh-separator);
--focus: var(--oh-focus);
--link: var(--oh-link);
--radius: var(--oh-radius);
--field-radius: var(--oh-field-radius);
--surface-shadow: var(--oh-surface-shadow);
--overlay-shadow: var(--oh-overlay-shadow);
--field-shadow: var(--oh-field-shadow);
}
@layer base {
button:not(:disabled),
[role="button"]:not([aria-disabled="true"]) {
cursor: pointer;
}
}
/* Skills / MCP / Automations tiles: no border at rest; hover/focus-visible only. */
.extension-module-card-interactive {
cursor: pointer;
border: 1px solid transparent;
outline: none;
box-shadow: none;
transition: border-color 150ms;
-webkit-tap-highlight-color: transparent;
}
button.extension-module-card-interactive {
appearance: none;
}
.extension-module-card-interactive:hover {
border-color: rgb(255 255 255 / 0.4);
}
.extension-module-card-interactive:focus {
outline: none;
box-shadow: none;
}
.extension-module-card-interactive:focus:not(:focus-visible) {
border-color: transparent;
}
.extension-module-card-interactive:focus-visible {
outline: none;
border-color: rgb(255 255 255 / 0.4);
}
.button-base {
@apply bg-tertiary border border-[var(--oh-border)] rounded-xs;
}
.skeleton {
@apply rounded-md animate-pulse motion-reduce:animate-none;
background-color: var(--oh-interactive-active);
}
.skeleton-round {
@apply rounded-full animate-pulse motion-reduce:animate-none;
background-color: var(--oh-interactive-active);
}
/**
* Stagger pulse in a 3-step wave for sibling groups (same rhythm as the
* conversation list loading rows).
*/
.skeleton-stagger > :nth-child(3n + 1) .skeleton,
.skeleton-stagger > :nth-child(3n + 1) .skeleton-round,
.skeleton-stagger > :nth-child(3n + 1).skeleton,
.skeleton-stagger > :nth-child(3n + 1).skeleton-round {
animation-delay: 0ms;
}
.skeleton-stagger > :nth-child(3n + 2) .skeleton,
.skeleton-stagger > :nth-child(3n + 2) .skeleton-round,
.skeleton-stagger > :nth-child(3n + 2).skeleton,
.skeleton-stagger > :nth-child(3n + 2).skeleton-round {
animation-delay: 180ms;
}
.skeleton-stagger > :nth-child(3n + 3) .skeleton,
.skeleton-stagger > :nth-child(3n + 3) .skeleton-round,
.skeleton-stagger > :nth-child(3n + 3).skeleton,
.skeleton-stagger > :nth-child(3n + 3).skeleton-round {
animation-delay: 360ms;
}
.heading {
@apply text-[28px] leading-8 -tracking-[0.02em] font-bold text-content-2;
}
/* Custom Chat Input */
.custom-scrollbar::-webkit-scrollbar {
width: 6px;
height: 6px;
}
.custom-scrollbar::-webkit-scrollbar-track {
background: transparent;
}
/* Hide scrollbar by default */
.custom-scrollbar::-webkit-scrollbar-thumb {
background: transparent;
border-radius: 3px;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
opacity: 0;
}
/* Show scrollbar on hover */
.custom-scrollbar:hover::-webkit-scrollbar-thumb {
background: var(--oh-scrollbar);
opacity: 1;
}
.custom-scrollbar:hover::-webkit-scrollbar-thumb:hover {
background: var(--oh-scrollbar-hover);
}
/* Firefox scrollbar styling */
.custom-scrollbar {
scrollbar-width: thin;
scrollbar-color: transparent transparent;
transition: scrollbar-color 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}
.custom-scrollbar:hover {
scrollbar-color: var(--oh-scrollbar) transparent;
}
/* Always visible scrollbar for chat interface */
.custom-scrollbar-always::-webkit-scrollbar {
width: 6px;
height: 6px;
}
.custom-scrollbar-always::-webkit-scrollbar-track {
background: transparent;
}
.custom-scrollbar-always::-webkit-scrollbar-thumb {
background: var(--oh-scrollbar);
border-radius: 3px;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}
.custom-scrollbar-always::-webkit-scrollbar-thumb:hover {
background: var(--oh-scrollbar-hover);
}
/* Firefox scrollbar styling for always visible */
.custom-scrollbar-always {
scrollbar-width: thin;
scrollbar-color: var(--oh-scrollbar) transparent;
}
/*
* Sidebar conversation list: reserve a stable gutter so short lists keep the
* same right inset as when a vertical scrollbar is present (aligns with nav).
*/
.conversation-panel-list-scroll {
scrollbar-gutter: stable;
}
@supports not (scrollbar-gutter: stable) {
.conversation-panel-list-scroll {
padding-right: 0.5rem;
}
}
/* Custom styles for contenteditable */
.chat-input:empty:before {
content: attr(data-placeholder);
color: var(--cool-grey-400);
pointer-events: none;
font-size: 16px;
font-weight: 400;
line-height: 20px;
}
.chat-input:focus {
outline: none;
}
.chat-input {
word-break: break-word;
overflow-wrap: anywhere;
white-space: pre-wrap;
width: 100%;
box-sizing: border-box;
}
/* Drag and drop styles */
.drag-over {
backdrop-filter: blur(2px);
background: rgba(255, 255, 255, 0.5);
border-radius: 15px;
height: 100%;
left: 0;
position: absolute;
top: 0;
width: 100%;
z-index: 100;
}
.drag-over-content-wrapper {
align-items: center;
display: flex;
flex-direction: column;
height: 100%;
justify-content: center;
left: 0;
position: absolute;
width: 100%;
z-index: 100;
padding-top: 2rem;
}
.drag-over-ui-content {
font-size: 16px;
font-weight: 400;
line-height: 20px;
color: #fff;
}
/* File preview styles */
.file-preview {
background: rgba(208, 217, 250, 0.1);
border: 1px solid rgba(208, 217, 250, 0.3);
border-radius: 8px;
padding: 8px;
margin: 4px 0;
display: flex;
align-items: center;
gap: 8px;
font-size: 12px;
color: var(--cool-grey-200);
}
.file-preview .file-icon {
width: 16px;
height: 16px;
flex-shrink: 0;
}
.file-preview .file-name {
flex: 1;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.file-preview .file-size {
color: var(--cool-grey-400);
font-size: 10px;
}
.file-preview .remove-file {
background: rgba(255, 255, 255, 0.1);
border: none;
border-radius: 50%;
width: 16px;
height: 16px;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
color: var(--cool-grey-200);
font-size: 10px;
transition: background-color 0.2s;
}
.file-preview .remove-file:hover {
background: rgba(255, 255, 255, 0.2);
}
.loader {
background: var(--oh-color-primary);
animation: l5 1s infinite linear alternate;
}
@keyframes l5 {
0% {
box-shadow:
20px 0 var(--oh-color-primary),
-20px 0 color-mix(in srgb, var(--oh-color-primary) 10%, transparent);
background: var(--oh-color-primary);
}
33% {
box-shadow:
20px 0 var(--oh-color-primary),
-20px 0 color-mix(in srgb, var(--oh-color-primary) 10%, transparent);
background: color-mix(in srgb, var(--oh-color-primary) 10%, transparent);
}
66% {
box-shadow:
20px 0 color-mix(in srgb, var(--oh-color-primary) 10%, transparent),
-20px 0 var(--oh-color-primary);
background: color-mix(in srgb, var(--oh-color-primary) 10%, transparent);
}
100% {
box-shadow:
20px 0 color-mix(in srgb, var(--oh-color-primary) 10%, transparent),
-20px 0 var(--oh-color-primary);
background: var(--oh-color-primary);
}
}
/* Custom styling for xterm */
/* XTerm.js scrollbar styling - follows custom-scrollbar pattern */
.xterm-viewport::-webkit-scrollbar {
width: 8px;
height: 8px;
}
.xterm-viewport::-webkit-scrollbar-track {
background: transparent;
}
.xterm-viewport::-webkit-scrollbar-thumb {
background: var(--oh-scrollbar);
border-radius: 4px;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
opacity: 1;
}
.xterm-viewport:hover::-webkit-scrollbar-thumb {
background: var(--oh-scrollbar-hover);
opacity: 1;
}
.xterm-viewport::-webkit-scrollbar-thumb:hover {
background: var(--oh-scrollbar-hover);
}
/* Firefox scrollbar styling for xterm */
.xterm-viewport {
scrollbar-width: thin;
scrollbar-color: var(--oh-scrollbar) transparent;
transition: scrollbar-color 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}
.xterm-viewport:hover {
scrollbar-color: var(--oh-scrollbar-hover) transparent;
}
/* Force text wrapping and proper overflow handling for xterm */
.xterm {
word-wrap: break-word;
white-space: pre-wrap;
overflow-wrap: break-word;
max-width: 100%;
background: transparent !important;
box-sizing: border-box !important;
padding: 0 !important;
margin: 0 !important;
}
.xterm-viewport {
overflow-x: hidden !important;
overflow-y: auto !important;
max-width: 100%;
}
.xterm-screen {
word-wrap: break-word;
white-space: pre-wrap;
overflow-wrap: break-word;
max-width: 100%;
}
/* Ensure terminal text doesn't overflow horizontally */
.xterm .xterm-viewport {
overflow-x: hidden !important;
background: transparent !important;
}
.xterm .xterm-screen {
max-width: 100%;
word-break: break-all;
background: transparent !important;
}
/* Ensure all xterm DOM elements have transparent backgrounds. Exclude canvas elements */
.xterm {
background: transparent !important;
}
/* Ensure xterm respects container boundaries */
.xterm-viewport {
box-sizing: border-box !important;
max-width: 100% !important;
width: 100% !important;
}
.xterm-screen {
box-sizing: border-box !important;
max-width: 100% !important;
width: 100% !important;
}
.context-menu-box-shadow {
box-shadow:
0 10px 15px -3px rgba(0, 0, 0, 0.1),
0 4px 6px -2px rgba(0, 0, 0, 0.05),
0 0 0 1px rgba(0, 0, 0, 0.05);
}
.modal-box-shadow {
box-shadow:
0 183px 51px 0 rgba(0, 0, 0, 0),
0 117px 47px 0 rgba(0, 0, 0, 0.01),
0 66px 40px 0 rgba(0, 0, 0, 0.03),
0 29px 29px 0 rgba(0, 0, 0, 0.04),
0 7px 16px 0 rgba(0, 0, 0, 0.05);
}
.table-box-shadow {
box-shadow:
0 26px 7px 0 rgba(0, 0, 0, 0),
0 17px 7px 0 rgba(0, 0, 0, 0.01),
0 9px 6px 0 rgba(0, 0, 0, 0.03),
0 4px 4px 0 rgba(0, 0, 0, 0.04),
0 1px 2px 0 rgba(0, 0, 0, 0.05);
}
.git-external-link-icon {
background: linear-gradient(90deg, rgba(69, 69, 69, 0) 0.35%, var(--cool-grey-800) 41.39%);
}
.api-configuration-modal {
box-shadow:
0 183px 51px 0 rgba(0, 0, 0, 0),
0 117px 47px 0 rgba(0, 0, 0, 0.01),
0 66px 40px 0 rgba(0, 0, 0, 0.03),
0 29px 29px 0 rgba(0, 0, 0, 0.04),
0 7px 16px 0 rgba(0, 0, 0, 0.05);
}
/* Shine text effect for streaming content */
@keyframes shine {
0% {
background-position: 200% 0%;
}
100% {
background-position: -200% 0%;
}
}
.shine-text {
color: transparent;
-webkit-background-clip: text !important;
background-clip: text !important;
animation: shine 2s linear infinite;
background:
radial-gradient(circle at center, rgb(24 24 27 / 85%), transparent) -200%
50% / 200% 100% no-repeat,
var(--cool-grey-50);
}
/* Flowing gradient text used for live agent activity (matches Proton). */
@keyframes gradient-slide {
0% {
background-position: 200% 50%;
}
100% {
background-position: 0% 50%;
}
}
.gradient-flow {
color: transparent;
background-image: linear-gradient(
90deg,
var(--oh-muted) 0%,
var(--oh-foreground) 50%,
var(--oh-muted) 100%
);
background-size: 200% 100%;
background-repeat: repeat-x;
-webkit-background-clip: text;
background-clip: text;
-webkit-text-fill-color: transparent;
animation: gradient-slide 1.25s linear infinite;
}
/* CTA card gradient and shadow */
.cta-card-gradient {
background:
radial-gradient(
85.36% 123.38% at 50% 0%,
rgba(255, 255, 255, 0.14) 0%,
rgba(0, 0, 0, 0) 100%
),
#000000;
box-shadow:
0px 4px 6px -4px rgba(0, 0, 0, 0.1),
0px 10px 15px -3px rgba(0, 0, 0, 0.1);
}