checkpoint

This commit is contained in:
Will Miao
2025-02-19 11:20:26 +08:00
parent 0b260276b2
commit 2f3061ce7c
2 changed files with 51 additions and 34 deletions

View File

@@ -543,7 +543,7 @@ body.modal-open {
opacity: 0.9; opacity: 0.9;
} }
/* Modal Header */ /* Lora Modal Header */
.modal-header { .modal-header {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
@@ -585,6 +585,20 @@ body.modal-open {
word-break: break-word; word-break: break-word;
} }
.info-item.notes {
grid-column: 1 / -1 !important; /* Make notes section full width */
}
/* Add specific styles for notes content */
.info-item.notes .editable-field [contenteditable] {
min-height: 60px; /* Increase height for multiple lines */
max-height: 150px; /* Limit maximum height */
overflow-y: auto; /* Add scrolling for long content */
white-space: pre-wrap; /* Preserve line breaks */
line-height: 1.5; /* Improve readability */
padding: 8px 12px; /* Slightly increase padding */
}
.file-path { .file-path {
font-family: monospace; font-family: monospace;
font-size: 0.9em; font-size: 0.9em;
@@ -659,6 +673,7 @@ body.modal-open {
margin-top: var(--space-1); margin-top: var(--space-1);
} }
/* Update Trigger Words styles */
.trigger-word-tag { .trigger-word-tag {
display: inline-flex; display: inline-flex;
align-items: center; align-items: center;
@@ -671,19 +686,20 @@ body.modal-open {
gap: 6px; gap: 6px;
} }
/* Keep the existing trigger word tag hover and content styles */ /* Update trigger word content color to use theme accent */
.trigger-word-tag:hover {
background: oklch(var(--lora-accent) / 0.1);
border-color: var(--lora-accent);
}
.trigger-word-content { .trigger-word-content {
color: oklch(65% 0.2 256); color: var(--lora-accent) !important; /* Override general span color */
font-size: 0.85em; font-size: 0.85em;
line-height: 1.4; line-height: 1.4;
word-break: break-word; word-break: break-word;
} }
/* Keep the hover effect using accent color */
.trigger-word-tag:hover {
background: oklch(var(--lora-accent) / 0.1);
border-color: var(--lora-accent);
}
.trigger-word-copy { .trigger-word-copy {
display: flex; display: flex;
align-items: center; align-items: center;
@@ -748,12 +764,6 @@ body.modal-open {
font-size: 0.9em; font-size: 0.9em;
} }
/* Adjust info items for the new fields */
.info-item.usage-tips,
.info-item.notes {
grid-column: span 1;
}
@media (max-width: 640px) { @media (max-width: 640px) {
.info-item.usage-tips, .info-item.usage-tips,
.info-item.notes { .info-item.notes {

View File

@@ -12,6 +12,7 @@ export function createLoraCard(lora) {
card.dataset.folder = lora.folder; card.dataset.folder = lora.folder;
card.dataset.modified = lora.modified; card.dataset.modified = lora.modified;
card.dataset.from_civitai = lora.from_civitai; card.dataset.from_civitai = lora.from_civitai;
card.dataset.base_model = lora.base_model;
card.dataset.meta = JSON.stringify(lora.civitai || {}); card.dataset.meta = JSON.stringify(lora.civitai || {});
const version = state.previewVersions.get(lora.file_path); const version = state.previewVersions.get(lora.file_path);
@@ -58,17 +59,18 @@ export function createLoraCard(lora) {
// Main card click event // Main card click event
card.addEventListener('click', () => { card.addEventListener('click', () => {
const meta = JSON.parse(card.dataset.meta || '{}'); const loraMeta = {
if (Object.keys(meta).length) { sha256: card.dataset.sha256,
showLoraModal(meta); file_path: card.dataset.filepath.replace(/[^/]+$/, ''), // Extract directory path
} else { model_name: card.dataset.name,
showToast( file_name: card.dataset.file_name,
card.dataset.from_civitai === 'true' ? folder: card.dataset.folder,
'Click "Fetch" to retrieve metadata' : modified: card.dataset.modified,
'No CivitAI information available', from_civitai: card.dataset.from_civitai === 'true',
'info' base_model: card.dataset.base_model,
); civitai: JSON.parse(card.dataset.meta || '{}')
} };
showLoraModal(loraMeta);
}); });
// Copy button click event // Copy button click event
@@ -108,9 +110,9 @@ export function showLoraModal(lora) {
const content = ` const content = `
<div class="modal-content"> <div class="modal-content">
<header class="modal-header">
<button class="close" onclick="modalManager.closeModal('loraModal')">&times;</button> <button class="close" onclick="modalManager.closeModal('loraModal')">&times;</button>
<h2>${lora.model.name}</h2> <header class="modal-header">
<h2>${lora.model_name}</h2>
<div class="modal-actions"> <div class="modal-actions">
${lora.from_civitai ? ${lora.from_civitai ?
`<button class="fetch-btn" title="Refresh metadata from Civitai"> `<button class="fetch-btn" title="Refresh metadata from Civitai">
@@ -128,7 +130,7 @@ export function showLoraModal(lora) {
<div class="info-grid"> <div class="info-grid">
<div class="info-item"> <div class="info-item">
<label>Version</label> <label>Version</label>
<span>${lora.name || 'N/A'}</span> <span>${lora.civitai.name || 'N/A'}</span>
</div> </div>
<div class="info-item"> <div class="info-item">
<label>File Name</label> <label>File Name</label>
@@ -145,12 +147,13 @@ export function showLoraModal(lora) {
<div class="info-item usage-tips"> <div class="info-item usage-tips">
<label>Usage Tips</label> <label>Usage Tips</label>
<div class="editable-field"> <div class="editable-field">
<div class="usage-tips-content" contenteditable="true" spellcheck="false">${lora.usage_tips || 'Strength: 0.8'}</div> <div class="usage-tips-content" contenteditable="true" spellcheck="false">${lora.usage_tips || 'Save usage tips here..'}</div>
<button class="save-btn" onclick="saveUsageTips('${lora.file_path}')"> <button class="save-btn" onclick="saveUsageTips('${lora.file_path}')">
<i class="fas fa-save"></i> <i class="fas fa-save"></i>
</button> </button>
</div> </div>
</div> </div>
${renderTriggerWords(escapedWords)}
<div class="info-item notes"> <div class="info-item notes">
<label>Additional Notes</label> <label>Additional Notes</label>
<div class="editable-field"> <div class="editable-field">
@@ -160,7 +163,6 @@ export function showLoraModal(lora) {
</button> </button>
</div> </div>
</div> </div>
${renderTriggerWords(escapedWords)}
<div class="info-item full-width"> <div class="info-item full-width">
<label>About this version</label> <label>About this version</label>
<div class="description-text">${lora.description || 'N/A'}</div> <div class="description-text">${lora.description || 'N/A'}</div>
@@ -175,7 +177,7 @@ export function showLoraModal(lora) {
Scroll for more examples Scroll for more examples
</div> </div>
<div class="carousel"> <div class="carousel">
${renderShowcaseImages(lora.images)} ${renderShowcaseImages(lora.civitai.images)}
</div> </div>
</div> </div>
</div> </div>
@@ -192,7 +194,7 @@ function setupEditableFields() {
editableFields.forEach(field => { editableFields.forEach(field => {
field.addEventListener('focus', function() { field.addEventListener('focus', function() {
if (this.textContent === 'Add your notes here...' || if (this.textContent === 'Add your notes here...' ||
this.textContent === 'Strength: 0.8') { this.textContent === 'Save usage tips here..') {
this.textContent = ''; this.textContent = '';
} }
}); });
@@ -200,7 +202,7 @@ function setupEditableFields() {
field.addEventListener('blur', function() { field.addEventListener('blur', function() {
if (this.textContent.trim() === '') { if (this.textContent.trim() === '') {
this.textContent = this.classList.contains('usage-tips-content') this.textContent = this.classList.contains('usage-tips-content')
? 'Strength: 0.8' ? 'Save usage tips here..'
: 'Add your notes here...'; : 'Add your notes here...';
} }
}); });
@@ -246,7 +248,12 @@ async function saveModelMetadata(filePath, data) {
} }
function renderTriggerWords(words) { function renderTriggerWords(words) {
if (!words.length) return ''; if (!words.length) return `
<div class="info-item full-width trigger-words">
<label>Trigger Words</label>
<span>No trigger word needed</span>
</div>
`;
return ` return `
<div class="info-item full-width trigger-words"> <div class="info-item full-width trigger-words">