本文へ移動
セクション
言語、現在は日本語
Rastrillo デザインシステム

ルート

レスポンスの一部ではなく、それ自体がレスポンス全体になる部品です。

どの例も実際に動きますが、リンクはどこにも移動しません。 HTML にはコピーできるマークアップがあります。

error-page

エラー応答の本体すべて。ステータス、正直な一文、戻る道、そして管理者が使える 500 の参照番号。

404:見つかりません

プレビュー
<div rst-error>
  <p rst-error-status>404</p>
  <h1 rst-error-title>そのページが見つかりません</h1>
  <p rst-error-body>リンクが古いか、ページが移動した可能性があります。アドレスを確認するか、最初のページに戻ってください。</p>
  <p rst-error-cta>
    <a rst-btn="primary" href="/">トップページ</a>
  </p>
</div>
{{template "error-page" dict "Status" 404 "HomeHref" "/"}}

403:アクセス権なし

プレビュー
<div rst-error>
  <p rst-error-status>403</p>
  <h1 rst-error-title>このページは表示できません</h1>
  <p rst-error-body>お使いのアカウントにはここへのアクセス権がありません。権限があるはずだとお考えの場合は、このサイトを運営している方にお問い合わせください。</p>
  <p rst-error-cta>
    <a rst-btn="primary" href="/">トップページ</a>
    <a rst-btn href="/posts">戻る</a>
  </p>
</div>
{{template "error-page" dict "Status" 403 "HomeHref" "/" "BackHref" "/posts"}}

422:処理できません

プレビュー
<div rst-error>
  <p rst-error-status>422</p>
  <h1 rst-error-title>送信できませんでした</h1>
  <p rst-error-body>送信された内容に正しくない箇所がありました。前に戻ってやり直してください。何も保存されていません。</p>
  <p rst-error-cta>
    <a rst-btn="primary" href="/">トップページ</a>
    <a rst-btn href="/posts/1/edit">戻る</a>
  </p>
</div>
{{template "error-page" dict
    "Status" 422
    "HomeHref" "/"
    "BackHref" "/posts/1/edit"}}

500:サーバーエラー

プレビュー
<div rst-error>
  <p rst-error-status>500</p>
  <h1 rst-error-title>こちら側で問題が発生しました</h1>
  <p rst-error-body>お客様のせいではありません。問題は記録されました。少し時間をおいてお試しください。繰り返し起きる場合は、下の参照番号をお知らせください。</p>
  <p rst-error-cta>
    <a rst-btn="primary" href="/">トップページ</a>
  </p>
  <p class="rst-mono" rst-error-ref dir="auto">参照番号: k3f9tq</p>
</div>
{{template "error-page" dict "Status" 500 "HomeHref" "/" "Ref" "k3f9tq"}}

参照番号が付くのは 500 だけです。運用担当者はそれでログを grep できます。

503:利用できません

プレビュー
<div rst-error>
  <p rst-error-status>503</p>
  <h1 rst-error-title>現在一時的にご利用いただけません</h1>
  <p rst-error-body>サイトを更新中か、混み合っています。一分ほどしてからお試しください。</p>
  <p rst-error-cta>
    <a rst-btn="primary" href="/">トップページ</a>
  </p>
</div>
{{template "error-page" dict "Status" 503 "HomeHref" "/"}}

それ以外すべて:汎用の組

プレビュー
<div rst-error>
  <p rst-error-status>418</p>
  <h1 rst-error-title>何か問題があります</h1>
  <p rst-error-body>そのリクエストは完了できませんでした。前に戻ってやり直してください。</p>
  <p rst-error-cta>
    <a rst-btn="primary" href="/">トップページ</a>
  </p>
</div>
{{template "error-page" dict "Status" 418 "HomeHref" "/"}}

五つの状態はフレームワークのカタログに文言があります。六つ目は、存在しないキーの名前を読者に見せる代わりに、汎用の組に落ちます。

back-nav

ひとつ上の階層に戻るリンクで、詳細画面や編集画面の上に置きます。

レコードに戻る

