0このアプリの全体像

イベントのセッション(プログラム)・スポンサー・参加者一覧を管理し、イベントサイトへ配信するアプリです。登壇者・参加者の人物データは人物 DB(nanovation-personal-database)が持ち、このアプリは表示・配信を担います。

運用者(イベント担当)

管理画面 /admin で、セッション・枠・登壇者区分・スポンサー・参加者スナップショットなどを編集します。→ 第1部

フロントエンド実装スタッフ(制作会社)

イベントサイトに配信 API / Web Component を組み込み、CSS で見た目を作ります。→ 第2部

💡
用語: DAY=開催日の区切り/枠(スロット)=同じ時刻に並ぶセッションの集まり/スナップショット=ある時点の写し(アーカイブ配信用)。公開状態は 下書き / STG公開 / 全公開 の3段階です。
📋 第1部 — 管理画面の操作(運用者向け)各画面のスクリーンショットと操作手順

1ログインとイベント選択

管理画面は 1 つ(/admin)。共有パスワードでログインします(ID なし)。

ログイン画面
ログイン画面。管理パスワードを入れて「ログイン」。パスワードは運用担当から受け取ります。

ログインするとイベント一覧が出ます。イベントの定義(slug・名称・開催日)は人物 DB が持ち、ここには各イベントの DAY 数・セッション数・スポンサー数・保存済みスナップショット版数が集計表示されます。行の「開く」で、そのイベントの編集に入ります。

イベント一覧
イベント一覧(起点)。行をクリック、または「開く」で選択。選ぶと左ナビにそのイベントの編集メニューが出ます。
🔗
各画面は URL を持ちます(例 /admin/MA26/sessions)。リロードや「戻る」が効き、リンク共有もできます。

2セッション一覧の見方

「A — セッション管理 → セッション一覧」。上部の DAY タブで日を切り替え、その日のセッションが時間枠ごとに、左に時刻・右にカードで並びます。同じ時刻に複数あれば横に並びます(並列トラック)。

セッション一覧
セッション一覧。左の時刻=枠、右がセッションカード。カードには公開状態バッジ(全公開/STG公開/下書き)・種別・並び順・登壇者チップ・スポンサーロゴが出ます。カードをクリックで編集モーダルが開きます。

3セッションを作る・編集する

セッション編集は大きなモーダルで、上のタブで 基本情報 / 登壇者 / スポンサー / 追加項目 / 公開制御 を切り替えます。最後に右下「保存」で確定します(保存するまで反映されません)。

基本情報タブ

基本情報タブ
基本情報。DAY・開始時刻・同一時間枠内の並び順、表示タイプ(通常/自由 HTML 枠)、種別・タイトル・Summary。

登壇者タブ

登壇者タブ
登壇者。区分・人物・会社・役職を行で管理。氏名/会社/役職は人物 DB の値を参照し、会社・役職はこのセッションだけ上書き可(マスタは変わりません)。顔写真の上書きは持ちません。
登壇者ピッカー
登壇者ピッカー。氏名・会社・役職・ID のどれでも絞り込めます。複数選んでまとめて追加。登録済みは薄く表示。

スポンサータブ

スポンサータブ
セッションスポンサー。スポンサー管理に登録済みの企業を選んで紐付けます。1 セッションに複数社可。

追加項目タブ

追加項目タブ
追加項目。「追加項目の定義」で作った任意項目がフォームになります。レイアウト(layout_class)もここで選びます(§15)。

公開制御タブ

公開制御タブ
公開制御。公開状態(全公開/STG公開/下書き)と、詳細ページを生成するか。
公開状態配信
全公開 (published)本番サイト(指定なし)に出る。
STG 公開 (staging)?stage=staging(要キー)でのみ出る。本番には出ない。
下書き (draft)どこにも配信されない。
🕘
モーダル下の「更新履歴」から、保存のたびの版に戻せます(最新 100 版)。削除したセッションも履歴から戻せます。

4枠管理(時刻・トラック名)

「枠管理」は、枠(=同じ時刻のセッションの集まり)を一画面でまとめて操作します。時刻変更が多い時に便利です。

枠管理
枠管理。DAY ごとに枠が並び、各枠で「時刻」「左側の時刻表示(表示/非表示)」「トラック名」を設定。DAY 単位で「この DAY の枠を保存」。

5DAY 定義

「DAY 定義」で開催日の区切りを作ります。ラベルは自由文字列(「DAY1」「After」等)、日付は任意。

DAY定義
DAY 定義。ラベル・サブラベル・日付・表示順を行で編集。💾 で保存、✕ で削除(使用中は削除不可)。

6登壇者区分

Speaker / Moderator / MC などの区分をイベントごとに定義できます。定義が無いイベントは既定 3 区分で動きます。

登壇者区分
登壇者区分。区分ごとに「ラベル表示(氏名の上に出す区分名)」と「配信の有無(その区分の登壇者をサイトに出すか)」を設定。既定のまま一部だけ変えたい時は「既定 3 区分を編集用に取り込む」。

