be dirty sync
BIN
examples/app_hub/assets/_snapshot-globe-grid3.png
Normal file
|
After Width: | Height: | Size: 151 KiB |
240
examples/app_hub/assets/extract_red_polygons.py
Normal file
@@ -0,0 +1,240 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Extract red land polygons from Mercator reference image -> SVG paths."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import json
|
||||
import math
|
||||
from collections import deque
|
||||
from pathlib import Path
|
||||
|
||||
import numpy as np
|
||||
from PIL import Image
|
||||
|
||||
ROOT = Path(__file__).resolve().parent
|
||||
SRC = ROOT / "mercator-source.jpg"
|
||||
OUT_FLAT = ROOT / "hub-logo-continents-mercator-flat.svg"
|
||||
OUT_META = ROOT / "continents-meta.json"
|
||||
|
||||
# Source image is 800x519 Mercator-style plate.
|
||||
W, H = 800, 519
|
||||
|
||||
|
||||
def red_mask(rgb: np.ndarray) -> np.ndarray:
|
||||
r, g, b = rgb[..., 0], rgb[..., 1], rgb[..., 2]
|
||||
return (r.astype(np.int16) > 150) & (g.astype(np.int16) < 120) & (b.astype(np.int16) < 120)
|
||||
|
||||
|
||||
def dilate(mask: np.ndarray, radius: int = 3) -> np.ndarray:
|
||||
"""Bridge thin white grid lines between red land cells."""
|
||||
h, w = mask.shape
|
||||
out = mask.copy()
|
||||
ys, xs = np.where(mask)
|
||||
for y, x in zip(ys, xs):
|
||||
y0 = max(0, y - radius)
|
||||
y1 = min(h, y + radius + 1)
|
||||
x0 = max(0, x - radius)
|
||||
x1 = min(w, x + radius + 1)
|
||||
if mask[y0:y1, x0:x1].any():
|
||||
out[y0:y1, x0:x1] = True
|
||||
return out
|
||||
|
||||
|
||||
def label_components(mask: np.ndarray) -> tuple[np.ndarray, int]:
|
||||
h, w = mask.shape
|
||||
labels = np.zeros((h, w), dtype=np.int32)
|
||||
current = 0
|
||||
for y in range(h):
|
||||
for x in range(w):
|
||||
if not mask[y, x] or labels[y, x]:
|
||||
continue
|
||||
current += 1
|
||||
q = deque([(x, y)])
|
||||
labels[y, x] = current
|
||||
while q:
|
||||
cx, cy = q.popleft()
|
||||
for nx, ny in ((cx + 1, cy), (cx - 1, cy), (cx, cy + 1), (cx, cy - 1)):
|
||||
if 0 <= nx < w and 0 <= ny < h and mask[ny, nx] and labels[ny, nx] == 0:
|
||||
labels[ny, nx] = current
|
||||
q.append((nx, ny))
|
||||
return labels, current
|
||||
|
||||
|
||||
def trace_boundary(labels: np.ndarray, label_id: int) -> list[tuple[int, int]]:
|
||||
"""Moore-neighbor contour for one connected component."""
|
||||
h, w = labels.shape
|
||||
comp = labels == label_id
|
||||
if not comp.any():
|
||||
return []
|
||||
|
||||
# Start at topmost-leftmost pixel of component.
|
||||
ys, xs = np.where(comp)
|
||||
start = (int(xs[0]), int(ys[0]))
|
||||
x, y = start
|
||||
path = [start]
|
||||
# Directions: E, SE, S, SW, W, NW, N, NE
|
||||
dirs = [(1, 0), (1, 1), (0, 1), (-1, 1), (-1, 0), (-1, -1), (0, -1), (1, -1)]
|
||||
dir_idx = 0
|
||||
|
||||
def is_land(px: int, py: int) -> bool:
|
||||
return 0 <= px < w and 0 <= py < h and labels[py, px] == label_id
|
||||
|
||||
for _ in range(w * h * 4):
|
||||
found = False
|
||||
for i in range(8):
|
||||
nd = (dir_idx + i) % 8
|
||||
dx, dy = dirs[nd]
|
||||
nx, ny = x + dx, y + dy
|
||||
if is_land(nx, ny):
|
||||
x, y = nx, ny
|
||||
dir_idx = (nd + 6) % 8
|
||||
path.append((x, y))
|
||||
found = True
|
||||
break
|
||||
if not found:
|
||||
break
|
||||
if (x, y) == start and len(path) > 8:
|
||||
break
|
||||
return path
|
||||
|
||||
|
||||
def simplify(points: list[tuple[int, int]], min_dist: float = 2.0) -> list[tuple[int, int]]:
|
||||
if len(points) < 3:
|
||||
return points
|
||||
out = [points[0]]
|
||||
for p in points[1:]:
|
||||
ox, oy = out[-1]
|
||||
if math.hypot(p[0] - ox, p[1] - oy) >= min_dist:
|
||||
out.append(p)
|
||||
if out[0] != out[-1]:
|
||||
out.append(out[0])
|
||||
return out
|
||||
|
||||
|
||||
def path_d(points: list[tuple[float, float]]) -> str:
|
||||
if len(points) < 3:
|
||||
return ""
|
||||
x0, y0 = points[0]
|
||||
parts = [f"M {x0:.1f} {y0:.1f}"]
|
||||
for x, y in points[1:]:
|
||||
parts.append(f"L {x:.1f} {y:.1f}")
|
||||
parts.append("Z")
|
||||
return " ".join(parts)
|
||||
|
||||
|
||||
def mercator_y_to_lat(y: float, h: float) -> float:
|
||||
# Map top->north, bottom->south; clamp to avoid infinities at poles.
|
||||
t = 1.0 - (y / h)
|
||||
t = min(max(t, 0.02), 0.98)
|
||||
return math.degrees(math.atan(math.sinh(math.pi * (2 * t - 1))))
|
||||
|
||||
|
||||
def lat_lon_to_globe(lat: float, lon: float, cx: float, cy: float, r: float) -> tuple[float, float]:
|
||||
"""Simple orthographic-ish placement on visible globe disk."""
|
||||
lat_r = math.radians(lat)
|
||||
lon_r = math.radians(lon)
|
||||
# Visible hemisphere centered around lon 20, lat 20 for this logo framing.
|
||||
lon0 = math.radians(20.0)
|
||||
lat0 = math.radians(15.0)
|
||||
# Rotate lon relative to center.
|
||||
dlon = lon_r - lon0
|
||||
x = cx + r * math.cos(lat_r) * math.sin(dlon)
|
||||
y = cy - r * math.sin(lat_r)
|
||||
return x, y
|
||||
|
||||
|
||||
def map_to_globe(points: list[tuple[int, int]], w: int, h: int) -> list[tuple[float, float]]:
|
||||
out: list[tuple[float, float]] = []
|
||||
cx, cy, r = 720.0, 560.0, 318.0
|
||||
for x, y in points:
|
||||
lon = (x / w) * 360.0 - 180.0
|
||||
lat = mercator_y_to_lat(float(y), float(h))
|
||||
gx, gy = lat_lon_to_globe(lat, lon, cx, cy, r)
|
||||
out.append((gx, gy))
|
||||
return out
|
||||
|
||||
|
||||
def main() -> None:
|
||||
img = Image.open(SRC).convert("RGB")
|
||||
rgb = np.array(img)
|
||||
w, h = rgb.shape[1], rgb.shape[0]
|
||||
mask = dilate(red_mask(rgb), radius=3)
|
||||
labels, n = label_components(mask)
|
||||
|
||||
components: list[dict] = []
|
||||
for label_id in range(1, n + 1):
|
||||
area = int((labels == label_id).sum())
|
||||
if area < 500: # drop tiny noise / watermark specks
|
||||
continue
|
||||
boundary = trace_boundary(labels, label_id)
|
||||
if len(boundary) < 20:
|
||||
continue
|
||||
boundary = simplify(boundary, min_dist=3.5)
|
||||
ys, xs = np.where(labels == label_id)
|
||||
bbox = [int(xs.min()), int(ys.min()), int(xs.max()), int(ys.max())]
|
||||
components.append(
|
||||
{
|
||||
"id": label_id,
|
||||
"area": area,
|
||||
"bbox": bbox,
|
||||
"flat": path_d([(float(x), float(y)) for x, y in boundary]),
|
||||
"globe": path_d(map_to_globe(boundary, w, h)),
|
||||
}
|
||||
)
|
||||
|
||||
components.sort(key=lambda c: c["area"], reverse=True)
|
||||
|
||||
flat_paths = "\n ".join(
|
||||
f'<path id="continent-{c["id"]}" data-area="{c["area"]}" d="{c["flat"]}"/>'
|
||||
for c in components
|
||||
)
|
||||
globe_paths = "\n ".join(
|
||||
f'<path id="continent-{c["id"]}" data-area="{c["area"]}" d="{c["globe"]}"/>'
|
||||
for c in components
|
||||
)
|
||||
|
||||
OUT_FLAT.write_text(
|
||||
f"""<svg xmlns="http://www.w3.org/2000/svg" width="{w}" height="{h}" viewBox="0 0 {w} {h}" role="img" aria-label="Extracted continents (flat Mercator plate)">
|
||||
<rect width="100%" height="100%" fill="#b8d4e8"/>
|
||||
<g id="continents-extracted" fill="#c41e1a" fill-opacity="0.92" stroke="#8f1410" stroke-width="0.8">
|
||||
{flat_paths}
|
||||
</g>
|
||||
</svg>
|
||||
""",
|
||||
encoding="utf-8",
|
||||
)
|
||||
|
||||
globe_svg = ROOT.parent.parent / "examples" / "app_hub" / "assets" / "hub-logo-continents-mercator-globe.svg"
|
||||
globe_svg.write_text(
|
||||
f"""<svg xmlns="http://www.w3.org/2000/svg" width="1920" height="1080" viewBox="0 0 1920 1080" preserveAspectRatio="xMidYMid slice" role="img" aria-label="Extracted continents mapped to globe viewBox">
|
||||
<defs>
|
||||
<clipPath id="globeClip"><circle cx="720" cy="560" r="322"/></clipPath>
|
||||
</defs>
|
||||
<g id="continents-globe" clip-path="url(#globeClip)" fill="#7287a1" fill-opacity="0.88" stroke="#a8b8cc" stroke-opacity="0.45" stroke-width="1">
|
||||
{globe_paths}
|
||||
</g>
|
||||
</svg>
|
||||
""",
|
||||
encoding="utf-8",
|
||||
)
|
||||
|
||||
OUT_META.write_text(
|
||||
json.dumps(
|
||||
{
|
||||
"source": str(SRC.name),
|
||||
"size": [w, h],
|
||||
"components": len(components),
|
||||
"areas_top10": [c["area"] for c in components[:10]],
|
||||
},
|
||||
indent=2,
|
||||
),
|
||||
encoding="utf-8",
|
||||
)
|
||||
|
||||
print(f"components={len(components)}")
|
||||
print(f"wrote {OUT_FLAT}")
|
||||
print(f"wrote {globe_svg}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
|
After Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 23 KiB |
24
examples/app_hub/assets/hub-logo-fragment-globe-4x4.svg
Normal file
@@ -0,0 +1,24 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1920" height="1080" viewBox="0 0 1920 1080" preserveAspectRatio="xMidYMid slice" role="img" aria-label="Globe fragment 4x4">
|
||||
<defs>
|
||||
<radialGradient id="globeOcean" cx="36%" cy="28%" r="74%">
|
||||
<stop offset="0%" stop-color="#2a3d56"/>
|
||||
<stop offset="45%" stop-color="#1a2332"/>
|
||||
<stop offset="100%" stop-color="#0a0e14"/>
|
||||
</radialGradient>
|
||||
<clipPath id="gridClip"><circle cx="720" cy="560" r="322"/></clipPath>
|
||||
</defs>
|
||||
|
||||
<circle id="globe-body" cx="720" cy="560" r="330" fill="url(#globeOcean)"/>
|
||||
|
||||
<!-- Mercator-style 4x4 grid: 3 vertical + 3 horizontal lines -->
|
||||
<g id="globe-grid" clip-path="url(#gridClip)" fill="none" stroke="#e7ecf3" stroke-opacity="0.92" stroke-width="7.5" stroke-linecap="round">
|
||||
<path d="M 580 248 Q 510 560 580 872"/>
|
||||
<path d="M 720 238 Q 720 560 720 882"/>
|
||||
<path d="M 860 248 Q 930 560 860 872"/>
|
||||
<ellipse cx="720" cy="395" rx="275" ry="80"/>
|
||||
<ellipse cx="720" cy="560" rx="320" ry="105"/>
|
||||
<ellipse cx="720" cy="725" rx="275" ry="80"/>
|
||||
</g>
|
||||
|
||||
<circle id="globe-border" cx="720" cy="560" r="330" fill="none" stroke="#e7ecf3" stroke-width="15"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.2 KiB |
@@ -0,0 +1,48 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1920" height="1080" viewBox="0 0 1920 1080" preserveAspectRatio="xMidYMid slice" role="img" aria-label="Globe grid overlay build 20260527j">
|
||||
<defs>
|
||||
<linearGradient id="gradNorthPole" x1="830" y1="432" x2="610" y2="358" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0%" stop-color="#e7ecf3" stop-opacity="0.02"/>
|
||||
<stop offset="100%" stop-color="#e7ecf3" stop-opacity="1"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="gradSouthPole" x1="830" y1="754" x2="610" y2="680" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0%" stop-color="#e7ecf3" stop-opacity="0.02"/>
|
||||
<stop offset="100%" stop-color="#e7ecf3" stop-opacity="1"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="gradEquator" x1="1040" y1="560" x2="400" y2="560" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0%" stop-color="#e7ecf3" stop-opacity="0.02"/>
|
||||
<stop offset="50%" stop-color="#e7ecf3" stop-opacity="1"/>
|
||||
<stop offset="100%" stop-color="#e7ecf3" stop-opacity="0.02"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="meridianSun" x1="390" y1="560" x2="1050" y2="560" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0%" stop-color="#f2f6fc" stop-opacity="0.95"/>
|
||||
<stop offset="52%" stop-color="#d7e0ec" stop-opacity="0.78"/>
|
||||
<stop offset="100%" stop-color="#4f6178" stop-opacity="0.92"/>
|
||||
</linearGradient>
|
||||
<clipPath id="gridClip"><circle cx="720" cy="560" r="322"/></clipPath>
|
||||
</defs>
|
||||
|
||||
<g id="globe-grid" clip-path="url(#gridClip)" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||
<circle id="globe-pivot" cx="720" cy="560" r="7" fill="#5eead4" stroke="#0a0e14" stroke-width="1.5"/>
|
||||
<path id="globe-meridian-west" d="M 620 248 Q 358 560 620 872" stroke="url(#meridianSun)" stroke-opacity="0.98" stroke-width="8"/>
|
||||
<path id="globe-meridian-prime" d="M 720 248 L 720 872" stroke="url(#meridianSun)" stroke-opacity="0.98" stroke-width="7.5"/>
|
||||
<path id="globe-meridian-east" d="M 820 248 Q 1082 560 820 872" stroke="url(#meridianSun)" stroke-opacity="0.98" stroke-width="8"/>
|
||||
<ellipse id="globe-equator" cx="720" cy="560" rx="318" ry="11" stroke="url(#gradEquator)" stroke-width="7.5"/>
|
||||
<ellipse id="globe-north-pole" cx="720" cy="392" rx="260" ry="39" stroke="url(#gradNorthPole)" stroke-width="7.5"/>
|
||||
<ellipse id="globe-south-pole" cx="720" cy="728" rx="260" ry="39" stroke="url(#gradSouthPole)" stroke-width="7.5"/>
|
||||
</g>
|
||||
|
||||
<g id="globe-compass" transform="translate(1050 820)">
|
||||
<circle cx="0" cy="0" r="52" fill="#0a0e14" fill-opacity="0.42" stroke="#c7d3e1" stroke-opacity="0.52" stroke-width="2"/>
|
||||
<circle cx="0" cy="0" r="40" fill="none" stroke="#dbe5f1" stroke-opacity="0.64" stroke-width="1.5"/>
|
||||
<path d="M 0 -38 L 9 0 L 0 38 L -9 0 Z" fill="#e7ecf3" fill-opacity="0.9"/>
|
||||
<path d="M -38 0 L 0 -9 L 38 0 L 0 9 Z" fill="#8ea1b9" fill-opacity="0.86"/>
|
||||
<path d="M 0 -28 L 6 0 L 0 28 L -6 0 Z" fill="#223246" fill-opacity="0.9"/>
|
||||
<circle cx="0" cy="0" r="4.2" fill="#e7ecf3" fill-opacity="0.92"/>
|
||||
<text x="0" y="-56" text-anchor="middle" fill="#e7ecf3" fill-opacity="0.72" font-size="12" font-family="Segoe UI, sans-serif">N</text>
|
||||
<text x="0" y="68" text-anchor="middle" fill="#a9bbce" fill-opacity="0.68" font-size="12" font-family="Segoe UI, sans-serif">S</text>
|
||||
<text x="-66" y="4" text-anchor="middle" fill="#a9bbce" fill-opacity="0.68" font-size="12" font-family="Segoe UI, sans-serif">W</text>
|
||||
<text x="66" y="4" text-anchor="middle" fill="#a9bbce" fill-opacity="0.68" font-size="12" font-family="Segoe UI, sans-serif">E</text>
|
||||
</g>
|
||||
|
||||
<circle id="globe-border" cx="720" cy="560" r="330" fill="none" stroke="#e7ecf3" stroke-width="15"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.6 KiB |
@@ -0,0 +1,4 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1920" height="1080" viewBox="0 0 1920 1080" preserveAspectRatio="xMidYMid slice" role="img" aria-label="Internal snapshot globe 20260526e">
|
||||
<!-- Internal snapshot pointer for build 20260526e -->
|
||||
<image href="hub-logo-fragment-globe.svg?v=20260526e" x="0" y="0" width="1920" height="1080"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 348 B |
@@ -0,0 +1,4 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1920" height="1080" viewBox="0 0 1920 1080" preserveAspectRatio="xMidYMid slice" role="img" aria-label="Internal snapshot globe 20260527g">
|
||||
<!-- Internal snapshot pointer for build 20260527g -->
|
||||
<image href="hub-logo-fragment-globe.svg?v=20260527g" x="0" y="0" width="1920" height="1080"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 348 B |
@@ -0,0 +1,4 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1920" height="1080" viewBox="0 0 1920 1080" preserveAspectRatio="xMidYMid slice" role="img" aria-label="Internal snapshot globe 20260527i">
|
||||
<!-- Internal snapshot pointer for build 20260527i -->
|
||||
<image href="hub-logo-fragment-globe.svg?v=20260527i" x="0" y="0" width="1920" height="1080"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 348 B |
@@ -0,0 +1,4 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1920" height="1080" viewBox="0 0 1920 1080" preserveAspectRatio="xMidYMid slice" role="img" aria-label="Internal snapshot globe 20260527j">
|
||||
<!-- Internal snapshot pointer for build 20260527j -->
|
||||
<image href="hub-logo-fragment-globe.svg?v=20260527j" x="0" y="0" width="1920" height="1080"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 348 B |
@@ -1,38 +1,62 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1920 1080" role="img" aria-label="Globe fragment">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1920" height="1080" viewBox="0 0 1920 1080" preserveAspectRatio="xMidYMid slice" role="img" aria-label="Globe fragment 3x3 build 20260527i">
|
||||
<!-- build=20260527i: thunder title pass + darker oceans with separate continent layer -->
|
||||
<defs>
|
||||
<radialGradient id="globeOcean" cx="38%" cy="30%" r="72%">
|
||||
<stop offset="0%" stop-color="#243044"/>
|
||||
<stop offset="50%" stop-color="#1a2332"/>
|
||||
<stop offset="100%" stop-color="#0a0e14"/>
|
||||
<radialGradient id="globeOcean" cx="24%" cy="18%" r="86%">
|
||||
<stop offset="0%" stop-color="#466287"/>
|
||||
<stop offset="42%" stop-color="#16263c"/>
|
||||
<stop offset="100%" stop-color="#04060b"/>
|
||||
</radialGradient>
|
||||
<linearGradient id="globeTerminator" x1="0%" y1="0%" x2="100%" y2="0%">
|
||||
<stop offset="0%" stop-color="#3d8bfd" stop-opacity="0.08"/>
|
||||
<stop offset="40%" stop-color="#3d8bfd" stop-opacity="0.18"/>
|
||||
<stop offset="70%" stop-color="#0a0e14" stop-opacity="0.55"/>
|
||||
<stop offset="100%" stop-color="#0a0e14" stop-opacity="0.80"/>
|
||||
|
||||
<linearGradient id="gradNorthPole" x1="830" y1="432" x2="610" y2="358" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0%" stop-color="#e7ecf3" stop-opacity="0.02"/>
|
||||
<stop offset="100%" stop-color="#e7ecf3" stop-opacity="1"/>
|
||||
</linearGradient>
|
||||
<radialGradient id="globeSpecular" cx="35%" cy="28%" r="45%">
|
||||
<stop offset="0%" stop-color="#e7ecf3" stop-opacity="0.12"/>
|
||||
<stop offset="100%" stop-color="#e7ecf3" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
<linearGradient id="continentGrad" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||
<stop offset="0%" stop-color="#5a6b82"/>
|
||||
<stop offset="100%" stop-color="#3d5060"/>
|
||||
|
||||
<linearGradient id="gradSouthPole" x1="830" y1="754" x2="610" y2="680" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0%" stop-color="#e7ecf3" stop-opacity="0.02"/>
|
||||
<stop offset="100%" stop-color="#e7ecf3" stop-opacity="1"/>
|
||||
</linearGradient>
|
||||
<clipPath id="globeClip"><circle cx="720" cy="560" r="330"/></clipPath>
|
||||
|
||||
<linearGradient id="gradEquator" x1="1040" y1="560" x2="400" y2="560" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0%" stop-color="#e7ecf3" stop-opacity="0.02"/>
|
||||
<stop offset="50%" stop-color="#e7ecf3" stop-opacity="1"/>
|
||||
<stop offset="100%" stop-color="#e7ecf3" stop-opacity="0.02"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="meridianSun" x1="390" y1="560" x2="1050" y2="560" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0%" stop-color="#f2f6fc" stop-opacity="0.95"/>
|
||||
<stop offset="52%" stop-color="#d7e0ec" stop-opacity="0.78"/>
|
||||
<stop offset="100%" stop-color="#4f6178" stop-opacity="0.92"/>
|
||||
</linearGradient>
|
||||
|
||||
<clipPath id="gridClip"><circle cx="720" cy="560" r="322"/></clipPath>
|
||||
</defs>
|
||||
<g id="globe-body"><circle cx="720" cy="560" r="330" fill="url(#globeOcean)" stroke="#2d3a4f" stroke-width="1.5"/></g>
|
||||
<g id="globe-grid" clip-path="url(#globeClip)" fill="none" stroke="#e7ecf3" stroke-opacity="0.28" stroke-width="1.5">
|
||||
<ellipse cx="720" cy="560" rx="330" ry="78"/><ellipse cx="720" cy="560" rx="330" ry="155"/><ellipse cx="720" cy="560" rx="330" ry="232"/><ellipse cx="720" cy="560" rx="330" ry="295"/>
|
||||
<line x1="720" y1="230" x2="720" y2="890"/><path d="M 500 230 Q 480 560 500 890"/><path d="M 940 230 Q 960 560 940 890"/>
|
||||
<path d="M 580 230 Q 548 560 580 890"/><path d="M 860 230 Q 892 560 860 890"/>
|
||||
|
||||
<circle id="globe-body" cx="720" cy="560" r="330" fill="url(#globeOcean)"/>
|
||||
|
||||
<g id="globe-grid" clip-path="url(#gridClip)" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||
<circle id="globe-pivot" cx="720" cy="560" r="7" fill="#5eead4" stroke="#0a0e14" stroke-width="1.5"/>
|
||||
|
||||
<path id="globe-meridian-west" d="M 620 248 Q 358 560 620 872" stroke="url(#meridianSun)" stroke-opacity="0.98" stroke-width="8"/>
|
||||
<path id="globe-meridian-prime" d="M 720 248 L 720 872" stroke="url(#meridianSun)" stroke-opacity="0.98" stroke-width="7.5"/>
|
||||
<path id="globe-meridian-east" d="M 820 248 Q 1082 560 820 872" stroke="url(#meridianSun)" stroke-opacity="0.98" stroke-width="8"/>
|
||||
|
||||
<ellipse id="globe-equator" cx="720" cy="560" rx="318" ry="11" stroke="url(#gradEquator)" stroke-width="7.5"/>
|
||||
<ellipse id="globe-north-pole" cx="720" cy="392" rx="260" ry="39" stroke="url(#gradNorthPole)" stroke-width="7.5"/>
|
||||
<ellipse id="globe-south-pole" cx="720" cy="728" rx="260" ry="39" stroke="url(#gradSouthPole)" stroke-width="7.5"/>
|
||||
</g>
|
||||
<g id="globe-continents" clip-path="url(#globeClip)" fill="url(#continentGrad)" stroke="#8b9cb3" stroke-opacity="0.35" stroke-width="1">
|
||||
<path d="M 590 350 Q 610 325 655 320 Q 700 315 745 328 Q 810 335 855 355 Q 900 375 895 415 Q 888 445 860 458 Q 830 470 795 462 Q 770 468 750 488 Q 728 510 700 505 Q 668 498 640 480 Q 610 462 592 435 Q 570 405 590 350 Z"/>
|
||||
<path d="M 640 480 Q 655 490 668 512 Q 680 535 678 570 Q 676 610 662 645 Q 648 678 628 692 Q 608 700 592 685 Q 575 668 572 640 Q 568 605 576 568 Q 582 535 590 508 Q 600 488 614 480 Q 628 472 640 480 Z"/>
|
||||
<path d="M 430 360 Q 415 340 400 355 Q 390 372 398 400 Q 408 430 428 448 Q 450 464 468 455 Q 480 444 474 420 Q 468 395 448 375 Q 440 368 430 360 Z"/>
|
||||
|
||||
<g id="globe-compass" transform="translate(1050 820)">
|
||||
<circle cx="0" cy="0" r="52" fill="#0a0e14" fill-opacity="0.42" stroke="#c7d3e1" stroke-opacity="0.52" stroke-width="2"/>
|
||||
<circle cx="0" cy="0" r="40" fill="none" stroke="#dbe5f1" stroke-opacity="0.64" stroke-width="1.5"/>
|
||||
<path d="M 0 -38 L 9 0 L 0 38 L -9 0 Z" fill="#e7ecf3" fill-opacity="0.9"/>
|
||||
<path d="M -38 0 L 0 -9 L 38 0 L 0 9 Z" fill="#8ea1b9" fill-opacity="0.86"/>
|
||||
<path d="M 0 -28 L 6 0 L 0 28 L -6 0 Z" fill="#223246" fill-opacity="0.9"/>
|
||||
<circle cx="0" cy="0" r="4.2" fill="#e7ecf3" fill-opacity="0.92"/>
|
||||
<text x="0" y="-56" text-anchor="middle" fill="#e7ecf3" fill-opacity="0.72" font-size="12" font-family="Segoe UI, sans-serif">N</text>
|
||||
<text x="0" y="68" text-anchor="middle" fill="#a9bbce" fill-opacity="0.68" font-size="12" font-family="Segoe UI, sans-serif">S</text>
|
||||
<text x="-66" y="4" text-anchor="middle" fill="#a9bbce" fill-opacity="0.68" font-size="12" font-family="Segoe UI, sans-serif">W</text>
|
||||
<text x="66" y="4" text-anchor="middle" fill="#a9bbce" fill-opacity="0.68" font-size="12" font-family="Segoe UI, sans-serif">E</text>
|
||||
</g>
|
||||
<circle id="globe-terminator" cx="720" cy="560" r="330" fill="url(#globeTerminator)" clip-path="url(#globeClip)"/>
|
||||
<circle cx="720" cy="560" r="330" fill="url(#globeSpecular)" clip-path="url(#globeClip)"/>
|
||||
<circle cx="720" cy="560" r="330" fill="none" stroke="#3d8bfd" stroke-opacity="0.25" stroke-width="2"/>
|
||||
|
||||
<circle id="globe-border" cx="720" cy="560" r="330" fill="none" stroke="#e7ecf3" stroke-width="15"/>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 4.0 KiB |
@@ -1,40 +1,110 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1920 1080" role="img" aria-label="Rocket fragment">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1920" height="1080" viewBox="0 0 1920 1080" preserveAspectRatio="xMidYMid slice" role="img" aria-label="Rocket fragment">
|
||||
<defs>
|
||||
<linearGradient id="rocketBodyGrad" x1="0%" y1="0%" x2="0%" y2="100%">
|
||||
<stop offset="0%" stop-color="#e7ecf3"/>
|
||||
<stop offset="35%" stop-color="#c8d4e3"/>
|
||||
<stop offset="70%" stop-color="#8b9cb3"/>
|
||||
<stop offset="100%" stop-color="#4a5a6e"/>
|
||||
<linearGradient id="hullTop" x1="0%" y1="0%" x2="0%" y2="100%">
|
||||
<stop offset="0%" stop-color="#ffffff"/>
|
||||
<stop offset="40%" stop-color="#e7ecf3"/>
|
||||
<stop offset="100%" stop-color="#9aadc4"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="rocketUnderGrad" x1="0%" y1="0%" x2="0%" y2="100%">
|
||||
<stop offset="0%" stop-color="#4a5a6e"/>
|
||||
<stop offset="100%" stop-color="#2d3a4f"/>
|
||||
<linearGradient id="hullSide" x1="0%" y1="0%" x2="0%" y2="100%">
|
||||
<stop offset="0%" stop-color="#c5d0df"/>
|
||||
<stop offset="55%" stop-color="#7f92a8"/>
|
||||
<stop offset="100%" stop-color="#3a4a5e"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="hullShadow" x1="0%" y1="0%" x2="100%" y2="0%">
|
||||
<stop offset="0%" stop-color="#1a2332" stop-opacity="0.55"/>
|
||||
<stop offset="100%" stop-color="#1a2332" stop-opacity="0"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="stripeBlue" x1="0%" y1="0%" x2="0%" y2="100%">
|
||||
<stop offset="0%" stop-color="#5ba3ff"/>
|
||||
<stop offset="100%" stop-color="#1e4a8a"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="wingGrad" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||
<stop offset="0%" stop-color="#3d8bfd"/>
|
||||
<stop offset="0%" stop-color="#4f9bff"/>
|
||||
<stop offset="100%" stop-color="#1a2332"/>
|
||||
</linearGradient>
|
||||
<radialGradient id="nozzleGlow" cx="50%" cy="50%" r="50%">
|
||||
<stop offset="0%" stop-color="#ffffff" stop-opacity="1"/>
|
||||
<stop offset="30%" stop-color="#5eead4" stop-opacity="0.9"/>
|
||||
<stop offset="65%" stop-color="#3d8bfd" stop-opacity="0.6"/>
|
||||
<linearGradient id="glassGrad" x1="0%" y1="0%" x2="0%" y2="100%">
|
||||
<stop offset="0%" stop-color="#0f1a28"/>
|
||||
<stop offset="100%" stop-color="#243044"/>
|
||||
</linearGradient>
|
||||
<radialGradient id="engineGlow" cx="50%" cy="50%" r="50%">
|
||||
<stop offset="0%" stop-color="#ffffff"/>
|
||||
<stop offset="25%" stop-color="#5eead4"/>
|
||||
<stop offset="55%" stop-color="#3d8bfd"/>
|
||||
<stop offset="100%" stop-color="#3d8bfd" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
<filter id="nozzleFilter" x="-100%" y="-100%" width="300%" height="300%">
|
||||
<feGaussianBlur stdDeviation="14" result="b"/>
|
||||
<feMerge><feMergeNode in="b"/><feMergeNode in="SourceGraphic"/></feMerge>
|
||||
<filter id="engineBloom" x="-120%" y="-120%" width="340%" height="340%">
|
||||
<feGaussianBlur stdDeviation="16" result="b"/>
|
||||
<feMerge><feMergeNode in="b"/><feMergeNode in="b"/><feMergeNode in="SourceGraphic"/></feMerge>
|
||||
</filter>
|
||||
<filter id="softShadow" x="-30%" y="-30%" width="160%" height="160%">
|
||||
<feDropShadow dx="4" dy="8" stdDeviation="6" flood-color="#000" flood-opacity="0.45"/>
|
||||
</filter>
|
||||
</defs>
|
||||
<g id="rocketship" transform="translate(1210,390) rotate(-32) scale(1,-1)">
|
||||
<path d="M -340 0 L -300 -22 L -80 -26 L 0 0 L -80 8 L -300 8 Z" fill="url(#rocketUnderGrad)" stroke="#2d3a4f" stroke-width="1.2"/>
|
||||
<path d="M -300 22 L -80 26 L 0 0 L -80 -8 L -300 -8 Z" fill="url(#rocketBodyGrad)" stroke="#1a2332" stroke-width="1.2"/>
|
||||
<path d="M -290 -6 L -100 -8 L -60 -4 L -100 0 L -290 0 Z" fill="#3d8bfd" opacity="0.85"/>
|
||||
<path d="M -80 -26 Q 30 -14 80 0 Q 30 14 -80 26 L -80 -26 Z" fill="#e7ecf3" stroke="#8b9cb3" stroke-width="1"/>
|
||||
<path d="M -60 -16 Q -30 -14 -10 -10 Q -30 -6 -60 -4 Z" fill="#0a0e14" stroke="#3d8bfd" stroke-width="1"/>
|
||||
<path d="M -280 22 L -160 22 L -100 90 L -240 70 Z" fill="url(#wingGrad)" stroke="#2d3a4f" stroke-width="1" opacity="0.95"/>
|
||||
<path d="M -260 -22 L -180 -22 L -160 -55 L -240 -45 Z" fill="#3d8bfd" stroke="#1a2332" stroke-width="1" opacity="0.80"/>
|
||||
<ellipse cx="-310" cy="0" rx="32" ry="20" fill="#2d3a4f" stroke="#8b9cb3" stroke-width="1"/>
|
||||
<ellipse cx="-310" cy="0" rx="24" ry="15" fill="#1a2332"/>
|
||||
<ellipse cx="-342" cy="0" rx="20" ry="20" fill="url(#nozzleGlow)" filter="url(#nozzleFilter)" opacity="0.90"/>
|
||||
|
||||
<g id="rocketship" transform="translate(1180,355) rotate(-30) scale(1,-1)" filter="url(#softShadow)">
|
||||
<!-- Belly shadow -->
|
||||
<path d="M -455 18 L -120 28 L 40 14 L -120 -4 Z" fill="url(#hullShadow)" opacity="0.65"/>
|
||||
|
||||
<!-- Lower hull -->
|
||||
<path d="M -455 14 L -118 26 L 42 12 L 118 2 L 42 -8 L -118 -18 L -455 -8 Z" fill="url(#hullSide)" stroke="#2d3a4f" stroke-width="1.2"/>
|
||||
|
||||
<!-- Upper hull -->
|
||||
<path d="M -118 -18 L 42 -8 L 118 2 L 42 12 L -118 26 L -420 22 L -455 14 L -420 6 L -118 -18 Z" fill="url(#hullTop)" stroke="#8b9cb3" stroke-width="1"/>
|
||||
|
||||
<!-- Side blue stripe -->
|
||||
<path d="M -400 4 L -150 8 L -80 6 L -150 2 L -400 -2 Z" fill="url(#stripeBlue)"/>
|
||||
|
||||
<!-- Panel lines -->
|
||||
<g stroke="#8b9cb3" stroke-opacity="0.45" stroke-width="0.75" fill="none">
|
||||
<path d="M -380 6 L -380 -6"/><path d="M -300 8 L -300 -8"/><path d="M -220 10 L -220 -10"/>
|
||||
<path d="M -140 10 L -140 -10"/><path d="M -60 8 L -60 -8"/>
|
||||
<path d="M -380 -6 Q -250 -4 -118 -8"/><path d="M -380 6 Q -250 4 -118 10"/>
|
||||
</g>
|
||||
|
||||
<!-- Nose cone -->
|
||||
<path d="M 42 -8 L 118 2 L 42 12 L 8 10 L 8 -4 Z" fill="#f4f7fb" stroke="#9aadc4" stroke-width="1"/>
|
||||
<path d="M 42 -6 L 96 2 L 42 10 L 18 8 L 18 -2 Z" fill="#ffffff" opacity="0.45"/>
|
||||
|
||||
<!-- Top canopy (rocketship2) -->
|
||||
<path d="M -80 -14 L 72 -8 L 96 2 L 72 6 L -80 2 L -110 -4 Z" fill="url(#glassGrad)" stroke="#3d8bfd" stroke-width="0.9"/>
|
||||
<g fill="#5eead4" opacity="0.9">
|
||||
<circle cx="-52" cy="-6" r="2.2"/><circle cx="-28" cy="-5" r="2"/><circle cx="-4" cy="-4" r="1.8"/>
|
||||
<circle cx="20" cy="-3" r="1.6"/><circle cx="44" cy="-2" r="1.4"/>
|
||||
</g>
|
||||
|
||||
<!-- Belly observation windows -->
|
||||
<path d="M -220 16 L -120 18 L -90 24 L -120 30 L -220 28 L -250 24 Z" fill="url(#glassGrad)" stroke="#3d8bfd" stroke-width="0.8" opacity="0.95"/>
|
||||
<g stroke="#5eead4" stroke-width="0.6" opacity="0.7">
|
||||
<line x1="-210" y1="22" x2="-210" y2="26"/><line x1="-180" y1="22" x2="-180" y2="26"/>
|
||||
<line x1="-150" y1="23" x2="-150" y2="27"/><line x1="-130" y1="24" x2="-130" y2="28"/>
|
||||
</g>
|
||||
|
||||
<!-- Main swept wings -->
|
||||
<path d="M -340 26 L -190 28 L -118 118 L -300 98 Z" fill="url(#wingGrad)" stroke="#1a2332" stroke-width="1"/>
|
||||
<path d="M -340 26 L -190 28 L -150 78" fill="none" stroke="#5eead4" stroke-width="1.2" opacity="0.55"/>
|
||||
<path d="M -280 48 L -200 50 L -168 88 L -258 76 Z" fill="#243044" opacity="0.5"/>
|
||||
|
||||
<!-- Dorsal fin -->
|
||||
<path d="M -320 -26 L -210 -24 L -188 -68 L -292 -56 Z" fill="#3d8bfd" stroke="#1a2332" stroke-width="1"/>
|
||||
<path d="M -320 -26 L -230 -24 L -205 -48" fill="none" stroke="#5eead4" stroke-width="1" opacity="0.5"/>
|
||||
|
||||
<!-- Tail V-stabilizers -->
|
||||
<path d="M -430 6 L -468 -8 L -458 -32 L -422 -20 Z" fill="#4a5a6e" stroke="#2d3a4f" stroke-width="0.9"/>
|
||||
<path d="M -430 22 L -468 36 L -458 58 L -422 44 Z" fill="#4a5a6e" stroke="#2d3a4f" stroke-width="0.9"/>
|
||||
|
||||
<!-- Engine housing -->
|
||||
<path d="M -448 -16 L -478 -20 L -486 -4 L -456 0 Z" fill="#2d3a4f" stroke="#8b9cb3" stroke-width="0.8"/>
|
||||
<path d="M -448 16 L -478 20 L -486 4 L -456 0 Z" fill="#2d3a4f" stroke="#8b9cb3" stroke-width="0.8"/>
|
||||
<ellipse cx="-478" cy="0" rx="22" ry="18" fill="#1a2332" stroke="#8b9cb3" stroke-width="1"/>
|
||||
<ellipse cx="-488" cy="0" rx="14" ry="11" fill="#0a0e14"/>
|
||||
|
||||
<!-- Engine glow -->
|
||||
<g filter="url(#engineBloom)">
|
||||
<ellipse cx="-458" cy="0" rx="28" ry="24" fill="url(#engineGlow)" opacity="0.95"/>
|
||||
<ellipse cx="-472" cy="0" rx="44" ry="36" fill="url(#engineGlow)" opacity="0.5"/>
|
||||
</g>
|
||||
<ellipse cx="-458" cy="0" rx="11" ry="9" fill="#ffffff" opacity="0.98"/>
|
||||
|
||||
<circle cx="100" cy="6" r="3" fill="#5eead4"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 5.8 KiB |
@@ -1,28 +1,75 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1920 1080" role="img" aria-label="Space fragment">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1920" height="1080" viewBox="0 0 1920 1080" preserveAspectRatio="xMidYMid slice" role="img" aria-label="Space fragment">
|
||||
<!-- Static vector sky (not runtime-generated). Editable: #space-bg, #nebula-*, #stars-layer, #stars-blinks -->
|
||||
<defs>
|
||||
<radialGradient id="spaceBgGrad" cx="52%" cy="48%" r="75%">
|
||||
<radialGradient id="spaceBgGrad" cx="52%" cy="48%" r="78%">
|
||||
<stop offset="0%" stop-color="#1a2332"/>
|
||||
<stop offset="55%" stop-color="#0a0e14"/>
|
||||
<stop offset="100%" stop-color="#060810"/>
|
||||
</radialGradient>
|
||||
<radialGradient id="nebulaAmber" cx="50%" cy="50%" r="50%">
|
||||
<stop offset="0%" stop-color="#b45309" stop-opacity="0.22"/>
|
||||
<stop offset="60%" stop-color="#92400e" stop-opacity="0.10"/>
|
||||
<stop offset="0%" stop-color="#b45309" stop-opacity="0.26"/>
|
||||
<stop offset="55%" stop-color="#92400e" stop-opacity="0.12"/>
|
||||
<stop offset="100%" stop-color="#78350f" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
<radialGradient id="nebulaBlue" cx="50%" cy="50%" r="50%">
|
||||
<stop offset="0%" stop-color="#1d4ed8" stop-opacity="0.20"/>
|
||||
<stop offset="60%" stop-color="#1e3a5f" stop-opacity="0.10"/>
|
||||
<stop offset="0%" stop-color="#3d8bfd" stop-opacity="0.22"/>
|
||||
<stop offset="55%" stop-color="#1e3a5f" stop-opacity="0.11"/>
|
||||
<stop offset="100%" stop-color="#0f172a" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
<radialGradient id="nebulaTeal" cx="50%" cy="50%" r="50%">
|
||||
<stop offset="0%" stop-color="#5eead4" stop-opacity="0.14"/>
|
||||
<stop offset="100%" stop-color="#5eead4" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
<filter id="starBlink" x="-300%" y="-300%" width="700%" height="700%">
|
||||
<feGaussianBlur stdDeviation="2.2" result="b"/>
|
||||
<feMerge><feMergeNode in="b"/><feMergeNode in="SourceGraphic"/></feMerge>
|
||||
</filter>
|
||||
</defs>
|
||||
|
||||
<rect id="space-bg" width="1920" height="1080" fill="url(#spaceBgGrad)"/>
|
||||
<ellipse id="nebula-amber" cx="310" cy="220" rx="380" ry="260" fill="url(#nebulaAmber)" transform="rotate(-18 310 220)"/>
|
||||
<ellipse id="nebula-blue" cx="1640" cy="870" rx="420" ry="300" fill="url(#nebulaBlue)" transform="rotate(12 1640 870)"/>
|
||||
<g id="stars-layer" fill="#e7ecf3" opacity="0.8">
|
||||
<circle cx="164" cy="310" r="2"/><circle cx="1680" cy="140" r="1.8"/><circle cx="980" cy="920" r="2"/>
|
||||
<circle cx="108" cy="155" r="1.3"/><circle cx="380" cy="186" r="1.4"/><circle cx="1160" cy="160" r="1.5"/>
|
||||
<circle cx="42" cy="38" r="0.8"/><circle cx="462" cy="108" r="0.7"/><circle cx="910" cy="30" r="1"/>
|
||||
<circle cx="1310" cy="40" r="0.7"/><circle cx="1760" cy="380" r="1.4"/><circle cx="1740" cy="820" r="0.6"/>
|
||||
|
||||
<ellipse id="nebula-amber" cx="280" cy="210" rx="420" ry="290" fill="url(#nebulaAmber)" transform="rotate(-16 280 210)"/>
|
||||
<ellipse id="nebula-blue" cx="1660" cy="860" rx="460" ry="320" fill="url(#nebulaBlue)" transform="rotate(14 1660 860)"/>
|
||||
<ellipse id="nebula-teal" cx="1180" cy="180" rx="300" ry="200" fill="url(#nebulaTeal)" transform="rotate(8 1180 180)"/>
|
||||
|
||||
<g id="stars-layer" fill="#e7ecf3">
|
||||
<circle cx="48" cy="42" r="0.9" opacity="0.5"/><circle cx="132" cy="96" r="0.7" opacity="0.42"/>
|
||||
<circle cx="204" cy="24" r="1.0" opacity="0.55"/><circle cx="292" cy="78" r="0.8" opacity="0.4"/>
|
||||
<circle cx="388" cy="52" r="0.9" opacity="0.48"/><circle cx="472" cy="114" r="0.7" opacity="0.44"/>
|
||||
<circle cx="562" cy="28" r="1.1" opacity="0.58"/><circle cx="652" cy="82" r="0.8" opacity="0.4"/>
|
||||
<circle cx="748" cy="46" r="0.9" opacity="0.46"/><circle cx="836" cy="108" r="0.7" opacity="0.42"/>
|
||||
<circle cx="928" cy="34" r="1.0" opacity="0.56"/><circle cx="1024" cy="88" r="0.8" opacity="0.45"/>
|
||||
<circle cx="1124" cy="22" r="0.9" opacity="0.5"/><circle cx="1216" cy="94" r="1.0" opacity="0.54"/>
|
||||
<circle cx="1324" cy="48" r="0.8" opacity="0.42"/><circle cx="1416" cy="116" r="0.9" opacity="0.48"/>
|
||||
<circle cx="1524" cy="62" r="0.8" opacity="0.44"/><circle cx="1632" cy="30" r="1.1" opacity="0.58"/>
|
||||
<circle cx="1736" cy="86" r="0.9" opacity="0.46"/><circle cx="1824" cy="148" r="0.8" opacity="0.4"/>
|
||||
<circle cx="1888" cy="64" r="1.0" opacity="0.52"/>
|
||||
<circle cx="72" cy="198" r="0.8" opacity="0.42"/><circle cx="156" cy="268" r="0.9" opacity="0.46"/>
|
||||
<circle cx="248" cy="318" r="0.7" opacity="0.38"/><circle cx="92" cy="418" r="1.0" opacity="0.52"/>
|
||||
<circle cx="168" cy="538" r="0.8" opacity="0.4"/><circle cx="58" cy="628" r="0.9" opacity="0.45"/>
|
||||
<circle cx="138" cy="728" r="0.7" opacity="0.38"/><circle cx="68" cy="838" r="1.0" opacity="0.5"/>
|
||||
<circle cx="212" cy="898" r="0.8" opacity="0.42"/><circle cx="324" cy="978" r="0.9" opacity="0.48"/>
|
||||
<circle cx="456" cy="1024" r="0.7" opacity="0.38"/><circle cx="588" cy="986" r="1.0" opacity="0.54"/>
|
||||
<circle cx="704" cy="1052" r="0.8" opacity="0.4"/><circle cx="848" cy="1014" r="0.9" opacity="0.46"/>
|
||||
<circle cx="968" cy="1062" r="0.7" opacity="0.36"/><circle cx="1088" cy="1026" r="1.0" opacity="0.52"/>
|
||||
<circle cx="1228" cy="996" r="0.8" opacity="0.42"/><circle cx="1368" cy="1046" r="0.9" opacity="0.48"/>
|
||||
<circle cx="1508" cy="1012" r="0.7" opacity="0.38"/><circle cx="1628" cy="1058" r="1.0" opacity="0.52"/>
|
||||
<circle cx="1752" cy="1024" r="0.8" opacity="0.42"/><circle cx="1868" cy="996" r="0.9" opacity="0.46"/>
|
||||
<circle cx="1724" cy="208" r="0.9" opacity="0.5"/><circle cx="1848" cy="328" r="0.8" opacity="0.42"/>
|
||||
<circle cx="1904" cy="458" r="1.0" opacity="0.54"/><circle cx="1796" cy="588" r="0.8" opacity="0.4"/>
|
||||
<circle cx="1876" cy="712" r="0.9" opacity="0.46"/><circle cx="1768" cy="832" r="0.7" opacity="0.38"/>
|
||||
<circle cx="118" cy="156" r="1.4" opacity="0.66"/><circle cx="392" cy="188" r="1.5" opacity="0.68"/>
|
||||
<circle cx="528" cy="944" r="1.4" opacity="0.62"/><circle cx="1176" cy="164" r="1.6" opacity="0.7"/>
|
||||
<circle cx="1476" cy="886" r="1.4" opacity="0.64"/><circle cx="1776" cy="388" r="1.5" opacity="0.66"/>
|
||||
<circle cx="172" cy="312" r="2.1" opacity="0.78"/><circle cx="1692" cy="146" r="1.9" opacity="0.74"/>
|
||||
<circle cx="992" cy="928" r="2.0" opacity="0.72"/>
|
||||
</g>
|
||||
|
||||
<g id="stars-blinks" filter="url(#starBlink)" opacity="0.85">
|
||||
<path d="M 228 146 L 231 134 L 234 146 L 246 149 L 234 152 L 231 164 L 228 152 L 216 149 Z" fill="#e7ecf3"/>
|
||||
<path d="M 1544 218 L 1547 208 L 1550 218 L 1562 221 L 1550 224 L 1547 234 L 1544 224 L 1532 221 Z" fill="#5eead4"/>
|
||||
<path d="M 1824 818 L 1827 808 L 1830 818 L 1842 821 L 1830 824 L 1827 834 L 1824 824 L 1812 821 Z" fill="#e7ecf3"/>
|
||||
<path d="M 1384 78 L 1386 72 L 1388 78 L 1396 80 L 1388 82 L 1386 88 L 1384 82 L 1376 80 Z" fill="#3d8bfd"/>
|
||||
<path d="M 468 842 L 470 837 L 472 842 L 478 844 L 472 846 L 470 851 L 468 846 L 462 844 Z" fill="#e7ecf3"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 5.6 KiB |
@@ -1,22 +1,58 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1920 1080" role="img" aria-label="Tail fragment">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1920" height="1080" viewBox="0 0 1920 1080" preserveAspectRatio="xMidYMid slice" role="img" aria-label="Tail fragment">
|
||||
<defs>
|
||||
<linearGradient id="exhaustGrad" x1="0%" y1="0%" x2="100%" y2="0%">
|
||||
<linearGradient id="plumeOuter" x1="0%" y1="50%" x2="100%" y2="50%">
|
||||
<stop offset="0%" stop-color="#5eead4" stop-opacity="0"/>
|
||||
<stop offset="20%" stop-color="#5eead4" stop-opacity="0.4"/>
|
||||
<stop offset="55%" stop-color="#3d8bfd" stop-opacity="0.75"/>
|
||||
<stop offset="80%" stop-color="#5eead4" stop-opacity="0.95"/>
|
||||
<stop offset="100%" stop-color="#ffffff" stop-opacity="0.9"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="exhaustCore" x1="0%" y1="0%" x2="100%" y2="0%">
|
||||
<stop offset="0%" stop-color="#ffffff" stop-opacity="0"/>
|
||||
<stop offset="50%" stop-color="#ffffff" stop-opacity="0.4"/>
|
||||
<stop offset="15%" stop-color="#5eead4" stop-opacity="0.18"/>
|
||||
<stop offset="45%" stop-color="#3d8bfd" stop-opacity="0.48"/>
|
||||
<stop offset="75%" stop-color="#5eead4" stop-opacity="0.78"/>
|
||||
<stop offset="100%" stop-color="#ffffff" stop-opacity="0.95"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="plumeMid" x1="0%" y1="50%" x2="100%" y2="50%">
|
||||
<stop offset="0%" stop-color="#3d8bfd" stop-opacity="0"/>
|
||||
<stop offset="50%" stop-color="#5eead4" stop-opacity="0.55"/>
|
||||
<stop offset="100%" stop-color="#ffffff" stop-opacity="0.88"/>
|
||||
</linearGradient>
|
||||
<radialGradient id="nozzleBloom" cx="100%" cy="50%" r="40%">
|
||||
<stop offset="0%" stop-color="#ffffff"/>
|
||||
<stop offset="35%" stop-color="#5eead4" stop-opacity="0.9"/>
|
||||
<stop offset="100%" stop-color="#3d8bfd" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
<filter id="plumeBlur" x="-50%" y="-100%" width="200%" height="300%">
|
||||
<feGaussianBlur stdDeviation="12" result="b"/>
|
||||
<feMerge><feMergeNode in="b"/><feMergeNode in="SourceGraphic"/></feMerge>
|
||||
</filter>
|
||||
</defs>
|
||||
<g id="exhaust-tail">
|
||||
<path d="M 430 810 Q 540 740 660 670 Q 780 600 920 540 Q 1040 488 1148 460" fill="none" stroke="url(#exhaustGrad)" stroke-width="60" stroke-linecap="round" opacity="0.18"/>
|
||||
<path d="M 430 810 Q 540 740 660 670 Q 780 600 920 540 Q 1040 488 1148 460" fill="none" stroke="url(#exhaustGrad)" stroke-width="32" stroke-linecap="round" opacity="0.45"/>
|
||||
<path d="M 432 808 Q 542 738 662 668 Q 782 598 922 538 Q 1042 486 1150 458" fill="none" stroke="url(#exhaustCore)" stroke-width="10" stroke-linecap="round" opacity="0.72"/>
|
||||
<path d="M 432 808 Q 542 738 662 668 Q 782 598 922 538 Q 1042 486 1150 458" fill="none" stroke="#ffffff" stroke-width="2.5" stroke-linecap="round" opacity="0.55"/>
|
||||
|
||||
<g id="exhaust-tail" filter="url(#plumeBlur)">
|
||||
<!-- Rounded volumetric plume: thin at Earth limb, wide at nozzle (~804,584) -->
|
||||
<path d="
|
||||
M 372 832
|
||||
C 452 778, 538 718, 628 658
|
||||
C 712 602, 772 572, 804 584
|
||||
C 818 590, 826 598, 832 606
|
||||
C 768 618, 688 668, 598 728
|
||||
C 508 788, 428 842, 358 868
|
||||
Z" fill="url(#plumeOuter)" opacity="0.7"/>
|
||||
|
||||
<path d="
|
||||
M 388 840
|
||||
C 468 788, 558 728, 648 672
|
||||
C 718 624, 778 592, 802 584
|
||||
C 810 586, 814 590, 818 594
|
||||
C 758 602, 688 642, 618 688
|
||||
C 538 738, 458 788, 392 812
|
||||
Z" fill="url(#plumeMid)" opacity="0.82"/>
|
||||
|
||||
<!-- Inner hot core -->
|
||||
<path d="
|
||||
M 620 668
|
||||
Q 710 612, 788 588
|
||||
Q 798 584, 804 584
|
||||
Q 798 588, 788 592
|
||||
Q 710 618, 628 672
|
||||
Z" fill="#ffffff" opacity="0.55"/>
|
||||
</g>
|
||||
|
||||
<ellipse id="exhaust-nozzle-bloom" cx="812" cy="592" rx="48" ry="32" fill="url(#nozzleBloom)" opacity="0.9"/>
|
||||
<ellipse cx="804" cy="584" rx="16" ry="12" fill="#ffffff" opacity="0.95"/>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 2.4 KiB |
|
Before Width: | Height: | Size: 387 KiB |
@@ -1,441 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1920 1080" role="img" aria-label="Android Cast logo - space background variant">
|
||||
<!--
|
||||
ENTITY MAP (for targeted editing):
|
||||
#space-bg - deep outer space fill + nebula fogs
|
||||
#stars-layer - individual star points and blinks
|
||||
#nebula-amber - warm amber cosmic fog (upper-left region)
|
||||
#nebula-blue - cool blue cosmic fog (lower-right region)
|
||||
#globe-body - Earth sphere base fill
|
||||
#globe-grid - Mercator longitude/latitude lines
|
||||
#globe-continents - landmass shapes (Eurasia, Africa, Americas)
|
||||
#globe-terminator - day/night shadow gradient overlay
|
||||
#exhaust-tail - rocket exhaust/tail from bottom-left of globe toward nozzle
|
||||
#rocketship - full rocket assembly (body, wings, cockpit, nozzle, glow)
|
||||
-->
|
||||
<defs>
|
||||
<!-- Space deep bg -->
|
||||
<radialGradient id="spaceBgGrad" cx="52%" cy="48%" r="75%">
|
||||
<stop offset="0%" stop-color="#1a2332"/>
|
||||
<stop offset="55%" stop-color="#0a0e14"/>
|
||||
<stop offset="100%" stop-color="#060810"/>
|
||||
</radialGradient>
|
||||
|
||||
<!-- Globe ocean fill -->
|
||||
<radialGradient id="globeOcean" cx="38%" cy="30%" r="72%">
|
||||
<stop offset="0%" stop-color="#243044"/>
|
||||
<stop offset="50%" stop-color="#1a2332"/>
|
||||
<stop offset="100%" stop-color="#0a0e14"/>
|
||||
</radialGradient>
|
||||
|
||||
<!-- Globe terminator (day/night) -->
|
||||
<linearGradient id="globeTerminator" x1="0%" y1="0%" x2="100%" y2="0%">
|
||||
<stop offset="0%" stop-color="#3d8bfd" stop-opacity="0.08"/>
|
||||
<stop offset="40%" stop-color="#3d8bfd" stop-opacity="0.18"/>
|
||||
<stop offset="70%" stop-color="#0a0e14" stop-opacity="0.55"/>
|
||||
<stop offset="100%" stop-color="#0a0e14" stop-opacity="0.80"/>
|
||||
</linearGradient>
|
||||
|
||||
<!-- Globe specular highlight -->
|
||||
<radialGradient id="globeSpecular" cx="35%" cy="28%" r="45%">
|
||||
<stop offset="0%" stop-color="#e7ecf3" stop-opacity="0.12"/>
|
||||
<stop offset="100%" stop-color="#e7ecf3" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
|
||||
<!-- Exhaust tail gradient: thin transparent at origin, thick glowing at nozzle -->
|
||||
<linearGradient id="exhaustGrad" x1="0%" y1="0%" x2="100%" y2="0%">
|
||||
<stop offset="0%" stop-color="#5eead4" stop-opacity="0"/>
|
||||
<stop offset="20%" stop-color="#5eead4" stop-opacity="0.4"/>
|
||||
<stop offset="55%" stop-color="#3d8bfd" stop-opacity="0.75"/>
|
||||
<stop offset="80%" stop-color="#5eead4" stop-opacity="0.95"/>
|
||||
<stop offset="100%" stop-color="#ffffff" stop-opacity="0.9"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="exhaustCore" x1="0%" y1="0%" x2="100%" y2="0%">
|
||||
<stop offset="0%" stop-color="#ffffff" stop-opacity="0"/>
|
||||
<stop offset="50%" stop-color="#ffffff" stop-opacity="0.4"/>
|
||||
<stop offset="100%" stop-color="#ffffff" stop-opacity="0.95"/>
|
||||
</linearGradient>
|
||||
|
||||
<!-- Nebula amber fog -->
|
||||
<radialGradient id="nebulaAmber" cx="50%" cy="50%" r="50%">
|
||||
<stop offset="0%" stop-color="#b45309" stop-opacity="0.22"/>
|
||||
<stop offset="60%" stop-color="#92400e" stop-opacity="0.10"/>
|
||||
<stop offset="100%" stop-color="#78350f" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
|
||||
<!-- Nebula blue fog -->
|
||||
<radialGradient id="nebulaBlue" cx="50%" cy="50%" r="50%">
|
||||
<stop offset="0%" stop-color="#1d4ed8" stop-opacity="0.20"/>
|
||||
<stop offset="60%" stop-color="#1e3a5f" stop-opacity="0.10"/>
|
||||
<stop offset="100%" stop-color="#0f172a" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
|
||||
<!-- Rocket body gradient -->
|
||||
<linearGradient id="rocketBodyGrad" x1="0%" y1="0%" x2="0%" y2="100%">
|
||||
<stop offset="0%" stop-color="#e7ecf3"/>
|
||||
<stop offset="35%" stop-color="#c8d4e3"/>
|
||||
<stop offset="70%" stop-color="#8b9cb3"/>
|
||||
<stop offset="100%" stop-color="#4a5a6e"/>
|
||||
</linearGradient>
|
||||
|
||||
<!-- Rocket underbelly (flipped: underside now on top) -->
|
||||
<linearGradient id="rocketUnderGrad" x1="0%" y1="0%" x2="0%" y2="100%">
|
||||
<stop offset="0%" stop-color="#4a5a6e"/>
|
||||
<stop offset="100%" stop-color="#2d3a4f"/>
|
||||
</linearGradient>
|
||||
|
||||
<!-- Rocket wing -->
|
||||
<linearGradient id="wingGrad" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||
<stop offset="0%" stop-color="#3d8bfd"/>
|
||||
<stop offset="100%" stop-color="#1a2332"/>
|
||||
</linearGradient>
|
||||
|
||||
<!-- Nozzle glow -->
|
||||
<radialGradient id="nozzleGlow" cx="50%" cy="50%" r="50%">
|
||||
<stop offset="0%" stop-color="#ffffff" stop-opacity="1"/>
|
||||
<stop offset="30%" stop-color="#5eead4" stop-opacity="0.9"/>
|
||||
<stop offset="65%" stop-color="#3d8bfd" stop-opacity="0.6"/>
|
||||
<stop offset="100%" stop-color="#3d8bfd" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
|
||||
<!-- Continent fill -->
|
||||
<linearGradient id="continentGrad" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||
<stop offset="0%" stop-color="#5a6b82"/>
|
||||
<stop offset="100%" stop-color="#3d5060"/>
|
||||
</linearGradient>
|
||||
|
||||
<!-- Glow filter -->
|
||||
<filter id="glow" x="-60%" y="-60%" width="220%" height="220%">
|
||||
<feGaussianBlur stdDeviation="8" result="b"/>
|
||||
<feMerge>
|
||||
<feMergeNode in="b"/>
|
||||
<feMergeNode in="b"/>
|
||||
<feMergeNode in="SourceGraphic"/>
|
||||
</feMerge>
|
||||
</filter>
|
||||
|
||||
<!-- Soft glow for nozzle -->
|
||||
<filter id="nozzleFilter" x="-100%" y="-100%" width="300%" height="300%">
|
||||
<feGaussianBlur stdDeviation="14" result="b"/>
|
||||
<feMerge>
|
||||
<feMergeNode in="b"/>
|
||||
<feMergeNode in="SourceGraphic"/>
|
||||
</feMerge>
|
||||
</filter>
|
||||
|
||||
<!-- Blink star filter -->
|
||||
<filter id="blink" x="-200%" y="-200%" width="500%" height="500%">
|
||||
<feGaussianBlur stdDeviation="2.5" result="b"/>
|
||||
<feMerge>
|
||||
<feMergeNode in="b"/>
|
||||
<feMergeNode in="SourceGraphic"/>
|
||||
</feMerge>
|
||||
</filter>
|
||||
|
||||
<!-- Globe clip -->
|
||||
<clipPath id="globeClip">
|
||||
<circle cx="720" cy="560" r="330"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
|
||||
<!-- PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP -->
|
||||
<!-- #space-bg : deep space fill -->
|
||||
<!-- PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP -->
|
||||
<rect id="space-bg" width="1920" height="1080" fill="url(#spaceBgGrad)"/>
|
||||
|
||||
<!-- PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP -->
|
||||
<!-- #nebula-amber : warm cosmic fog upper-left -->
|
||||
<!-- PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP -->
|
||||
<ellipse id="nebula-amber" cx="310" cy="220" rx="380" ry="260" fill="url(#nebulaAmber)" transform="rotate(-18 310 220)"/>
|
||||
|
||||
<!-- PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP -->
|
||||
<!-- #nebula-blue : cool cosmic fog lower-right -->
|
||||
<!-- PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP -->
|
||||
<ellipse id="nebula-blue" cx="1640" cy="870" rx="420" ry="300" fill="url(#nebulaBlue)" transform="rotate(12 1640 870)"/>
|
||||
|
||||
<!-- PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP -->
|
||||
<!-- #stars-layer : star field + blinks -->
|
||||
<!-- PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP -->
|
||||
<g id="stars-layer" fill="#e7ecf3">
|
||||
<!-- Tiny dim stars -->
|
||||
<circle cx="42" cy="38" r="0.8" opacity="0.45"/>
|
||||
<circle cx="128" cy="92" r="0.7" opacity="0.40"/>
|
||||
<circle cx="195" cy="18" r="0.9" opacity="0.50"/>
|
||||
<circle cx="280" cy="72" r="0.6" opacity="0.38"/>
|
||||
<circle cx="380" cy="44" r="0.8" opacity="0.42"/>
|
||||
<circle cx="462" cy="108" r="0.7" opacity="0.48"/>
|
||||
<circle cx="550" cy="22" r="0.9" opacity="0.55"/>
|
||||
<circle cx="640" cy="78" r="0.6" opacity="0.35"/>
|
||||
<circle cx="740" cy="48" r="0.8" opacity="0.45"/>
|
||||
<circle cx="820" cy="112" r="0.7" opacity="0.40"/>
|
||||
<circle cx="910" cy="30" r="1.0" opacity="0.58"/>
|
||||
<circle cx="1010" cy="86" r="0.7" opacity="0.43"/>
|
||||
<circle cx="1110" cy="24" r="0.8" opacity="0.47"/>
|
||||
<circle cx="1200" cy="96" r="0.9" opacity="0.52"/>
|
||||
<circle cx="1310" cy="40" r="0.7" opacity="0.38"/>
|
||||
<circle cx="1400" cy="118" r="0.8" opacity="0.44"/>
|
||||
<circle cx="1510" cy="58" r="0.7" opacity="0.40"/>
|
||||
<circle cx="1620" cy="28" r="1.0" opacity="0.55"/>
|
||||
<circle cx="1720" cy="80" r="0.8" opacity="0.42"/>
|
||||
<circle cx="1800" cy="140" r="0.7" opacity="0.37"/>
|
||||
<circle cx="1880" cy="60" r="0.9" opacity="0.50"/>
|
||||
<circle cx="68" cy="195" r="0.7" opacity="0.40"/>
|
||||
<circle cx="148" cy="260" r="0.8" opacity="0.44"/>
|
||||
<circle cx="240" cy="310" r="0.6" opacity="0.35"/>
|
||||
<circle cx="88" cy="410" r="0.9" opacity="0.50"/>
|
||||
<circle cx="160" cy="530" r="0.7" opacity="0.38"/>
|
||||
<circle cx="55" cy="620" r="0.8" opacity="0.43"/>
|
||||
<circle cx="130" cy="720" r="0.6" opacity="0.36"/>
|
||||
<circle cx="62" cy="830" r="0.9" opacity="0.48"/>
|
||||
<circle cx="200" cy="890" r="0.7" opacity="0.40"/>
|
||||
<circle cx="310" cy="970" r="0.8" opacity="0.45"/>
|
||||
<circle cx="440" cy="1020" r="0.6" opacity="0.36"/>
|
||||
<circle cx="570" cy="980" r="0.9" opacity="0.52"/>
|
||||
<circle cx="680" cy="1048" r="0.7" opacity="0.38"/>
|
||||
<circle cx="820" cy="1010" r="0.8" opacity="0.44"/>
|
||||
<circle cx="940" cy="1058" r="0.6" opacity="0.34"/>
|
||||
<circle cx="1060" cy="1022" r="0.9" opacity="0.50"/>
|
||||
<circle cx="1200" cy="990" r="0.7" opacity="0.40"/>
|
||||
<circle cx="1340" cy="1040" r="0.8" opacity="0.43"/>
|
||||
<circle cx="1480" cy="1008" r="0.6" opacity="0.37"/>
|
||||
<circle cx="1600" cy="1052" r="0.9" opacity="0.50"/>
|
||||
<circle cx="1730" cy="1018" r="0.7" opacity="0.40"/>
|
||||
<circle cx="1850" cy="990" r="0.8" opacity="0.44"/>
|
||||
<circle cx="1700" cy="200" r="0.8" opacity="0.48"/>
|
||||
<circle cx="1820" cy="320" r="0.7" opacity="0.40"/>
|
||||
<circle cx="1880" cy="450" r="0.9" opacity="0.52"/>
|
||||
<circle cx="1780" cy="580" r="0.7" opacity="0.38"/>
|
||||
<circle cx="1860" cy="700" r="0.8" opacity="0.44"/>
|
||||
<circle cx="1740" cy="820" r="0.6" opacity="0.36"/>
|
||||
<!-- Medium stars -->
|
||||
<circle cx="108" cy="155" r="1.3" opacity="0.60"/>
|
||||
<circle cx="380" cy="186" r="1.4" opacity="0.64"/>
|
||||
<circle cx="520" cy="940" r="1.3" opacity="0.58"/>
|
||||
<circle cx="1160" cy="160" r="1.5" opacity="0.68"/>
|
||||
<circle cx="1460" cy="880" r="1.3" opacity="0.62"/>
|
||||
<circle cx="1760" cy="380" r="1.4" opacity="0.60"/>
|
||||
<!-- Bright stars -->
|
||||
<circle cx="164" cy="310" r="2.0" opacity="0.75"/>
|
||||
<circle cx="1680" cy="140" r="1.8" opacity="0.72"/>
|
||||
<circle cx="980" cy="920" r="2.0" opacity="0.70"/>
|
||||
</g>
|
||||
|
||||
<!-- Blink sparkles (4-point star shape) -->
|
||||
<g id="stars-layer-blinks" opacity="0.82" filter="url(#blink)">
|
||||
<!-- Blink 1 -->
|
||||
<path d="M 226 148 L 228 138 L 230 148 L 240 150 L 230 152 L 228 162 L 226 152 L 216 150 Z" fill="#e7ecf3" opacity="0.80"/>
|
||||
<!-- Blink 2 -->
|
||||
<path d="M 1540 220 L 1542 212 L 1544 220 L 1552 222 L 1544 224 L 1542 232 L 1540 224 L 1532 222 Z" fill="#5eead4" opacity="0.70"/>
|
||||
<!-- Blink 3 -->
|
||||
<path d="M 1820 820 L 1822 812 L 1824 820 L 1832 822 L 1824 824 L 1822 832 L 1820 824 L 1812 822 Z" fill="#e7ecf3" opacity="0.65"/>
|
||||
<!-- Blink 4 small -->
|
||||
<path d="M 460 840 L 461.5 835 L 463 840 L 468 841.5 L 463 843 L 461.5 848 L 460 843 L 455 841.5 Z" fill="#3d8bfd" opacity="0.72"/>
|
||||
<!-- Blink 5 -->
|
||||
<path d="M 1380 80 L 1382 72 L 1384 80 L 1392 82 L 1384 84 L 1382 92 L 1380 84 L 1372 82 Z" fill="#e7ecf3" opacity="0.75"/>
|
||||
</g>
|
||||
|
||||
<!-- PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP -->
|
||||
<!-- #globe-body : Earth sphere -->
|
||||
<!-- PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP -->
|
||||
<g id="globe-body">
|
||||
<circle cx="720" cy="560" r="330" fill="url(#globeOcean)" stroke="#2d3a4f" stroke-width="1.5"/>
|
||||
</g>
|
||||
|
||||
<!-- PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP -->
|
||||
<!-- #globe-grid : Mercator lon/lat lines -->
|
||||
<!-- PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP -->
|
||||
<g id="globe-grid" clip-path="url(#globeClip)" fill="none" stroke="#e7ecf3" stroke-opacity="0.28" stroke-width="1.5">
|
||||
<!-- Equator -->
|
||||
<ellipse cx="720" cy="560" rx="330" ry="78"/>
|
||||
<!-- Latitude lines -->
|
||||
<ellipse cx="720" cy="560" rx="330" ry="155"/>
|
||||
<ellipse cx="720" cy="560" rx="330" ry="232"/>
|
||||
<ellipse cx="720" cy="560" rx="330" ry="295"/>
|
||||
<!-- Tropics (dashed) -->
|
||||
<ellipse cx="720" cy="560" rx="330" ry="110" stroke-dasharray="8 5" stroke-opacity="0.18"/>
|
||||
<ellipse cx="720" cy="560" rx="330" ry="210" stroke-dasharray="8 5" stroke-opacity="0.18"/>
|
||||
<!-- Prime meridian + antimeridian -->
|
||||
<line x1="720" y1="230" x2="720" y2="890"/>
|
||||
<!-- Longitude lines -->
|
||||
<path d="M 500 230 Q 480 560 500 890"/>
|
||||
<path d="M 940 230 Q 960 560 940 890"/>
|
||||
<path d="M 580 230 Q 548 560 580 890"/>
|
||||
<path d="M 860 230 Q 892 560 860 890"/>
|
||||
<path d="M 618 230 Q 594 560 618 890"/>
|
||||
<path d="M 822 230 Q 846 560 822 890"/>
|
||||
<path d="M 655 230 Q 638 560 655 890"/>
|
||||
<path d="M 785 230 Q 802 560 785 890"/>
|
||||
</g>
|
||||
|
||||
<!-- PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP -->
|
||||
<!-- #globe-continents : landmasses -->
|
||||
<!-- PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP -->
|
||||
<g id="globe-continents" clip-path="url(#globeClip)" fill="url(#continentGrad)" stroke="#8b9cb3" stroke-opacity="0.35" stroke-width="1" stroke-linejoin="round">
|
||||
<!-- Eurasia -->
|
||||
<path d="
|
||||
M 590 350
|
||||
Q 610 325 655 320
|
||||
Q 700 315 745 328
|
||||
Q 810 335 855 355
|
||||
Q 900 375 895 415
|
||||
Q 888 445 860 458
|
||||
Q 830 470 795 462
|
||||
Q 770 468 750 488
|
||||
Q 728 510 700 505
|
||||
Q 668 498 640 480
|
||||
Q 610 462 592 435
|
||||
Q 570 405 590 350 Z"/>
|
||||
<!-- India (peninsula off Eurasia) -->
|
||||
<path d="
|
||||
M 780 462
|
||||
Q 800 470 810 500
|
||||
Q 820 530 808 555
|
||||
Q 795 575 778 568
|
||||
Q 762 558 758 530
|
||||
Q 752 505 762 482
|
||||
Q 770 468 780 462 Z"/>
|
||||
<!-- Africa -->
|
||||
<path d="
|
||||
M 640 480
|
||||
Q 655 490 668 512
|
||||
Q 680 535 678 570
|
||||
Q 676 610 662 645
|
||||
Q 648 678 628 692
|
||||
Q 608 700 592 685
|
||||
Q 575 668 572 640
|
||||
Q 568 605 576 568
|
||||
Q 582 535 590 508
|
||||
Q 600 488 614 480
|
||||
Q 628 472 640 480 Z"/>
|
||||
<!-- Western Europe (bump west of Eurasia) -->
|
||||
<path d="
|
||||
M 590 350
|
||||
Q 572 360 560 380
|
||||
Q 548 405 558 428
|
||||
Q 566 448 580 452
|
||||
Q 596 456 606 440
|
||||
Q 618 420 612 398
|
||||
Q 606 372 590 350 Z"/>
|
||||
<!-- Americas (partial, visible left edge of globe) -->
|
||||
<path d="
|
||||
M 430 360
|
||||
Q 415 340 400 355
|
||||
Q 390 372 398 400
|
||||
Q 408 430 428 448
|
||||
Q 450 464 468 455
|
||||
Q 480 444 474 420
|
||||
Q 468 395 448 375
|
||||
Q 440 368 430 360 Z"/>
|
||||
<path d="
|
||||
M 420 478
|
||||
Q 405 490 400 515
|
||||
Q 395 545 405 575
|
||||
Q 415 602 432 618
|
||||
Q 450 630 464 618
|
||||
Q 476 602 470 572
|
||||
Q 462 540 448 510
|
||||
Q 436 490 420 478 Z"/>
|
||||
</g>
|
||||
|
||||
<!-- PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP -->
|
||||
<!-- #globe-terminator : day/night shadow -->
|
||||
<!-- PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP -->
|
||||
<circle id="globe-terminator" cx="720" cy="560" r="330" fill="url(#globeTerminator)" clip-path="url(#globeClip)"/>
|
||||
|
||||
<!-- Globe specular highlight -->
|
||||
<circle cx="720" cy="560" r="330" fill="url(#globeSpecular)" clip-path="url(#globeClip)"/>
|
||||
|
||||
<!-- Globe rim -->
|
||||
<circle cx="720" cy="560" r="330" fill="none" stroke="#3d8bfd" stroke-opacity="0.25" stroke-width="2"/>
|
||||
|
||||
<!-- PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP -->
|
||||
<!-- #exhaust-tail : curved plume from globe base -->
|
||||
<!-- thin at bottom-left, thick at rocket nozzle -->
|
||||
<!-- PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP -->
|
||||
<g id="exhaust-tail">
|
||||
<!-- Outer glow (very wide, very transparent) -->
|
||||
<path d="M 430 810 Q 540 740 660 670 Q 780 600 920 540 Q 1040 488 1148 460"
|
||||
fill="none" stroke="url(#exhaustGrad)" stroke-width="60" stroke-linecap="round" opacity="0.18"/>
|
||||
<!-- Mid bloom -->
|
||||
<path d="M 430 810 Q 540 740 660 670 Q 780 600 920 540 Q 1040 488 1148 460"
|
||||
fill="none" stroke="url(#exhaustGrad)" stroke-width="32" stroke-linecap="round" opacity="0.45"/>
|
||||
<!-- Core streak -->
|
||||
<path d="M 432 808 Q 542 738 662 668 Q 782 598 922 538 Q 1042 486 1150 458"
|
||||
fill="none" stroke="url(#exhaustCore)" stroke-width="10" stroke-linecap="round" opacity="0.72"/>
|
||||
<!-- Thin tail filament -->
|
||||
<path d="M 432 808 Q 542 738 662 668 Q 782 598 922 538 Q 1042 486 1150 458"
|
||||
fill="none" stroke="#ffffff" stroke-width="2.5" stroke-linecap="round" opacity="0.55"/>
|
||||
</g>
|
||||
|
||||
<!-- PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP -->
|
||||
<!-- #rocketship : futuristic widebody -->
|
||||
<!-- flying upper-right, X-axis flipped -->
|
||||
<!-- (original top of ship now faces DOWN) -->
|
||||
<!-- nose pointing upper-right at ~-32deg -->
|
||||
<!-- PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP -->
|
||||
<!--
|
||||
Local coords: nose at (0,0), body extends -X (left = back).
|
||||
X-flip: scale(1,-1) so dorsal (top) faces down in world space.
|
||||
Then rotate -32deg and translate to world position (1210, 390).
|
||||
-->
|
||||
<g id="rocketship" transform="translate(1210,390) rotate(-32) scale(1,-1)">
|
||||
|
||||
<!-- === Main fuselage === -->
|
||||
<!-- Underside panel (now world-UP after flip) -->
|
||||
<path d="M -340 0 L -300 -22 L -80 -26 L 0 0 L -80 8 L -300 8 Z"
|
||||
fill="url(#rocketUnderGrad)" stroke="#2d3a4f" stroke-width="1.2"/>
|
||||
|
||||
<!-- Dorsal spine (now world-DOWN after flip) -->
|
||||
<path d="M -300 22 L -80 26 L 0 0 L -80 -8 L -300 -8 Z"
|
||||
fill="url(#rocketBodyGrad)" stroke="#1a2332" stroke-width="1.2"/>
|
||||
|
||||
<!-- Blue accent stripe -->
|
||||
<path d="M -290 -6 L -100 -8 L -60 -4 L -100 0 L -290 0 Z"
|
||||
fill="#3d8bfd" opacity="0.85"/>
|
||||
|
||||
<!-- Nose cone -->
|
||||
<path d="M -80 -26 Q 30 -14 80 0 Q 30 14 -80 26 L -80 -26 Z"
|
||||
fill="#e7ecf3" stroke="#8b9cb3" stroke-width="1"/>
|
||||
|
||||
<!-- Nose tip highlight -->
|
||||
<path d="M -80 -18 Q 20 -8 62 0 Q 20 4 -80 8 L -80 -18 Z"
|
||||
fill="#ffffff" opacity="0.30"/>
|
||||
|
||||
<!-- Cockpit window strip -->
|
||||
<path d="M -60 -16 Q -30 -14 -10 -10 Q -30 -6 -60 -4 Z"
|
||||
fill="#0a0e14" stroke="#3d8bfd" stroke-width="1"/>
|
||||
<circle cx="-42" cy="-10" r="5" fill="#1a2332" stroke="#5eead4" stroke-width="0.8"/>
|
||||
<circle cx="-26" cy="-9" r="4" fill="#1a2332" stroke="#5eead4" stroke-width="0.8"/>
|
||||
|
||||
<!-- === Delta wings (lower, world-UP side) === -->
|
||||
<!-- Main delta wing -->
|
||||
<path d="M -280 22 L -160 22 L -100 90 L -240 70 Z"
|
||||
fill="url(#wingGrad)" stroke="#2d3a4f" stroke-width="1" opacity="0.95"/>
|
||||
<!-- Wing leading edge highlight -->
|
||||
<path d="M -280 22 L -160 22 L -120 60" fill="none" stroke="#3d8bfd" stroke-width="1.5" opacity="0.6"/>
|
||||
|
||||
<!-- === Dorsal fins (upper, world-DOWN side) === -->
|
||||
<path d="M -260 -22 L -180 -22 L -160 -55 L -240 -45 Z"
|
||||
fill="#3d8bfd" stroke="#1a2332" stroke-width="1" opacity="0.80"/>
|
||||
|
||||
<!-- === Engine pod === -->
|
||||
<ellipse cx="-310" cy="0" rx="32" ry="20" fill="#2d3a4f" stroke="#8b9cb3" stroke-width="1"/>
|
||||
<ellipse cx="-310" cy="0" rx="24" ry="15" fill="#1a2332"/>
|
||||
|
||||
<!-- === Nozzle glows (world-left = ship-back = exhaust end) === -->
|
||||
<ellipse cx="-342" cy="0" rx="20" ry="20" fill="url(#nozzleGlow)" filter="url(#nozzleFilter)" opacity="0.90"/>
|
||||
<ellipse cx="-355" cy="0" rx="32" ry="32" fill="url(#nozzleGlow)" filter="url(#nozzleFilter)" opacity="0.45"/>
|
||||
|
||||
<!-- === Panel detail lines === -->
|
||||
<line x1="-240" y1="-6" x2="-240" y2="6" stroke="#8b9cb3" stroke-width="0.8" opacity="0.5"/>
|
||||
<line x1="-190" y1="-6" x2="-190" y2="6" stroke="#8b9cb3" stroke-width="0.8" opacity="0.5"/>
|
||||
<line x1="-140" y1="-8" x2="-140" y2="8" stroke="#8b9cb3" stroke-width="0.8" opacity="0.5"/>
|
||||
|
||||
<!-- === Navigation light === -->
|
||||
<circle cx="60" cy="4" r="3" fill="#5eead4" filter="url(#blink)" opacity="0.9"/>
|
||||
</g>
|
||||
|
||||
<!-- PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP -->
|
||||
<!-- Foreground: globe rim glow (over everything) -->
|
||||
<!-- PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP -->
|
||||
<circle cx="720" cy="560" r="332" fill="none" stroke="#3d8bfd" stroke-opacity="0.12" stroke-width="6"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 287 KiB |
@@ -1,206 +1,3 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1920 1080" role="img" aria-label="Android Cast logo - transparent background variant">
|
||||
<!--
|
||||
ENTITY MAP (for targeted editing):
|
||||
(no #space-bg, #nebula-*, #stars-layer in this variant - background is 100% transparent)
|
||||
#globe-body - Earth sphere base fill
|
||||
#globe-grid - Mercator longitude/latitude lines
|
||||
#globe-continents - landmass shapes (Eurasia, Africa, Americas)
|
||||
#globe-terminator - day/night shadow gradient overlay
|
||||
#exhaust-tail - rocket exhaust/tail from bottom-left of globe toward nozzle
|
||||
#rocketship - full rocket assembly (body, wings, cockpit, nozzle, glow)
|
||||
-->
|
||||
<defs>
|
||||
<!-- Globe ocean fill -->
|
||||
<radialGradient id="globeOcean" cx="38%" cy="30%" r="72%">
|
||||
<stop offset="0%" stop-color="#243044"/>
|
||||
<stop offset="50%" stop-color="#1a2332"/>
|
||||
<stop offset="100%" stop-color="#0a0e14"/>
|
||||
</radialGradient>
|
||||
|
||||
<!-- Globe terminator -->
|
||||
<linearGradient id="globeTerminator" x1="0%" y1="0%" x2="100%" y2="0%">
|
||||
<stop offset="0%" stop-color="#3d8bfd" stop-opacity="0.08"/>
|
||||
<stop offset="40%" stop-color="#3d8bfd" stop-opacity="0.18"/>
|
||||
<stop offset="70%" stop-color="#0a0e14" stop-opacity="0.55"/>
|
||||
<stop offset="100%" stop-color="#0a0e14" stop-opacity="0.80"/>
|
||||
</linearGradient>
|
||||
|
||||
<!-- Globe specular highlight -->
|
||||
<radialGradient id="globeSpecular" cx="35%" cy="28%" r="45%">
|
||||
<stop offset="0%" stop-color="#e7ecf3" stop-opacity="0.12"/>
|
||||
<stop offset="100%" stop-color="#e7ecf3" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
|
||||
<!-- Exhaust gradients -->
|
||||
<linearGradient id="exhaustGrad" x1="0%" y1="0%" x2="100%" y2="0%">
|
||||
<stop offset="0%" stop-color="#5eead4" stop-opacity="0"/>
|
||||
<stop offset="20%" stop-color="#5eead4" stop-opacity="0.4"/>
|
||||
<stop offset="55%" stop-color="#3d8bfd" stop-opacity="0.75"/>
|
||||
<stop offset="80%" stop-color="#5eead4" stop-opacity="0.95"/>
|
||||
<stop offset="100%" stop-color="#ffffff" stop-opacity="0.9"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="exhaustCore" x1="0%" y1="0%" x2="100%" y2="0%">
|
||||
<stop offset="0%" stop-color="#ffffff" stop-opacity="0"/>
|
||||
<stop offset="50%" stop-color="#ffffff" stop-opacity="0.4"/>
|
||||
<stop offset="100%" stop-color="#ffffff" stop-opacity="0.95"/>
|
||||
</linearGradient>
|
||||
|
||||
<!-- Rocket body gradient -->
|
||||
<linearGradient id="rocketBodyGrad" x1="0%" y1="0%" x2="0%" y2="100%">
|
||||
<stop offset="0%" stop-color="#e7ecf3"/>
|
||||
<stop offset="35%" stop-color="#c8d4e3"/>
|
||||
<stop offset="70%" stop-color="#8b9cb3"/>
|
||||
<stop offset="100%" stop-color="#4a5a6e"/>
|
||||
</linearGradient>
|
||||
|
||||
<linearGradient id="rocketUnderGrad" x1="0%" y1="0%" x2="0%" y2="100%">
|
||||
<stop offset="0%" stop-color="#4a5a6e"/>
|
||||
<stop offset="100%" stop-color="#2d3a4f"/>
|
||||
</linearGradient>
|
||||
|
||||
<linearGradient id="wingGrad" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||
<stop offset="0%" stop-color="#3d8bfd"/>
|
||||
<stop offset="100%" stop-color="#1a2332"/>
|
||||
</linearGradient>
|
||||
|
||||
<radialGradient id="nozzleGlow" cx="50%" cy="50%" r="50%">
|
||||
<stop offset="0%" stop-color="#ffffff" stop-opacity="1"/>
|
||||
<stop offset="30%" stop-color="#5eead4" stop-opacity="0.9"/>
|
||||
<stop offset="65%" stop-color="#3d8bfd" stop-opacity="0.6"/>
|
||||
<stop offset="100%" stop-color="#3d8bfd" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
|
||||
<linearGradient id="continentGrad" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||
<stop offset="0%" stop-color="#5a6b82"/>
|
||||
<stop offset="100%" stop-color="#3d5060"/>
|
||||
</linearGradient>
|
||||
|
||||
<filter id="glow" x="-60%" y="-60%" width="220%" height="220%">
|
||||
<feGaussianBlur stdDeviation="8" result="b"/>
|
||||
<feMerge>
|
||||
<feMergeNode in="b"/>
|
||||
<feMergeNode in="b"/>
|
||||
<feMergeNode in="SourceGraphic"/>
|
||||
</feMerge>
|
||||
</filter>
|
||||
|
||||
<filter id="nozzleFilter" x="-100%" y="-100%" width="300%" height="300%">
|
||||
<feGaussianBlur stdDeviation="14" result="b"/>
|
||||
<feMerge>
|
||||
<feMergeNode in="b"/>
|
||||
<feMergeNode in="SourceGraphic"/>
|
||||
</feMerge>
|
||||
</filter>
|
||||
|
||||
<filter id="blink" x="-200%" y="-200%" width="500%" height="500%">
|
||||
<feGaussianBlur stdDeviation="2.5" result="b"/>
|
||||
<feMerge>
|
||||
<feMergeNode in="b"/>
|
||||
<feMergeNode in="SourceGraphic"/>
|
||||
</feMerge>
|
||||
</filter>
|
||||
|
||||
<clipPath id="globeClip">
|
||||
<circle cx="720" cy="560" r="330"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
|
||||
<!-- Background: fully transparent (no rect) -->
|
||||
|
||||
<!-- PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP -->
|
||||
<!-- #globe-body : Earth sphere -->
|
||||
<!-- PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP -->
|
||||
<g id="globe-body">
|
||||
<circle cx="720" cy="560" r="330" fill="url(#globeOcean)" stroke="#2d3a4f" stroke-width="1.5"/>
|
||||
</g>
|
||||
|
||||
<!-- PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP -->
|
||||
<!-- #globe-grid : Mercator lon/lat lines -->
|
||||
<!-- PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP -->
|
||||
<g id="globe-grid" clip-path="url(#globeClip)" fill="none" stroke="#e7ecf3" stroke-opacity="0.28" stroke-width="1.5">
|
||||
<ellipse cx="720" cy="560" rx="330" ry="78"/>
|
||||
<ellipse cx="720" cy="560" rx="330" ry="155"/>
|
||||
<ellipse cx="720" cy="560" rx="330" ry="232"/>
|
||||
<ellipse cx="720" cy="560" rx="330" ry="295"/>
|
||||
<ellipse cx="720" cy="560" rx="330" ry="110" stroke-dasharray="8 5" stroke-opacity="0.18"/>
|
||||
<ellipse cx="720" cy="560" rx="330" ry="210" stroke-dasharray="8 5" stroke-opacity="0.18"/>
|
||||
<line x1="720" y1="230" x2="720" y2="890"/>
|
||||
<path d="M 500 230 Q 480 560 500 890"/>
|
||||
<path d="M 940 230 Q 960 560 940 890"/>
|
||||
<path d="M 580 230 Q 548 560 580 890"/>
|
||||
<path d="M 860 230 Q 892 560 860 890"/>
|
||||
<path d="M 618 230 Q 594 560 618 890"/>
|
||||
<path d="M 822 230 Q 846 560 822 890"/>
|
||||
<path d="M 655 230 Q 638 560 655 890"/>
|
||||
<path d="M 785 230 Q 802 560 785 890"/>
|
||||
</g>
|
||||
|
||||
<!-- PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP -->
|
||||
<!-- #globe-continents : landmasses -->
|
||||
<!-- PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP -->
|
||||
<g id="globe-continents" clip-path="url(#globeClip)" fill="url(#continentGrad)" stroke="#8b9cb3" stroke-opacity="0.35" stroke-width="1" stroke-linejoin="round">
|
||||
<path d="M 590 350 Q 610 325 655 320 Q 700 315 745 328 Q 810 335 855 355 Q 900 375 895 415 Q 888 445 860 458 Q 830 470 795 462 Q 770 468 750 488 Q 728 510 700 505 Q 668 498 640 480 Q 610 462 592 435 Q 570 405 590 350 Z"/>
|
||||
<path d="M 780 462 Q 800 470 810 500 Q 820 530 808 555 Q 795 575 778 568 Q 762 558 758 530 Q 752 505 762 482 Q 770 468 780 462 Z"/>
|
||||
<path d="M 640 480 Q 655 490 668 512 Q 680 535 678 570 Q 676 610 662 645 Q 648 678 628 692 Q 608 700 592 685 Q 575 668 572 640 Q 568 605 576 568 Q 582 535 590 508 Q 600 488 614 480 Q 628 472 640 480 Z"/>
|
||||
<path d="M 590 350 Q 572 360 560 380 Q 548 405 558 428 Q 566 448 580 452 Q 596 456 606 440 Q 618 420 612 398 Q 606 372 590 350 Z"/>
|
||||
<path d="M 430 360 Q 415 340 400 355 Q 390 372 398 400 Q 408 430 428 448 Q 450 464 468 455 Q 480 444 474 420 Q 468 395 448 375 Q 440 368 430 360 Z"/>
|
||||
<path d="M 420 478 Q 405 490 400 515 Q 395 545 405 575 Q 415 602 432 618 Q 450 630 464 618 Q 476 602 470 572 Q 462 540 448 510 Q 436 490 420 478 Z"/>
|
||||
</g>
|
||||
|
||||
<!-- PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP -->
|
||||
<!-- #globe-terminator -->
|
||||
<!-- PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP -->
|
||||
<circle id="globe-terminator" cx="720" cy="560" r="330" fill="url(#globeTerminator)" clip-path="url(#globeClip)"/>
|
||||
<circle cx="720" cy="560" r="330" fill="url(#globeSpecular)" clip-path="url(#globeClip)"/>
|
||||
<circle cx="720" cy="560" r="330" fill="none" stroke="#3d8bfd" stroke-opacity="0.25" stroke-width="2"/>
|
||||
|
||||
<!-- PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP -->
|
||||
<!-- #exhaust-tail -->
|
||||
<!-- PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP -->
|
||||
<g id="exhaust-tail">
|
||||
<path d="M 430 810 Q 540 740 660 670 Q 780 600 920 540 Q 1040 488 1148 460"
|
||||
fill="none" stroke="url(#exhaustGrad)" stroke-width="60" stroke-linecap="round" opacity="0.18"/>
|
||||
<path d="M 430 810 Q 540 740 660 670 Q 780 600 920 540 Q 1040 488 1148 460"
|
||||
fill="none" stroke="url(#exhaustGrad)" stroke-width="32" stroke-linecap="round" opacity="0.45"/>
|
||||
<path d="M 432 808 Q 542 738 662 668 Q 782 598 922 538 Q 1042 486 1150 458"
|
||||
fill="none" stroke="url(#exhaustCore)" stroke-width="10" stroke-linecap="round" opacity="0.72"/>
|
||||
<path d="M 432 808 Q 542 738 662 668 Q 782 598 922 538 Q 1042 486 1150 458"
|
||||
fill="none" stroke="#ffffff" stroke-width="2.5" stroke-linecap="round" opacity="0.55"/>
|
||||
</g>
|
||||
|
||||
<!-- PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP -->
|
||||
<!-- #rocketship -->
|
||||
<!-- PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP -->
|
||||
<g id="rocketship" transform="translate(1210,390) rotate(-32) scale(1,-1)">
|
||||
<path d="M -340 0 L -300 -22 L -80 -26 L 0 0 L -80 8 L -300 8 Z"
|
||||
fill="url(#rocketUnderGrad)" stroke="#2d3a4f" stroke-width="1.2"/>
|
||||
<path d="M -300 22 L -80 26 L 0 0 L -80 -8 L -300 -8 Z"
|
||||
fill="url(#rocketBodyGrad)" stroke="#1a2332" stroke-width="1.2"/>
|
||||
<path d="M -290 -6 L -100 -8 L -60 -4 L -100 0 L -290 0 Z"
|
||||
fill="#3d8bfd" opacity="0.85"/>
|
||||
<path d="M -80 -26 Q 30 -14 80 0 Q 30 14 -80 26 L -80 -26 Z"
|
||||
fill="#e7ecf3" stroke="#8b9cb3" stroke-width="1"/>
|
||||
<path d="M -80 -18 Q 20 -8 62 0 Q 20 4 -80 8 L -80 -18 Z"
|
||||
fill="#ffffff" opacity="0.30"/>
|
||||
<path d="M -60 -16 Q -30 -14 -10 -10 Q -30 -6 -60 -4 Z"
|
||||
fill="#0a0e14" stroke="#3d8bfd" stroke-width="1"/>
|
||||
<circle cx="-42" cy="-10" r="5" fill="#1a2332" stroke="#5eead4" stroke-width="0.8"/>
|
||||
<circle cx="-26" cy="-9" r="4" fill="#1a2332" stroke="#5eead4" stroke-width="0.8"/>
|
||||
<path d="M -280 22 L -160 22 L -100 90 L -240 70 Z"
|
||||
fill="url(#wingGrad)" stroke="#2d3a4f" stroke-width="1" opacity="0.95"/>
|
||||
<path d="M -280 22 L -160 22 L -120 60" fill="none" stroke="#3d8bfd" stroke-width="1.5" opacity="0.6"/>
|
||||
<path d="M -260 -22 L -180 -22 L -160 -55 L -240 -45 Z"
|
||||
fill="#3d8bfd" stroke="#1a2332" stroke-width="1" opacity="0.80"/>
|
||||
<ellipse cx="-310" cy="0" rx="32" ry="20" fill="#2d3a4f" stroke="#8b9cb3" stroke-width="1"/>
|
||||
<ellipse cx="-310" cy="0" rx="24" ry="15" fill="#1a2332"/>
|
||||
<ellipse cx="-342" cy="0" rx="20" ry="20" fill="url(#nozzleGlow)" filter="url(#nozzleFilter)" opacity="0.90"/>
|
||||
<ellipse cx="-355" cy="0" rx="32" ry="32" fill="url(#nozzleGlow)" filter="url(#nozzleFilter)" opacity="0.45"/>
|
||||
<line x1="-240" y1="-6" x2="-240" y2="6" stroke="#8b9cb3" stroke-width="0.8" opacity="0.5"/>
|
||||
<line x1="-190" y1="-6" x2="-190" y2="6" stroke="#8b9cb3" stroke-width="0.8" opacity="0.5"/>
|
||||
<line x1="-140" y1="-8" x2="-140" y2="8" stroke="#8b9cb3" stroke-width="0.8" opacity="0.5"/>
|
||||
<circle cx="60" cy="4" r="3" fill="#5eead4" filter="url(#blink)" opacity="0.9"/>
|
||||
</g>
|
||||
|
||||
<!-- Globe rim glow -->
|
||||
<circle cx="720" cy="560" r="332" fill="none" stroke="#3d8bfd" stroke-opacity="0.12" stroke-width="6"/>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1920" height="1080" viewBox="0 0 1920 1080" preserveAspectRatio="xMidYMid slice" role="img" aria-label="Android Cast logo mark">
|
||||
<image href="hub-logo-fragment-globe.svg" x="0" y="0" width="1920" height="1080"/>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 268 B |
@@ -1,94 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 960 720" role="img" aria-label="Android Cast - globe and rocket">
|
||||
<defs>
|
||||
<radialGradient id="globeShade" cx="38%" cy="32%" r="68%">
|
||||
<stop offset="0%" stop-color="#3d8bfd" stop-opacity="0.35"/>
|
||||
<stop offset="55%" stop-color="#1a2332" stop-opacity="0.95"/>
|
||||
<stop offset="100%" stop-color="#0a0e14" stop-opacity="1"/>
|
||||
</radialGradient>
|
||||
<linearGradient id="ocean" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||
<stop offset="0%" stop-color="#243044"/>
|
||||
<stop offset="100%" stop-color="#141c28"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="trail" x1="0%" y1="100%" x2="100%" y2="0%">
|
||||
<stop offset="0%" stop-color="#5eead4" stop-opacity="0"/>
|
||||
<stop offset="35%" stop-color="#5eead4" stop-opacity="0.85"/>
|
||||
<stop offset="70%" stop-color="#3d8bfd" stop-opacity="0.9"/>
|
||||
<stop offset="100%" stop-color="#3d8bfd" stop-opacity="0.2"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="rocketBody" x1="0%" y1="50%" x2="100%" y2="50%">
|
||||
<stop offset="0%" stop-color="#8b9cb3"/>
|
||||
<stop offset="45%" stop-color="#e7ecf3"/>
|
||||
<stop offset="100%" stop-color="#3d8bfd"/>
|
||||
</linearGradient>
|
||||
<filter id="glow" x="-40%" y="-40%" width="180%" height="180%">
|
||||
<feGaussianBlur stdDeviation="6" result="b"/>
|
||||
<feMerge>
|
||||
<feMergeNode in="b"/>
|
||||
<feMergeNode in="SourceGraphic"/>
|
||||
</feMerge>
|
||||
</filter>
|
||||
<clipPath id="globeClip">
|
||||
<circle cx="420" cy="380" r="248"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
|
||||
<!-- Trail behind globe (left-bottom) -->
|
||||
<path d="M 48 598 Q 140 520 220 468" fill="none" stroke="url(#trail)" stroke-width="28" stroke-linecap="round" opacity="0.55"/>
|
||||
|
||||
<!-- Globe -->
|
||||
<circle cx="420" cy="380" r="248" fill="url(#ocean)" stroke="#2d3a4f" stroke-width="2"/>
|
||||
<circle cx="420" cy="380" r="248" fill="url(#globeShade)"/>
|
||||
|
||||
<!-- Mercator grid -->
|
||||
<g clip-path="url(#globeClip)" stroke="#3d8bfd" stroke-opacity="0.22" fill="none">
|
||||
<ellipse cx="420" cy="380" rx="248" ry="62"/>
|
||||
<ellipse cx="420" cy="380" rx="248" ry="124"/>
|
||||
<ellipse cx="420" cy="380" rx="248" ry="186"/>
|
||||
<line x1="420" y1="132" x2="420" y2="628"/>
|
||||
<line x1="172" y1="380" x2="668" y2="380"/>
|
||||
<path d="M 200 220 Q 420 200 640 220"/>
|
||||
<path d="M 180 320 Q 420 300 660 320"/>
|
||||
<path d="M 190 440 Q 420 420 650 440"/>
|
||||
<path d="M 210 520 Q 420 500 630 520"/>
|
||||
<path d="M 280 180 Q 420 160 560 180"/>
|
||||
<path d="M 250 560 Q 420 540 590 560"/>
|
||||
<line x1="296" y1="132" x2="296" y2="628"/>
|
||||
<line x1="544" y1="132" x2="544" y2="628"/>
|
||||
<line x1="358" y1="132" x2="358" y2="628"/>
|
||||
<line x1="482" y1="132" x2="482" y2="628"/>
|
||||
</g>
|
||||
|
||||
<!-- Continents -->
|
||||
<g clip-path="url(#globeClip)" fill="#5a6b82" fill-opacity="0.5" stroke="#8b9cb3" stroke-opacity="0.3" stroke-width="1">
|
||||
<!-- North America -->
|
||||
<path d="M 230 210 Q 210 190 240 170 Q 280 155 330 175 Q 370 200 360 250 Q 340 300 290 290 Q 250 270 230 210 Z"/>
|
||||
<!-- South America -->
|
||||
<path d="M 290 310 Q 270 340 295 390 Q 320 440 360 420 Q 390 385 378 340 Q 355 295 290 310 Z"/>
|
||||
<!-- Europe/Africa -->
|
||||
<path d="M 430 190 Q 460 170 510 195 Q 545 225 530 270 Q 510 300 475 290 Q 445 265 430 190 Z"/>
|
||||
<path d="M 445 305 Q 480 285 520 310 Q 555 350 540 410 Q 510 450 470 430 Q 440 395 445 305 Z"/>
|
||||
<!-- Asia -->
|
||||
<path d="M 540 190 Q 590 165 660 185 Q 710 215 700 270 Q 670 310 620 305 Q 570 285 540 190 Z"/>
|
||||
</g>
|
||||
|
||||
<!-- Arc trail across globe -->
|
||||
<path d="M 220 468 Q 320 400 420 355 Q 510 305 610 235" fill="none" stroke="url(#trail)" stroke-width="20" stroke-linecap="round" filter="url(#glow)" opacity="0.7" clip-path="url(#globeClip)"/>
|
||||
<!-- Arc trail beyond globe -->
|
||||
<path d="M 610 235 Q 680 185 760 148" fill="none" stroke="url(#trail)" stroke-width="18" stroke-linecap="round" filter="url(#glow)" opacity="0.85"/>
|
||||
|
||||
<!-- Rocket: translate to tip position, rotate 38deg -->
|
||||
<g transform="translate(740,132) rotate(38)">
|
||||
<!-- Body -->
|
||||
<path d="M 0 0 L 52 -14 L 48 -6 L 72 -4 L 44 8 L 52 34 L 20 18 L 6 28 Z" fill="url(#rocketBody)" stroke="#2d3a4f" stroke-width="1" stroke-linejoin="round"/>
|
||||
<!-- Wing -->
|
||||
<path d="M 52 34 L 82 44 L 68 30 L 76 22 L 52 24 Z" fill="#3d8bfd" opacity="0.9"/>
|
||||
<!-- Engine glow -->
|
||||
<ellipse cx="60" cy="36" rx="16" ry="9" fill="#5eead4" opacity="0.7" filter="url(#glow)"/>
|
||||
<!-- Exhaust -->
|
||||
<path d="M 82 44 Q 108 54 130 48" fill="none" stroke="#5eead4" stroke-width="9" stroke-linecap="round" opacity="0.65"/>
|
||||
<path d="M 130 48 Q 158 42 182 38" fill="none" stroke="#5eead4" stroke-width="5" stroke-linecap="round" opacity="0.3"/>
|
||||
</g>
|
||||
|
||||
<!-- Globe rim highlight -->
|
||||
<circle cx="420" cy="380" r="248" fill="none" stroke="#3d8bfd" stroke-opacity="0.2" stroke-width="2"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 4.7 KiB |
22
examples/app_hub/assets/hub-thunder.svg
Normal file
@@ -0,0 +1,22 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="340" height="46" viewBox="0 0 340 46" role="img" aria-label="Thunder schematic underline">
|
||||
<defs>
|
||||
<linearGradient id="thunderCore" x1="0%" y1="50%" x2="100%" y2="50%">
|
||||
<stop offset="0%" stop-color="#7dd3fc" stop-opacity="0.15"/>
|
||||
<stop offset="15%" stop-color="#bae6fd" stop-opacity="0.95"/>
|
||||
<stop offset="48%" stop-color="#ffffff" stop-opacity="1"/>
|
||||
<stop offset="82%" stop-color="#bae6fd" stop-opacity="0.95"/>
|
||||
<stop offset="100%" stop-color="#7dd3fc" stop-opacity="0.15"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="thunderEdge" x1="0%" y1="0%" x2="100%" y2="0%">
|
||||
<stop offset="0%" stop-color="#9ddcff" stop-opacity="0"/>
|
||||
<stop offset="24%" stop-color="#9ddcff" stop-opacity="0.8"/>
|
||||
<stop offset="76%" stop-color="#9ddcff" stop-opacity="0.8"/>
|
||||
<stop offset="100%" stop-color="#9ddcff" stop-opacity="0"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
|
||||
<path d="M 12 24 L 86 24 L 98 16 L 126 31 L 154 13 L 178 28 L 210 11 L 236 27 L 262 17 L 286 25 L 328 25"
|
||||
fill="none" stroke="url(#thunderCore)" stroke-width="6" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M 12 24 L 86 24 L 98 16 L 126 31 L 154 13 L 178 28 L 210 11 L 236 27 L 262 17 L 286 25 L 328 25"
|
||||
fill="none" stroke="url(#thunderEdge)" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.4 KiB |
BIN
examples/app_hub/assets/mercator-source.jpg
Normal file
|
After Width: | Height: | Size: 63 KiB |