GenUI — 生成系 UI 出力仕様
言語: ユーザーの要求言語(それ以外の場合はユーザーのメッセージの言語)に合わせ、周囲の散文とすべてのユーザー表示UIテキスト(タイトル、ラベル、コンテンツ、オプション、説明)で統一します。以下の中国語の例はスキーマのみを示しています。このスキルをロードした後、会話を中国語に切り替えないでください。JSONキー、コンポーネントタイプ、ID、アクションは変更しないでください。英語のリクエストには英語の散文とUIテキスト、中国語のリクエストには中国語の散文とUIテキストを生成します。<user-language ...> トークンはメタプレースホルダーにすぎません。すべてを会話言語の実際のコンテンツに置き換え、これらのプレースホルダーをそのまま出力しないでください。
応答の途中にインタラクティブなUIコンポーネントを出力できます。言語タグ dsh-ui を持つフェンスブロック(fenced block)を記述し、その中にJSON仕様を含めます。レンダラーはこのブロック全体を実際のコンポーネントとして描画し、テキストは前後に通常通り配置されます。コンポーネントは応答の一部であり、ツール呼び出しではありません。
{"title":"<user-language text>","gap":14,"items":[...]}
フェンス記述の鉄則(最初に読んでください)
フェンスの開始行の言語タグは常に dsh-ui と記述し、句読点、引用符、コメントを追加しないでください。レンダラーは大文字小文字、前後の空白、および一部の末尾の句読点を許容します。他の言語タグはGenUIとして解釈されず、ユーザーには通常のコードブロックとして表示されます。
| 記述方法 | 結果 |
|---|---|
```dsh-ui | ✅ レンダリング |
```dsh-ui> | ✅ 許容してレンダリング(生成時は > を削除してください) |
```dsh-ui 行末に空白あり | ✅ レンダリング(自動トリム) |
``` DSH-UI | ✅ レンダリング(大文字小文字を無視) |
```dshui / ```ds-ui | ❌ 有効なタグではありません |
以前、同じモデルが同じセッション内で 182 個の ```dsh-ui> フェンスを記述し、サイレントに失敗しました。現在は、このような末尾の句読点を一律に許容するようになりました。フェンスを記述するときは、** dsh-ui の6文字のみ**を記述し、句読点、引用符、コメントは追加しないでください。終了は必ず単独行の ``` にしてください。
フェンスの位置:応答の本文にのみ記述してください。reasoning/思考ブロックに記述してもレンダリングされず、ユーザーは見ることができません。
数式:$...$ / \(...\) はインライン数式、$$...$$ / \[...\] は独立した数式です。行列、区分関数、複数行の整列した導出、および太字/ハイライト内の数式をサポートします。本文、リスト、キーと値、テーブルヘッダー/セル、カード/ステップ/タイムライン/タブのタイトル、問題と説明、ボタンとフォームラベル、指標、メディア説明、およびチャートの外側のタイトルでこの機能を共有します。JSON文字列内のバックスラッシュは二重にする必要があります(例:"content": "\(\\frac{a}{b}\)")。コードソース、入力値/プレースホルダー、ネイティブドロップダウンオプション、およびチャートエンジン内部の描画テキストは、それぞれのネイティブ形式に従い、リッチテキストは解析されません。数式構文はKaTeXに準拠し、HTML、外部リソース、またはスクリプトは実行しません。LaTeXドキュメントのコンパイルや任意のマクロパッケージのロードはサポートしていません。
コンポーネント語彙(許可される type のみ)
レイアウト:text row col grid card carousel divider spacer arrow hero
表示:stat badge progress list table keyvalue avatar image image-group audio video timeline file-tree breadcrumb diff json code callout steps icon blocks
チャート:chart(bars/line/donut、複数系列可能)plot(数学関数グラフ)echart(ECharts 全機能チャート)
インタラクション:button input select checkbox radio switch slider textarea tabs accordion copy link submit
高度:svg mermaid diagram scene3d quiz
レイアウト
- text:
{"type":"text","size":"display|h1|h2|h3|body|muted|caption","content":"...","align":"left|center|right"?}(tone:"danger|success|warning|info|muted"でテキスト行全体に意味に応じた色を付けます。badge を使う必要はありません。mono:trueは等幅フォントを使用します。16進数/2進数/識別子に使用し、インラインコードの背景色は付けません)(size:"display"は見出しより一段大きく、導入/冒頭の主張文に使用します。1つの応答に ≤1。center:trueは古い記述法でalign:"center"と同等です。新しい記述は常にalignを使用してください) - row / col:
{"type":"row"|"col","items":[...],"wrap":true?,"spacer":true?,"gap":n?}。row.justify:"center"は主軸を中央揃えにします(アイコン+タイトルのヘッダーなど)。col.width:n(1-100)はこの列に行幅の何%を割り当てるかを指定します。指定しない場合はコンテンツ幅になります。 - grid:
{"type":"grid","cols":n,"items":[...]} - carousel:
{"type":"carousel","title":"<user-language title>","items":[{"type":"card","title":"...","items":[...]}],"itemWidth":240?,"gap":3?}— ネイティブノードを水平スクロールで表示します。最大24項目、幅は80–640pxでトラック幅の85%を超えません。デフォルト幅は240px。gapの値に4pxを掛けたものが実際の間隔になります。省略時は12px、負の値は0として扱われます。ナビゲーションボタンは毎回トラック幅の85%をスクロールし、コンテンツがはみ出した場合のみ表示されます。タッチデバイスではトラックを直接スワイプします。自動再生はしません。トラックにフォーカスがあるときは左右キー / Home / End をサポートします。カード内のフォームは通常の送信ルールに従います。閲覧とスクロールではアクションは送信されません。子コンポーネント自身が宣言したアクションは、既存のインタラクションルールに従ってトリガーされます。ストリーミング出力では、既存の入力経路を保持するために、末尾にカードを追加するだけです。 - hero:
{"type":"hero","title":"<user-language title>","subtitle":"<user-language text>","value":"99.96%","label":"<user-language metric>","delta":"+0.02%","spark":[...],"tone":"accent|success|warning|danger"}— カバーブロック:アイブロウ + 超大数字(52px、カウントアップアニメーション付き)+ タイトル + サブタイトル + tone に応じたグラデーション背景色。1つの応答で最大1つ、先頭に視覚的なアンカーとして配置します。 - span: 任意のノードに
"span":2を追加できます(グリッド子ノードが占める列数)。これはベントーグリッドレイアウトの唯一のプリミティブです。span:2のワイドカードとナローカードを組み合わせると、1列にブロックを積み重ねるよりずっと見栄えが良くなります。 - card:
{"type":"card","title":"...","items":[...]}。"tone":"info|success|warning|danger"はカードに意味に応じた背景色を付けます(結論カード/リスクカードなど)。"accent":"#f59e0b"はアクセントカラーを指定します(枠線+タイトル+非常に薄い背景色)。"flat":trueは影を削除し、非常に薄いニュートラルな背景色に置き換えます。図の中のパネルは必ず flat を使用してください。そうしないと、すべてのレイヤーが浮き上がったカードのように見え、2層重なると見苦しくなります。"eyebrow":"<user-language 小見出し>"はタイトルの上にメタ情報の小文字を1行追加します(複数のカードを章に分けるときに使用します。連続した同じ章のカードにはすべて追加せず、1つの応答で ≤3 個にしてください)。 - palette:
chart/echartは両方とも"palette":["#ff8800","#3ecf8e"]をサポートし、カテゴリのカラーパレットを上書きします(デフォルトはホストテーマに従います)。意味的に色を指定する必要がある場合のみ記述してください(例:コスト=赤、利益=緑)。そうでない場合は、テーマに従う方が安定します。 - divider:
{"type":"divider"}。章名付き:{"type":"divider","label":"<user-language 章名>"}(線 + 中央に小さなラベル。レポートで要約からデータに移行するときや、チャート集で新しいセクションを開始するときなど、章の区切りに使用します。カード/リスト内部や、連続した同じテーマのコンテンツの間では使用しないでください。1つの応答で ≤3 個)。spacer:{"type":"spacer"}
表示
- stat:
{"type":"stat","label":"...","value":"...","delta":"+12.4%|-3%"}(-で始まると自動的に赤、+で緑になります)。オプションで"spark":[3,5,4,8,6]を追加してミニトレンドラインを描画できます(2–60個の有限値)。"size":"hero"は超大数字をレンダリングします(1つの応答で最大1回、視覚的なアンカーとして使用)。 - badge:
{"type":"badge","label":"...","tone":"success|warn|danger|accent","icon":"emoji?"} - progress:
{"type":"progress","label":"...","value":0-100,"valueLabel":"70%"}。"variant":"ring"はリング状のプログレスバーを描画します。"target":70はトラック上に目標目盛りをマークします。 - avatar:
{"type":"avatar","name":"...","color":"#hex?"} - image:
{"type":"image","src":"/mmx-files/result.png","alt":"<user-language description>"}— ブラウザからアクセス可能な http(s) または同一オリジンの相対画像URLを表示します。遅延ロード。file:/data:などのローカルまたは能動的なプロトコルはサポートしません。"caption":"<user-language 図の説明>"は画像の下に説明行を追加します(出典/解釈/クレジット。altは画像の上のラベル行であり、両者の役割は異なります)。 - image-group:
{"type":"image-group","title":"<user-language title>","items":[{"src":"/mmx-files/a.png","alt":"<description>","caption":"<caption>"},{"src":"/mmx-files/b.png","alt":"<description>"}]}— 最大24枚の画像をアスペクト比に応じて自動的に折り返して表示します。クリックするとネイティブのライトボックスで拡大表示され、左右キー / Home / End で画像を切り替え、Esc / 閉じるボタンでビューアを閉じてフォーカスを復元します。image と同じ http(s) / 相対アドレス制限に従います。file/data/javascript は受け付けません。ローカルブラウジングのみを行い、アクションは送信しません。モデルアクションが必要な場合は、別途独立した button を隣に配置してください。追加/並べ替えでは現在の src が保持されます。現在の画像が削除されるとビューアは閉じます。同じ src は出現順に区別されます。空のリストと画像読み込み失敗の両方に明確な状態があります。HTML にエクスポートする場合、画像バイトは埋め込まず、画像は元のURLに依存します。完全な使用方法と受け入れテスト。 - audio:
{"type":"audio","src":"/mmx-files/result.mp3","alt":"<user-language description>","loop":true?}— ネイティブコントロールバー。ユーザーが能動的に再生を開始します。自動再生はしません。http(s) または同一オリジンの相対アドレスのみ。 - video:
{"type":"video","src":"/mmx-files/result.mp4","alt":"<user-language description>","poster":"/mmx-files/poster.jpg"?,"loop":true?,"muted":true?,"aspectRatio":"16:9|4:3|1:1|9:16"?}— ネイティブの再生/音量/全画面コントロール。自動再生はしません。 - list:
{"type":"list","items":["..."] または [{"title":"...","desc":"..."}] またはネストされたノード(例:{"type":"badge","label":"TS"})}— インラインでノードを埋め込むことができます(ノード予算にカウントされます)。レコード内のlabel/nameはtitleに、description/content/text/body/detailはdescに統一されます。本文のみの場合は本文をタイトルとして使用します。不明なフィールドは警告が発行されます。 - table:
{"type":"table","columns":["..."],"rows":[["...","..."]],"types":["text|num|delta|bar|badge"]?,"details":[[...]]?,"total":true?}— ヘッダークリックでローカルソート(昇順/降順/リセット、ラウンドトリップなし)。数値認識:カンマ区切り(1,234)、k/m/b、万/億、%、通貨記号を実際の数値で比較できます。純粋な数値列は自動的に右揃えになります。符号付きセルは自動的に色付けされます(+12.4%は緑、-3は赤。追加フィールドは不要)。typesでは列ごとに以下を指定できます。bar(0-100のインラインプログレスバー)、ring(0-100の小さなリング)、spark(セルに"3,5,4,8"と記述してミニトレンドラインを描画)、badge(カプセルラベル)、delta(強制的に増減色を付ける)、num(強制的に右揃え)、index(行番号)、group(最初の列をグループ見出しとして扱います。その行の最初のセルにのみコンテンツがある場合、列をまたぐ小見出しとしてレンダリングされます)。"total":trueは合計行を追加します(数値列は自動的に合計されます)。"export":true:テーブルの上に「Markdown をコピー / CSV をコピー」の2つの小さなボタンが表示されます(純粋なローカルクリップボード、リクエストは送信しません)。"filter":"入力フィールドid":テーブルを input/select にバインドし、ユーザーの入力に応じて即座にフィルタリングします(filterColumnで列を制限できます)。データ量が多い場合は、デフォルトでこれを設定するべきです。"sortField":"ドロップダウンid"はドロップダウンの値(列名)を使用してソートします。detailsは rows と同じ順序で、i番目の項目はその行の展開後の内容です(任意のコンポーネントを配置できます。nullはその行が展開不可であることを意味します)。最初の列にシェブロンが表示され、クリックすると行の下に明細が展開されます。「メインテーブル + 明細」に適しています。 - keyvalue:
{"type":"keyvalue","pairs":[{"key":"...","value":"..."}]} - timeline:
{"type":"timeline","items":[{"title":"...","desc":"...","time":"..."}]} - file-tree:
{"type":"file-tree","items":[{"name":"...","type":"file|dir","children":[...]?}]}— ディレクトリ行はクリックで折りたたみ/展開が可能です(ローカル、ラウンドトリップなし)。 - breadcrumb:
{"type":"breadcrumb","items":["<user-language text>","<user-language text>","<user-language text>"]} - diff:
{"type":"diff","diffs":[{"path":"...","oldText":"..."|null,"newText":"..."}]} - json:
{"type":"json","value":...}(JSONツリービューア) - code:
{"type":"code","lang":"ts","code":"..."} - callout:
{"type":"callout","tone":"info|success|warning|error","title":"...","content":"..."}— 単一の強調、リマインダー、またはリスクの要約に使用します。contentはテキスト文字列で、JSONの"\n"を使用して行を分割できます。複数の独立した項目には、listの{title,desc}を使用して項目ごとの階層を保持します。 - steps:
{"type":"steps","current":n,"steps":[{"title":"...","desc":"..."}]} - arrow:
{"type":"arrow","dir":"down|right","length":16-96,"label":"..."}— 図内の2つのブロック間の細線コネクタです(1.4px線幅 + V字矢印、固定長)。上下フローチャートでは必ずこれを使用し、テキストの「↓」は使用しないでください。文字矢印はテキストベースラインに従い、間隔を適切に広げることができません。 - icon:
{"type":"icon","name":"Nodes","tone":"info|success|warning|danger|muted|default","size":16|20|24|32,"tile":true,"label":"<user-language アクセシブル名>"}— 内蔵アイコンセット(749個を忠実にレンダリング可能。64個はインラインで即座に表示され、残りは初回使用時にロードされます。完全なリストは ICON-NAMES.md を参照)。tile:trueは薄色の角丸四角い背景として描画されます。フェーズカード/セマンティックマーカーに使用します。tileなしの場合はテキスト色に従うインラインアイコンです。labelは省略可能です(純粋な装飾)。ペアで表示される場合は、1つだけに label を付けます。 - blocks:
{"type":"blocks","title":"...","rows":[{"label":"初期","cells":["0","1","2"],"color":"#64748b"}],"columns":n?,"caption":"..."}— 色付きブロック図:行ごとにグループ化されたセル。3つの形態が同じ構造で表現されます。① 階段図(行ごとにセル数が異なり、各行が独自に幅を等分します。例:8→4→2→1)② 等分割ブロック(1行4ブロック)③ スイムレーン図(columnsで列数を固定し、cellsに"—"または空文字を記述します)。colorを省略した場合はアクセントカラーの薄い背景が使用されます。テキストの色は明度に応じて自動的に反転します(暗い背景に白いテキスト/明るい背景に黒いテキスト)。「何かに分割する、段階的に進める、グループで比較する」構造がある場合はこれを使用し、手動で svg 座標を記述しないでください。captionは必須です:各セルが何を表すかを一文で説明します。- 行レベルの
"variant":"outline":細い枠線のみで塗りつぶしません。行列に使用します(各セルが枠になります)。"variant":"plain":枠線すら描画しません。ビット列に使用します(1 0 1 0 0 0 0 0はテーブルではなく数字として読まれます)。tone/colorを持つセルのみが背景色を取得します。 - セルはオブジェクトとして記述できます:
{"text":"1","tone":"danger","sub":"SF"}。tone(accent/success/warning/danger/muted)は個々のセルに意味に応じた色を付けます。subはセルの下に小さなテキスト行(ビット名、インデックス、ロール)を表示します。colorは16進数を明示的に指定でき、tone よりも優先されます。 - 例:
{"columns":8,"rows":[{"variant":"outline","cells":[{"text":"1","tone":"danger","sub":"SF"},"0","1","1","0","0","1","0","0"]}],"caption":"最上位ビットが1なので、SF=1です。"}
- 行レベルの
内蔵アイコン名:以下 64個はパッケージにインラインで含まれており、即座にレンダリングされます。優先的にこれらから選択してください:
Check CheckCircle Info InfoCircle Warning Error X Plus Minus Circle ArrowDown ArrowUp ArrowRight ArrowLeft ArrowCurvedRight Function Functions Operator Atom Nodes Connect Share Branch Grid GridAlt Stack Cube Storage Chart Trending Pulse Speed Timer Clock TableFilled Code SquareCode Terminal File FileCode Folder Link Paperclip Lightbulb Book BookOpen GraduationCap Flask Lab Brain Robot Sparkles ShieldCheck Lock Globe WebsiteNetwork Search MagnifyingGlassSearch PluginPuzzle Settings Bolt Compass
残りの 685個はオンデマンドでロードされます(初回使用時に約1MBを取得し、その後このページで全て使用可能になります)。完全なリストは、このSKILLと同じディレクトリにある ICON-NAMES.md にあります。名前を推測する必要がある場合は、それを読むかgrepしてください。会話内で列挙しないでください。
チャート
- chart:
{"type":"chart","kind":"bars|line|donut","data":[{"label":"...","value":n,"color":"#hex?"}],"series":[{"label":"...","data":[...]}]?,"horizontal":true?}— bars がデフォルト。line はトレンド。donut は構成比。series:bars はグループ化された棒グラフ、line は複数系列の折れ線グラフ。各series[].dataは[{"label":"Q1","value":30},{"label":"Q2","value":45}]のようなオブジェクトの配列を使用し、[30,45]のような数値配列は使用しません。****horizontal:trueは横向きの棒グラフを描画します(ランキング/長いラベルに最適)。stacked:trueは系列を積み上げます(構成/経時変化の比率)。積み上げセグメントが十分に高い場合、値はセグメント内に直接表示されます。任意の棒/セグメント/点/扇形にマウスオーバーすると、即座にツールチップが表示されます(積み上げの場合は、そのセグメントの値と合計が表示されます)。v3レンダリング:幅自動調整、Y軸の目盛り間隔は1/2/5、単一系列の負の値はゼロ線より下に実際に描画されます。line は面積グラデーションと X ラベルの間引きをサポートします。donut の凡例には値とパーセンテージが表示されます。≤8点の簡単な比較には chart を使用します。複数系列、ズーム/インタラクション、または大量のデータが必要な場合は echart を使用します。 - plot:
{"type":"plot","series":[{"expr":"a*sin(b*x)","label":"...","color":"#hex?","params":[{"name":"a","value":1,"min":0,"max":5,"animateTo":3,"durationMs":4000,"loop":true},{"name":"b","value":1,"min":0.5,"max":5}]}],"xMin":-6.28,"xMax":6.28,"title":"..."}— SVG関数グラフ。series は"kind":"line|area|scatter"を持つことができます(デフォルトは line。area はベースラインまで塗りつぶします。scatter は散布図)。params はリアルタイムスライダーとしてレンダリングされます(ドラッグすると即座に再描画されます。y軸はロック=曲線のみが変化し、軸は変わりません)。animateTo パラメータは再生ボタンを表示します(自動アニメーションデモ)。SVGはドラッグでパン、ホイールでズームが可能です。式は sin/cos/tan/asin/acos/atan/sqrt/cbrt/exp/log/ln/abs/floor/ceil/round/min/max/pow、定数 pi/e/tau、変数 x(他の文字はパラメータ)をサポートします。 - echart:
{"type":"echart","title":"...","height":300,"preset":"bar|line|area|pie|scatter","data":[{"label":"...","value":n}],"series":[...]?}— ECharts 全機能チャート、視覚効果はchartをはるかに上回ります(グラデーション、ツールチップ、アニメーション、凡例インタラクション)。preset モード:chartと同じdata/series形式を使用し、テーマに沿った ECharts の設定を自動構築します(色はホストテーマに従います)。preset 一覧(preset + data/series/links のみ記述、テーマは自動追従):bar·line·area·pie·scatter·radar(各 series が多角形、指標は最初の series の label を使用)·gauge(各 datum が1つのゲージ、単一KPIに最適)·funnel(ファネル/コンバージョン)·treemap(体積/階層構成比)·sankey(フロー、links:[{from,to,value}]を使用)·graph(関係図、linksで駆動、ノードサイズは接続数に応じて変化)·heatmap(seriesを行、最初の series の label を列として使用)·bigline(長い系列 + 内蔵ズーム)·wordCloud(ワードクラウド、data:[{label,value}]の value は重みを表します。色はpaletteまたはテーマのパレットに従います) full option モード:"option":{...}を渡して ECharts のネイティブ設定を直接記述します(ECharts 内蔵チャートおよび登録済みのwordCloudワードクラウド拡張をサポートします。他のサードパーティ拡張は保証されません)。option 内の関数はフィルタリングされます(データのみを受け付けます)。選択の指針:chart は軽量(追加ダウンロードなし)で、≤8点の簡単な比較に適しています。echart は視覚的により豊か(グラデーション、ツールチップ、凡例インタラクション、dataZoom)ですが、オンデマンドで約1MBのエンジンをダウンロードします。複数系列/大画面/インタラクティブなシナリオでは echart を優先します。
インタラクション
ローカルファースト(v2.6):UI自身で処理できる状態変化(採点、判定、リセット、展開、選択)は、すべてローカルで即座に完了します。モデルとのラウンドトリップはゼロです。action は、モデルが参加する必要がある場合(新しいコンテンツの生成、ツールの実行、次のステップの提案)にのみ使用します。インタラクションコンポーネントには action が必要です:action のないボタンは無効状態でレンダリングされ、ユーザーはクリックできません。action のあるボタンは、クリック後にローカルで「トリガーされました」というフィードバックを表示します。
- button:
{"type":"button","label":"...","tone":"primary|danger|success|ghost","full":true?,"small":true?,"icon":"emoji?","action":"refresh"?} - 秘密禁止令:パスワード、APIキー、アクセストークン、リカバリコードなどの秘密入力を要求または生成してはなりません。そのような要求があった場合は、直接拒否して説明を行ってください。
- input:
{"type":"input","label":"...","placeholder":"...","inputType":"text|email|color|number","value":"...","action":"name"?,"id":"field-id"?}—colorはブラウザのネイティブカラーピッカーを使用し、値は#RRGGBBを使用します。numberは Computed 数値入力として使用できます。action はフォーカスが外れたときおよび Enter キーが押されたときにトリガーされます(Enter の場合はsubmit:trueが含まれます)。blur は値が変更された場合のみ送信されます(フォーカスしてそのまま離れた場合、空のラウンドトリップは発生しません)。ペイロードには、モデルがフィールドを特定するのに役立つidが含まれます。idがある値はリフレッシュ後も保持され、submit によってfieldsに収集されます。 - select:
{"type":"select","label":"...","options":["...","..."],"selected":インデックス?,"action":"pick"?,"id":"field-id"?}—selectedは特定のオプションを事前選択します(省略した場合は「選択してください…」のプレースホルダーが表示され、最初の項目が暗黙的に選択されることはありません)。idがある選択はリフレッシュ後も保持され、submit のfieldsに含まれます。 - checkbox:
{"type":"checkbox","label":"<user-language option>","checked":true?,"action":"toggle"?,"group":"group-id"?}— デフォルトでは個別のaction動作を維持します。groupを追加すると複数選択集約モードになります。同じグループのチェックボックスは繰り返しチェック/チェック解除が可能で、変更はローカルでのみ記録され、個別の action は送信されません。兄弟要素のsubmitが、そのグループから選択されたラベルを文字列配列としてanswersに一度に送信します(例:{"styles":["<user-language option>","<user-language option>"]})。 - slider:
{"type":"slider","label":"...","min":0,"max":100,"step":1,"value":n?,"action":"name"?,"id":"field-id"?}— 数値フォームスライダー:現在値をリアルタイム表示します。idがある値はリフレッシュ後も保持され、submit のfieldsに含まれます(ドラッグはデバウンスされて1つのアクションに統合されます)。 - radio:
{"type":"radio","label":"<user-language label>","options":["<user-language option>","<user-language option>"],"selected":n?,"action":"pick"?}— 単一選択。"group":"group-id"を追加すると集約モードになります:選択はローカルでのみ記録され、ラウンドトリップは発生しません。"answer":正しいインデックスまたはラベルと"explanation":"<user-language explanation>"を設定できます。純粋なラジオボタンで、他に送信すべきフォーム状態がない場合、ローカルで採点します。 - link:
{"type":"link","label":"...","href":"https://..."?}— http(s)/mailto プロトコルのみ受け付けられます。hrefがない場合は、プレーンテキストスタイルでレンダリングされます(クリック可能なようには見えません)。 - submit:
{"type":"submit","label":"<user-language action>","action":"grade","groups":["q1","styles"],"resetAction":"redo"?}— 集約ボタン:groupsは現在のブロック内の submission member key を参照します。ソースはradio.group、checkbox.group、input.id、textarea.id、select.id、slider.idです。radio は選択済みである必要があります。checkbox グループは少なくとも1つ選択されている必要があります。通常のフィールドの値はトリム後に空であってはなりません。groupsは送信に必要なメンバーと完了の進捗を制御します。設定されていない場合、少なくとも1つの完了したメンバーがあれば送信できます。answerを含む純粋な radio グループで、今回のペイロードにグループ外のものが含まれていない場合は、ローカルで採点できます。それ以外の場合は、一度に[genui-action]を送信し、ペイロードは現在のブロックで入力されたフォームの状態を収集し続けます。フィールドは...