プレビュー
<nav rst-back-nav>
  <a href="/orders/1">← 注文 AB3PX</a>
</nav>
{{template "back-nav" dict "Href" "/orders/1" "Label" "注文 AB3PX"}}

locale-menu

言語スイッチャーです。/_locale へ送る一項目だけの POST フォームを details メニューに並べたもので、選択はロケールの Cookie に入り、読者は同じパスにとどまります。

12の言語。現在の言語が強調されます。

プレビュー
<details rst-dropdown rst-locale name="rst-menus">
  <summary>
    言語
    <span rst-caret aria-hidden="true">
      <svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m6 9 6 6 6-6"/></svg>
    </span>
  </summary>
  <div rst-dropdown-menu>
    <form method="post" action="/_locale">
      <input type="hidden" name="locale" value="en">
      <input type="hidden" name="return" value="/">
      <button type="submit" lang="en">English</button>
    </form>
    <form method="post" action="/_locale">
      <input type="hidden" name="locale" value="ga">
      <input type="hidden" name="return" value="/">
      <button type="submit" lang="ga">Gaeilge</button>
    </form>
    <form method="post" action="/_locale">
      <input type="hidden" name="locale" value="zh-Hans">
      <input type="hidden" name="return" value="/">
      <button type="submit" lang="zh-Hans">简体中文</button>
    </form>
    <form method="post" action="/_locale">
      <input type="hidden" name="locale" value="es">
      <input type="hidden" name="return" value="/">
      <button type="submit" lang="es">Español</button>
    </form>
    <form method="post" action="/_locale">
      <input type="hidden" name="locale" value="hi">
      <input type="hidden" name="return" value="/">
      <button type="submit" lang="hi">हिन्दी</button>
    </form>
    <form method="post" action="/_locale">
      <input type="hidden" name="locale" value="pt-PT">
      <input type="hidden" name="return" value="/">
      <button type="submit" lang="pt-PT">Português</button>
    </form>
    <form method="post" action="/_locale">
      <input type="hidden" name="locale" value="bn">
      <input type="hidden" name="return" value="/">
      <button type="submit" lang="bn">বাংলা</button>
    </form>
    <form method="post" action="/_locale">
      <input type="hidden" name="locale" value="ru">
      <input type="hidden" name="return" value="/">
      <button type="submit" lang="ru">Русский</button>
    </form>
    <form method="post" action="/_locale">
      <input type="hidden" name="locale" value="ja">
      <input type="hidden" name="return" value="/">
      <button type="submit" lang="ja" aria-current="true">日本語</button>
    </form>
    <form method="post" action="/_locale">
      <input type="hidden" name="locale" value="yue">
      <input type="hidden" name="return" value="/">
      <button type="submit" lang="yue">廣東話</button>
    </form>
    <form method="post" action="/_locale">
      <input type="hidden" name="locale" value="vi">
      <input type="hidden" name="return" value="/">
      <button type="submit" lang="vi">Tiếng Việt</button>
    </form>
    <form method="post" action="/_locale">
      <input type="hidden" name="locale" value="ar">
      <input type="hidden" name="return" value="/">
      <button type="submit" lang="ar">العربية</button>
    </form>
  </div>
</details>
{{template "locale-menu" dict "Items" .Locales "Return" "/"}}

これは /_locale へ POST するので、サーバーが必要です。Items は rastrillo.LocaleItems(r) から取ります。このページ自身のヘッダーにある切り替えは、リンクだけで作った版です。

scheme-menu

配色の切り替え: /_theme へ送る 1 項目の POST フォームを並べた details メニューで、「ライト」「ダーク」「システムに合わせる」の 3 つから選べます。選択は配色 cookie に入り、読者は同じページに留まります。

3 つの選択肢。現在はダークです。

