diff --git a/apps/web/public/brand/mento-ai-avatar.png b/apps/web/public/brand/mento-ai-avatar.png index 13403a3..a3f12b6 100644 Binary files a/apps/web/public/brand/mento-ai-avatar.png and b/apps/web/public/brand/mento-ai-avatar.png differ diff --git a/apps/web/public/brand/mento-logo.png b/apps/web/public/brand/mento-logo.png index 04b9094..b320f89 100644 Binary files a/apps/web/public/brand/mento-logo.png and b/apps/web/public/brand/mento-logo.png differ diff --git a/apps/web/public/brand/mento-logo.svg b/apps/web/public/brand/mento-logo.svg index a44345e..4f44ced 100644 --- a/apps/web/public/brand/mento-logo.svg +++ b/apps/web/public/brand/mento-logo.svg @@ -1,7 +1,8 @@ - - - - - + + + + + + diff --git a/apps/web/src/components/brand/MentoAiAvatar.vue b/apps/web/src/components/brand/MentoAiAvatar.vue index 843f587..54a5f55 100644 --- a/apps/web/src/components/brand/MentoAiAvatar.vue +++ b/apps/web/src/components/brand/MentoAiAvatar.vue @@ -6,7 +6,7 @@ withDefaults( showBubble?: boolean; }>(), { - size: 140, + size: 148, bubble: 'من دستیار فروش هوشمند سیستم هستم', showBubble: true, }, @@ -16,16 +16,13 @@ withDefaults( @@ -33,7 +30,7 @@ withDefaults( .ai-avatar { display: grid; justify-items: center; - gap: 0.45rem; + gap: 0.4rem; } .bubble { @@ -49,30 +46,13 @@ withDefaults( border: 1px solid rgba(255, 255, 255, 0.18); } -.figure { - position: relative; - width: 100%; - aspect-ratio: 1; - display: grid; - place-items: center; -} - .img { width: 100%; - height: 100%; + height: auto; + display: block; object-fit: contain; - position: relative; - z-index: 1; - filter: drop-shadow(0 12px 28px rgba(14, 165, 233, 0.35)); -} - -.glow { - position: absolute; - bottom: 8%; - width: 55%; - height: 14%; - border-radius: 999px; - background: radial-gradient(circle, rgba(56, 189, 248, 0.75), transparent 70%); - filter: blur(4px); + background: transparent; + /* soft presence without rectangular plate */ + filter: drop-shadow(0 10px 18px rgba(14, 165, 233, 0.28)); } diff --git a/apps/web/src/components/brand/MentoLogo.vue b/apps/web/src/components/brand/MentoLogo.vue index 353d271..ffd707a 100644 --- a/apps/web/src/components/brand/MentoLogo.vue +++ b/apps/web/src/components/brand/MentoLogo.vue @@ -15,13 +15,24 @@ withDefaults( @@ -82,15 +82,15 @@ function alertIcon(tone: string) { .hero { position: relative; display: grid; - grid-template-columns: minmax(0, 1fr) 180px; - gap: 1rem; + grid-template-columns: minmax(0, 1.4fr) minmax(220px, 0.7fr); + gap: 0.5rem 1rem; align-items: center; - min-height: 196px; - padding: 1.35rem 1.4rem; + min-height: 210px; + padding: 1.4rem 1.5rem 1.35rem; border-radius: 28px; overflow: hidden; color: #fff; - background: linear-gradient(110deg, #5eead4 0%, #14b8a6 26%, #0f766e 55%, #163a5f 100%); + background: linear-gradient(105deg, #4fd1c5 0%, #14b8a6 24%, #0f766e 52%, #123a5c 100%); box-shadow: 0 18px 40px rgba(15, 118, 110, 0.22); } diff --git a/apps/web/src/layouts/AppLayout.vue b/apps/web/src/layouts/AppLayout.vue index 70153cd..4959750 100644 --- a/apps/web/src/layouts/AppLayout.vue +++ b/apps/web/src/layouts/AppLayout.vue @@ -760,30 +760,32 @@ onUnmounted(() => { padding: 0 0.35rem; } -.desktop-topbar { - align-items: center; - justify-content: space-between; - gap: 1rem; - padding: 1.05rem 1.5rem 0.85rem; - position: sticky; - top: 0; - z-index: 20; - background: rgba(245, 247, 250, 0.9); - backdrop-filter: blur(10px); -} - .global-search { flex: 1; - max-width: 560px; + max-width: 620px; + margin-inline: auto; display: flex; align-items: center; gap: 0.7rem; background: #eef2f6; border-radius: 999px; - padding: 0.72rem 1rem; + padding: 0.78rem 1.1rem; border: 1px solid transparent; } +.desktop-topbar { + display: grid; + grid-template-columns: minmax(0, 1fr) auto; + align-items: center; + gap: 1rem; + padding: 1.05rem 1.5rem 0.85rem; + position: sticky; + top: 0; + z-index: 20; + background: rgba(245, 247, 250, 0.92); + backdrop-filter: blur(10px); +} + .global-search:focus-within { background: #fff; border-color: #cbd5e1; diff --git a/scripts/cleanup_avatar_plate.py b/scripts/cleanup_avatar_plate.py new file mode 100644 index 0000000..5810a50 --- /dev/null +++ b/scripts/cleanup_avatar_plate.py @@ -0,0 +1,26 @@ +from PIL import Image + +# Force-clear any remaining opaque black plate around AI avatar too +path = r"e:\projeha\crm\apps\web\public\brand\mento-ai-avatar.png" +img = Image.open(path).convert("RGBA") +px = img.load() +w, h = img.size +cleared = 0 +for y in range(h): + for x in range(w): + r, g, b, a = px[x, y] + if a == 0: + continue + # leftover flat dark teal/black plate + if r < 45 and g < 70 and b < 85 and max(r, g, b) - min(r, g, b) < 35: + # keep cyan glow pixels (more green/blue variance + brighter cyan) + if b > 120 or g > 140: + continue + px[x, y] = (r, g, b, 0) + cleared += 1 + elif r > 248 and g > 248 and b > 248: + px[x, y] = (255, 255, 255, 0) + cleared += 1 + +img.save(path, "PNG") +print("cleared", cleared, "pixels; size", img.size) diff --git a/scripts/process_ai_avatar.py b/scripts/process_ai_avatar.py new file mode 100644 index 0000000..22eabe7 --- /dev/null +++ b/scripts/process_ai_avatar.py @@ -0,0 +1,35 @@ +from PIL import Image + +src = r"C:\Users\Mahdi\.cursor\projects\e-projeha-crm\assets\mento-ai-avatar-transparent.png" +dst = r"e:\projeha\crm\apps\web\public\brand\mento-ai-avatar.png" + +img = Image.open(src).convert("RGBA") +pixels = img.load() +w, h = img.size +cx, cy = w / 2, h / 2 +radius = min(w, h) * 0.42 + +for y in range(h): + for x in range(w): + r, g, b, a = pixels[x, y] + if r > 245 and g > 245 and b > 245: + pixels[x, y] = (r, g, b, 0) + continue + # leftover dark plate far from character + if r < 40 and g < 70 and b < 80 and a > 200: + dist = ((x - cx) ** 2 + (y - cy) ** 2) ** 0.5 + if dist > radius: + pixels[x, y] = (r, g, b, 0) + +bbox = img.getbbox() +if bbox: + img = img.crop(bbox) + pad = 12 + padded = Image.new("RGBA", (img.width + pad * 2, img.height + pad * 2), (0, 0, 0, 0)) + padded.paste(img, (pad, pad), img) + img = padded + +img.save(dst, "PNG") +px = img.load() +print("saved", dst, img.size) +print("corner alpha", px[0, 0][3], px[img.width - 1, 0][3]) diff --git a/scripts/process_logo.py b/scripts/process_logo.py new file mode 100644 index 0000000..74cef38 --- /dev/null +++ b/scripts/process_logo.py @@ -0,0 +1,40 @@ +from PIL import Image + +src = r"C:\Users\Mahdi\.cursor\projects\e-projeha-crm\assets\mento-logo-mark.png" +dst_png = r"e:\projeha\crm\apps\web\public\brand\mento-logo.png" + +img = Image.open(src).convert("RGBA") +pixels = img.load() +w, h = img.size + +for y in range(h): + for x in range(w): + r, g, b, a = pixels[x, y] + # white canvas + if r > 235 and g > 235 and b > 235: + pixels[x, y] = (255, 255, 255, 0) + continue + # black / near-black canvas + if r < 28 and g < 28 and b < 28: + pixels[x, y] = (0, 0, 0, 0) + continue + # dark fringe around logo on black plate + if r < 40 and g < 45 and b < 50 and (r + g + b) < 110: + pixels[x, y] = (0, 0, 0, 0) + +bbox = img.getbbox() +if not bbox: + raise SystemExit("empty image after bg remove") + +img = img.crop(bbox) +pad = 10 +padded = Image.new("RGBA", (img.width + pad * 2, img.height + pad * 2), (0, 0, 0, 0)) +padded.paste(img, (pad, pad), img) +img = padded + +side = max(img.width, img.height) +canvas = Image.new("RGBA", (side, side), (0, 0, 0, 0)) +canvas.paste(img, ((side - img.width) // 2, (side - img.height) // 2), img) +canvas.save(dst_png, "PNG") +px = canvas.load() +print("logo saved", dst_png, canvas.size, "corner", px[0, 0])