diff --git a/static/js/components/CheckpointCard.js b/static/js/components/CheckpointCard.js index a9246b8e..b8925b52 100644 --- a/static/js/components/CheckpointCard.js +++ b/static/js/components/CheckpointCard.js @@ -1,6 +1,7 @@ import { showToast } from '../utils/uiHelpers.js'; import { state } from '../state/index.js'; import { CheckpointModal } from './CheckpointModal.js'; +import { NSFW_LEVELS } from '../utils/constants.js'; // Create an instance of the modal const checkpointModal = new CheckpointModal(); @@ -28,28 +29,73 @@ export function createCheckpointCard(checkpoint) { card.dataset.tags = JSON.stringify(checkpoint.tags); } + // Store NSFW level if available + const nsfwLevel = checkpoint.preview_nsfw_level !== undefined ? checkpoint.preview_nsfw_level : 0; + card.dataset.nsfwLevel = nsfwLevel; + + // Determine if the preview should be blurred based on NSFW level and user settings + const shouldBlur = state.settings.blurMatureContent && nsfwLevel > NSFW_LEVELS.PG13; + if (shouldBlur) { + card.classList.add('nsfw-content'); + } + // Determine preview URL const previewUrl = checkpoint.preview_url || '/loras_static/images/no-preview.png'; const version = state.previewVersions ? state.previewVersions.get(checkpoint.file_path) : null; const versionedPreviewUrl = version ? `${previewUrl}?t=${version}` : previewUrl; + // Determine NSFW warning text based on level + let nsfwText = "Mature Content"; + if (nsfwLevel >= NSFW_LEVELS.XXX) { + nsfwText = "XXX-rated Content"; + } else if (nsfwLevel >= NSFW_LEVELS.X) { + nsfwText = "X-rated Content"; + } else if (nsfwLevel >= NSFW_LEVELS.R) { + nsfwText = "R-rated Content"; + } + + // Check if autoplayOnHover is enabled for video previews + const autoplayOnHover = state.global?.settings?.autoplayOnHover || false; + const isVideo = previewUrl.endsWith('.mp4'); + const videoAttrs = autoplayOnHover ? 'controls muted loop' : 'controls autoplay muted loop'; + card.innerHTML = ` -