From d1f6cdb17914b94fe4e3e0daa2d2fd11c225168b Mon Sep 17 00:00:00 2001
From: Staninna <26458805+Staninna@users.noreply.github.com>
Date: Thu, 28 Aug 2025 17:02:52 +0200
Subject: [PATCH] Reapply "Decoupled css part 2"
This reverts commit 1acb3955a0125488fedbb7187963f2a48610ae45.
---
.github/workflows/cd.yml | 187 ++++
Auto-Image.js | 1935 ++++++-------------------------------
auto-image-styles.css | 1966 ++++++++++++++++++++++++++++++++++++++
themes/classic-light.css | 482 ++++++++++
themes/classic.css | 653 +++++++++++++
themes/neon.css | 403 ++++++++
6 files changed, 4007 insertions(+), 1619 deletions(-)
create mode 100644 .github/workflows/cd.yml
create mode 100644 auto-image-styles.css
create mode 100644 themes/classic-light.css
create mode 100644 themes/classic.css
create mode 100644 themes/neon.css
diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml
new file mode 100644
index 0000000..c8805b4
--- /dev/null
+++ b/.github/workflows/cd.yml
@@ -0,0 +1,187 @@
+name: Pages – aggregate all branches
+
+on:
+ push:
+ branches: ["**"]
+ workflow_dispatch:
+
+permissions:
+ contents: read
+ pages: write
+ id-token: write
+
+concurrency:
+ group: pages
+ cancel-in-progress: true
+
+jobs:
+ aggregate_deploy:
+ runs-on: ubuntu-latest
+ environment:
+ name: github-pages
+ url: ${{ steps.deploy.outputs.page_url }}
+
+ steps:
+ - name: Checkout (shallow)
+ uses: actions/checkout@v4
+ with:
+ fetch-depth: 1
+
+ - name: Configure Pages
+ uses: actions/configure-pages@v5
+
+ - name: Aggregate and build recursive directory pages
+ shell: bash
+ run: |
+ set -euo pipefail
+
+ # jq for JSON escaping (present on runners, but ensure)
+ if ! command -v jq >/dev/null 2>&1; then
+ sudo apt-get update -y
+ sudo apt-get install -y jq
+ fi
+
+ REPO="${GITHUB_REPOSITORY#*/}"
+ SITE_ROOT="/${REPO}/"
+
+ mkdir -p public
+ : > public/.nojekyll
+
+ # Tiny favicon assets to avoid 404s
+ printf "%s" \
+ "" \
+ > public/favicon.svg
+
+ # List remote branches
+ mapfile -t BRANCHES < <(
+ git ls-remote --heads origin | awk '{print $2}' \
+ | sed 's@refs/heads/@@'
+ )
+
+ # Landing page (no globals except window.__branches)
+ cat > public/index.html <<'HTML'
+
+
+
+
+
Branches
+
+ Branches
+
+
+
+ HTML
+
+ # Emit index.html for a directory
+ gen_index_dir() {
+ local DIR="$1" ROOT="$2" BR="$3"
+ local rel="${DIR#$ROOT}"
+ local title="Branch: ${BR}${rel:-/}"
+
+ {
+ echo ""
+ echo ""
+ echo ""
+ echo "${title}"
+ echo ""
+ echo "${title}
"
+ if [[ "$DIR" != "$ROOT" ]]; then
+ echo "⬆ Up • All branches
"
+ else
+ echo "All branches
"
+ fi
+ echo "| Name | Size | Modified |
"
+
+ # Subdirectories
+ while IFS= read -r d; do
+ [[ -n "$d" ]] || continue
+ printf "| 📁 %s/ | — | — |
\n" "$d" "$d"
+ done < <(find "$DIR" -mindepth 1 -maxdepth 1 -type d -printf '%f\n' | sort)
+
+ # Files
+ while IFS= read -r f; do
+ [[ -n "$f" ]] || continue
+ size=$(stat -c %s "$DIR/$f" 2>/dev/null || echo 0)
+ size_h=$(numfmt --to=iec --suffix=B "$size" 2>/dev/null || echo "$size")
+ mod=$(date -r "$DIR/$f" "+%Y-%m-%d %H:%M" 2>/dev/null || echo "")
+ printf "| 📄 %s | %s | %s |
\n" "$f" "$f" "$size_h" "$mod"
+ done < <(find "$DIR" -mindepth 1 -maxdepth 1 -type f ! -name 'index.html' -printf '%f\n' | sort)
+
+ echo "
"
+ echo "Generated $(date -u '+%Y-%m-%d %H:%M UTC')
"
+ } > "$DIR/index.html"
+ }
+
+ # Build per-branch trees and indexes
+ for BR in "${BRANCHES[@]}"; do
+ SAFE="$(echo "$BR" | tr '/:@ ' '----' | sed 's/[^A-Za-z0-9._-]/-/g')"
+ mkdir -p "public/$SAFE"
+
+ git fetch --depth=1 origin "$BR"
+ git archive --format=tar FETCH_HEAD | tar -x -C "public/$SAFE"
+
+ # Keep only static assets; prune empty dirs
+ rm -rf "public/$SAFE/.git" "public/$SAFE/.github" \
+ "public/$SAFE/node_modules"
+ find "public/$SAFE" -type f ! \
+ \( -name '*.html' -o -name '*.js' -o -name '*.css' -o \
+ -name '*.json' -o -name '*.png' -o -name '*.jpg' -o \
+ -name '*.jpeg' -o -name '*.gif' -o -name '*.svg' \) \
+ -delete
+ find "public/$SAFE" -type d -empty -delete
+
+ ROOT_DIR="public/$SAFE"
+ while IFS= read -r -d '' d; do
+ gen_index_dir "$d" "$ROOT_DIR" "$BR"
+ done < <(find "$ROOT_DIR" -type d -print0)
+
+ # Append to landing page (JSON-escaped)
+ SAFE_JSON=$(printf '%s' "$SAFE" | jq -Rr @json)
+ BR_JSON=$(printf '%s' "$BR" | jq -Rr @json)
+ echo "" \
+ >> public/index.html
+ done
+
+ # Finish landing page
+ cat >> public/index.html <<'HTML'
+
+ HTML
+
+ - name: Upload Pages artifact
+ uses: actions/upload-pages-artifact@v4
+ with:
+ path: public
+
+ - name: Deploy to GitHub Pages
+ id: deploy
+ uses: actions/deploy-pages@v4
\ No newline at end of file
diff --git a/Auto-Image.js b/Auto-Image.js
index 94f4a78..c6798da 100644
--- a/Auto-Image.js
+++ b/Auto-Image.js
@@ -146,6 +146,27 @@
pixelBlink: false,
},
},
+ "Classic Light": {
+ primary: "#ffffff",
+ secondary: "#f8f9fa",
+ accent: "#e9ecef",
+ text: "#212529",
+ highlight: "#6f42c1",
+ success: "#28a745",
+ error: "#dc3545",
+ warning: "#ffc107",
+ fontFamily: "'Segoe UI', Roboto, sans-serif",
+ borderRadius: "12px",
+ borderStyle: "solid",
+ borderWidth: "1px",
+ boxShadow: "0 8px 32px rgba(0,0,0,0.15), 0 0 0 1px rgba(0,0,0,0.08)",
+ backdropFilter: "blur(10px)",
+ animations: {
+ glow: false,
+ scanline: false,
+ pixelBlink: false,
+ },
+ },
"Neon Retro": {
primary: "#1a1a2e",
secondary: "#16213e",
@@ -177,20 +198,56 @@
const getCurrentTheme = () => CONFIG.THEMES[CONFIG.currentTheme]
const switchTheme = (themeName) => {
- if (CONFIG.THEMES[themeName]) {
- CONFIG.currentTheme = themeName
- saveThemePreference()
+ if (CONFIG.THEMES[themeName]) {
+ CONFIG.currentTheme = themeName
+ saveThemePreference()
- // Remove existing theme styles
- const existingStyle = document.querySelector('style[data-wplace-theme="true"]')
- if (existingStyle) {
- existingStyle.remove()
- }
+ // APPLY THEME VARS/CLASS (new)
+ applyTheme()
- // Recreate UI with new theme (cleanup is handled in createUI)
- createUI()
- }
+ // Recreate UI (kept for now)
+ createUI()
}
+}
+
+// Add this helper (place it after getCurrentTheme/switchTheme definitions)
+function applyTheme() {
+ const theme = getCurrentTheme();
+ // Toggle theme class on documentElement so CSS vars cascade to our UI
+ document.documentElement.classList.remove('wplace-theme--classic', 'wplace-theme--classic-light', 'wplace-theme--neon');
+
+ let themeClass = 'wplace-theme--classic'; // default
+ if (CONFIG.currentTheme === 'Neon Retro') {
+ themeClass = 'wplace-theme--neon';
+ } else if (CONFIG.currentTheme === 'Classic Light') {
+ themeClass = 'wplace-theme--classic-light';
+ }
+
+ document.documentElement.classList.add(themeClass);
+
+ // Also set CSS variables explicitly in case you want runtime overrides
+ const root = document.documentElement;
+ const setVar = (k, v) => { try { root.style.setProperty(k, v); } catch {} };
+
+ setVar('--wplace-primary', theme.primary);
+ setVar('--wplace-secondary', theme.secondary);
+ setVar('--wplace-accent', theme.accent);
+ setVar('--wplace-text', theme.text);
+ setVar('--wplace-highlight', theme.highlight);
+ setVar('--wplace-success', theme.success);
+ setVar('--wplace-error', theme.error);
+ setVar('--wplace-warning', theme.warning);
+
+ // Typography + look
+ setVar('--wplace-font', theme.fontFamily || "'Segoe UI', Roboto, sans-serif");
+ setVar('--wplace-radius', ('' + (theme.borderRadius || '12px')));
+ setVar('--wplace-border-style', (('' + (theme.borderStyle || 'solid'))));
+ setVar('--wplace-border-width', (('' + (theme.borderWidth || '1px'))));
+ setVar('--wplace-backdrop', (('' + (theme.backdropFilter || 'blur(10px)'))));
+ setVar('--wplace-border-color', 'rgba(255,255,255,0.1)');
+}
+
+
const saveThemePreference = () => {
try {
@@ -212,19 +269,13 @@
}
const loadLanguagePreference = () => {
- const savedLanguage = localStorage.getItem("wplace_language")
-
- const browserLocale = navigator.language
- const browserLanguage = browserLocale.split("-")[0]
-
- if (TEXT[savedLanguage]) { // trying to load saved language
- state.language = savedLanguage
- } else if (TEXT[browserLocale]) { // trying to load full locale match (e.g. "zh-CN", "zh-TW" etc)
- state.language = browserLocale
- localStorage.setItem("wplace_language", browserLocale)
- } else if (TEXT[browserLanguage]) { // trying to load base language match (e.g. "en" for "en-US" or "en-GB" etc)
- state.language = browserLanguage
- localStorage.setItem("wplace_language", browserLanguage)
+ try {
+ const saved = localStorage.getItem("wplace_language")
+ if (saved && TEXT[saved]) {
+ state.language = saved
+ }
+ } catch (e) {
+ console.warn("Could not load language preference:", e)
}
}
@@ -740,7 +791,7 @@
automation: "Otomasyon",
noChargesThreshold: "⌛ Hakların {threshold} seviyesine ulaşması bekleniyor. Şu anda {current}. Sonraki {time} içinde...",
},
- "zh-CN": {
+ zh: {
title: "WPlace 自动图像",
toggleOverlay: "切换覆盖层",
scanColors: "扫描颜色",
@@ -816,7 +867,7 @@
automation: "自动化",
noChargesThreshold: "⌛ 等待次数达到 {threshold}。当前 {current}。下次在 {time}...",
},
- "zh-TW": {
+ "zh-tw": {
title: "WPlace 自動圖像",
toggleOverlay: "切換覆蓋層",
scanColors: "掃描顏色",
@@ -1700,6 +1751,18 @@
}
});
+ async function detectLanguage() {
+ try {
+ const response = await fetch("https://backend.wplace.live/me", {
+ credentials: "include",
+ })
+ const data = await response.json()
+ state.language = data.language === "pt" ? "pt" : "en"
+ } catch {
+ state.language = navigator.language.startsWith("pt") ? "pt" : "en"
+ }
+ }
+
// UTILITY FUNCTIONS
const Utils = {
sleep: (ms) => new Promise((r) => setTimeout(r, ms)),
@@ -1768,18 +1831,7 @@
}
this._turnstileContainer = document.createElement('div');
- this._turnstileContainer.style.cssText = `
- position: fixed !important;
- left: -99999px !important;
- top: -99999px !important;
- width: 1px !important;
- height: 1px !important;
- pointer-events: none !important;
- opacity: 0 !important;
- visibility: hidden !important;
- z-index: -99999 !important;
- overflow: hidden !important;
- `;
+ this._turnstileContainer.className = 'wplace-turnstile-hidden';
this._turnstileContainer.setAttribute('aria-hidden', 'true');
this._turnstileContainer.id = 'turnstile-widget-container';
document.body.appendChild(this._turnstileContainer);
@@ -1795,35 +1847,19 @@
const overlay = document.createElement('div');
overlay.id = 'turnstile-overlay-container';
- overlay.style.cssText = `
- position: fixed !important;
- bottom: 20px !important;
- right: 20px !important;
- z-index: 99999 !important;
- background: rgba(0,0,0,0.9) !important;
- border-radius: 12px !important;
- padding: 20px !important;
- box-shadow: 0 8px 32px rgba(0,0,0,0.4) !important;
- backdrop-filter: blur(10px) !important;
- border: 1px solid rgba(255,255,255,0.2) !important;
- color: white !important;
- font-family: 'Segoe UI', sans-serif !important;
- display: none !important;
- max-width: 350px !important;
- min-width: 300px !important;
- `;
+ overlay.className = 'wplace-turnstile-overlay wplace-overlay-hidden';
const title = document.createElement('div');
title.textContent = 'Cloudflare Turnstile — please complete the check if shown';
- title.style.cssText = 'font: 600 12px/1.3 "Segoe UI",sans-serif; margin-bottom: 8px; opacity: 0.9;';
+ title.className = 'wplace-turnstile-title';
const host = document.createElement('div');
host.id = 'turnstile-overlay-host';
- host.style.cssText = 'width: 100%; min-height: 70px;';
+ host.className = 'wplace-turnstile-host';
const hideBtn = document.createElement('button');
hideBtn.textContent = 'Hide';
- hideBtn.style.cssText = 'position:absolute; top:6px; right:6px; font-size:11px; background:transparent; color:#fff; border:1px solid rgba(255,255,255,0.2); border-radius:6px; padding:2px 6px; cursor:pointer;';
+ hideBtn.className = 'wplace-turnstile-hide-btn';
hideBtn.addEventListener('click', () => overlay.remove());
overlay.appendChild(title);
@@ -1938,6 +1974,7 @@
}
const overlay = this.ensureTurnstileOverlayContainer();
+ overlay.classList.remove('wplace-overlay-hidden');
overlay.style.display = 'block';
const host = overlay.querySelector('#turnstile-overlay-host');
@@ -1946,6 +1983,7 @@
// Set a timeout for interactive mode
const timeout = setTimeout(() => {
console.warn('⏰ Interactive Turnstile widget timeout');
+ overlay.classList.add('wplace-overlay-hidden');
overlay.style.display = 'none';
resolve(null);
}, 60000); // 60 seconds for user interaction
@@ -1957,7 +1995,8 @@
theme: 'light',
callback: (token) => {
clearTimeout(timeout);
- overlay.style.display = 'none';
+ overlay.classList.add('wplace-overlay-hidden');
+ overlay.style.display = 'none';
console.log('✅ Interactive Turnstile completed successfully');
if (typeof token === 'string' && token.length > 20) {
@@ -1969,7 +2008,8 @@
},
'error-callback': (error) => {
clearTimeout(timeout);
- overlay.style.display = 'none';
+ overlay.classList.add('wplace-overlay-hidden');
+ overlay.style.display = 'none';
console.warn('❌ Interactive Turnstile error:', error);
resolve(null);
},
@@ -1980,6 +2020,7 @@
if (!widgetId) {
clearTimeout(timeout);
+ overlay.classList.add('wplace-overlay-hidden');
overlay.style.display = 'none';
console.warn('❌ Failed to create interactive Turnstile widget');
resolve(null);
@@ -2152,40 +2193,7 @@
showAlert: (message, type = "info") => {
const alertDiv = document.createElement("div")
- alertDiv.style.cssText = `
- position: fixed;
- top: 20px;
- left: 50%;
- transform: translateX(-50%);
- padding: 12px 20px;
- border-radius: 8px;
- color: white;
- font-weight: 600;
- z-index: 10001;
- max-width: 400px;
- text-align: center;
- box-shadow: 0 4px 12px rgba(0,0,0,0.3);
- animation: slideDown 0.3s ease-out;
- font-family: 'Segoe UI', sans-serif;
- `
-
- const colors = {
- info: "background: linear-gradient(135deg, #3498db, #2980b9);",
- success: "background: linear-gradient(135deg, #27ae60, #229954);",
- warning: "background: linear-gradient(135deg, #f39c12, #e67e22);",
- error: "background: linear-gradient(135deg, #e74c3c, #c0392b);",
- }
-
- alertDiv.style.cssText += colors[type] || colors.info
-
- const style = document.createElement("style")
- style.textContent = `
- @keyframes slideDown {
- from { transform: translateX(-50%) translateY(-20px); opacity: 0; }
- to { transform: translateX(-50%) translateY(0); opacity: 1; }
- }
- `
- document.head.appendChild(style)
+ alertDiv.className = `wplace-alert-base wplace-alert-${type}`
alertDiv.textContent = message
document.body.appendChild(alertDiv)
@@ -2194,7 +2202,6 @@
alertDiv.style.animation = "slideDown 0.3s ease-out reverse"
setTimeout(() => {
document.body.removeChild(alertDiv)
- document.head.removeChild(style)
}, 300)
}, 4000)
},
@@ -3127,7 +3134,7 @@
// Don't re-fetch colors here, use what was captured when user clicked upload
if (!state.availableColors || state.availableColors.length === 0) {
// If no colors have been captured yet, show message
- colorsContainer.innerHTML = 'Upload an image first to capture available colors
';
+ colorsContainer.innerHTML = 'Upload an image first to capture available colors
';
return;
}
@@ -3329,6 +3336,8 @@
async function createUI() {
+ await detectLanguage()
+
const existingContainer = document.getElementById("wplace-image-bot-container")
const existingStats = document.getElementById("wplace-stats-container")
const existingSettings = document.getElementById("wplace-settings-container")
@@ -3345,6 +3354,7 @@
loadLanguagePreference()
const theme = getCurrentTheme()
+ applyTheme() // <- new: set CSS vars and theme class before building UI
const fontAwesome = document.createElement("link")
fontAwesome.rel = "stylesheet"
@@ -3358,1155 +3368,12 @@
document.head.appendChild(googleFonts)
}
- const style = document.createElement("style")
- style.setAttribute("data-wplace-theme", "true")
-
- style.textContent = `
- ${theme.animations.glow
- ? `
- @keyframes neonGlow {
- 0%, 100% {
- text-shadow: 0 0 5px currentColor, 0 0 10px currentColor, 0 0 15px currentColor;
- }
- 50% {
- text-shadow: 0 0 2px currentColor, 0 0 5px currentColor, 0 0 8px currentColor;
- }
- }`
- : ""
- }
-
- ${theme.animations.pixelBlink
- ? `
- @keyframes pixelBlink {
- 0%, 50% { opacity: 1; }
- 51%, 100% { opacity: 0.7; }
- }`
- : ""
- }
-
- ${theme.animations.scanline
- ? `
- @keyframes scanline {
- 0% { transform: translateY(-100%); }
- 100% { transform: translateY(400px); }
- }`
- : ""
- }
-
- @keyframes pulse {
- 0% { box-shadow: 0 0 0 0 rgba(0, 255, 0, 0.7); }
- 70% { box-shadow: 0 0 0 10px rgba(0, 255, 0, 0); }
- 100% { box-shadow: 0 0 0 0 rgba(0, 255, 0, 0); }
- }
- @keyframes slideIn {
- from { transform: translateY(-10px); opacity: 0; }
- to { transform: translateY(0); opacity: 1; }
- }
- @keyframes shimmer {
- 0% { transform: translateX(-100%); }
- 100% { transform: translateX(100%); }
- }
-
- #wplace-image-bot-container {
- position: fixed;
- top: 20px;
- left: 20px;
- width: ${CONFIG.currentTheme === "Neon Retro" ? "280px" : "280px"};
- max-height: calc(100vh - 40px);
- background: ${CONFIG.currentTheme === "Classic Autobot"
- ? `linear-gradient(135deg, ${theme.primary} 0%, #1a1a1a 100%)`
- : theme.primary
- };
- border: ${theme.borderWidth} ${theme.borderStyle} ${CONFIG.currentTheme === "Classic Autobot" ? theme.accent : theme.text};
- border-radius: ${theme.borderRadius};
- padding: 0;
- box-shadow: ${theme.boxShadow};
- z-index: 9998;
- font-family: ${theme.fontFamily};
- color: ${theme.text};
- animation: slideIn 0.4s ease-out;
- overflow-y: auto; /* Allow scrolling for main panel */
- overflow-x: hidden;
- ${theme.backdropFilter ? `backdrop-filter: ${theme.backdropFilter};` : ""}
- transition: all 0.3s ease;
- user-select: none;
- ${CONFIG.currentTheme === "Neon Retro" ? "image-rendering: pixelated;" : ""}
- }
-
- ${theme.animations.scanline
- ? `
- #wplace-image-bot-container::before {
- content: '';
- position: absolute;
- top: 0;
- left: 0;
- right: 0;
- height: 2px;
- background: linear-gradient(90deg, transparent, ${theme.neon}, transparent);
- animation: scanline 3s linear infinite;
- z-index: 1;
- pointer-events: none;
- }`
- : ""
- }
-
- ${CONFIG.currentTheme === "Neon Retro"
- ? `
- #wplace-image-bot-container::after {
- content: '';
- position: absolute;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
- background:
- repeating-linear-gradient(
- 0deg,
- transparent,
- transparent 2px,
- rgba(0, 255, 65, 0.03) 2px,
- rgba(0, 255, 65, 0.03) 4px
- );
- pointer-events: none;
- z-index: 1;
- }`
- : ""
- }
-
- #wplace-image-bot-container.wplace-dragging {
- transition: none;
- box-shadow: 0 12px 40px rgba(0,0,0,0.8), 0 0 0 2px rgba(255,255,255,0.2);
- transform: scale(1.02);
- z-index: 9999;
- }
- #wplace-image-bot-container.wplace-minimized {
- width: 200px;
- height: auto;
- overflow: hidden;
- }
- #wplace-image-bot-container.wplace-compact {
- width: 240px;
- }
-
- /* Stats Container */
- #wplace-stats-container {
- position: fixed;
- top: 20px;
- left: 330px;
- width: ${CONFIG.currentTheme === "Neon Retro" ? "280px" : "280px"};
- max-height: calc(100vh - 40px);
- background: ${CONFIG.currentTheme === "Classic Autobot"
- ? `linear-gradient(135deg, ${theme.primary} 0%, #1a1a1a 100%)`
- : theme.primary
- };
- border: ${theme.borderWidth} ${theme.borderStyle} ${CONFIG.currentTheme === "Classic Autobot" ? theme.accent : theme.text};
- border-radius: ${theme.borderRadius};
- padding: 0;
- box-shadow: ${theme.boxShadow};
- z-index: 9997;
- font-family: ${theme.fontFamily};
- color: ${theme.text};
- animation: slideIn 0.4s ease-out;
- overflow-y: auto; /* Make stats panel scrollable */
- ${theme.backdropFilter ? `backdrop-filter: ${theme.backdropFilter};` : ""}
- transition: all 0.3s ease;
- user-select: none;
- ${CONFIG.currentTheme === "Neon Retro" ? "image-rendering: pixelated;" : ""}
- }
-
- /* FIX: Disable transition during drag to prevent lag */
- #wplace-stats-container.wplace-dragging {
- transition: none;
- }
-
- .wplace-header {
- padding: ${CONFIG.currentTheme === "Neon Retro" ? "8px 12px" : "8px 12px"};
- background: ${CONFIG.currentTheme === "Classic Autobot"
- ? `linear-gradient(135deg, ${theme.secondary} 0%, #2a2a2a 100%)`
- : theme.secondary
- };
- color: ${theme.highlight};
- font-size: ${CONFIG.currentTheme === "Neon Retro" ? "11px" : "13px"};
- font-weight: ${CONFIG.currentTheme === "Neon Retro" ? "normal" : "700"};
- display: flex;
- justify-content: space-between;
- align-items: center;
- cursor: move;
- user-select: none;
- border-bottom: ${CONFIG.currentTheme === "Neon Retro" ? "2px" : "1px"} solid ${CONFIG.currentTheme === "Classic Autobot" ? "rgba(255,255,255,0.1)" : theme.text};
- ${CONFIG.currentTheme === "Classic Autobot" ? "text-shadow: 0 1px 2px rgba(0,0,0,0.5);" : "text-transform: uppercase; letter-spacing: 1px;"}
- transition: background 0.2s ease;
- position: relative;
- z-index: 2;
- ${theme.animations.glow ? "animation: neonGlow 2s ease-in-out infinite alternate;" : ""}
- }
-
- .wplace-header-title {
- display: flex;
- align-items: center;
- gap: ${CONFIG.currentTheme === "Neon Retro" ? "6px" : "6px"};
- }
-
- .wplace-header-controls {
- display: flex;
- gap: ${CONFIG.currentTheme === "Neon Retro" ? "6px" : "6px"};
- }
-
- .wplace-header-btn {
- background: ${CONFIG.currentTheme === "Classic Autobot" ? "rgba(255,255,255,0.1)" : theme.accent};
- border: ${CONFIG.currentTheme === "Neon Retro" ? `2px solid ${theme.text}` : "none"};
- color: ${theme.text};
- cursor: pointer;
- border-radius: ${CONFIG.currentTheme === "Classic Autobot" ? "4px" : "0"};
- width: ${CONFIG.currentTheme === "Classic Autobot" ? "18px" : "auto"};
- height: ${CONFIG.currentTheme === "Classic Autobot" ? "18px" : "auto"};
- padding: ${CONFIG.currentTheme === "Neon Retro" ? "4px 6px" : "0"};
- font-size: ${CONFIG.currentTheme === "Neon Retro" ? "8px" : "10px"};
- display: flex;
- align-items: center;
- justify-content: center;
- transition: all 0.2s;
- font-family: ${theme.fontFamily};
- ${CONFIG.currentTheme === "Neon Retro" ? "image-rendering: pixelated;" : ""}
- }
- .wplace-header-btn:hover {
- background: ${CONFIG.currentTheme === "Classic Autobot" ? theme.accent : theme.text};
- color: ${CONFIG.currentTheme === "Classic Autobot" ? theme.text : theme.primary};
- transform: ${CONFIG.currentTheme === "Classic Autobot" ? "scale(1.1)" : "none"};
- ${CONFIG.currentTheme === "Neon Retro" ? `box-shadow: 0 0 10px ${theme.text};` : ""}
- }
-
- .wplace-content {
- padding: ${CONFIG.currentTheme === "Neon Retro" ? "12px" : "12px"};
- display: block;
- position: relative;
- z-index: 2;
- }
- .wplace-content.wplace-hidden {
- display: none;
- }
-
- .wplace-status-section {
- margin-bottom: 12px;
- padding: 8px;
- background: rgba(255,255,255,0.03);
- border-radius: ${theme.borderRadius};
- border: 1px solid rgba(255,255,255,0.1);
- }
-
- .wplace-section {
- margin-bottom: ${CONFIG.currentTheme === "Neon Retro" ? "12px" : "12px"};
- padding: 12px;
- background: rgba(255,255,255,0.03);
- border-radius: ${theme.borderRadius};
- border: 1px solid rgba(255,255,255,0.1);
- }
-
- .wplace-section-title {
- font-size: 11px;
- font-weight: 600;
- margin-bottom: 8px;
- color: ${theme.highlight};
- display: flex;
- align-items: center;
- gap: 6px;
- text-transform: uppercase;
- letter-spacing: 0.5px;
- }
-
- .wplace-controls {
- display: flex;
- flex-direction: column;
- gap: 8px;
- }
- .wplace-row {
- display: grid;
- grid-template-columns: 1fr 1fr;
- gap: 8px;
- }
- .wplace-row.single {
- grid-template-columns: 1fr;
- }
-
- .wplace-btn {
- padding: ${CONFIG.currentTheme === "Neon Retro" ? "12px 8px" : "8px 12px"};
- border: ${CONFIG.currentTheme === "Neon Retro" ? "2px solid" : "none"};
- border-radius: ${theme.borderRadius};
- font-weight: ${CONFIG.currentTheme === "Neon Retro" ? "normal" : "500"};
- cursor: pointer;
- display: flex;
- align-items: center;
- justify-content: center;
- gap: ${CONFIG.currentTheme === "Neon Retro" ? "8px" : "6px"};
- font-size: ${CONFIG.currentTheme === "Neon Retro" ? "8px" : "11px"};
- transition: all 0.3s ease;
- position: relative;
- overflow: hidden;
- font-family: ${theme.fontFamily};
- ${CONFIG.currentTheme === "Neon Retro" ? "text-transform: uppercase; letter-spacing: 1px; image-rendering: pixelated;" : ""}
- background: ${CONFIG.currentTheme === "Classic Autobot"
- ? `linear-gradient(135deg, ${theme.accent} 0%, #4a4a4a 100%)`
- : theme.accent
- };
- ${CONFIG.currentTheme === "Classic Autobot" ? "border: 1px solid rgba(255,255,255,0.1);" : ""}
- }
-
- ${CONFIG.currentTheme === "Classic Autobot"
- ? `
- .wplace-btn::before {
- content: '';
- position: absolute;
- top: 0;
- left: -100%;
- width: 100%;
- height: 100%;
- background: linear-gradient(90deg, transparent, rgba(255,255,255,0.1), transparent);
- transition: left 0.5s ease;
- }
- .wplace-btn:hover:not(:disabled)::before {
- left: 100%;
- }`
- : `
- .wplace-btn::before {
- content: '';
- position: absolute;
- top: 0;
- left: -100%;
- width: 100%;
- height: 100%;
- background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent);
- transition: left 0.5s;
- }
- .wplace-btn:hover::before {
- left: 100%;
- }`
- }
-
- .wplace-btn:hover:not(:disabled) {
- transform: ${CONFIG.currentTheme === "Classic Autobot" ? "translateY(-1px)" : "none"};
- box-shadow: ${CONFIG.currentTheme === "Classic Autobot" ? "0 4px 12px rgba(0,0,0,0.4)" : "0 0 15px currentColor"
- };
- ${theme.animations.pixelBlink ? "animation: pixelBlink 0.5s infinite;" : ""}
- }
- .wplace-btn:active:not(:disabled) {
- transform: translateY(0);
- }
-
- .wplace-btn-primary {
- background: ${CONFIG.currentTheme === "Classic Autobot"
- ? `linear-gradient(135deg, ${theme.accent} 0%, #6a5acd 100%)`
- : theme.accent
- };
- color: ${theme.text};
- ${CONFIG.currentTheme === "Neon Retro" ? `border-color: ${theme.text};` : ""}
- }
- .wplace-btn-upload {
- background: ${CONFIG.currentTheme === "Classic Autobot"
- ? `linear-gradient(135deg, ${theme.secondary} 0%, #4a4a4a 100%)`
- : theme.purple
- };
- color: ${theme.text};
- ${CONFIG.currentTheme === "Classic Autobot"
- ? `border: 1px dashed ${theme.highlight};`
- : `border-color: ${theme.text}; border-style: dashed;`
- }
- }
- .wplace-btn-start {
- background: ${CONFIG.currentTheme === "Classic Autobot"
- ? `linear-gradient(135deg, ${theme.success} 0%, #228b22 100%)`
- : theme.success
- };
- color: ${CONFIG.currentTheme === "Classic Autobot" ? "white" : theme.primary};
- ${CONFIG.currentTheme === "Neon Retro" ? `border-color: ${theme.success};` : ""}
- }
- .wplace-btn-stop {
- background: ${CONFIG.currentTheme === "Classic Autobot"
- ? `linear-gradient(135deg, ${theme.error} 0%, #dc143c 100%)`
- : theme.error
- };
- color: ${CONFIG.currentTheme === "Classic Autobot" ? "white" : theme.text};
- ${CONFIG.currentTheme === "Neon Retro" ? `border-color: ${theme.error};` : ""}
- }
- .wplace-btn-select {
- background: ${CONFIG.currentTheme === "Classic Autobot"
- ? `linear-gradient(135deg, ${theme.highlight} 0%, #9370db 100%)`
- : theme.highlight
- };
- color: ${CONFIG.currentTheme === "Classic Autobot" ? "white" : theme.primary};
- ${CONFIG.currentTheme === "Neon Retro" ? `border-color: ${theme.highlight};` : ""}
- }
- .wplace-btn-file {
- background: ${CONFIG.currentTheme === "Classic Autobot"
- ? "linear-gradient(135deg, #ff8c00 0%, #ff7f50 100%)"
- : theme.warning
- };
- color: ${CONFIG.currentTheme === "Classic Autobot" ? "white" : theme.primary};
- ${CONFIG.currentTheme === "Neon Retro" ? `border-color: ${theme.warning};` : ""}
- }
- .wplace-btn:disabled {
- opacity: ${CONFIG.currentTheme === "Classic Autobot" ? "0.5" : "0.3"};
- cursor: not-allowed;
- transform: none !important;
- ${theme.animations.pixelBlink ? "animation: none !important;" : ""}
- box-shadow: none !important;
- }
- .wplace-btn:disabled::before {
- display: none;
- }
-
- .wplace-btn-overlay.active {
- background: linear-gradient(135deg, #29b6f6 0%, #8e2de2 100%);
- box-shadow: 0 0 15px #8e2de2;
- }
-
- .wplace-stats {
- background: ${CONFIG.currentTheme === "Classic Autobot" ? "rgba(255,255,255,0.03)" : theme.secondary};
- padding: ${CONFIG.currentTheme === "Neon Retro" ? "12px" : "8px"};
- border: ${CONFIG.currentTheme === "Neon Retro" ? `2px solid ${theme.text}` : "1px solid rgba(255,255,255,0.1)"};
- border-radius: ${theme.borderRadius};
- margin-bottom: ${CONFIG.currentTheme === "Neon Retro" ? "15px" : "8px"};
- ${CONFIG.currentTheme === "Neon Retro" ? "box-shadow: inset 0 0 10px rgba(0, 255, 65, 0.1);" : ""}
- }
-
- .wplace-stat-item {
- display: flex;
- justify-content: space-between;
- padding: ${CONFIG.currentTheme === "Neon Retro" ? "6px 0" : "4px 0"};
- font-size: ${CONFIG.currentTheme === "Neon Retro" ? "8px" : "11px"};
- border-bottom: 1px solid rgba(255,255,255,0.05);
- ${CONFIG.currentTheme === "Neon Retro" ? "text-transform: uppercase; letter-spacing: 1px;" : ""}
- }
- .wplace-stat-item:last-child {
- border-bottom: none;
- }
- .wplace-stat-label {
- display: flex;
- align-items: center;
- gap: 6px;
- opacity: 0.9;
- font-size: ${CONFIG.currentTheme === "Neon Retro" ? "8px" : "10px"};
- }
- .wplace-stat-value {
- font-weight: 600;
- color: ${theme.highlight};
- }
-
- .wplace-colors-section {
- margin-top: 10px;
- padding-top: 8px;
- border-top: 1px solid rgba(255,255,255,0.05);
- }
-
- .wplace-stat-colors-grid {
- display: grid;
- grid-template-columns: repeat(auto-fill, minmax(16px, 1fr));
- gap: 4px;
- margin-top: 8px;
- padding: 4px;
- background: rgba(0,0,0,0.2);
- border-radius: 4px;
- max-height: 80px; /* Limit height and allow scrolling */
- overflow-y: auto;
- }
-
- .wplace-stat-color-swatch {
- width: 16px;
- height: 16px;
- border-radius: 3px;
- border: 1px solid rgba(255,255,255,0.1);
- box-shadow: inset 0 0 2px rgba(0,0,0,0.5);
- }
-
- .wplace-progress {
- width: 100%;
- background: ${CONFIG.currentTheme === "Classic Autobot" ? "rgba(0,0,0,0.3)" : theme.secondary};
- border: ${CONFIG.currentTheme === "Neon Retro" ? `2px solid ${theme.text}` : "1px solid rgba(255,255,255,0.1)"};
- border-radius: ${theme.borderRadius};
- margin: ${CONFIG.currentTheme === "Neon Retro" ? "10px 0" : "8px 0"};
- overflow: hidden;
- height: ${CONFIG.currentTheme === "Neon Retro" ? "16px" : "6px"};
- position: relative;
- }
-
- ${CONFIG.currentTheme === "Neon Retro"
- ? `
- .wplace-progress::before {
- content: '';
- position: absolute;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
- background:
- repeating-linear-gradient(
- 45deg,
- transparent,
- transparent 2px,
- rgba(0, 255, 65, 0.1) 2px,
- rgba(0, 255, 65, 0.1) 4px
- );
- pointer-events: none;
- }`
- : ""
- }
-
- .wplace-progress-bar {
- height: ${CONFIG.currentTheme === "Neon Retro" ? "100%" : "6px"};
- background: ${CONFIG.currentTheme === "Classic Autobot"
- ? `linear-gradient(135deg, ${theme.highlight} 0%, #9370db 100%)`
- : `linear-gradient(90deg, ${theme.success}, ${theme.neon})`
- };
- transition: width ${CONFIG.currentTheme === "Neon Retro" ? "0.3s" : "0.5s"} ease;
- position: relative;
- ${CONFIG.currentTheme === "Neon Retro" ? `box-shadow: 0 0 10px ${theme.success};` : ""}
- }
-
- ${CONFIG.currentTheme === "Classic Autobot"
- ? `
- .wplace-progress-bar::after {
- content: '';
- position: absolute;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
- background: linear-gradient(90deg, transparent, rgba(255,255,255,0.3), transparent);
- animation: shimmer 2s infinite;
- }`
- : `
- .wplace-progress-bar::after {
- content: '';
- position: absolute;
- top: 0;
- right: 0;
- width: 4px;
- height: 100%;
- background: ${theme.text};
- animation: pixelBlink 1s infinite;
- }`
- }
-
- .wplace-status {
- padding: ${CONFIG.currentTheme === "Neon Retro" ? "10px" : "6px"};
- border: ${CONFIG.currentTheme === "Neon Retro" ? "2px solid" : "1px solid"};
- border-radius: ${theme.borderRadius};
- text-align: center;
- font-size: ${CONFIG.currentTheme === "Neon Retro" ? "8px" : "11px"};
- ${CONFIG.currentTheme === "Neon Retro" ? "text-transform: uppercase; letter-spacing: 1px;" : ""}
- position: relative;
- overflow: hidden;
- }
-
- .status-default {
- background: ${CONFIG.currentTheme === "Classic Autobot" ? "rgba(255,255,255,0.1)" : theme.accent};
- border-color: ${theme.text};
- color: ${theme.text};
- }
- .status-success {
- background: ${CONFIG.currentTheme === "Classic Autobot" ? "rgba(0, 255, 0, 0.1)" : theme.success};
- border-color: ${theme.success};
- color: ${CONFIG.currentTheme === "Classic Autobot" ? theme.success : theme.primary};
- box-shadow: 0 0 15px ${theme.success};
- }
- .status-error {
- background: ${CONFIG.currentTheme === "Classic Autobot" ? "rgba(255, 0, 0, 0.1)" : theme.error};
- border-color: ${theme.error};
- color: ${CONFIG.currentTheme === "Classic Autobot" ? theme.error : theme.text};
- box-shadow: 0 0 15px ${theme.error};
- ${theme.animations.pixelBlink ? "animation: pixelBlink 0.5s infinite;" : ""}
- }
- .status-warning {
- background: ${CONFIG.currentTheme === "Classic Autobot" ? "rgba(255, 165, 0, 0.1)" : theme.warning};
- border-color: ${theme.warning};
- color: ${CONFIG.currentTheme === "Classic Autobot" ? "orange" : theme.primary};
- box-shadow: 0 0 15px ${theme.warning};
- }
-
- .resize-container {
- display: none;
- position: fixed;
- top: 50%;
- left: 50%;
- transform: translate(-50%, -50%);
- background: ${theme.primary};
- padding: 20px;
- border: ${theme.borderWidth} ${theme.borderStyle} ${theme.text};
- border-radius: ${theme.borderRadius};
- z-index: 10000;
- box-shadow: ${CONFIG.currentTheme === "Classic Autobot" ? "0 0 20px rgba(0,0,0,0.5)" : "0 0 30px rgba(0, 255, 65, 0.5)"
- };
- width: 90%;
- max-width: 700px;
- max-height: 90%;
- overflow: auto;
- font-family: ${theme.fontFamily};
- }
-
- .resize-preview-wrapper {
- display: flex;
- justify-content: center;
- align-items: center;
- border: 1px solid ${theme.accent};
- background: rgba(0,0,0,0.2);
- margin: 15px 0;
- height: 300px;
- overflow: hidden;
- }
-
- .resize-canvas-stack { position: relative; transform-origin: center center; display: inline-block; }
- .resize-base-canvas, .resize-mask-canvas {
- position: absolute; left: 0; top: 0;
- image-rendering: pixelated;
- image-rendering: -moz-crisp-edges;
- image-rendering: crisp-edges;
- }
- .resize-mask-canvas { pointer-events: auto; }
- .resize-tools { display:flex; gap:8px; align-items:center; margin-top:8px; font-size:12px; }
- .resize-tools button { padding:6px 10px; border-radius:6px; border:1px solid rgba(255,255,255,0.2); background: rgba(255,255,255,0.06); color:#fff; cursor:pointer; }
- .wplace-btn.active,
- .wplace-btn[aria-pressed="true"] {
- background: ${theme.highlight} !important;
- color: ${theme.primary} !important;
- border-color: ${theme.text} !important;
- box-shadow: 0 0 8px rgba(0,0,0,0.25) inset, 0 0 6px rgba(0,0,0,0.2) !important;
- }
- .wplace-btn.active i,
- .wplace-btn[aria-pressed="true"] i { filter: drop-shadow(0 0 3px ${theme.primary}); }
- .mask-mode-group .wplace-btn.active,
- .mask-mode-group .wplace-btn[aria-pressed="true"] {
- background: ${theme.highlight};
- color: ${theme.primary};
- border-color: ${theme.text};
- box-shadow: 0 0 8px rgba(0,0,0,0.25) inset, 0 0 6px rgba(0,0,0,0.2);
- }
-
- .resize-controls {
- display: grid;
- grid-template-columns: 1fr 1fr;
- gap: 15px;
- align-items: center;
- }
-
- .resize-controls label {
- font-size: ${CONFIG.currentTheme === "Neon Retro" ? "8px" : "12px"};
- ${CONFIG.currentTheme === "Neon Retro" ? "text-transform: uppercase; letter-spacing: 1px;" : ""}
- color: ${theme.text};
- }
-
- .resize-slider {
- width: 100%;
- height: ${CONFIG.currentTheme === "Neon Retro" ? "8px" : "4px"};
- background: ${CONFIG.currentTheme === "Classic Autobot" ? "#ccc" : theme.secondary};
- border: ${CONFIG.currentTheme === "Neon Retro" ? `2px solid ${theme.text}` : "none"};
- border-radius: ${theme.borderRadius};
- outline: none;
- -webkit-appearance: none;
- }
-
- ${CONFIG.currentTheme === "Neon Retro"
- ? `
- .resize-slider::-webkit-slider-thumb {
- -webkit-appearance: none;
- width: 16px;
- height: 16px;
- background: ${theme.highlight};
- border: 2px solid ${theme.text};
- border-radius: 0;
- cursor: pointer;
- box-shadow: 0 0 5px ${theme.highlight};
- }
-
- .resize-slider::-moz-range-thumb {
- width: 16px;
- height: 16px;
- background: ${theme.highlight};
- border: 2px solid ${theme.text};
- border-radius: 0;
- cursor: pointer;
- box-shadow: 0 0 5px ${theme.highlight};
- }`
- : ""
- }
-
- .resize-zoom-controls {
- grid-column: 1 / -1;
- display: flex;
- align-items: center;
- gap: 10px;
- margin-top: 15px;
- }
-
- .resize-buttons {
- display: flex;
- gap: 10px;
- justify-content: center;
- margin-top: 20px;
- }
-
- .resize-overlay {
- position: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- background: rgba(0, 0, 0, 0.8);
- z-index: 9999;
- display: none;
- }
- .wplace-color-grid {
- display: grid;
- grid-template-columns: repeat(auto-fill, minmax(60px, 1fr));
- gap: 10px;
- padding-top: 8px;
- max-height: 300px;
- overflow-y: auto;
- }
- .wplace-color-item {
- display: flex;
- flex-direction: column;
- align-items: center;
- gap: 4px;
- }
- .wplace-color-item-name {
- font-size: 9px;
- color: #ccc;
- text-align: center;
- white-space: nowrap;
- overflow: hidden;
- text-overflow: ellipsis;
- width: 100%;
- }
- .wplace-color-swatch {
- width: 22px;
- height: 22px;
- border: 1px solid rgba(255,255,255,0.2);
- border-radius: 4px;
- cursor: pointer;
- transition: transform 0.1s ease, box-shadow 0.2s ease;
- position: relative;
- margin: 0 auto;
- }
- .wplace-color-swatch.unavailable {
- border-color: #666;
- border-style: dashed;
- cursor: not-allowed;
- }
- .wplace-color-swatch:hover {
- transform: scale(1.1);
- z-index: 1;
- }
- .wplace-color-swatch:not(.active) {
- opacity: 0.3;
- filter: grayscale(80%);
- }
- .wplace-color-swatch.unavailable:not(.active) {
- opacity: 0.2;
- filter: grayscale(90%);
- }
- .wplace-color-swatch.active::after {
- content: '✔';
- position: absolute;
- top: 50%;
- left: 50%;
- transform: translate(-50%, -50%);
- color: white;
- font-size: 12px;
- font-weight: bold;
- text-shadow: 0 0 3px black;
- }
- .wplace-color-divider {
- border: none;
- height: 1px;
- background: rgba(255,255,255,0.1);
- margin: 8px 0;
- }
-
- .wplace-cooldown-control {
- margin-top: 8px;
- }
- .wplace-cooldown-control label {
- font-size: 11px;
- margin-bottom: 4px;
- display: block;
- }
- .wplace-slider-container {
- display: flex;
- align-items: center;
- gap: 8px;
- }
- .wplace-slider {
- flex: 1;
- -webkit-appearance: none;
- appearance: none;
- height: 4px;
- background: #444;
- border-radius: 2px;
- outline: none;
- }
- .wplace-slider::-webkit-slider-thumb {
- -webkit-appearance: none;
- width: 14px;
- height: 14px;
- background: ${theme.highlight};
- border-radius: 50%;
- cursor: pointer;
- }
-
-
- ${CONFIG.currentTheme === "Neon Retro"
- ? `
- input[type="checkbox"] {
- -webkit-appearance: none;
- -moz-appearance: none;
- appearance: none;
- width: 16px;
- height: 16px;
- border: 2px solid ${theme.text};
- background: ${theme.secondary};
- margin-right: 8px;
- position: relative;
- cursor: pointer;
- }
-
- input[type="checkbox"]:checked {
- background: ${theme.success};
- }
-
- input[type="checkbox"]:checked::after {
- content: '✓';
- position: absolute;
- top: -2px;
- left: 1px;
- color: ${theme.primary};
- font-size: 12px;
- font-weight: bold;
- }
-
- .fas, .fa {
- filter: drop-shadow(0 0 3px currentColor);
- }
-
- .wplace-speed-control {
- margin-top: 12px;
- padding: 12px;
- background: ${theme.secondary};
- border: ${theme.borderWidth} ${theme.borderStyle} ${theme.accent};
- border-radius: ${theme.borderRadius};
- backdrop-filter: ${theme.backdropFilter};
- }
-
- .wplace-speed-label {
- display: flex;
- align-items: center;
- margin-bottom: 8px;
- color: ${theme.text};
- font-size: 13px;
- font-weight: 600;
- }
-
- .wplace-speed-label i {
- margin-right: 6px;
- color: ${theme.highlight};
- }
-
- .wplace-speed-slider-container {
- display: flex;
- align-items: center;
- gap: 12px;
- }
-
- .wplace-speed-slider {
- flex: 1;
- height: 6px;
- border-radius: 3px;
- background: ${theme.primary};
- outline: none;
- cursor: pointer;
- -webkit-appearance: none;
- appearance: none;
- }
-
- .wplace-speed-slider::-webkit-slider-thumb {
- -webkit-appearance: none;
- appearance: none;
- width: 18px;
- height: 18px;
- border-radius: 50%;
- background: ${theme.highlight};
- cursor: pointer;
- border: 2px solid ${theme.text};
- box-shadow: ${theme.boxShadow};
- }
-
- .wplace-speed-slider::-moz-range-thumb {
- width: 18px;
- height: 18px;
- border-radius: 50%;
- background: ${theme.highlight};
- cursor: pointer;
- border: 2px solid ${theme.text};
- box-shadow: ${theme.boxShadow};
- }
-
- .wplace-speed-display {
- display: flex;
- align-items: center;
- gap: 4px;
- min-width: 90px;
- justify-content: flex-end;
- }
-
- #speedValue {
- color: ${theme.highlight};
- font-weight: 600;
- font-size: 14px;
- }
-
- .wplace-speed-unit {
- color: ${theme.text};
- font-size: 11px;
- opacity: 0.8;
- }
-
- #wplace-settings-container {
- position: fixed;
- top: 50%;
- left: 50%;
- transform: translate(-50%, -50%);
- z-index: 10001;
- min-width: 400px;
- max-width: 500px;
- background: ${theme.primary};
- border: ${theme.borderWidth} ${theme.borderStyle} ${theme.accent};
- border-radius: ${theme.borderRadius};
- box-shadow: ${theme.boxShadow};
- backdrop-filter: ${theme.backdropFilter};
- }
-
- .wplace-settings {
- padding: 16px;
- max-height: 400px;
- overflow-y: auto;
- }
-
- .wplace-setting-section {
- margin-bottom: 20px;
- padding: 12px;
- background: ${theme.secondary};
- border: ${theme.borderWidth} ${theme.borderStyle} ${theme.accent};
- border-radius: ${theme.borderRadius};
- }
-
- .wplace-setting-title {
- display: flex;
- align-items: center;
- margin-bottom: 12px;
- color: ${theme.text};
- font-size: 14px;
- font-weight: 600;
- }
-
- .wplace-setting-title i {
- margin-right: 8px;
- color: ${theme.highlight};
- }
-
- .wplace-setting-content {
- color: ${theme.text};
- }
-
- .wplace-section {
- margin-bottom: 20px;
- padding: 15px;
- background: ${theme.secondary};
- border: ${theme.borderWidth} ${theme.borderStyle} ${theme.accent};
- border-radius: ${theme.borderRadius};
- }
-
- .wplace-section-title {
- display: flex;
- align-items: center;
- margin-bottom: 15px;
- color: ${theme.text};
- font-size: 14px;
- font-weight: 600;
- }
-
- .wplace-section-title i {
- margin-right: 8px;
- color: ${theme.highlight};
- }
-
- .wplace-speed-container {
- display: flex;
- align-items: center;
- gap: 15px;
- margin-bottom: 10px;
- }
-
- .wplace-slider {
- flex: 1;
- height: 6px;
- background: ${theme.accent};
- border-radius: 3px;
- outline: none;
- -webkit-appearance: none;
- }
-
- .wplace-slider::-webkit-slider-thumb {
- -webkit-appearance: none;
- width: 18px;
- height: 18px;
- background: ${theme.highlight};
- border-radius: 50%;
- cursor: pointer;
- border: 2px solid ${theme.primary};
- }
-
- .wplace-speed-display {
- background: ${theme.accent};
- padding: 5px 10px;
- border-radius: 4px;
- color: ${theme.text};
- font-weight: 600;
- min-width: 80px;
- text-align: center;
- border: ${theme.borderWidth} ${theme.borderStyle} ${theme.highlight};
- }
-
- .wplace-select {
- width: 100%;
- padding: 8px 12px;
- background: ${theme.secondary};
- border: ${theme.borderWidth} ${theme.borderStyle} ${theme.accent};
- border-radius: ${theme.borderRadius};
- color: ${theme.text};
- font-size: 14px;
- margin-bottom: 10px;
- }
-
- .wplace-select:focus {
- outline: none;
- border-color: ${theme.highlight};
- }
-
- .wplace-description {
- color: ${theme.text};
- font-size: 12px;
- opacity: 0.8;
- line-height: 1.4;
- }
-
- .wplace-theme-custom {
- margin-top: 15px;
- padding: 15px;
- background: ${theme.accent};
- border-radius: ${theme.borderRadius};
- border: ${theme.borderWidth} ${theme.borderStyle} ${theme.highlight};
- }
-
- .wplace-custom-group {
- margin-bottom: 15px;
- }
-
- .wplace-custom-label {
- display: flex;
- align-items: center;
- margin-bottom: 8px;
- color: ${theme.text};
- font-size: 13px;
- font-weight: 600;
- }
-
- .wplace-custom-label i {
- margin-right: 8px;
- color: ${theme.highlight};
- width: 16px;
- }
-
- .wplace-color-input-group {
- display: flex;
- gap: 8px;
- align-items: center;
- }
-
- .wplace-color-input {
- width: 50px;
- height: 30px;
- border: none;
- border-radius: 4px;
- cursor: pointer;
- background: transparent;
- }
-
- .wplace-color-text {
- flex: 1;
- padding: 6px 10px;
- background: ${theme.secondary};
- border: ${theme.borderWidth} ${theme.borderStyle} ${theme.accent};
- border-radius: 4px;
- color: ${theme.text};
- font-size: 12px;
- font-family: monospace;
- }
-
- .wplace-animation-controls {
- display: flex;
- flex-direction: column;
- gap: 8px;
- }
-
- .wplace-checkbox-label {
- display: flex;
- align-items: center;
- gap: 8px;
- color: ${theme.text};
- font-size: 12px;
- cursor: pointer;
- }
-
- .wplace-checkbox-label input[type="checkbox"] {
- accent-color: ${theme.highlight};
- }
-
- .wplace-slider-container {
- display: flex;
- align-items: center;
- gap: 10px;
- }
-
- .wplace-slider-container .wplace-slider {
- flex: 1;
- }
-
- .wplace-slider-container span {
- color: ${theme.text};
- font-size: 12px;
- font-weight: 600;
- min-width: 40px;
- }
-
- .wplace-custom-actions {
- display: flex;
- gap: 10px;
- margin-top: 20px;
- border-top: 1px solid ${theme.accent};
- padding-top: 15px;
- }
-
- .wplace-btn-secondary {
- background: ${theme.accent};
- color: ${theme.text};
- border: ${theme.borderWidth} ${theme.borderStyle} ${theme.highlight};
- }
-
- .wplace-btn-secondary:hover {
- background: ${theme.secondary};
- }`
- : ""
- }
- `
- document.head.appendChild(style)
+ // Link external CSS files
+ const cssLink = document.createElement('link');
+ cssLink.rel = 'stylesheet';
+ cssLink.href = 'https://staninna.github.io/WPlace-AutoBOT/decoupled-css/auto-image-styles.css'; // TODO: Before merge change to https://raw.githubusercontent.com/Wplace-AutoBot/WPlace-AutoBOT/refs/heads/main/auto-image-styles.css
+ cssLink.setAttribute('data-wplace-theme', 'true');
+ document.head.appendChild(cssLink);
const container = document.createElement("div")
container.id = "wplace-image-bot-container"
@@ -4595,7 +3462,7 @@
- ${state.cooldownChargeThreshold}
+ ${state.cooldownChargeThreshold}
@@ -4669,19 +3536,13 @@
`linear-gradient(135deg, ${theme.primary} 0%, ${theme.secondary || theme.primary} 100%)` :
`linear-gradient(135deg, #667eea 0%, #764ba2 100%)`
- settingsContainer.style.cssText = `
- position: fixed;
- top: 50%;
- left: 50%;
- transform: translate(-50%, -50%);
- background: ${themeBackground};
- border: ${theme.borderWidth || '1px'} ${theme.borderStyle || 'solid'} ${theme.accent || 'rgba(255,255,255,0.1)'};
- border-radius: ${theme.borderRadius || '16px'};
- padding: 0;
- z-index: 10002;
- display: none;
+ settingsContainer.className = 'wplace-settings-container-base';
+ // Apply theme-specific background
+ settingsContainer.style.background = themeBackground;
+ settingsContainer.style.cssText += `
min-width: 420px;
max-width: 480px;
+ z-index: 99999;
color: ${theme.text || 'white'};
font-family: ${theme.fontFamily || "'Segoe UI', Tahoma, Geneva, Verdana, sans-serif"};
box-shadow: ${theme.boxShadow || '0 20px 40px rgba(0,0,0,0.3), 0 0 0 1px rgba(255,255,255,0.1)'};
@@ -4692,171 +3553,85 @@
box-shadow: ${theme.boxShadow || '0 20px 40px rgba(0,0,0,0.3)'},
0 0 30px ${theme.highlight || theme.neon || '#00ffff'};
` : ''}
- `
+ `;
settingsContainer.innerHTML = `
-