7追加項目の定義

セッション/スポンサーごとに、任意の項目(カスタムフィールド)を足せます。項目は固定しません。

追加項目の定義
追加項目の定義。キー・表示ラベル・型(text/select/url 等)・選択肢・表示順・公開/管理のみ を設定。上のセレクトで「セッションに付く項目/スポンサーに付く項目」を切替。
📐
キー layout_class はレイアウト用の予約項目です(§15)。型を select、選択肢に cont_big,cont_ssn_col2,cont_ssn_col3 等を入れると、セッション編集で選べます。

8表示スタイル設定

配信される見た目(Web Component の描画モード・CSS・テンプレート・外部 CSS)を設定します。制作会社が触る想定の画面です。

表示スタイル設定
表示スタイル設定。①描画モード(Light/Shadow)とテンプレート優先順位、②CSS(丸ごと手書き可・スケルトン挿入あり)、③テンプレート(構造を変えたい時)、④外部スタイルシート URL。

9スポンサー一覧・グレード定義

スポンサーはイベントごとに登録します。グレード(見出し)× 表示ランク(特大/大/通常)で並びます。

スポンサー一覧
スポンサー一覧。グレードごとにロゴが並びます。「+ スポンサー追加」で新規、カードをクリックで編集(社名・URL・グレード・ランク・ロゴ・紹介文・掲載/非表示)。「前イベントから一括複製」も可。
グレード定義
グレード定義。グレード名(表示見出し)・slug・既定の表示ランク・表示順。使用中のグレードは削除できません。

10スポンサー DB(使い回し)

一度登録したスポンサーを別イベントでも使い回すための、全イベント共通の企業台帳です。

スポンサーDB
スポンサー DB。企業を登録しておき、チェックして「選択をこのイベントに取り込む」で現在のイベントへ追加。各社に「◯イベントで使用中」と使用実績が出ます。既存のスポンサー一覧は「この一覧を DB に登録」でまとめて台帳化できます(同名は名寄せ)。

11スナップショット(保存・編集)

開催後のアーカイブはスナップショット(ある時点の写し)で固定します。ライブを止めるわけではないので「凍結」ではありません。写真・ロゴも自己完結で複製されます。

スナップショット管理
スナップショット管理。「📸 スナップショットを保存」で今の全公開データを 1 版として保存(何度でも可・保存しても配信は変わらない)。各版に「この版を配信する URL(?snapshot=N)」が出ます。

撮った版は「スナップショット編集」で直せます。ライブデータは一切参照しません(土台にした版だけを編集して新しい版を作ります)。

スナップショット編集
スナップショット編集。版を土台に、セッションの種別・タイトル・Summary、登壇者の氏名・会社・役職、顔写真・スポンサーロゴの差し替え、掲載取り下げ、参加者一覧の編集ができます。「新版として保存」で新しい版になります(元の版は変わりません)。
⚠️
編集で件数(セッション数・登壇者数・参加者数)は変わりません。掲載を止めたい登壇者スポンサー・参加者は「掲載取り下げ(非表示)」にします。取り下げた対象はその版の配信から落ちます。

12配信エンドポイント画面

「参考 — 閲覧のみ」の画面。サイトのどの画面が何を叩くのかを一覧できます。制作会社に渡す URL はここからコピーします。

配信エンドポイント
配信エンドポイント。スケジュール/セッション詳細/スポンサー/参加者/画像の、JSON と Web Component の叩く先・置くタグを一覧。「配信内容を確認」で実レスポンスも見られます。参加者一覧は必ずこのアプリの URL を使ってください(人物 DB 直叩きは STG 混入の恐れ)。
🧩 第2部 — サイトへの組み込み(フロントエンド実装向け)配信の叩き方・DOM/class 設計

13配信エンドポイント一覧

イベントサイトが叩く先。認証不要(公開・読み取り専用)。event にイベント slug(例 MA26)。

GET/api/schedule?event=MA26
スケジュール一括(DAY → 枠 → セッション → 登壇者・スポンサー)。
GET/api/sessions/{session_id}?event=MA26
セッション 1 件(詳細ページ用)。
GET/api/sponsors?event=MA26
スポンサー一覧(グレード × 表示ランク)。
GET/api/attendees?event=MA26
参加者一覧(区分ごと)。このアプリの口のみ使用。
GET/wc/schedule.js
Web Component 本体(<ma-schedule> / <ma-session>)。
GET/img/photo/{person_id} /img/sponsor/{sponsor_id}
顔写真・ロゴ。配信 JSON にこの URL が入っているのでそのまま <img> に使えます。

配信内容の切り替え(呼び出し側が URL で指定)

付ける指定返るもの
(なし)ライブ・全公開のみ。本番サイトはこれ。
?snapshot=3スナップショット v3(アーカイブ)。immutable キャッシュ可
?stage=staging&key=…STG 公開まで含む(確認用・キー必須)。

