Calendar

月・週・年の表示を切り替えて、日付と予定を確認します。

月の予定と週番号

日曜始まりの月

週の時間割

0〜24時をスクロールでき、開くと現在時刻を表示します。重なる予定・終日・早朝と夜の予定を含みます。

9月21日〜27日第39週

21
22
27

日

9月24日

稼働日

9月21日〜25日

21
22

3日

9月24日〜26日

日曜始まりの週

9月20日〜26日第39週

20
21
22

短い予定と長い題名

9月14日〜20日

稼働時間を指定した週

9〜18時の外を淡く塗り、今日を含まない週は稼働時間の始まりを表示します。

9月14日〜20日の営業時間

予定のない週

9月7日〜13日

7
8
9
10
11
12
13

週の選択

9月14日〜20日から選ぶ

期間の選択

9月21日〜27日から期間を選ぶ

平日から選ぶ

週末と前後の月を空き(null)にした月です。↑↓は空きをまたいでも同じ曜日の前後の週へ移ります。

2026年9月の平日から選ぶ

2026年9月の平日から選ぶ
月火水木金土日

年の俯瞰

2026年

時刻順の予定

月をまたぐ一覧

予定がない期間

予定のない週

この期間に予定はありません

予定を押して詳細を開く

詳細を持つ予定

21
22
24
25
26
27

使いどころ

  • 予定を月・週・年・日付順の一覧で見渡し、期間を行き来する時に使います。
  • フォームの欄で日付や期間を一つ選ぶ時は DatePicker、開始と終了の日時を並べて見せる時は DateTimeRange を使います。
  • 出来事を時系列で読む記録は Timeline を使います。

使い方

weeks に一行一週の日付(CalendarDay)を渡します。月の計算・予定の取得・休日の判断は利用側で行い、Calendarは渡された日付と予定を描きます。weekStart で月曜・日曜始まりを選び、weeks の各行も同じ曜日から並べます。weekNumbers を渡すと、月の各行と週の見出しにISO週番号を出します。

previous・today・next は見出しの隣にリンクで、views は表示形式を切り替える FilterBar のセグメントで置きます。どれもリンクなので、期間や形式を変えた表示は利用側がリンク先で描き直します。actions は見出しの行の終わりに置く操作です。期間の見出しは Section の見出しと同じ15pxの赤の通常の太さの文字です。

月(view="month")は表の各日に予定を一行ずつ並べます。外枠を持たずに日の間の暖かい灰色の細い線で区切り、日付は各日の末尾側の上に灰色の数字で書きます。今日はセル全体を黄色で塗り、日付を「今日 21」と濃い灰色の太字で書きます。月の初日には、Basecamp 2の「November 1」と同じく、日付の数字の前に同じ灰色の通常の太さで月の名前を続けます(「10月 1」)。outside の日は面を塗らず、日付の数字を淡い灰色にします。画面の幅が40rem以下では、日付の下に予定の有無を示す青い点だけを置き、表の下に「この月の予定」の一覧を出します。

週(view="week")は weeks の先頭の一行を、0〜24時の時間割で描きます。行の日数で列数が決まり、1日なら日、5日なら稼働日の表示です。時間割は --rx-calendar-scroll-size(既定は min(40rem, 75dvh))の高さでスクロールし、見出しと終日の行を上に固定します。hours の外側はわずかに塗ります。今日の列は見出しを黄色で塗り、時間割にごく淡い黄色を敷きます。

now を渡すと、今日(current の日)の列に現在時刻を赤茶の破線で引いて時刻を同じ色の太字で書き、開いた時にその1時間前から表示します。今日を含まない週は、稼働時間の始まりの1時間前から表示します。開いた位置はCSSの scroll-initial-target で決まり、対応しないブラウザでは CalendarScrollController を calendar-scroll として登録すると同じ位置へスクロールします。

予定(CalendarEvent)は、start が無ければ終日、end が無いか開始以前なら開始から1時間です。Calendarが終日を先に、時刻のある予定を開始の早い順に並べ替え、時間の重なる予定は横に並べます。月の日と一覧の予定は、日付の数字より一段大きい12pxの文字で、面を塗らずに accent の色(既定は青)の小さな点と題名を、淡い灰色の時刻と一緒に一行で書きます。ホバーすると題名に下線を引きます。終日の予定は accent の色で塗った高さ16pxのピルの形の帯に、白い太字で書きます。週の時間割の予定は、accent の淡い色の面に先頭側の縁を accent の色の線にし、題名を太字で先に、時刻を後に書きます。tentative の予定は塗らずに破線で囲みます。今日より前の日の予定と、今日のうち now までに終わった予定は文字と面を淡くします。

年(view="year")は months の日付を月をまたいで一続きに並べ、月の始まりの日は先頭側の縁の線を濃くし、月の名前を赤の小さな太字で置きます。週末は淡い灰色、予定のある日は淡い青の面にして末尾側の下に青緑の点を付け、今日は黄色で塗ります。CalendarMonth の href を渡すと、月の名前が月表示へのリンクになります。

