💬 Commit message: Update 2026-02-14 09:01:09, 7 files, 66 lines
📁 Files changed: 7 📝 Lines changed: 66 • pyproject.toml • screenshot.png • client.ts • GalleryView.vue • SearchView.vue • index.ts • uv.lock
This commit is contained in:
@@ -38,6 +38,11 @@ export async function getLoras(): Promise<{ loras: LoRA[]; total: number }> {
|
||||
}
|
||||
|
||||
// Generation
|
||||
export interface LoraConfig {
|
||||
path: string
|
||||
multiplier: number
|
||||
}
|
||||
|
||||
export interface GenerateParams {
|
||||
prompt: string
|
||||
negative_prompt?: string
|
||||
@@ -47,6 +52,7 @@ export interface GenerateParams {
|
||||
cfg_scale?: number
|
||||
seed?: number
|
||||
save_to_gallery?: boolean
|
||||
lora?: LoraConfig
|
||||
}
|
||||
|
||||
export async function generate(params: GenerateParams): Promise<{ images: GeneratedImage[] }> {
|
||||
|
||||
@@ -98,6 +98,15 @@ onMounted(loadImages)
|
||||
</div>
|
||||
</template>
|
||||
</v-img>
|
||||
<div class="delete-overlay">
|
||||
<v-btn
|
||||
icon="mdi-delete"
|
||||
size="small"
|
||||
color="error"
|
||||
variant="flat"
|
||||
@click.stop="deleteImage(img.id)"
|
||||
/>
|
||||
</div>
|
||||
</v-card>
|
||||
</v-col>
|
||||
</v-row>
|
||||
@@ -161,9 +170,20 @@ onMounted(loadImages)
|
||||
cursor: pointer;
|
||||
transition: transform 0.2s, border-color 0.2s;
|
||||
border: 1px solid transparent;
|
||||
position: relative;
|
||||
}
|
||||
.gallery-card:hover {
|
||||
transform: scale(1.03);
|
||||
border-color: rgb(var(--v-theme-primary));
|
||||
}
|
||||
.delete-overlay {
|
||||
position: absolute;
|
||||
top: 4px;
|
||||
right: 4px;
|
||||
opacity: 0;
|
||||
transition: opacity 0.2s;
|
||||
}
|
||||
.gallery-card:hover .delete-overlay {
|
||||
opacity: 1;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
<script setup lang="ts">
|
||||
import { ref } from 'vue'
|
||||
import { ref, onMounted } from 'vue'
|
||||
import * as api from '@/api/client'
|
||||
import type { CivitaiModel } from '@/types'
|
||||
import ModelCard from './ModelCard.vue'
|
||||
|
||||
const STORAGE_KEY = 'civitai-search-state'
|
||||
|
||||
const query = ref('')
|
||||
const modelType = ref('')
|
||||
const baseModel = ref('')
|
||||
@@ -12,6 +14,35 @@ const loading = ref(false)
|
||||
const results = ref<CivitaiModel[]>([])
|
||||
const searched = ref(false)
|
||||
|
||||
// Restore search state from sessionStorage
|
||||
onMounted(() => {
|
||||
const saved = sessionStorage.getItem(STORAGE_KEY)
|
||||
if (saved) {
|
||||
try {
|
||||
const state = JSON.parse(saved)
|
||||
query.value = state.query || ''
|
||||
modelType.value = state.modelType || ''
|
||||
baseModel.value = state.baseModel || ''
|
||||
sortOrder.value = state.sortOrder || 'Most Downloaded'
|
||||
results.value = state.results || []
|
||||
searched.value = state.searched || false
|
||||
} catch (e) {
|
||||
console.error('Failed to restore search state:', e)
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
function saveState() {
|
||||
sessionStorage.setItem(STORAGE_KEY, JSON.stringify({
|
||||
query: query.value,
|
||||
modelType: modelType.value,
|
||||
baseModel: baseModel.value,
|
||||
sortOrder: sortOrder.value,
|
||||
results: results.value,
|
||||
searched: searched.value,
|
||||
}))
|
||||
}
|
||||
|
||||
const modelTypes = [
|
||||
{ title: 'All Types', value: '' },
|
||||
{ title: 'Checkpoint', value: 'Checkpoint' },
|
||||
@@ -54,6 +85,7 @@ async function search() {
|
||||
results.value = []
|
||||
} finally {
|
||||
loading.value = false
|
||||
saveState()
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
@@ -4,6 +4,7 @@ export interface Model {
|
||||
filename: string
|
||||
size_mb: number
|
||||
modified: number
|
||||
category: 'sd15' | 'large'
|
||||
}
|
||||
|
||||
export interface LoRA {
|
||||
@@ -12,6 +13,7 @@ export interface LoRA {
|
||||
filename: string
|
||||
size_mb: number
|
||||
modified: number
|
||||
category: 'sd15' | 'large'
|
||||
}
|
||||
|
||||
export interface GeneratedImage {
|
||||
|
||||
Reference in New Issue
Block a user