プレビュー
<details rst-dropdown rst-scheme name="rst-menus">
  <summary>
    配色
    <span rst-caret aria-hidden="true">
      <svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m6 9 6 6 6-6"/></svg>
    </span>
  </summary>
  <div rst-dropdown-menu role="group" aria-label="配色">
    <form method="post" action="/_theme">
      <input type="hidden" name="scheme" value="light">
      <input type="hidden" name="return" value="/">
      <button type="submit">ライト</button>
    </form>
    <form method="post" action="/_theme">
      <input type="hidden" name="scheme" value="dark">
      <input type="hidden" name="return" value="/">
      <button type="submit" aria-current="true">ダーク</button>
    </form>
    <form method="post" action="/_theme">
      <input type="hidden" name="scheme" value="system">
      <input type="hidden" name="return" value="/">
      <button type="submit">システムに合わせる</button>
    </form>
  </div>
</details>
{{template "scheme-menu" dict "Scheme" "dark" "Return" "/"}}

これは /_theme へ POST するので、サーバーが必要です。Scheme は rastrillo.SchemeFrom(r) から取り、ui.ForRequest が運びます。このページ自身のバーにある切り替えはギャラリー独自のものです。

api-tokens

apitoken の PageData から作るトークンページです。一度だけの表示、作成フォーム、一覧、取り消しボタンがあります。

トークン 4 件、うち 2 件が有効