14Web Component / JSON

最小は script 1 行とタグ 1 個。

<script src="https://nanovation-session-manager.web-agent.io/wc/schedule.js"></script>
<ma-schedule event="MA26"></ma-schedule>
⚠️
版・段階(?snapshot= / ?stage=)は必ず <script> の URL に付けます(<ma-schedule> の属性ではない)。CSS・テンプレートがこの JS に焼き込まれるためです。
属性意味
eventイベント slug(必須)。
day特定 DAY だけ描く。
shadow="on"/"off"Shadow DOM を個別に強制/解除。
session-urlセッション名のリンク先テンプレ({id} 置換)。

詳細ページは <ma-session session="ses_00119"></ma-session>。JSON 自前描画は同じ ma-* class を使えば同じ CSS が効きます。

🧪
参照実装(そのままコピーできる実物): /demo/
配信テストのハブです。イベントを切り替えつつ、JSON 方式 / Web Component / データ同梱 / 2 方式の実測比較 / セッション詳細 / スポンサー一覧 / 参加者一覧をタブで確認できます。各ページのソースを見れば class の付け方がそのまま分かります。

15セッションのレイアウト(人数による可変表示)

従来の session_class(cont_col / cont_big …)を、2 階建てに置き換えました。

自動 人数で決まる組み分け

各カードに登壇者数・スポンサー数の class が自動で付きます。CSS だけで書け、カードごとの設定は不要。

手動 人数では決まらない演出

「大きく表示」「2列/3列」は、セッション編集の追加項目 layout_class で個別指定(§7)。値がそのまま class に。

<!-- 登壇者4名・スポンサー1社 -->
<li class="ma-session ma-session--normal ma-session--sp4 ma-session--spo1">
分類従来 class今回の対応
① ノーマル横3人(なし)既定。何もしない
② 人1・スポンサー1cont_col自動 .ma-session--sp1.ma-session--spo1 を CSS で狙う
③ 人1・その他1cont_col「その他」がスポンサーなら②と同じ
④ 大きく表示(横2人)cont_big手動 layout_class = cont_big
⑤ 2列横並びcont_ssn_col2手動 layout_class = cont_ssn_col2
⑥ 3列横並びcont_ssn_col3手動 layout_class = cont_ssn_col3

自動 class の名前は ma-session--sp1 等で、従来の cont_col とは別名です。既存 CSS を流用するなら次のどちらか。

/* 方法A(推奨・完全自動): 自動class を狙って cont_col 相当を当てる */
.ma-session--sp1.ma-session--spo1 .prg_att_cont.prg_speaker { width:32%; margin-right:1%; }
.ma-session--sp1.ma-session--spo1 .prg_att_cont.prg_sponsor { width:21%; }

方法B(手動): layout_class の選択肢に cont_col を足し、②③のセッションに設定 → カードに cont_col が付き既存 CSS がそのまま効きます。

16DOM・class リファレンス

既定テンプレートが出す構造。class 名と part 名は同じなので Shadow DOM でも ::part() で狙えます。

<section class="ma-day"><h2 class="ma-day-label">DAY1</h2>
  <div class="ma-slot">            // 並列 .ma-slot--parallel / 時刻非表示 .ma-slot--hide-time
    <div class="ma-slot-rail"><time class="ma-slot-time">13:30</time>
      <span class="ma-slot-track">Track 1</span></div>
    <ul class="ma-slot-body"><li class="ma-session ma-session--sp4 ma-session--spo1">
      <ul class="ma-speakers"><li class="ma-speaker ma-speaker--moderator" data-role="moderator">
        <span class="ma-speaker-role">Moderator</span>   // ラベルは氏名の上
        <span class="ma-speaker-name">…</span>…</li></ul></li></ul></div></section>
class(= part)意味
ma-day / ma-day-labelDAY と見出し
ma-slot / -rail / -time / -track枠(時刻・トラック名)
ma-slot--parallel / --hide-time並列 / 時刻非表示
ma-session / --sp{N} / --spo{N}セッションと人数クラス(§15)
ma-session-kind / -title / -summary種別・タイトル・概要
ma-speaker / --{role} / [data-role]登壇者と区分
ma-speaker-role / -name / -company / -position / -photo区分ラベル(上)・氏名・会社・役職・写真
ma-sponsors / ma-sponsor / ma-sponsor-logoセッションスポンサー

17スナップショット / STG の配信

アーカイブは ?snapshot=N を付けるだけ。版が URL に入り内容は変わらないので immutable で長期キャッシュできます。

fetch('/api/schedule?event=MA26&snapshot=3')
<script src="…/wc/schedule.js?event=MA26&snapshot=3"></script>

STG(確認用)は ?stage=staging&key=<配信キー>。キーは運用者から受け取ります。本番サイトには付けません。

fetch('/api/schedule?event=MA26&stage=staging&key=<配信キー>')