一覧(view="agenda")は weeks のうち予定のある日だけを、日付ごとに月・週と同じ予定の行で並べ、日付を先頭側の列に置き、今日の日付は黄色のハイライトで塗ります。月が変わる所には赤の月の名前と罫線を置きます。表示する日付や予定が無い時は、どの形式でも emptyLabel を表示します。

予定に details(id と内容)を渡すと、予定は押すと詳細のパネルを開くボタンになります。パネルは Popover と同じで、題名・時刻・内容と、href があれば「詳しく見る」のリンクを置きます。PopoverController を popover として登録します。

selection を渡すと(月と週だけ)、日付がボタンになり、CalendarController を calendar として登録すると一日(single)か期間(range)を選べます。選んだ日(期間の両端)はチェックボックスの選んだ状態と同じ淡い青の縦の塗りに紺の縁と紺の数字、期間の間の日は淡い青(#ddeefe)の面にします。選んだ値は calendar:change で受け取り、送信や保存は利用側で行います。Calendarはフォームの入力欄を持たず、選択中は日の href を使いません。日付は重複させず、日付の順に並べます(そうでない時、controllerは動作しません)。

JavaScriptが無い時も、期間の移動と表示形式の切り替えはリンクとして動作し、時間割の初期表示位置はCSSで決めます。日付の選択には CalendarController が必要です。

キーボード

Calendarのキーボード操作
キー動作
Tab選べる日付のうち、選んでいる日(無ければ最初の選べる日)にだけフォーカスが止まります。
← / →selection の時、前・後の選べる日へフォーカスを移します。選べない日は飛ばします。右から左に読む画面では向きが逆になります。
↑ / ↓selection の時、7日前・後の同じ曜日へフォーカスを移します。並びの空き(null)をまたいでも日付で数えます。その日が表示の外か、選べない時は動きません。
Enter / Spaceフォーカスした日を選びます。
Escape開いている予定の詳細のパネルを閉じます。

アクセシビリティ

  • Calendar全体は role="region" で、label を名前と見出し(h2)にします。期間の移動は「表示期間」という名前の nav に置き、矢印だけのボタンは label を読み上げ名にします。
  • 月は caption と曜日の列見出しを持つ表で、週番号は行の見出しです。表と時間割は tabindex="0" のスクロール領域に置きます。
  • 今日には aria-current="date" を付けます。曜日と月のラベルは読み上げから外すので、日の label に「9月15日(火)」のように読む名前を渡します。
  • 選べる日付は aria-pressed で選んでいるかを伝えます。
  • 予定は日ごとに「(日の名前)の予定」という名前の一覧にします。年表示では、日付の読み上げに予定の件数と題名を含めます。現在時刻の線は「現在時刻 10:30」のように読みます。
  • 詳細を持つ予定のボタンは aria-haspopup="dialog" でパネルを開くことを示し、パネルは role="dialog" で予定の題名を名前にし、開くと題名にフォーカスを移します。
  • accent の色は区別の補助です。分類の意味は予定の題名などの文言で伝えます。

イベント

Calendarが発火するイベント
イベント内容
calendar:beforechange取り消せます。日を選ぶ前に発火し、preventDefault() すると選択を変えません。detail は calendar:change と同じです。
calendar:change日を選んだ時に発火します。single の detail は { value, previousValue, reason }、range は { start, end, previousStart, previousEnd, reason } です。日付は YYYY-MM-DD、未定は空文字、reason は pointer か keyboard です。

API

Calendar

Calendarのprops
名前型既定値説明
label必須string表示している期間の名前(「2026年9月」など)。上の見出しに書き、Calendar全体の読み上げ名にもする。
hours{ start: number; end: number; }{ start: 8, end: 20 }時間割の稼働時間(時)。外側を淡く塗り、今日が含まれない時は開始時刻へスクロールする。
nowstringcurrentの日に引く現在時刻(HH:MM)。時間割は開いた時にこの時刻を表示する。
weekStartWeekStart"monday"週の開始曜日。weeksの各行もこの曜日から並べる。
weekNumbersbooleanfalse月の各行と週の見出しにISO週番号を表示する。
previousCalendarPeriodLink前の期間へのリンク。矢印だけのボタンにする。
nextCalendarPeriodLink次の期間へのリンク。矢印だけのボタンにする。
todayCalendarPeriodLink今日を含む期間へのリンク。前後の矢印の間に文字のボタンで置く。
viewsreadonly FilterBarItem[]表示形式(月・週・年・一覧など)の切り替え。FilterBarのセグメントで置く。今の形式の項目にはcurrentを渡す。
actionsChild見出しの行の終わりに置く操作(「予定を追加」など)。
emptyLabelstring"この期間に予定はありません"表示する日付や予定が無い時に書く文。
view形による"month" | "week" | "year" | "agenda""month"weekは先頭の一行を時間割で表示する。1日なら日、5日なら稼働日の表示になる。
weeks形によるreadonly (readonly (CalendarDay | null)[])[]表示する日付。一行が一週で、weekStartの曜日から並べる。月の前後の空きはnullか、outsideの日で埋める。 agendaでは予定のある日だけを日付の順に並べる。
selectionCalendarSelection日付を押して選べるようにする。日付はボタンになり、CalendarControllerをcalendarとして登録する。選んだ値はcalendar:changeで受け取る。
months形によるreadonly CalendarMonth[]年表示の月。日付を月をまたいで一続きに並べ、月の始まりに月の名前を置く。

ほかに、<div>へ標準のHTML属性を渡せます。

登録するcontroller:calendar(CalendarController)、popover(PopoverController)、calendar-scroll(CalendarScrollController)

読み込むCSS:layers.css、reset.css、tokens.css、base.css、layout.css、components/button.css、components/overlay.css、components/filter-bar.css、components/icon.css、components/calendar.css

hoursの項目

hoursの項目
名前型既定値説明
start必須number稼働の始まりの時(0〜24)。
end必須number稼働の終わりの時(0〜24)。

WeekStart

値:"monday" | "sunday"

CalendarPeriodLink

CalendarPeriodLink
名前型既定値説明
label必須string操作の名前。今日への移動は文字で書き、前後への移動は矢印の読み上げ名とtitleにする。
href必須string移動先のURL。期間を変えた表示は利用側がこのURLで返す。

FilterBarItem

FilterBarの一件。Navigationの項目と同じ形で、currentは選んでいる条件を示す。

FilterBarItem
名前型既定値説明
label必須string項目の名前。
href必須string移動先のURL。現在地の項目もリンクのまま出す。
currentboolean今いる項目。aria-current="page"を付け、見た目でも現在地として示す。
countnumber名前の後に出す件数。0も表示し、省略すると出さない。
iconChild名前の前のアイコン(Iconなど)。

CalendarDay

CalendarDay
名前型既定値説明
day必須number表示する日の数字。
date必須string日付(YYYY-MM-DD)。time要素のdatetime、選択の値、曜日と週番号の計算に使う。
labelstring日付の読み上げ名(「9月15日(火)」など)。省略するとdateを読む。
hrefstring日のページ。selectionが無い時、日付の数字をこのリンクにする。
currentboolean今日。黄色のハイライトで塗り、aria-current="date"を付ける。現在時刻の線と、過去の予定を淡くする基準にもなる。
disabledboolean選べない日。リンクにせず、選択のボタンを無効にする。
outsideboolean表示している月の外の日(前後の月の端)。淡く書き、一覧・年表示・狭い幅の月の下の予定一覧には出さない。
eventsreadonly CalendarEvent[]その日の予定。並べ替えはCalendarが行う(終日を先に、時刻のある予定は開始の早い順)。

CalendarSelection

CalendarSelection(mode: "single")
名前型既定値説明
mode必須"single"一日を選ぶ。
valuestring選んでいる日(YYYY-MM-DD)。
CalendarSelection(mode: "range")
名前型既定値説明
mode必須"range"開始と終了の二日で期間を選ぶ。開始の無い時に押した日が開始、開始以降の日を押すと終了になる。開始より前の日を押すか、終了まで決まった後に押すと、その日から選び直す。
startstring期間の開始日(YYYY-MM-DD)。
endstring期間の終了日(YYYY-MM-DD)。start以降の日にする。

CalendarMonth

CalendarMonth
名前型既定値説明
label必須string月の名前(「9月」など)。年表示の月の始まりに置く。
hrefstring月表示へのリンク。渡すと月の名前をリンクにする。月の初日は、日付のリンクの代わりにこのリンクを置く。
weeks必須readonly (readonly (CalendarDay | null)[])[]その月の日付。Calendarのweeksと同じ形で、outsideの日は年表示に出さない。

CalendarEvent

CalendarEvent
名前型既定値説明
label必須string予定の題名。太字で書き、長い時は一行で省略する。
hrefstring予定のページ。detailsを渡す時は省略でき、予定は詳細のパネルを開くボタンになる。
details{ id: string; content: Child; }予定を押すとPopoverと同じパネルで開く、予定の詳細(場所・参加者・メモなど)。idはパネルのidで、画面の中で一意にする。開閉と位置決めはPopoverと同じ(PopoverControllerをpopoverとして登録する)。
startstring開始時刻(HH:MM)。省略すると終日の予定。
endstring終了時刻(HH:MM)。省略すると開始から1時間。
accentAccent分類の色。月の日と一覧では点と題名の色、終日は帯の塗り、時間割では淡い面と先頭側の線の色にする。省略すると青。
tentativeboolean仮の予定。塗らずに破線の縁で囲み、まだ確定していないことを示す。

CalendarEvent.detailsの項目

CalendarEvent.detailsの項目
名前型既定値説明
id必須string詳細のパネルのid。予定のボタンのpopovertargetが指すので、画面の中で一意にする。
content必須Childパネルに書く中身(場所・参加者・メモなど)。

Accent

値:"blue" | "green" | "amber" | "coral"

コード

HTML
Hono JSX