プレビュー
<div rst-tokens>
  <section rst-box>
    <form rst-form method="post" action="/tokens">
      <div rst-field>
        <label rst-field-label for="agent">エージェント名</label>
        <input rst-input type="text" id="agent" name="agent" maxlength="40">
      </div>
      <label rst-switch>
        <input type="checkbox" name="for_self" value="on">
        <span rst-switch-track aria-hidden="true"></span>
        このトークンはエージェントではなく、自分で使います
      </label>
      <fieldset rst-choice>
        <legend>アクセス</legend>
        <div rst-choice-cards>
          <label>
            <input type="radio" name="access" value="write" checked>
            <span>
              <span rst-choice-title>読み取りと書き込み</span>
            </span>
          </label>
          <label>
            <input type="radio" name="access" value="read">
            <span>
              <span rst-choice-title>読み取りのみ</span>
            </span>
          </label>
        </div>
      </fieldset>
      <div rst-field>
        <label rst-field-label for="expiry">有効期限</label>
        <select rst-input="short" id="expiry" name="expiry">
          <option value="30">30 日</option>
          <option value="90" selected>90 日</option>
          <option value="365">1 年</option>
          <option value="never">期限なし</option>
        </select>
      </div>
      <div rst-form-foot>
        <button rst-btn="primary lg" type="submit">トークンを作成</button>
      </div>
    </form>
  </section>
  <div rst-card rst-tokens-list>
    <div rst-lrow="head">
      <span>トークン</span>
      <span class="rst-m-hide">アクセス</span>
      <span class="rst-m-hide">作成日</span>
      <span class="rst-m-hide">最終使用</span>
      <span class="rst-m-hide">有効期限</span>
      <span></span>
      <span></span>
    </div>
    <div rst-lrow>
      <span class="rst-nm"><span rst-actor>Claude(Grace Hopper の代理)</span>
        <small>
          <code>k3Jx9QpL2mWa</code>
        </small>
      </span>
      <span rst-tokens-fact><span rst-tokens-fact-label>アクセス</span>読み取りと書き込み</span>
      <span rst-tokens-fact><span rst-tokens-fact-label>作成日</span><time datetime="2026-08-02">2026-08-02</time></span>
      <span rst-tokens-fact><span rst-tokens-fact-label>最終使用</span><time datetime="2026-08-11">2026-08-11</time></span>
      <span rst-tokens-fact><span rst-tokens-fact-label>有効期限</span><time datetime="2026-10-31">2026-10-31</time></span>
      <span rst-tokens-state></span>
      <details rst-row-menu name="rst-menus">
        <summary aria-label="Claude(Grace Hopper の代理) の操作">
          <svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="1"/><circle cx="12" cy="5" r="1"/><circle cx="12" cy="19" r="1"/></svg>
        </summary>
        <div rst-row-menu-panel>
          <form method="post" action="/tokens/revoke">
            <input type="hidden" name="id" value="k3Jx9QpL2mWa">
            <button type="submit">取り消す</button>
          </form>
        </div>
      </details>
    </div>
    <div rst-lrow>
      <span class="rst-nm"><span rst-actor>Grace Hopper</span>
        <small>
          <code>Qm2vR8sT4xYb</code>
        </small>
      </span>
      <span rst-tokens-fact><span rst-tokens-fact-label>アクセス</span>読み取りのみ</span>
      <span rst-tokens-fact><span rst-tokens-fact-label>作成日</span><time datetime="2026-08-02">2026-08-02</time></span>
      <span rst-tokens-fact><span rst-tokens-fact-label>最終使用</span></span>
      <span rst-tokens-fact><span rst-tokens-fact-label>有効期限</span>期限なし</span>
      <span rst-tokens-state></span>
      <details rst-row-menu name="rst-menus">
        <summary aria-label="Grace Hopper の操作">
          <svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="1"/><circle cx="12" cy="5" r="1"/><circle cx="12" cy="19" r="1"/></svg>
        </summary>
        <div rst-row-menu-panel>
          <form method="post" action="/tokens/revoke">
            <input type="hidden" name="id" value="Qm2vR8sT4xYb">
            <button type="submit">取り消す</button>
          </form>
        </div>
      </details>
    </div>
    <div rst-lrow>
      <span class="rst-nm"><span rst-actor>Codex(Grace Hopper の代理)</span>
        <small>
          <code>Zp7wN1cH6kLd</code>
        </small>
      </span>
      <span rst-tokens-fact><span rst-tokens-fact-label>アクセス</span>読み取りと書き込み</span>
      <span rst-tokens-fact><span rst-tokens-fact-label>作成日</span><time datetime="2026-08-02">2026-08-02</time></span>
      <span rst-tokens-fact><span rst-tokens-fact-label>最終使用</span></span>
      <span rst-tokens-fact><span rst-tokens-fact-label>有効期限</span>期限なし</span>
      <span rst-tokens-state><span rst-status rst-tone="neutral">取り消し済み</span></span>
    </div>
    <div rst-lrow>
      <span class="rst-nm"><span rst-actor>Nightly import(Grace Hopper の代理)</span>
        <small>
          <code>Vb4tG9yK3nMe</code>
        </small>
      </span>
      <span rst-tokens-fact><span rst-tokens-fact-label>アクセス</span>読み取りのみ</span>
      <span rst-tokens-fact><span rst-tokens-fact-label>作成日</span><time datetime="2026-08-02">2026-08-02</time></span>
      <span rst-tokens-fact><span rst-tokens-fact-label>最終使用</span></span>
      <span rst-tokens-fact><span rst-tokens-fact-label>有効期限</span><time datetime="2026-08-11">2026-08-11</time></span>
      <span rst-tokens-state><span rst-status rst-tone="warning">期限切れ</span></span>
    </div>
  </div>
  <div rst-tokens-revoke>
    <form method="post" action="/tokens/revoke-agent">
      <input type="hidden" name="agent" value="Claude">
      <button rst-btn type="submit">このエージェントのトークンをすべて取り消す: Claude</button>
    </form>
    <form method="post" action="/tokens/revoke-all">
      <button rst-btn="danger" type="submit">すべてのトークンを取り消す</button>
    </form>
  </div>
</div>
{{template "api-tokens" dict "Page" .Page "Path" "/tokens"}}

Handlers が Render に渡すものを Page として、ページ自身のパスを Path として渡します。取り消しフォームは Path/revoke、Path/revoke-agent、Path/revoke-all に送信します。どれかを変えるには RevokePath、RevokeAgentPath、RevokeAllPath を設定します。

作成直後: シークレットを一度だけ表示

