diff --git a/assets/scripts/hidden-details.js b/assets/scripts/hidden-details.js
index 6942ce1..b3f41bd 100644
--- a/assets/scripts/hidden-details.js
+++ b/assets/scripts/hidden-details.js
@@ -41,7 +41,7 @@
"aliases": ["Young Z", "young z", "young-z", "young_z", "young"],
"territoryColor": "#d8a95a",
"symbol": "Y",
- "avatar": {"shape": "sun-child", "accent": "#f1bc5b", "shadow": "#7a5630", "mood": "excited", "motif": "crayon sun", "description": "small crayon-sun spirit with oversized curiosity"},
+ "avatar": {"shape": "young", "accent": "#f4bf5f", "secondary": "#ffe6a8", "hair": "#6f4a2f", "skin": "#f4c9a3", "clothes": "#f0a858", "mood": "happy", "motif": "crayon sun", "description": "bright semi-chibi child spirit with curious warm eyes"},
"motifs": ["crayon sun", "blanket cape", "childhood desk"],
"themes": ["childhood", "play", "memory", "safety"],
"affinities": ["z", "future z", "aphy", "lima"]
@@ -52,7 +52,7 @@
"aliases": ["Z", "z", "zaine"],
"territoryColor": "#d6c38a",
"symbol": "Z",
- "avatar": {"shape": "traveler", "accent": "#d6c38a", "shadow": "#5d533a", "mood": "receptive", "motif": "small lantern", "description": "present observer spirit, quiet and receptive"},
+ "avatar": {"shape": "traveler", "accent": "#d8c891", "secondary": "#f1e6bd", "hair": "#4e4437", "skin": "#d9b58f", "clothes": "#7f735a", "mood": "calm", "motif": "small lantern", "description": "quiet protagonist spirit with an open observant expression"},
"motifs": ["archive", "website", "home"],
"themes": ["selfhood", "return", "making"],
"affinities": ["lima", "young z", "future z"]
@@ -63,7 +63,7 @@
"aliases": ["Aphy", "aphy", "aphy_bot", "aphy bot"],
"territoryColor": "#7fb089",
"symbol": "A",
- "avatar": {"shape": "terminal", "accent": "#7fd0a0", "shadow": "#315944", "mood": "curious", "motif": "terminal cursor", "description": "curious tiny system companion with a soft terminal glow"},
+ "avatar": {"shape": "tech", "accent": "#83d4df", "secondary": "#c8f5f6", "hair": "#38536a", "skin": "#e0c2a4", "clothes": "#54758a", "mood": "curious", "motif": "terminal cursor", "description": "playful terminal-helper spirit with gentle cyan vtuber energy"},
"motifs": ["console", "diagnostic", "backup"],
"themes": ["humor", "systems", "care through tools"],
"affinities": ["z", "lima", "sensei chi"]
@@ -74,7 +74,7 @@
"aliases": ["Lima", "lima"],
"territoryColor": "#d06b78",
"symbol": "L",
- "avatar": {"shape": "hearth", "accent": "#e78f8d", "shadow": "#6d3f43", "mood": "warm", "motif": "kitchen light", "description": "warm grounding spirit with calm eyes and a soft light"},
+ "avatar": {"shape": "home", "accent": "#e7a176", "secondary": "#ffe0b8", "hair": "#8a5b43", "skin": "#efc2a1", "clothes": "#b86f5e", "mood": "happy", "motif": "kitchen light", "description": "warm loving spirit with soft eyes and cozy home light"},
"motifs": ["warmth", "kitchen light", "ring"],
"themes": ["love", "home", "grounding"],
"affinities": ["z", "aphy", "future z", "young z"]
@@ -85,7 +85,7 @@
"aliases": ["Sensei Chi", "sensei chi", "sensei-chi", "sensei_chi", "sensei"],
"territoryColor": "#75a9bd",
"symbol": "S",
- "avatar": {"shape": "sage", "accent": "#84b8c8", "shadow": "#36566a", "mood": "smiling", "motif": "tea lantern", "description": "patient elderly spirit in simple robes"},
+ "avatar": {"shape": "mentor", "accent": "#9ec4be", "secondary": "#f0dbad", "hair": "#d8d0bd", "skin": "#d7ad88", "clothes": "#7d9b86", "mood": "calm", "motif": "tea lantern", "description": "kind elderly mentor spirit with peaceful tea-lantern warmth"},
"motifs": ["tea", "garden", "quiet lesson"],
"themes": ["reflection", "patience", "wisdom"],
"affinities": ["aphy", "future z"]
@@ -96,7 +96,7 @@
"aliases": ["Future Z", "future z", "future-z", "future_z", "future"],
"territoryColor": "#a58ac9",
"symbol": "F",
- "avatar": {"shape": "moon", "accent": "#b8a2d7", "shadow": "#51496a", "mood": "reflective", "motif": "distant clock", "description": "older reflective spirit, distant but caring"},
+ "avatar": {"shape": "future", "accent": "#b7a6cf", "secondary": "#e4d7f0", "hair": "#6b6279", "skin": "#d7b89e", "clothes": "#776d8f", "mood": "nostalgic", "motif": "distant clock", "description": "gentle older spirit with tired kind eyes and quiet patience"},
"motifs": ["clock", "age 40", "future log"],
"themes": ["time", "reassurance", "continuity"],
"affinities": ["z", "young z", "lima", "sensei chi"]
@@ -597,32 +597,49 @@
function avatarExpression(character, text) {
const value = String(text || "").toLowerCase();
- if (character === "aphy" && /error|glitch|system|diagnostic|debug|console/.test(value)) return "glitching";
- if (character === "lima" && /safe|home|warm|protect|care|eat|rest|light/.test(value)) return "concerned";
- if (character === "young z" && /draw|crayon|game|play|sun|blanket/.test(value)) return "drawing";
- if (character === "future z" && /time|future|return|ordinary|warning|later/.test(value)) return "reflective";
- if (character === "sensei chi" && /quiet|tea|patience|lesson|garden/.test(value)) return "smiling";
- return CHARACTER_REGISTRY[character]?.avatar?.mood || "soft";
+ if (character === "aphy" && /error|terminal|system|diagnostic|debug|console|search/.test(value)) return "thinking";
+ if (character === "lima" && /safe|home|warm|protect|care|eat|rest|light/.test(value)) return "happy";
+ if (character === "young z" && /draw|crayon|game|play|sun|blanket/.test(value)) return "surprised";
+ if (character === "future z" && /time|future|return|ordinary|warning|later/.test(value)) return "nostalgic";
+ if (character === "sensei chi" && /quiet|tea|patience|lesson|garden/.test(value)) return "calm";
+ return CHARACTER_REGISTRY[character]?.avatar?.mood || "calm";
}
function avatarSvg(character, expression) {
const config = CHARACTER_REGISTRY[character] || CHARACTER_REGISTRY.z;
const avatar = config.avatar || {};
const accent = avatar.accent || config.territoryColor || "#d3a64d";
- const shadow = avatar.shadow || "#5d4632";
+ const secondary = avatar.secondary || "#f6dfb4";
+ const hair = avatar.hair || "#5d4632";
+ const skin = avatar.skin || "#e7bd99";
+ const clothes = avatar.clothes || accent;
const symbol = escapeHtml(config.symbol || "?");
const shape = avatar.shape || "traveler";
- const eye = expression === "reflective" || expression === "smiling" ? "M12 15h3M21 15h3" : expression === "glitching" ? "M11 14h5M21 13h3M22 17h4" : "M12 14h3M21 14h3";
- const mouth = expression === "concerned" ? "M15 23q3-2 6 0" : expression === "excited" || expression === "drawing" || expression === "smiling" ? "M15 22q3 3 7 0" : "M16 22h6";
+ const eye = {
+ happy: ``,
+ calm: ``,
+ thinking: ``,
+ surprised: ``,
+ nostalgic: ``,
+ sleepy: ``
+ }[expression] || ``;
+ const mouth = {
+ happy: "M15.5 22q2.8 2.3 5.8 0",
+ calm: "M16.1 22.1q2.2 1.2 4.5 0",
+ thinking: "M16.5 22.3q2 .7 4 0",
+ surprised: "M18.4 21.9a1.15 1.15 0 1 0 .1 0",
+ nostalgic: "M16.2 22.2q2.4 1.5 4.8 0",
+ sleepy: "M16.7 22.2q1.8.8 3.6 0"
+ }[expression] || "M16.1 22.1q2.2 1.2 4.5 0";
const motif = {
- "sun-child": ``,
- terminal: ``,
- sage: ``,
- hearth: ``,
- moon: ``,
- traveler: ``
+ young: ``,
+ tech: ``,
+ mentor: ``,
+ home: ``,
+ future: ``,
+ traveler: ``
}[shape] || "";
- return ``;
+ return ``;
}
function avatarHtml(character, text) {
diff --git a/assets/styles/hidden-details.css b/assets/styles/hidden-details.css
index 8571ae2..74f3a9c 100644
--- a/assets/styles/hidden-details.css
+++ b/assets/styles/hidden-details.css
@@ -54,10 +54,10 @@
display: inline-grid;
place-items: center;
flex: 0 0 auto;
- border-radius: 8px;
- background: color-mix(in oklab, var(--hidden-avatar-color, var(--accent)) 16%, var(--surface));
- box-shadow: 0 0 0 1px color-mix(in oklab, var(--hidden-avatar-color, var(--accent)) 42%, transparent),
- 0 0 18px color-mix(in oklab, var(--hidden-avatar-color, var(--accent)) 22%, transparent);
+ border-radius: 50%;
+ background: radial-gradient(circle at 35% 25%, color-mix(in oklab, #fff 72%, transparent), color-mix(in oklab, var(--hidden-avatar-color, var(--accent)) 28%, var(--surface)));
+ box-shadow: 0 0 0 1px color-mix(in oklab, var(--hidden-avatar-color, var(--accent)) 34%, color-mix(in oklab, #fff 20%, transparent)),
+ 0 0 18px color-mix(in oklab, var(--hidden-avatar-color, var(--accent)) 18%, transparent);
overflow: hidden;
animation: hidden-avatar-breathe 6s ease-in-out infinite;
}
@@ -66,7 +66,7 @@
width: 100%;
height: 100%;
display: block;
- shape-rendering: crispEdges;
+ shape-rendering: geometricPrecision;
}
.hidden-toast.is-visible {
diff --git a/authoring_server.py b/authoring_server.py
index 55942eb..25d106a 100755
--- a/authoring_server.py
+++ b/authoring_server.py
@@ -150,12 +150,15 @@ CHARACTER_REGISTRY = {
"territoryColor": "#d8a95a",
"symbol": "Y",
"avatar": {
- "shape": "sun-child",
- "accent": "#f1bc5b",
- "shadow": "#7a5630",
- "mood": "excited",
+ "shape": "young",
+ "accent": "#f4bf5f",
+ "secondary": "#ffe6a8",
+ "hair": "#6f4a2f",
+ "skin": "#f4c9a3",
+ "clothes": "#f0a858",
+ "mood": "happy",
"motif": "crayon sun",
- "description": "small crayon-sun spirit with oversized curiosity",
+ "description": "bright semi-chibi child spirit with curious warm eyes",
},
"motifs": ["crayon sun", "blanket cape", "childhood desk"],
"themes": ["childhood", "play", "memory", "safety"],
@@ -169,11 +172,14 @@ CHARACTER_REGISTRY = {
"symbol": "Z",
"avatar": {
"shape": "traveler",
- "accent": "#d6c38a",
- "shadow": "#5d533a",
- "mood": "receptive",
+ "accent": "#d8c891",
+ "secondary": "#f1e6bd",
+ "hair": "#4e4437",
+ "skin": "#d9b58f",
+ "clothes": "#7f735a",
+ "mood": "calm",
"motif": "small lantern",
- "description": "present observer spirit, quiet and receptive",
+ "description": "quiet protagonist spirit with an open observant expression",
},
"motifs": ["archive", "website", "home"],
"themes": ["selfhood", "return", "making"],
@@ -186,12 +192,15 @@ CHARACTER_REGISTRY = {
"territoryColor": "#7fb089",
"symbol": "A",
"avatar": {
- "shape": "terminal",
- "accent": "#7fd0a0",
- "shadow": "#315944",
+ "shape": "tech",
+ "accent": "#83d4df",
+ "secondary": "#c8f5f6",
+ "hair": "#38536a",
+ "skin": "#e0c2a4",
+ "clothes": "#54758a",
"mood": "curious",
"motif": "terminal cursor",
- "description": "curious tiny system companion with a soft terminal glow",
+ "description": "playful terminal-helper spirit with gentle cyan vtuber energy",
},
"motifs": ["console", "diagnostic", "backup"],
"themes": ["humor", "systems", "care through tools"],
@@ -204,12 +213,15 @@ CHARACTER_REGISTRY = {
"territoryColor": "#d06b78",
"symbol": "L",
"avatar": {
- "shape": "hearth",
- "accent": "#e78f8d",
- "shadow": "#6d3f43",
- "mood": "warm",
+ "shape": "home",
+ "accent": "#e7a176",
+ "secondary": "#ffe0b8",
+ "hair": "#8a5b43",
+ "skin": "#efc2a1",
+ "clothes": "#b86f5e",
+ "mood": "happy",
"motif": "kitchen light",
- "description": "warm grounding spirit with calm eyes and a soft light",
+ "description": "warm loving spirit with soft eyes and cozy home light",
},
"motifs": ["warmth", "kitchen light", "ring"],
"themes": ["love", "home", "grounding"],
@@ -222,12 +234,15 @@ CHARACTER_REGISTRY = {
"territoryColor": "#75a9bd",
"symbol": "S",
"avatar": {
- "shape": "sage",
- "accent": "#84b8c8",
- "shadow": "#36566a",
- "mood": "smiling",
+ "shape": "mentor",
+ "accent": "#9ec4be",
+ "secondary": "#f0dbad",
+ "hair": "#d8d0bd",
+ "skin": "#d7ad88",
+ "clothes": "#7d9b86",
+ "mood": "calm",
"motif": "tea lantern",
- "description": "patient elderly spirit in simple robes",
+ "description": "kind elderly mentor spirit with peaceful tea-lantern warmth",
},
"motifs": ["tea", "garden", "quiet lesson"],
"themes": ["reflection", "patience", "wisdom"],
@@ -240,12 +255,15 @@ CHARACTER_REGISTRY = {
"territoryColor": "#a58ac9",
"symbol": "F",
"avatar": {
- "shape": "moon",
- "accent": "#b8a2d7",
- "shadow": "#51496a",
- "mood": "reflective",
+ "shape": "future",
+ "accent": "#b7a6cf",
+ "secondary": "#e4d7f0",
+ "hair": "#6b6279",
+ "skin": "#d7b89e",
+ "clothes": "#776d8f",
+ "mood": "nostalgic",
"motif": "distant clock",
- "description": "older reflective spirit, distant but caring",
+ "description": "gentle older spirit with tired kind eyes and quiet patience",
},
"motifs": ["clock", "age 40", "future log"],
"themes": ["time", "reassurance", "continuity"],
@@ -2580,17 +2598,17 @@ HIDDEN_APP_HTML = r"""
display: inline-grid;
place-items: center;
flex: 0 0 auto;
- border-radius: 7px;
- background: color-mix(in oklab, var(--avatar-color, #d3a64d) 20%, rgba(18, 16, 13, 0.72));
- box-shadow: 0 0 0 1px color-mix(in oklab, var(--avatar-color, #d3a64d) 42%, transparent), 0 0 14px color-mix(in oklab, var(--avatar-color, #d3a64d) 22%, transparent);
+ border-radius: 50%;
+ background: radial-gradient(circle at 35% 25%, rgba(255, 248, 226, 0.82), color-mix(in oklab, var(--avatar-color, #d3a64d) 32%, rgba(18, 16, 13, 0.38)));
+ box-shadow: 0 0 0 1px color-mix(in oklab, var(--avatar-color, #d3a64d) 34%, rgba(255, 246, 223, 0.28)), 0 0 16px color-mix(in oklab, var(--avatar-color, #d3a64d) 18%, transparent);
overflow: hidden;
vertical-align: middle;
}
- .avatar svg { width: 100%; height: 100%; display: block; shape-rendering: crispEdges; }
- .avatar--xs { --avatar-size: 18px; border-radius: 5px; }
+ .avatar svg { width: 100%; height: 100%; display: block; shape-rendering: geometricPrecision; }
+ .avatar--xs { --avatar-size: 18px; }
.avatar--sm { --avatar-size: 24px; }
.avatar--md { --avatar-size: 34px; }
- .avatar--lg { --avatar-size: 52px; border-radius: 10px; }
+ .avatar--lg { --avatar-size: 52px; }
.avatar--breathing { animation: spirit-breathe 5.8s ease-in-out infinite; }
.character-chip, .avatar-chip {
display: inline-flex;
@@ -2674,7 +2692,7 @@ HIDDEN_APP_HTML = r"""
.memory-node:active { cursor: grabbing; }
.memory-node text, .node-label text, .cluster-label text { fill: #f7ead3; paint-order: stroke; stroke: rgba(14, 11, 8, 0.82); stroke-width: 3px; stroke-linejoin: round; }
.memory-node circle { stroke: rgba(255, 246, 223, 0.82); stroke-width: 1.4; filter: drop-shadow(0 0 7px rgba(255, 232, 177, 0.18)); transition: r 160ms ease, stroke 160ms ease, opacity 160ms ease; }
- .memory-node .character-halo { fill: none; stroke: var(--node-character-color, rgba(211, 166, 77, 0.46)); stroke-width: 2; opacity: 0.42; stroke-dasharray: 2 5; animation: spirit-shimmer 8s ease-in-out infinite; }
+ .memory-node .character-halo { fill: color-mix(in oklab, var(--node-character-color, rgba(211, 166, 77, 0.46)) 8%, transparent); stroke: var(--node-character-color, rgba(211, 166, 77, 0.46)); stroke-width: 1.6; opacity: 0.34; stroke-dasharray: 2 7; animation: spirit-shimmer 8s ease-in-out infinite; }
.memory-node .node-avatar { opacity: 0; transform: scale(0.72); transition: opacity 220ms ease, transform 220ms ease; }
.zoom-2 .memory-node .node-avatar, .zoom-3 .memory-node .node-avatar, .memory-node.selected .node-avatar { opacity: 0.96; transform: scale(1); }
.memory-node.selected circle { stroke: #fff3c7; stroke-width: 3; }
@@ -3032,38 +3050,60 @@ HIDDEN_APP_HTML = r"""
}
function expressionFor(entry, character = "") {
const text = [entry?.title, entry?.content, entry?.triggerConditions, entry?.emotionalRole, entry?.mysteryLevel, ...(entry?.symbols || []), ...(entry?.tags || [])].join(" ").toLowerCase();
- if (character === "aphy" && /error|glitch|terminal|system|diagnostic|bug|css|console/.test(text)) return "glitching";
- if (character === "lima" && /safe|home|warm|protect|care|eat|rest|kitchen|light/.test(text)) return "concerned";
- if (character === "young z" && /draw|crayon|game|play|sun|blanket|child|desk/.test(text)) return "drawing";
- if (character === "future z" && /time|future|age 40|return|ordinary|warning|later/.test(text)) return "reflective";
- if (character === "sensei chi" && /quiet|tea|patience|lesson|garden|wisdom|still/.test(text)) return "smiling";
- return characterConfig(character).avatar?.mood || "soft";
+ if (character === "aphy" && /error|terminal|system|diagnostic|bug|css|console|search/.test(text)) return "thinking";
+ if (character === "lima" && /safe|home|warm|protect|care|eat|rest|kitchen|light/.test(text)) return "happy";
+ if (character === "young z" && /draw|crayon|game|play|sun|blanket|child|desk/.test(text)) return "surprised";
+ if (character === "future z" && /time|future|age 40|return|ordinary|warning|later/.test(text)) return "nostalgic";
+ if (character === "sensei chi" && /quiet|tea|patience|lesson|garden|wisdom|still/.test(text)) return "calm";
+ return characterConfig(character).avatar?.mood || "calm";
}
function avatarSvg(character, expression = "soft") {
const config = characterConfig(character);
const avatar = config.avatar || {};
const accent = avatar.accent || config.territoryColor || "#d3a64d";
- const shadow = avatar.shadow || "#5d4632";
+ const secondary = avatar.secondary || "#f6dfb4";
+ const hair = avatar.hair || "#5d4632";
+ const skin = avatar.skin || "#e7bd99";
+ const clothes = avatar.clothes || accent;
const symbol = html(config.symbol || "?");
const shape = avatar.shape || "traveler";
- const eye = expression === "reflective" || expression === "smiling" ? "M12 15h3M21 15h3" : expression === "glitching" ? "M11 14h5M21 13h3M22 17h4" : "M12 14h3M21 14h3";
- const mouth = expression === "concerned" ? "M15 23q3-2 6 0" : expression === "excited" || expression === "drawing" || expression === "smiling" ? "M15 22q3 3 7 0" : "M16 22h6";
+ const eye = {
+ happy: ``,
+ calm: ``,
+ thinking: ``,
+ surprised: ``,
+ nostalgic: ``,
+ sleepy: ``
+ }[expression] || ``;
+ const mouth = {
+ happy: "M15.5 22q2.8 2.3 5.8 0",
+ calm: "M16.1 22.1q2.2 1.2 4.5 0",
+ thinking: "M16.5 22.3q2 .7 4 0",
+ surprised: "M18.4 21.9a1.15 1.15 0 1 0 .1 0",
+ nostalgic: "M16.2 22.2q2.4 1.5 4.8 0",
+ sleepy: "M16.7 22.2q1.8.8 3.6 0"
+ }[expression] || "M16.1 22.1q2.2 1.2 4.5 0";
const motif = {
- "sun-child": ``,
- terminal: ``,
- sage: ``,
- hearth: ``,
- moon: ``,
- traveler: ``,
+ young: ``,
+ tech: ``,
+ mentor: ``,
+ home: ``,
+ future: ``,
+ traveler: ``,
}[shape] || "";
return ``;
}
function avatarHtml(character, size = "sm", expression = "soft", extraClass = "") {