Fooocus/css/style.css

1155 lines
23 KiB
CSS

/* based on https://github.com/AUTOMATIC1111/stable-diffusion-webui/blob/v1.6.0/style.css */
.loader-container {
display: flex; /* Use flex to align items horizontally */
align-items: center; /* Center items vertically within the container */
white-space: nowrap; /* Prevent line breaks within the container */
}
.loader {
border: 8px solid #f3f3f3; /* Light grey */
border-top: 8px solid #3498db; /* Blue */
border-radius: 50%;
width: 30px;
height: 30px;
animation: spin 2s linear infinite;
}
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
/* Style the progress bar */
progress {
appearance: none; /* Remove default styling */
height: 20px; /* Set the height of the progress bar */
border-radius: 5px; /* Round the corners of the progress bar */
background-color: #f3f3f3; /* Light grey background */
width: 100%;
vertical-align: middle !important;
}
/* Style the progress bar container */
.progress-container {
margin-left: 20px;
margin-right: 20px;
flex-grow: 1; /* Allow the progress container to take up remaining space */
}
/* Set the color of the progress bar fill */
progress::-webkit-progress-value {
background-color: #3498db; /* Blue color for the fill */
}
progress::-moz-progress-bar {
background-color: #3498db; /* Blue color for the fill in Firefox */
}
/* Style the text on the progress bar */
progress::after {
content: attr(value '%'); /* Display the progress value followed by '%' */
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
color: white; /* Set text color */
font-size: 14px; /* Set font size */
}
/* Style other texts */
.loader-container > span {
margin-left: 5px; /* Add spacing between the progress bar and the text */
}
.progress-bar > .generating {
display: none !important;
}
.progress-bar{
height: 30px !important;
}
.progress-bar span {
text-align: right;
width: 215px;
}
div:has(> #positive_prompt) {
border: none;
}
#positive_prompt {
padding: 1px;
background: var(--background-fill-primary);
}
.type_row {
height: 84px !important;
}
.type_row_half {
height: 34px !important;
}
.refresh_button {
border: none !important;
background: none !important;
font-size: none !important;
box-shadow: none !important;
}
.advanced_check_row {
width: 100% !important;
max-width: 400px !important;
}
.min_check {
min-width: min(1px, 100%) !important;
}
.resizable_area {
resize: vertical;
overflow: auto !important;
}
.aspect_ratios label {
flex: calc(50% - 5px) !important;
}
.aspect_ratios label span {
white-space: nowrap !important;
}
.aspect_ratios label input {
margin-left: -5px !important;
}
.lora_enable label {
height: 100%;
}
.lora_enable label input {
margin: auto;
}
.lora_enable label span {
display: none;
}
@-moz-document url-prefix() {
.lora_weight input[type=number] {
width: 80px;
}
}
#context-menu{
z-index:9999;
position:absolute;
display:block;
padding:0px 0;
border:2px solid #a55000;
border-radius:8px;
box-shadow:1px 1px 2px #CE6400;
width: 200px;
}
.context-menu-items{
list-style: none;
margin: 0;
padding: 0;
}
.context-menu-items a{
display:block;
padding:5px;
cursor:pointer;
}
.context-menu-items a:hover{
background: #a55000;
}
.canvas-tooltip-info {
position: absolute;
top: 28px;
left: 2px;
cursor: help;
background-color: rgba(0, 0, 0, 0.3);
width: 20px;
height: 20px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
z-index: 100;
}
.canvas-tooltip-info::after {
content: '';
display: block;
width: 2px;
height: 7px;
background-color: white;
margin-top: 2px;
}
.canvas-tooltip-info::before {
content: '';
display: block;
width: 2px;
height: 2px;
background-color: white;
}
.canvas-tooltip-content {
display: none;
background-color: #f9f9f9;
color: #333;
border: 1px solid #ddd;
padding: 15px;
position: absolute;
top: 40px;
left: 10px;
width: 250px;
font-size: 16px;
opacity: 0;
border-radius: 8px;
box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);
z-index: 100;
}
.canvas-tooltip:hover .canvas-tooltip-content {
display: block;
animation: fadeIn 0.5s;
opacity: 1;
}
@keyframes fadeIn {
from {opacity: 0;}
to {opacity: 1;}
}
.styler {
overflow:inherit !important;
}
.gradio-container{
overflow: visible;
max-width: none !important;
width: 100% !important;
}
/* Ensure full width utilization */
.gradio-container .contain {
max-width: none !important;
width: 100% !important;
padding: 0 1rem !important;
}
/* Make main layout responsive and full width */
.gradio-container .block {
width: 100% !important;
max-width: none !important;
}
/* Ensure rows use full width */
.gradio-container .row {
width: 100% !important;
gap: 1rem !important;
}
/* Optimize for full viewport width */
body {
margin: 0 !important;
padding: 0 !important;
}
.gradio-container {
min-width: 100vw !important;
}
/* fullpage image viewer */
#lightboxModal{
display: none;
position: fixed;
z-index: 1001;
left: 0;
top: 0;
width: 100%;
height: 100%;
overflow: auto;
background-color: rgba(20, 20, 20, 0.95);
user-select: none;
-webkit-user-select: none;
flex-direction: column;
}
.modalControls {
display: flex;
position: absolute;
right: 0px;
left: 0px;
gap: 1em;
padding: 1em;
background-color:rgba(0,0,0,0);
z-index: 1;
transition: 0.2s ease background-color;
}
.modalControls:hover {
background-color:rgba(0,0,0,0.9);
}
.modalClose {
margin-left: auto;
}
.modalControls span{
color: white;
text-shadow: 0px 0px 0.25em black;
font-size: 35px;
font-weight: bold;
cursor: pointer;
width: 1em;
}
.modalControls span:hover, .modalControls span:focus{
color: #999;
text-decoration: none;
}
#lightboxModal > img {
display: block;
margin: auto;
width: auto;
}
#lightboxModal > img.modalImageFullscreen{
object-fit: contain;
height: 100%;
width: 100%;
min-height: 0;
}
.modalPrev,
.modalNext {
cursor: pointer;
position: absolute;
top: 50%;
width: auto;
padding: 16px;
margin-top: -50px;
color: white;
font-weight: bold;
font-size: 20px;
transition: 0.6s ease;
border-radius: 0 3px 3px 0;
user-select: none;
-webkit-user-select: none;
}
.modalNext {
right: 0;
border-radius: 3px 0 0 3px;
}
.modalPrev:hover,
.modalNext:hover {
background-color: rgba(0, 0, 0, 0.8);
}
#imageARPreview {
position: absolute;
top: 0px;
left: 0px;
border: 2px solid red;
background: rgba(255, 0, 0, 0.3);
z-index: 900;
pointer-events: none;
display: none;
}
#stylePreviewOverlay {
opacity: 0;
pointer-events: none;
width: 128px;
height: 128px;
position: fixed;
top: 0px;
left: 0px;
border: solid 1px lightgrey;
transform: translate(-140px, 20px);
background-size: cover;
background-position: center;
background-color: rgba(0, 0, 0, 0.3);
border-radius: 5px;
z-index: 100;
transition: transform 0.1s ease, opacity 0.3s ease;
}
#stylePreviewOverlay.lower-half {
transform: translate(-140px, -140px);
}
/* scrollable box for style selections */
.contain .tabs {
height: 100%;
}
.contain .tabs .tabitem.style_selections_tab {
height: 100%;
}
.contain .tabs .tabitem.style_selections_tab > div:first-child {
height: 100%;
}
.contain .tabs .tabitem.style_selections_tab .style_selections {
min-height: 200px;
height: 100%;
}
.contain .tabs .tabitem.style_selections_tab .style_selections .wrap[data-testid="checkbox-group"] {
position: absolute; /* remove this to disable scrolling within the checkbox-group */
overflow: auto;
padding-right: 2px;
max-height: 100%;
}
.contain .tabs .tabitem.style_selections_tab .style_selections .wrap[data-testid="checkbox-group"] label {
/* max-width: calc(35% - 15px) !important; */ /* add this to enable 3 columns layout */
flex: calc(50% - 5px) !important;
}
.contain .tabs .tabitem.style_selections_tab .style_selections .wrap[data-testid="checkbox-group"] label span {
/* white-space:nowrap; */ /* add this to disable text wrapping (better choice for 3 columns layout) */
overflow: hidden;
text-overflow: ellipsis;
}
/* styles preview tooltip */
.preview-tooltip {
background-color: #fff8;
font-family: monospace;
text-align: center;
border-radius: 5px 5px 0px 0px;
display: none; /* remove this to enable tooltip in preview image */
}
#inpaint_canvas .canvas-tooltip-info {
top: 2px;
}
#inpaint_brush_color input[type=color]{
background: none;
}
/* =============================================================================
Configuration Section Styles
============================================================================= */
/* Configuration section accordions */
.config-section {
margin-bottom: 10px !important;
}
.config-section .label-wrap {
padding: 10px 15px !important;
background: var(--background-fill-secondary) !important;
border-radius: 8px !important;
}
.config-section .label-wrap:hover {
background: var(--background-fill-tertiary) !important;
}
/* Configuration labels */
.config-label {
display: block;
font-weight: 500;
margin-bottom: 8px;
color: var(--body-text-color);
font-size: 0.95em;
}
/* Folder display table */
.folder-display {
max-height: 150px;
overflow-y: auto;
border-radius: 6px;
margin-bottom: 10px;
}
.folder-display table {
width: 100%;
border-collapse: collapse;
}
.folder-display td {
padding: 8px 12px;
border-bottom: 1px solid var(--border-color-primary);
font-family: monospace;
font-size: 0.9em;
}
.folder-display tr:last-child td {
border-bottom: none;
}
/* Folder buttons */
.folder-btn {
min-width: 80px !important;
}
/* Reset buttons */
.reset-btn {
min-width: 100px !important;
background: var(--button-secondary-background-fill) !important;
}
.reset-btn:hover {
background: var(--button-secondary-background-fill-hover) !important;
}
.reset-btn-mini {
min-width: 40px !important;
max-width: 40px !important;
padding: 0 8px !important;
background: var(--button-secondary-background-fill) !important;
font-size: 1.1em !important;
}
.reset-btn-mini:hover {
background: var(--button-secondary-background-fill-hover) !important;
}
/* Config styles checkbox group */
.config-styles {
max-height: 250px;
overflow-y: auto;
padding: 10px;
border: 1px solid var(--border-color-primary);
border-radius: 8px;
}
.config-styles label {
flex: calc(50% - 10px) !important;
margin: 4px !important;
}
/* Configuration status message */
.config-status {
margin-top: 10px;
padding: 10px;
border-radius: 6px;
}
/* Row with reset button */
.config-row-with-reset {
display: flex;
align-items: flex-end;
gap: 10px;
}
.config-row-with-reset > div:first-child {
flex: 1;
}
/* Responsive adjustments for config section */
@media (max-width: 768px) {
.reset-btn-mini {
min-width: 36px !important;
max-width: 36px !important;
}
.folder-btn {
min-width: 60px !important;
}
.reset-btn {
min-width: 80px !important;
}
}
/* Highlight effect for changed settings */
.config-changed {
border-left: 3px solid var(--color-accent) !important;
padding-left: 10px !important;
}
/* Tooltip for reset buttons */
.reset-btn[title], .reset-btn-mini[title] {
cursor: help;
}
/* Group styling in config sections */
.config-section .gr-group {
margin-bottom: 15px;
padding: 12px;
border: 1px solid var(--border-color-primary);
border-radius: 8px;
background: var(--background-fill-primary);
}
/* Better spacing for config inputs */
.config-section input[type="text"],
.config-section select,
.config-section .gradio-dropdown {
margin-bottom: 5px;
}
/* Save/Restore buttons area */
.config-actions {
display: flex;
justify-content: flex-end;
gap: 15px;
margin-top: 20px;
padding-top: 15px;
border-top: 1px solid var(--border-color-primary);
}
/* =============================================================================
Style Manager Styles
============================================================================= */
/* Modify Styles button */
.modify-styles-btn {
margin-top: 10px;
width: 100%;
}
/* Style Editor Panel */
.style-editor-panel {
margin-top: 15px;
padding: 15px;
border: 1px solid var(--border-color-primary);
border-radius: 8px;
background: var(--background-fill-secondary);
}
.style-editor-panel h4 {
margin-top: 0;
margin-bottom: 15px;
color: var(--body-text-color);
font-size: 1em;
}
/* Style editor dropdown */
.style-editor-panel .gradio-dropdown {
margin-bottom: 10px;
}
/* Style editor textboxes */
.style-editor-panel textarea {
font-family: monospace;
font-size: 0.9em;
}
/* Style type indicator */
.style-editor-panel .style-type-indicator {
margin-bottom: 10px;
padding: 5px 10px;
border-radius: 4px;
font-size: 0.85em;
}
/* Style type badges */
.style-type-badge {
display: inline-block;
padding: 2px 8px;
border-radius: 4px;
font-size: 0.8em;
font-weight: 500;
margin-left: 8px;
}
.style-type-system {
background: var(--background-fill-tertiary);
color: var(--body-text-color);
}
.style-type-user {
background: var(--color-accent);
color: white;
}
/* Style list container */
.style-list-container {
max-height: 400px;
overflow-y: auto;
padding-right: 5px;
}
/* Style item in list */
.style-item {
display: flex;
align-items: center;
padding: 8px 12px;
margin-bottom: 4px;
background: var(--background-fill-primary);
border-radius: 6px;
cursor: pointer;
transition: background 0.2s ease;
}
.style-item:hover {
background: var(--background-fill-secondary);
}
.style-item.selected {
background: var(--background-fill-tertiary);
border-left: 3px solid var(--color-accent);
}
.style-item-name {
flex: 1;
font-weight: 500;
}
.style-item-type {
font-size: 0.75em;
padding: 2px 6px;
border-radius: 3px;
background: var(--background-fill-tertiary);
}
/* Prompt template highlight */
.prompt-template-highlight {
background: rgba(255, 193, 7, 0.3);
padding: 0 2px;
border-radius: 2px;
}
/* =============================================================================
Image Library Styles
============================================================================= */
/* Open Library Button */
.open-library-btn {
margin-top: 10px;
margin-bottom: 10px;
}
/* Library Modal Overlay - Gradio handles display via visible prop */
#image_library_modal {
position: fixed !important;
top: 0 !important;
left: 0 !important;
width: 100vw !important;
height: 100vh !important;
background: rgba(0, 0, 0, 0.85) !important;
z-index: 9999 !important;
padding: 10px !important;
box-sizing: border-box !important;
}
/* Flex centering when visible */
#image_library_modal .gradio-group {
display: flex !important;
align-items: stretch !important;
justify-content: center !important;
width: 100% !important;
height: 100% !important;
}
/* Library Modal Content */
.library-modal-content {
background: var(--background-fill-primary) !important;
border-radius: 12px !important;
width: 98vw !important;
max-width: 98vw !important;
height: calc(100vh - 20px) !important;
max-height: calc(100vh - 20px) !important;
display: flex !important;
flex-direction: column !important;
padding: 15px !important;
box-shadow: 0 10px 40px rgba(0, 0, 0, 0.5) !important;
border: 1px solid var(--border-color-primary) !important;
overflow: hidden !important;
}
/* Library Modal Header */
.library-modal-header {
display: flex !important;
justify-content: space-between !important;
align-items: center !important;
margin-bottom: 10px !important;
padding-bottom: 8px !important;
border-bottom: 1px solid var(--border-color-primary) !important;
flex-shrink: 0 !important;
}
.library-modal-header h2 {
margin: 0 !important;
color: var(--body-text-color) !important;
font-size: 1.3em !important;
}
/* Close Button */
.library-close-btn {
width: 36px !important;
height: 36px !important;
min-width: 36px !important;
border-radius: 50% !important;
font-size: 22px !important;
line-height: 1 !important;
padding: 0 !important;
background: var(--background-fill-secondary) !important;
border: 1px solid var(--border-color-primary) !important;
cursor: pointer !important;
}
.library-close-btn:hover {
background: var(--color-accent) !important;
color: white !important;
}
/* Left panel - navigation */
.library-left-panel {
display: flex !important;
flex-direction: column !important;
height: 100% !important;
padding-right: 10px !important;
border-right: 1px solid var(--border-color-primary) !important;
overflow: hidden !important;
}
/* Right panel - preview */
.library-right-panel {
display: flex !important;
flex-direction: column !important;
height: 100% !important;
padding-left: 10px !important;
overflow-y: auto !important;
max-height: calc(100vh - 100px) !important;
}
/* Refresh button */
.library-refresh-btn {
margin-bottom: 10px !important;
}
/* Column slider */
#library_column_slider {
min-width: 100px !important;
}
/* Image Library Gallery - fill available space */
#library_gallery {
flex: 1 !important;
min-height: 0 !important;
overflow-y: auto !important;
}
/* Hide gallery built-in preview when clicking */
#library_gallery .preview {
display: none !important;
}
/* Library gallery thumbnails */
#library_gallery .thumbnail-item {
cursor: pointer;
transition: transform 0.2s ease, box-shadow 0.2s ease;
}
#library_gallery .thumbnail-item:hover {
transform: scale(1.02);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
}
/* Preview image - fit within panel */
#library_preview_image {
flex-shrink: 0 !important;
max-height: 50vh !important;
width: 100% !important;
object-fit: contain !important;
}
#library_preview_image img {
max-height: 50vh !important;
object-fit: contain !important;
}
/* Image metadata display - scrollable */
#library_image_info {
max-height: 150px !important;
overflow-y: auto !important;
font-family: monospace;
font-size: 0.85em;
flex-shrink: 0 !important;
}
#library_image_info pre {
white-space: pre-wrap;
word-wrap: break-word;
}
/* Tags input styling */
#image_tags {
margin-top: 5px;
margin-bottom: 5px;
}
#library_edit_tags {
margin-top: 10px;
}
/* Library action buttons */
.library-action-btn {
margin-top: 5px;
}
/* Tag badges in metadata */
.tag-badge {
display: inline-block;
padding: 2px 8px;
margin: 2px;
background: var(--color-accent);
color: white;
border-radius: 12px;
font-size: 0.8em;
}
/* Library empty state */
.library-empty {
text-align: center;
padding: 40px;
color: var(--body-text-color-subdued);
}
/* Library loading state */
.library-loading {
text-align: center;
padding: 40px;
color: var(--body-text-color-subdued);
}
/* Image details panel */
.image-details-panel {
background: var(--background-fill-secondary);
border-radius: 8px;
padding: 15px;
margin-top: 10px;
}
.image-details-panel h4 {
margin-top: 0;
margin-bottom: 10px;
color: var(--body-text-color);
}
/* Metadata key-value display */
.metadata-row {
display: flex;
padding: 4px 0;
border-bottom: 1px solid var(--border-color-primary);
}
.metadata-row:last-child {
border-bottom: none;
}
.metadata-key {
flex: 0 0 120px;
font-weight: 500;
color: var(--body-text-color);
}
.metadata-value {
flex: 1;
color: var(--body-text-color);
word-break: break-word;
}
/* Responsive adjustments for library */
@media (max-width: 768px) {
#library_gallery {
min-height: 300px;
}
#library_image_info {
max-height: 200px;
}
.metadata-key {
flex: 0 0 80px;
font-size: 0.9em;
}
}
/* =============================================================================
Multiselect Mode Styles
============================================================================= */
/* Multiselect mode checkbox */
#library_multiselect_mode {
margin-top: 10px;
}
#library_multiselect_mode label {
font-weight: 500;
cursor: pointer;
}
/* Selected count badge */
.selected-count-badge {
display: inline-block;
padding: 4px 12px;
background: var(--color-accent);
color: white;
border-radius: 16px;
font-size: 0.9em;
font-weight: 500;
margin-left: 10px;
}
/* Delete selected button */
.delete-selected-btn {
background: #dc3545 !important;
color: white !important;
border: none !important;
}
.delete-selected-btn:hover {
background: #c82333 !important;
}
/* Selected image indicator in gallery */
#library_gallery .thumbnail-item.selected {
outline: 3px solid var(--color-accent) !important;
outline-offset: 2px;
}
/* Multiselect mode gallery cursor */
#library_gallery.multiselect-mode .thumbnail-item {
cursor: crosshair;
}
/* Selection overlay for thumbnails */
#library_gallery .thumbnail-item::after {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: transparent;
pointer-events: none;
transition: background 0.2s ease;
}
#library_gallery .thumbnail-item.selected::after {
background: rgba(var(--color-accent-rgb, 52, 152, 219), 0.3);
}
/* Checkbox for all images - always visible */
#library_gallery .thumbnail-item::before {
content: '';
position: absolute;
top: 5px;
right: 5px;
width: 20px;
height: 20px;
background: rgba(255, 255, 255, 0.9);
border: 2px solid var(--border-color-primary);
border-radius: 4px;
z-index: 10;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
transition: all 0.2s ease;
pointer-events: none;
}
/* Checkbox hover state */
#library_gallery .thumbnail-item:hover::before {
border-color: var(--color-accent);
background: rgba(255, 255, 255, 1);
}
/* Checked state - show checkmark */
#library_gallery .thumbnail-item.selected::before {
content: '✓';
background: var(--color-accent);
border-color: var(--color-accent);
color: white;
display: flex;
align-items: center;
justify-content: center;
font-size: 12px;
font-weight: bold;
}
/* Actual checkbox element (positioned on top of ::before) */
#library_gallery .library-checkbox {
position: absolute;
top: 5px;
right: 5px;
width: 20px;
height: 20px;
z-index: 15;
cursor: pointer;
border-radius: 4px;
}
#library_gallery .library-checkbox .checkmark {
display: none;
}
/* Selected images list panel */
.selected-images-list {
max-height: 200px;
overflow-y: auto;
background: var(--background-fill-secondary);
border-radius: 8px;
padding: 10px;
margin-top: 10px;
border: 1px solid var(--border-color-primary);
}
.selected-images-list:empty {
display: none;
}
.selected-image-item {
display: flex;
align-items: center;
padding: 6px 10px;
margin-bottom: 4px;
background: var(--background-fill-primary);
border-radius: 4px;
font-size: 0.85em;
}
.selected-image-item:last-child {
margin-bottom: 0;
}
.selected-image-name {
flex: 1;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.selected-image-remove {
width: 20px;
height: 20px;
min-width: 20px;
border-radius: 50%;
background: var(--button-secondary-background-fill);
border: none;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
font-size: 14px;
margin-left: 8px;
padding: 0;
}
.selected-image-remove:hover {
background: #dc3545;
color: white;
}