diff --git a/ai-artifacts/docs/VISUAL_MODEL.md b/ai-artifacts/docs/VISUAL_MODEL.md index 45bd266..f2a0725 100644 --- a/ai-artifacts/docs/VISUAL_MODEL.md +++ b/ai-artifacts/docs/VISUAL_MODEL.md @@ -26,17 +26,7 @@ npm run generate ## 2. Placement -```text -viewport -┌──────────────────────────────┐ -│ ↔ 0.5% minimum footprint gap│ -│ ghost center: 40% ↓ │ -│ size: 12.6% of height │ -│ │ -└──────────────────────────────┘ -``` - -The gap clamps the full animated footprint, including drift and decorations. The face renders on a dense `8 × 17 px` virtual ASCII grid so small features remain legible; sidebar placement separately uses real `16 px` terminal-cell width. +The face keeps one height-based size and one `16 px × 29` sidebar-center placement on every display. Its full animated footprint may move right only when needed to retain a `0.1%` viewport-width gap at the left edge; it never shrinks or switches layout based on cursor geometry. The face always renders on the dense `8 × 17 px` virtual ASCII grid. ## 3. Visual invariants diff --git a/shaders/ghost-in-the-machine.glsl b/shaders/ghost-in-the-machine.glsl index 884aa7a..0e9aca2 100644 --- a/shaders/ghost-in-the-machine.glsl +++ b/shaders/ghost-in-the-machine.glsl @@ -15,10 +15,10 @@ const vec2 CELL = vec2(8.0, 17.0); const float FACE_SIZE = 0.126; // 画面高に対する比(旧 0.14 から 10% 縮小) const float FACE_Y_FROM_TOP = 0.40; // 顔中心の上端からの位置(画面高比) -const float FACE_LEFT_GAP = 0.005; // 最も左の描画点と画面左端の最小距離(画面幅比) +const float FACE_LEFT_GAP = 0.001; // 最も左の描画点と画面左端の最小距離(画面幅比) const float FACE_BOUND_X = 1.25; // drift/decorations 込みの顔空間左半径 const float SIDEBAR_COLS = 29.0; // herdr 展開サイドバーの幅(列) -const float SIDEBAR_CELL_WIDTH = 16.0; // sidebar 配置用の実セル幅(dense grid とは独立) +const float SIDEBAR_CELL_WIDTH = 16.0; // sidebar 配置用の実セル幅(dense grid とは独立) const vec3 FACE_COL = vec3(0.36, 0.88, 0.79); // 通常時の顔色(idle パレットアンカーも兼ねる) const vec3 ERR_COL = vec3(0.95, 0.36, 0.42); // 失敗時の顔色(err パレットアンカーも兼ねる) const vec3 THINK_COL = vec3(0.94, 0.76, 0.29); // 考える顔(調査/プランニング中) @@ -617,8 +617,8 @@ void mainImage(out vec4 fragColor, in vec2 fragCoord) { vec2 cellUV = fract(fragCoord / CELL); vec2 smp = (cellId + 0.5) * CELL; - // 基本位置は herdr サイドバー中央。drift と全状態 decoration を含む左端が - // viewport の 0.5% より内側へ入らない場合だけ、顔全体を右へ寄せる。 + // 元の高さ基準サイズと sidebar 中心配置を保つ。drift/decorations を含む + // 左端だけは viewport の 0.1% より内側へ入らないよう、必要な場合のみ右へ寄せる。 float faceScale = FACE_SIZE * iResolution.y; float sidebarCenterX = SIDEBAR_CELL_WIDTH * SIDEBAR_COLS * 0.5; float minCenterX = FACE_LEFT_GAP * iResolution.x + FACE_BOUND_X * faceScale; diff --git a/shaders/variants/done.glsl b/shaders/variants/done.glsl index 7f92940..4e59cdf 100644 --- a/shaders/variants/done.glsl +++ b/shaders/variants/done.glsl @@ -15,10 +15,10 @@ const vec2 CELL = vec2(8.0, 17.0); const float FACE_SIZE = 0.126; // 画面高に対する比(旧 0.14 から 10% 縮小) const float FACE_Y_FROM_TOP = 0.40; // 顔中心の上端からの位置(画面高比) -const float FACE_LEFT_GAP = 0.005; // 最も左の描画点と画面左端の最小距離(画面幅比) +const float FACE_LEFT_GAP = 0.001; // 最も左の描画点と画面左端の最小距離(画面幅比) const float FACE_BOUND_X = 1.25; // drift/decorations 込みの顔空間左半径 const float SIDEBAR_COLS = 29.0; // herdr 展開サイドバーの幅(列) -const float SIDEBAR_CELL_WIDTH = 16.0; // sidebar 配置用の実セル幅(dense grid とは独立) +const float SIDEBAR_CELL_WIDTH = 16.0; // sidebar 配置用の実セル幅(dense grid とは独立) const vec3 FACE_COL = vec3(0.36, 0.88, 0.79); // 通常時の顔色(idle パレットアンカーも兼ねる) const vec3 ERR_COL = vec3(0.95, 0.36, 0.42); // 失敗時の顔色(err パレットアンカーも兼ねる) const vec3 THINK_COL = vec3(0.94, 0.76, 0.29); // 考える顔(調査/プランニング中) @@ -617,8 +617,8 @@ void mainImage(out vec4 fragColor, in vec2 fragCoord) { vec2 cellUV = fract(fragCoord / CELL); vec2 smp = (cellId + 0.5) * CELL; - // 基本位置は herdr サイドバー中央。drift と全状態 decoration を含む左端が - // viewport の 0.5% より内側へ入らない場合だけ、顔全体を右へ寄せる。 + // 元の高さ基準サイズと sidebar 中心配置を保つ。drift/decorations を含む + // 左端だけは viewport の 0.1% より内側へ入らないよう、必要な場合のみ右へ寄せる。 float faceScale = FACE_SIZE * iResolution.y; float sidebarCenterX = SIDEBAR_CELL_WIDTH * SIDEBAR_COLS * 0.5; float minCenterX = FACE_LEFT_GAP * iResolution.x + FACE_BOUND_X * faceScale; diff --git a/shaders/variants/error.glsl b/shaders/variants/error.glsl index 6aac5b8..000b7a8 100644 --- a/shaders/variants/error.glsl +++ b/shaders/variants/error.glsl @@ -15,10 +15,10 @@ const vec2 CELL = vec2(8.0, 17.0); const float FACE_SIZE = 0.126; // 画面高に対する比(旧 0.14 から 10% 縮小) const float FACE_Y_FROM_TOP = 0.40; // 顔中心の上端からの位置(画面高比) -const float FACE_LEFT_GAP = 0.005; // 最も左の描画点と画面左端の最小距離(画面幅比) +const float FACE_LEFT_GAP = 0.001; // 最も左の描画点と画面左端の最小距離(画面幅比) const float FACE_BOUND_X = 1.25; // drift/decorations 込みの顔空間左半径 const float SIDEBAR_COLS = 29.0; // herdr 展開サイドバーの幅(列) -const float SIDEBAR_CELL_WIDTH = 16.0; // sidebar 配置用の実セル幅(dense grid とは独立) +const float SIDEBAR_CELL_WIDTH = 16.0; // sidebar 配置用の実セル幅(dense grid とは独立) const vec3 FACE_COL = vec3(0.36, 0.88, 0.79); // 通常時の顔色(idle パレットアンカーも兼ねる) const vec3 ERR_COL = vec3(0.95, 0.36, 0.42); // 失敗時の顔色(err パレットアンカーも兼ねる) const vec3 THINK_COL = vec3(0.94, 0.76, 0.29); // 考える顔(調査/プランニング中) @@ -617,8 +617,8 @@ void mainImage(out vec4 fragColor, in vec2 fragCoord) { vec2 cellUV = fract(fragCoord / CELL); vec2 smp = (cellId + 0.5) * CELL; - // 基本位置は herdr サイドバー中央。drift と全状態 decoration を含む左端が - // viewport の 0.5% より内側へ入らない場合だけ、顔全体を右へ寄せる。 + // 元の高さ基準サイズと sidebar 中心配置を保つ。drift/decorations を含む + // 左端だけは viewport の 0.1% より内側へ入らないよう、必要な場合のみ右へ寄せる。 float faceScale = FACE_SIZE * iResolution.y; float sidebarCenterX = SIDEBAR_CELL_WIDTH * SIDEBAR_COLS * 0.5; float minCenterX = FACE_LEFT_GAP * iResolution.x + FACE_BOUND_X * faceScale; diff --git a/shaders/variants/idle.glsl b/shaders/variants/idle.glsl index 4936295..fd9a2ac 100644 --- a/shaders/variants/idle.glsl +++ b/shaders/variants/idle.glsl @@ -15,10 +15,10 @@ const vec2 CELL = vec2(8.0, 17.0); const float FACE_SIZE = 0.126; // 画面高に対する比(旧 0.14 から 10% 縮小) const float FACE_Y_FROM_TOP = 0.40; // 顔中心の上端からの位置(画面高比) -const float FACE_LEFT_GAP = 0.005; // 最も左の描画点と画面左端の最小距離(画面幅比) +const float FACE_LEFT_GAP = 0.001; // 最も左の描画点と画面左端の最小距離(画面幅比) const float FACE_BOUND_X = 1.25; // drift/decorations 込みの顔空間左半径 const float SIDEBAR_COLS = 29.0; // herdr 展開サイドバーの幅(列) -const float SIDEBAR_CELL_WIDTH = 16.0; // sidebar 配置用の実セル幅(dense grid とは独立) +const float SIDEBAR_CELL_WIDTH = 16.0; // sidebar 配置用の実セル幅(dense grid とは独立) const vec3 FACE_COL = vec3(0.36, 0.88, 0.79); // 通常時の顔色(idle パレットアンカーも兼ねる) const vec3 ERR_COL = vec3(0.95, 0.36, 0.42); // 失敗時の顔色(err パレットアンカーも兼ねる) const vec3 THINK_COL = vec3(0.94, 0.76, 0.29); // 考える顔(調査/プランニング中) @@ -617,8 +617,8 @@ void mainImage(out vec4 fragColor, in vec2 fragCoord) { vec2 cellUV = fract(fragCoord / CELL); vec2 smp = (cellId + 0.5) * CELL; - // 基本位置は herdr サイドバー中央。drift と全状態 decoration を含む左端が - // viewport の 0.5% より内側へ入らない場合だけ、顔全体を右へ寄せる。 + // 元の高さ基準サイズと sidebar 中心配置を保つ。drift/decorations を含む + // 左端だけは viewport の 0.1% より内側へ入らないよう、必要な場合のみ右へ寄せる。 float faceScale = FACE_SIZE * iResolution.y; float sidebarCenterX = SIDEBAR_CELL_WIDTH * SIDEBAR_COLS * 0.5; float minCenterX = FACE_LEFT_GAP * iResolution.x + FACE_BOUND_X * faceScale; diff --git a/shaders/variants/thinking.glsl b/shaders/variants/thinking.glsl index 626ff63..5b42f3c 100644 --- a/shaders/variants/thinking.glsl +++ b/shaders/variants/thinking.glsl @@ -15,10 +15,10 @@ const vec2 CELL = vec2(8.0, 17.0); const float FACE_SIZE = 0.126; // 画面高に対する比(旧 0.14 から 10% 縮小) const float FACE_Y_FROM_TOP = 0.40; // 顔中心の上端からの位置(画面高比) -const float FACE_LEFT_GAP = 0.005; // 最も左の描画点と画面左端の最小距離(画面幅比) +const float FACE_LEFT_GAP = 0.001; // 最も左の描画点と画面左端の最小距離(画面幅比) const float FACE_BOUND_X = 1.25; // drift/decorations 込みの顔空間左半径 const float SIDEBAR_COLS = 29.0; // herdr 展開サイドバーの幅(列) -const float SIDEBAR_CELL_WIDTH = 16.0; // sidebar 配置用の実セル幅(dense grid とは独立) +const float SIDEBAR_CELL_WIDTH = 16.0; // sidebar 配置用の実セル幅(dense grid とは独立) const vec3 FACE_COL = vec3(0.36, 0.88, 0.79); // 通常時の顔色(idle パレットアンカーも兼ねる) const vec3 ERR_COL = vec3(0.95, 0.36, 0.42); // 失敗時の顔色(err パレットアンカーも兼ねる) const vec3 THINK_COL = vec3(0.94, 0.76, 0.29); // 考える顔(調査/プランニング中) @@ -617,8 +617,8 @@ void mainImage(out vec4 fragColor, in vec2 fragCoord) { vec2 cellUV = fract(fragCoord / CELL); vec2 smp = (cellId + 0.5) * CELL; - // 基本位置は herdr サイドバー中央。drift と全状態 decoration を含む左端が - // viewport の 0.5% より内側へ入らない場合だけ、顔全体を右へ寄せる。 + // 元の高さ基準サイズと sidebar 中心配置を保つ。drift/decorations を含む + // 左端だけは viewport の 0.1% より内側へ入らないよう、必要な場合のみ右へ寄せる。 float faceScale = FACE_SIZE * iResolution.y; float sidebarCenterX = SIDEBAR_CELL_WIDTH * SIDEBAR_COLS * 0.5; float minCenterX = FACE_LEFT_GAP * iResolution.x + FACE_BOUND_X * faceScale; diff --git a/shaders/variants/working.glsl b/shaders/variants/working.glsl index 98f4fb4..f0b8926 100644 --- a/shaders/variants/working.glsl +++ b/shaders/variants/working.glsl @@ -15,10 +15,10 @@ const vec2 CELL = vec2(8.0, 17.0); const float FACE_SIZE = 0.126; // 画面高に対する比(旧 0.14 から 10% 縮小) const float FACE_Y_FROM_TOP = 0.40; // 顔中心の上端からの位置(画面高比) -const float FACE_LEFT_GAP = 0.005; // 最も左の描画点と画面左端の最小距離(画面幅比) +const float FACE_LEFT_GAP = 0.001; // 最も左の描画点と画面左端の最小距離(画面幅比) const float FACE_BOUND_X = 1.25; // drift/decorations 込みの顔空間左半径 const float SIDEBAR_COLS = 29.0; // herdr 展開サイドバーの幅(列) -const float SIDEBAR_CELL_WIDTH = 16.0; // sidebar 配置用の実セル幅(dense grid とは独立) +const float SIDEBAR_CELL_WIDTH = 16.0; // sidebar 配置用の実セル幅(dense grid とは独立) const vec3 FACE_COL = vec3(0.36, 0.88, 0.79); // 通常時の顔色(idle パレットアンカーも兼ねる) const vec3 ERR_COL = vec3(0.95, 0.36, 0.42); // 失敗時の顔色(err パレットアンカーも兼ねる) const vec3 THINK_COL = vec3(0.94, 0.76, 0.29); // 考える顔(調査/プランニング中) @@ -617,8 +617,8 @@ void mainImage(out vec4 fragColor, in vec2 fragCoord) { vec2 cellUV = fract(fragCoord / CELL); vec2 smp = (cellId + 0.5) * CELL; - // 基本位置は herdr サイドバー中央。drift と全状態 decoration を含む左端が - // viewport の 0.5% より内側へ入らない場合だけ、顔全体を右へ寄せる。 + // 元の高さ基準サイズと sidebar 中心配置を保つ。drift/decorations を含む + // 左端だけは viewport の 0.1% より内側へ入らないよう、必要な場合のみ右へ寄せる。 float faceScale = FACE_SIZE * iResolution.y; float sidebarCenterX = SIDEBAR_CELL_WIDTH * SIDEBAR_COLS * 0.5; float minCenterX = FACE_LEFT_GAP * iResolution.x + FACE_BOUND_X * faceScale;