プレビュー
<div rst-tokens>
  <div rst-callout rst-tone="positive" tabindex="-1" autofocus>
    <span rst-callout-ic aria-hidden="true">
      <svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="10"/><path d="m9 12 2 2 4-4"/></svg>
    </span>
    <div rst-callout-body>
      <strong>このトークンを今すぐコピーしてください。二度と表示されません。</strong>
      <p>
        <code rst-tokens-secret>harbour_k3Jx9QpL2mWa_6bD2qK9xWz4rT8vN1mP3sL7yF5hJ0cG2aE4uB</code>
      </p>
    </div>
  </div>
  <section rst-box>
    <form rst-form method="post" action="/tokens">
      <div rst-field>
        <label rst-field-label for="agent">エージェント名</label>
        <input rst-input type="text" id="agent" name="agent" maxlength="40">
      </div>
      <label rst-switch>
        <input type="checkbox" name="for_self" value="on">
        <span rst-switch-track aria-hidden="true"></span>
        このトークンはエージェントではなく、自分で使います
      </label>
      <fieldset rst-choice>
        <legend>アクセス</legend>
        <div rst-choice-cards>
          <label>
            <input type="radio" name="access" value="write" checked>
            <span>
              <span rst-choice-title>読み取りと書き込み</span>
            </span>
          </label>
          <label>
            <input type="radio" name="access" value="read">
            <span>
              <span rst-choice-title>読み取りのみ</span>
            </span>
          </label>
        </div>
      </fieldset>
      <div rst-field>
        <label rst-field-label for="expiry">有効期限</label>
        <select rst-input="short" id="expiry" name="expiry">
          <option value="30">30 日</option>
          <option value="90" selected>90 日</option>
          <option value="365">1 年</option>
          <option value="never">期限なし</option>
        </select>
      </div>
      <div rst-form-foot>
        <button rst-btn="primary lg" type="submit">トークンを作成</button>
      </div>
    </form>
  </section>
  <div rst-card rst-tokens-list>
    <div rst-lrow="head">
      <span>トークン</span>
      <span class="rst-m-hide">アクセス</span>
      <span class="rst-m-hide">作成日</span>
      <span class="rst-m-hide">最終使用</span>
      <span class="rst-m-hide">有効期限</span>
      <span></span>
      <span></span>
    </div>
    <div rst-lrow>
      <span class="rst-nm"><span rst-actor>Claude(Grace Hopper の代理)</span>
        <small>
          <code>k3Jx9QpL2mWa</code>
        </small>
      </span>
      <span rst-tokens-fact><span rst-tokens-fact-label>アクセス</span>読み取りと書き込み</span>
      <span rst-tokens-fact><span rst-tokens-fact-label>作成日</span><time datetime="2026-08-02">2026-08-02</time></span>
      <span rst-tokens-fact><span rst-tokens-fact-label>最終使用</span><time datetime="2026-08-11">2026-08-11</time></span>
      <span rst-tokens-fact><span rst-tokens-fact-label>有効期限</span><time datetime="2026-10-31">2026-10-31</time></span>
      <span rst-tokens-state></span>
      <details rst-row-menu name="rst-menus">
        <summary aria-label="Claude(Grace Hopper の代理) の操作">
          <svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="1"/><circle cx="12" cy="5" r="1"/><circle cx="12" cy="19" r="1"/></svg>
        </summary>
        <div rst-row-menu-panel>
          <form method="post" action="/tokens/revoke">
            <input type="hidden" name="id" value="k3Jx9QpL2mWa">
            <button type="submit">取り消す</button>
          </form>
        </div>
      </details>
    </div>
    <div rst-lrow>
      <span class="rst-nm"><span rst-actor>Grace Hopper</span>
        <small>
          <code>Qm2vR8sT4xYb</code>
        </small>
      </span>
      <span rst-tokens-fact><span rst-tokens-fact-label>アクセス</span>読み取りのみ</span>
      <span rst-tokens-fact><span rst-tokens-fact-label>作成日</span><time datetime="2026-08-02">2026-08-02</time></span>
      <span rst-tokens-fact><span rst-tokens-fact-label>最終使用</span></span>
      <span rst-tokens-fact><span rst-tokens-fact-label>有効期限</span>期限なし</span>
      <span rst-tokens-state></span>
      <details rst-row-menu name="rst-menus">
        <summary aria-label="Grace Hopper の操作">
          <svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="1"/><circle cx="12" cy="5" r="1"/><circle cx="12" cy="19" r="1"/></svg>
        </summary>
        <div rst-row-menu-panel>
          <form method="post" action="/tokens/revoke">
            <input type="hidden" name="id" value="Qm2vR8sT4xYb">
            <button type="submit">取り消す</button>
          </form>
        </div>
      </details>
    </div>
    <div rst-lrow>
      <span class="rst-nm"><span rst-actor>Codex(Grace Hopper の代理)</span>
        <small>
          <code>Zp7wN1cH6kLd</code>
        </small>
      </span>
      <span rst-tokens-fact><span rst-tokens-fact-label>アクセス</span>読み取りと書き込み</span>
      <span rst-tokens-fact><span rst-tokens-fact-label>作成日</span><time datetime="2026-08-02">2026-08-02</time></span>
      <span rst-tokens-fact><span rst-tokens-fact-label>最終使用</span></span>
      <span rst-tokens-fact><span rst-tokens-fact-label>有効期限</span>期限なし</span>
      <span rst-tokens-state><span rst-status rst-tone="neutral">取り消し済み</span></span>
    </div>
    <div rst-lrow>
      <span class="rst-nm"><span rst-actor>Nightly import(Grace Hopper の代理)</span>
        <small>
          <code>Vb4tG9yK3nMe</code>
        </small>
      </span>
      <span rst-tokens-fact><span rst-tokens-fact-label>アクセス</span>読み取りのみ</span>
      <span rst-tokens-fact><span rst-tokens-fact-label>作成日</span><time datetime="2026-08-02">2026-08-02</time></span>
      <span rst-tokens-fact><span rst-tokens-fact-label>最終使用</span></span>
      <span rst-tokens-fact><span rst-tokens-fact-label>有効期限</span><time datetime="2026-08-11">2026-08-11</time></span>
      <span rst-tokens-state><span rst-status rst-tone="warning">期限切れ</span></span>
    </div>
  </div>
  <div rst-tokens-revoke>
    <form method="post" action="/tokens/revoke-agent">
      <input type="hidden" name="agent" value="Claude">
      <button rst-btn type="submit">このエージェントのトークンをすべて取り消す: Claude</button>
    </form>
    <form method="post" action="/tokens/revoke-all">
      <button rst-btn="danger" type="submit">すべてのトークンを取り消す</button>
    </form>
  </div>
