Skip to content

Modal

概要

モーダルコンポーネント。命令的 APIModal.show())と宣言的 API(JSX component)の 2 つの使い方をサポート。

レガシーの Bootstrap 5 スタイルモーダル(ModalClassic)は旧 API です。このページでは current API を案内します。

特徴説明
サイズxs, sm, md, lg, xl, cover, full の 7 段階
配置top(デフォルト), center, bottom
スクロールoutside(デフォルト), inside
アニメーションscale(デフォルト), none
キーボードEscape キーで閉じる(デフォルト有効)
外側クリックバックドロップクリックで閉じる(デフォルト有効)

デモ

使い方 — 命令的 API(Modal.show)

Modal.show() は Promise を返す。コンテンツコンポーネントには resolvehide が attrs に注入される。

tsx
import { Modal } from 'mithril-ui-kit';

const result = await Modal.show<boolean>({
  size: "md",
  placement: "center",
  content: {
    view(vnode) {
      return (
        <div>
          <Modal.Header>
            <Modal.Title>確認</Modal.Title>
            <Modal.CloseTrigger />
          </Modal.Header>
          <Modal.Body>
            <p>削除しますか?</p>
          </Modal.Body>
          <Modal.Footer>
            <button onclick={() => vnode.attrs.hide()}>キャンセル</button>
            <button onclick={() => vnode.attrs.resolve(true)}>OK</button>
          </Modal.Footer>
        </div>
      );
    }
  }
});

console.log(result); // true or false

使い方 — 宣言的 API(JSX Component)

tsx
import { Modal, Portal } from 'mithril-ui-kit';

let open = false;

// view 内で
<Modal.Root
  open={open}
  onOpenChange={(d) => { open = d.open; }}
  size="md"
  placement="center"
>
  <Modal.Trigger asChild>
    <button>開く</button>
  </Modal.Trigger>
  <Portal>
    <Modal.Backdrop />
    <Modal.Positioner>
      <Modal.Content>
        <Modal.Header>
          <Modal.Title>タイトル</Modal.Title>
          <Modal.CloseTrigger />
        </Modal.Header>
        <Modal.Body>コンテンツ</Modal.Body>
        <Modal.Footer>
          <button onclick={() => { open = false; }}>閉じる</button>
        </Modal.Footer>
      </Modal.Content>
    </Modal.Positioner>
  </Portal>
</Modal.Root>

Props

ModalShowOptions(命令的 API)

プロパティデフォルト説明
contentm.ComponentTypes<any>必須モーダル内に表示するコンポーネント
attrsRecord<string, any>{}content に渡す追加の attrs
sizeModalSize"md"サイズ
placementModalPlacement"top"配置
scrollBehaviorModalScrollBehavior"outside"スクロール動作
motionPresetModalMotionPreset"scale"アニメーション
closeOnEscapebooleantrueEscape キーで閉じるか
closeOnInteractOutsidebooleantrue外側クリックで閉じるか
role"dialog" | "alertdialog""dialog"ARIA role

ModalRootAttrs(宣言的 API)

プロパティデフォルト説明
openboolean-開閉状態(制御モード)
defaultOpenbooleanfalse初期表示状態(非制御モード)
onOpenChange(details) => void-開閉状態変更コールバック
sizeModalSize"md"サイズ
placementModalPlacement"top"配置
scrollBehaviorModalScrollBehavior"outside"スクロール動作
motionPresetModalMotionPreset"scale"アニメーション
closeOnEscapebooleantrueEscape キーで閉じるか
closeOnInteractOutsidebooleantrue外側クリックで閉じるか
role"dialog" | "alertdialog""dialog"ARIA role
preventScrollbooleantrue背後のスクロール防止

ModalContentInjectedAttrs(show() でコンテンツに注入される属性)

プロパティ説明
resolve(value)(value: T) => void値を返してモーダルを閉じる
hide()() => voidモーダルを閉じる(false を返す)

サブコンポーネント一覧

コンポーネント説明
Modal.Rootルートコンポーネント(宣言的 API 用)
Modal.Triggerモーダルを開くトリガー
Modal.Backdropバックドロップ(半透明背景)
Modal.Positionerポジショニングコンテナ
Modal.Contentモーダル本体
Modal.Headerヘッダー
Modal.Titleタイトル(h2)
Modal.Description説明文(p)
Modal.Bodyボディ
Modal.Footerフッター
Modal.CloseTrigger閉じるボタン(×)
Modal.ActionTriggerアクション+閉じるトリガー

サイズ一覧

サイズ
xs320px
sm400px
md500px
lg700px
xl900px
cover100vw - 2rem
full100vw(全画面)

Mithril UI Kit Documentation