This commit is contained in:
@@ -158,7 +158,7 @@ CHARACTER_REGISTRY = {
|
||||
"playful": "https://zainezq.com/assets/avatars/young-z.jpeg",
|
||||
},
|
||||
"sizes": {"tiny": 18, "medium": 42, "close": 56, "focus": 82},
|
||||
"observatory": {"territory": "nostalgic/playful memories", "anchor": {"x": 0.23, "y": 0.7}, "shimmer": "soft"},
|
||||
"observatory": {"territory": "nostalgic/playful memories", "shimmer": "soft"},
|
||||
"presenceTones": ["nostalgic", "funny", "hopeful"],
|
||||
"presenceKeywords": ["childhood", "play", "desk", "crayon", "young", "small", "blanket", "memory"],
|
||||
"symbol": "Y",
|
||||
@@ -176,7 +176,7 @@ CHARACTER_REGISTRY = {
|
||||
"fallbackAvatar": "https://zainezq.com/assets/avatars/z.jpeg",
|
||||
"expressions": {"default": "https://zainezq.com/assets/avatars/z.jpeg", "calm": "https://zainezq.com/assets/avatars/z.jpeg"},
|
||||
"sizes": {"tiny": 18, "medium": 42, "close": 56, "focus": 82},
|
||||
"observatory": {"territory": "self/archive memories", "anchor": {"x": 0.5, "y": 0.52}, "shimmer": "steady"},
|
||||
"observatory": {"territory": "self/archive memories", "shimmer": "steady"},
|
||||
"presenceTones": ["warm", "soft", "hopeful"],
|
||||
"presenceKeywords": ["website", "archive", "home", "self", "making", "return", "zaine"],
|
||||
"symbol": "Z",
|
||||
@@ -198,7 +198,7 @@ CHARACTER_REGISTRY = {
|
||||
"amused": "https://zainezq.com/assets/avatars/aphy.jpeg",
|
||||
},
|
||||
"sizes": {"tiny": 18, "medium": 42, "close": 56, "focus": 82},
|
||||
"observatory": {"territory": "system/symbolic areas", "anchor": {"x": 0.77, "y": 0.35}, "shimmer": "diagnostic"},
|
||||
"observatory": {"territory": "system/symbolic areas", "shimmer": "diagnostic"},
|
||||
"presenceTones": ["funny", "strange", "hopeful"],
|
||||
"presenceKeywords": ["system", "console", "diagnostic", "keyboard", "search", "terminal", "backup", "symbolic", "query"],
|
||||
"symbol": "A",
|
||||
@@ -221,7 +221,7 @@ CHARACTER_REGISTRY = {
|
||||
"protective": "https://zainezq.com/assets/avatars/lima.jpg",
|
||||
},
|
||||
"sizes": {"tiny": 18, "medium": 42, "close": 56, "focus": 82},
|
||||
"observatory": {"territory": "warm/protective arcs", "anchor": {"x": 0.29, "y": 0.36}, "shimmer": "warm"},
|
||||
"observatory": {"territory": "warm/protective arcs", "shimmer": "warm"},
|
||||
"presenceTones": ["warm", "protective", "soft"],
|
||||
"presenceKeywords": ["lima", "love", "warm", "kitchen", "light", "ring", "home", "protect", "eat"],
|
||||
"symbol": "L",
|
||||
@@ -243,7 +243,7 @@ CHARACTER_REGISTRY = {
|
||||
"wise": "https://zainezq.com/assets/avatars/sensei-chi.jpeg",
|
||||
},
|
||||
"sizes": {"tiny": 18, "medium": 42, "close": 56, "focus": 82},
|
||||
"observatory": {"territory": "reflective areas", "anchor": {"x": 0.68, "y": 0.68}, "shimmer": "quiet"},
|
||||
"observatory": {"territory": "reflective areas", "shimmer": "quiet"},
|
||||
"presenceTones": ["wise", "melancholy", "soft"],
|
||||
"presenceKeywords": ["reflection", "patience", "wisdom", "lesson", "tea", "garden", "quiet", "sensei"],
|
||||
"symbol": "S",
|
||||
@@ -265,7 +265,7 @@ CHARACTER_REGISTRY = {
|
||||
"reassuring": "https://zainezq.com/assets/avatars/future-z.jpeg",
|
||||
},
|
||||
"sizes": {"tiny": 18, "medium": 42, "close": 56, "focus": 82},
|
||||
"observatory": {"territory": "temporal regions", "anchor": {"x": 0.73, "y": 0.18}, "shimmer": "temporal"},
|
||||
"observatory": {"territory": "temporal regions", "shimmer": "temporal"},
|
||||
"presenceTones": ["hopeful", "melancholy", "wise"],
|
||||
"presenceKeywords": ["future", "time", "clock", "older", "tomorrow", "age", "reassurance", "continuity"],
|
||||
"symbol": "F",
|
||||
@@ -2853,10 +2853,6 @@ HIDDEN_APP_HTML = r"""<!doctype html>
|
||||
}
|
||||
.cluster-node .count { font-size: 18px; font-weight: 850; }
|
||||
.cluster-halo { fill: rgba(211, 166, 77, 0.08); stroke: rgba(211, 166, 77, 0.22); stroke-dasharray: 3 8; }
|
||||
.territory-anchor { pointer-events: none; opacity: 0.72; }
|
||||
.territory-anchor circle { fill: rgba(251, 241, 220, 0.035); stroke-width: 1.2; stroke-dasharray: 5 11; }
|
||||
.territory-anchor image { opacity: 0.88; }
|
||||
.territory-anchor text { fill: rgba(248, 234, 209, 0.66); font-size: 18px; paint-order: stroke; stroke: rgba(14, 11, 8, 0.78); stroke-width: 3px; }
|
||||
.drag-preview-line { stroke: rgba(255, 232, 177, 0.78); stroke-width: 3; stroke-dasharray: 8 8; pointer-events: none; }
|
||||
.drag-preview-halo { fill: rgba(211, 166, 77, 0.1); stroke: rgba(255, 232, 177, 0.58); stroke-width: 2; stroke-dasharray: 4 7; pointer-events: none; }
|
||||
.drag-preview-label rect { fill: rgba(18, 16, 13, 0.86); stroke: rgba(255, 232, 177, 0.42); rx: 7; }
|
||||
@@ -3972,7 +3968,6 @@ HIDDEN_APP_HTML = r"""<!doctype html>
|
||||
const storyRegions = renderStoryRegions(entries);
|
||||
const occupied = [];
|
||||
const defs = [];
|
||||
const territoryAnchors = renderTerritoryAnchors(defs);
|
||||
const clusterNodes = clusters.map((cluster) => {
|
||||
const pos = state.clusterPositions.get(cluster.id);
|
||||
const character = state.mode === "character" ? cluster.label : cluster.character || "z";
|
||||
@@ -4010,7 +4005,7 @@ HIDDEN_APP_HTML = r"""<!doctype html>
|
||||
: svgAvatar(character, size, clipId, avatarExpressionForEntry(entry), state.zoom >= 2 ? "node-breathe" : "")}
|
||||
</g>${label}`;
|
||||
}).join("");
|
||||
graph.innerHTML = `<defs>${defs.join("")}</defs><g id="world" transform="${cameraTransform()}">${rings}${territoryAnchors}${storyRegions}${clusterEdges}${edges}${clusterNodes}${nodes}<g id="dragLayer"></g></g>`;
|
||||
graph.innerHTML = `<defs>${defs.join("")}</defs><g id="world" transform="${cameraTransform()}">${rings}${storyRegions}${clusterEdges}${edges}${clusterNodes}${nodes}<g id="dragLayer"></g></g>`;
|
||||
graph.querySelectorAll(".cluster-node").forEach((node) => {
|
||||
node.addEventListener("click", () => openCluster(node.dataset.id));
|
||||
node.addEventListener("dblclick", () => openCluster(node.dataset.id));
|
||||
@@ -4029,23 +4024,6 @@ HIDDEN_APP_HTML = r"""<!doctype html>
|
||||
renderMinimap(scope);
|
||||
updateDragPreview();
|
||||
}
|
||||
function renderTerritoryAnchors(defs) {
|
||||
if (state.camera.k < 0.18 || ["journey","hidden","dream","temporal"].includes(state.mode)) return "";
|
||||
return Object.entries(avatarRegistry()).map(([character, config]) => {
|
||||
const anchor = config.observatory?.anchor || { x: 0.5, y: 0.5 };
|
||||
const x = Math.max(260, Math.min(WORLD.width - 260, Number(anchor.x || 0.5) * WORLD.width));
|
||||
const y = Math.max(220, Math.min(WORLD.height - 220, Number(anchor.y || 0.5) * WORLD.height));
|
||||
const radius = state.mode === "character" ? 150 : 105;
|
||||
const portrait = state.mode === "character" || state.camera.k > 0.42;
|
||||
const clipId = `clip-territory-${slugify(character)}`;
|
||||
defs.push(`<clipPath id="${html(clipId)}"><circle r="38"></circle></clipPath>`);
|
||||
return `<g class="territory-anchor constellation-shimmer" transform="translate(${x} ${y})" style="--node-glow:${html(avatarGlow(character))}">
|
||||
<circle r="${radius}" stroke="${html(avatarGlow(character))}" opacity="0.36"></circle>
|
||||
${portrait ? svgAvatar(character, 38, clipId, "default", "node-breathe") : ""}
|
||||
<text x="0" y="${portrait ? 74 : 6}" text-anchor="middle">${html(characterLabel(character))}</text>
|
||||
</g>`;
|
||||
}).join("");
|
||||
}
|
||||
function renderStoryRegions(entries) {
|
||||
if (!entries.length || state.camera.k < 0.22) return "";
|
||||
return filteredStories().map((story) => {
|
||||
|
||||
Reference in New Issue
Block a user