# -*- coding: utf-8 -*-
"""舞台型ショートの部品(2026-11-06「研究のスキル一覧」で決めた見た目を、2本目から共通にした)。
モニターの中(900×600)は面で組む: 左上に小さな見出し、その下に言いたいことを1文、図は1つ。
オレンジは「いま話している1つ」だけ。細い枠線・記号のアイコンは使わない。
"""
import json, os
from kabe_kit import shake_js, counter_js
ORANGE, FACE_C, FACE_2, DIM, INK = "#E2683A", "#1B2433", "#2C3647", "#8A93A3", "#F5F3EE"
HERE = os.path.dirname(os.path.abspath(__file__))
STAGE_DIR = os.path.join(HERE, "stage")
CSS = f""""""
def win(t0, t1, inner):
an = f"show .15s linear {t0:.3f}s forwards" + (f", hide .15s linear {t1:.3f}s forwards" if t1 else "")
return f'
{inner}
'
def kick(name):
return f'{name}
'
def a(name, t, d=.3, ease="ease-out"):
"""animation の1つ分"""
return f"{name} {d}s {ease} {t:.3f}s forwards"
def stage_fx(T, bursts=(), shakes=(), ring_sec=48.0, fx=()):
"""床の円を回す(stage_bg_noring.png の上にカメラの値で描き直す)+紙吹雪(bursts: [(秒, 片の数)])+画面の揺れ
fx: 紙吹雪のほかの演出 [dict(kind=, t=秒, d=長さ, ...)](毎回紙吹雪にしない・2026-11-06 エイイチの指示)
rays … 床の円の真ん中から光の筋が回る(お祝い・決まった所)
speed … マンガの集中線がモニターに集まる(叩きつけ・ツッコミ)
shock … 床の円から波紋が広がる(知らせ・音・決定)
spot … まわりを暗くして、x の位置にスポットライト(決めるのは○○)
stars … 上の方に星がまたたき、少し暗くなる(夜・ひらめき)
shine … モニターの上を光の帯が斜めに走る(作り直した・きれいになった)
rise … 床から小さな四角が立ちのぼる(データ・記録・読まれる)"""
R = json.load(open(os.path.join(STAGE_DIR, "ring_lut.json")))
bs = [dict(t=t, n=n) for t, n in bursts]
js = f"""
"""
return js + (shake_js(list(shakes), amp=7) if shakes else "")
# 舞台型の共通の値(spec.py で from butai_parts import * して使う)
STAGE = STAGE_DIR
BG_NAME = "stage_bg_noring"
FOOT_L, FOOT_R, SIZE, SUB_MID = (390, 1525), (690, 1525), 0.88, 1590
SUB_ONE_LINE = True
LEAD = 0.8
OUTRO_TEXT = "研究の記録は、毎日サイトで公開中です!"
def outro(T, k):
"""締め(サイトへの入口)。モニターを pixelstomotors.com で覆う。文 k は narration.py の最後に足した OUTRO_TEXT の文
(2026-11-07 エイイチ「うちのサイトへの動線部分がないけど?」。2本目からの8本で入れ忘れていた)"""
t = T(k, 0)
return (f''
f'
研究の記録
'
f'
pixelstomotors.com
'
f'
毎日、公開中
')