</div>
{{template "api-tokens" dict "Page" .Page "Path" "/tokens"}}

作成フォームへの応答は Created を設定して描画し、リダイレクトしないでください。シークレットはその応答の中にしかありません。

トークンはまだありません

プレビュー
<div rst-tokens>
  <section rst-box>
    <form rst-form method="post" action="/tokens">
      <div rst-field>
        <label rst-field-label for="agent">エージェント名</label>
        <input rst-input type="text" id="agent" name="agent" maxlength="40">
      </div>
      <label rst-switch>
        <input type="checkbox" name="for_self" value="on">
        <span rst-switch-track aria-hidden="true"></span>
        このトークンはエージェントではなく、自分で使います
      </label>
      <fieldset rst-choice>
        <legend>アクセス</legend>
        <div rst-choice-cards>
          <label>
            <input type="radio" name="access" value="write" checked>
            <span>
              <span rst-choice-title>読み取りと書き込み</span>
            </span>
          </label>
          <label>
            <input type="radio" name="access" value="read">
            <span>
              <span rst-choice-title>読み取りのみ</span>
            </span>
          </label>
        </div>
      </fieldset>
      <div rst-field>
        <label rst-field-label for="expiry">有効期限</label>
        <select rst-input="short" id="expiry" name="expiry">
          <option value="30">30 日</option>
          <option value="90" selected>90 日</option>
          <option value="365">1 年</option>
          <option value="never">期限なし</option>
        </select>
      </div>
      <div rst-form-foot>
        <button rst-btn="primary lg" type="submit">トークンを作成</button>
      </div>
    </form>
  </section>
  <div rst-empty>
    <p rst-empty-body>トークンはまだありません。</p>
  </div>
</div>
{{template "api-tokens" dict "Page" .Page "Path" "/tokens"}}