Calendar

纯事件展示日历,对齐 Semi Design Calendar。四视图 mode=day/week/month/range:day 单日时间轴(左时间列 + 单日列,25×2 半小时可点击格 + 绝对定位事件);week 星期表头 + 7 列 DayCol,跨天事件走顶部全天区(parseWeekSpanEvents);range 结构同 week,列数=range 天数(左闭右开),跨天走 parseSpanEvents;month 6×7 网格,跨天条走 getMonthEvents,每格超额显示「还有 N 项」并用 Popover 弹卡片。displayValue 决定展示锚点;onClick 回调点击的精确时间点(日/周精确到半小时,月精确到日)。showCurrTime 当前时间红线(当天列,每 30s 刷新)。事件定位全部来自 @chenzy-design/core 纯算法(getDailyEvents/parseWeekSpanEvents/parseSpanEvents/getMonthEvents/calcRowHeight/allDayEventMap/getPos),本组件只把数值位置转成内联样式。事件外观由 event.children 承载(字符串直出 / snippet render),对齐 Semi children。头部对齐 Semi:无默认导航,仅当传入 header 时渲染自定义头部。

设计文档

如何引入

import { Calendar } from '@chenzy-design/svelte';

日视图

mode="day" 日视图时间轴

    全天

周视图

mode="week" 周视图时间轴

    7月
  • 12 周日
  • 13 周一
  • 14 周二
  • 15 周三
  • 16 周四
  • 17 周五
  • 18 周六
    全天

月视图

mode="month" 月视图网格

设置周起始日

weekStartsOn 设定每周第一天(0=周日 … 6=周六),对月 / 周视图生效

多日视图

mode="range" range 必传,左闭右开

    7月
  • 26 周六
  • 27 周日
  • 28 周一
  • 29 周二
  • 30 周三
    全天

事件渲染用法

mode 切换 + DatePicker 联动 displayValue + 10 个事件(children 内联样式块),minEventHeight 控制最小高

    7月
  • 21 周日
  • 22 周一
  • 23 周二
  • 24 周三
  • 25 周四
  • 26 周五
  • 27 周六
    全天
  • 6月25日 14:45 ~ 7月26日 6:18
  • 7月18日 10:00 ~ 7月30日 8:00
  • 7月19日 20:00 ~ 7月23日 14:00
  • 7月25日 8:00 ~ 7月27日 6:00
  • 7月21日 6:00 ~ 7月25日 6:00
  • 7月26日 10:00 ~ 7月27日 16:00
  • 7月22日 全天
  • 7月22日 9:00 ~ 7月23日 23:00

自定义渲染事件

dateGridRender 在某列绝对定位塞事件块(吃饭 / 睡觉 / 打豆豆),需绝对定位 top/height

    7月
  • 21 周日
  • 22 周一
  • 23 周二
  • 24 周三
  • 25 周四
  • 26 周五
  • 27 周六
    全天

自定义渲染单元格样式

dateGridRender 给重要日期铺一层背景(需绝对定位)

自定义日期文案

renderDateDisplay 用 Avatar 渲染周视图日期头

    5月
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
    全天

点击回调

onClick 回调点击的精确时间点(日 / 周精确到半小时)

    7月
  • 12 周日
  • 13 周一
  • 14 周二
  • 15 周三
  • 16 周四
  • 17 周五
  • 18 周六
    全天
点击时间:(未点击)

周末标识与「还有 N 项」

markWeekend 区分周末 + Tag 上色事件 + onMoreClick 处理溢出

「还有 N 项」:(未点击)

API 参考

Calendar

Props

属性说明类型默认值
displayValue展示锚点日期(决定展示的天/周/月)Datenew Date()
rangemode='range' 时必传,左闭右开 [start, end)[Date, Date]undefined
header自定义头部内容(对齐 Semi header;缺省不渲染头部)Snippetundefined
events事件列表(key 必填且唯一)CalendarEvent[][]
mode视图模式'day' | 'week' | 'month' | 'range''week'
showCurrTime显示当前时间红线(日/周/多日视图,当天列)booleantrue
weekStartsOn一周起始(0=周日)0|1|2|3|4|5|60
scrollTop日/周视图默认滚动区高度(px)number400
markWeekend区分周末列(灰底)booleanfalse
minEventHeight日/周/多日视图事件块最小高度(px)numberNumber.MIN_SAFE_INTEGER
width日历整体宽度number | stringundefined
height日历整体高度number | string600
onClick点击日期格(对齐 Semi function(e, date)):日/周视图精确到半小时,月视图精确到日(e: Event, date: Date) => voidundefined
onClose月视图 +N 卡片关闭回调(对齐 Semi function(e))(e: Event) => voidundefined
onMoreClick月视图点「还有 N 项」回调(对齐 Semi function(e, date, remaining))(e: Event, date: Date, remaining: number) => voidundefined
renderTimeDisplay自定义日/周视图时间文案(返回字符串即可)(hour: number) => unknownundefined
renderDateDisplay自定义 week/range 视图日期表头(接收 date 的 Snippet,对齐 Semi ReactNode)Snippet<[Date]>undefined
dateGridRender自定义单元格/列额外内容(dateString = date.toString(),对齐 Semi)(dateString: string, date: Date) => Snippet | null | undefinedundefined
allDayEventsRender自定义顶部全天区渲染(events: CalendarEvent[]) => Snippet | null | undefinedundefined

Events

事件载荷说明
onClick点击日期格(日/周半小时、月日)
onMoreClick月视图点「还有 N 项」
onClose月视图 +N 卡片关闭

Slots

名称说明
header自定义头部内容(对齐 Semi header)

Accessibility

  • 根容器 role=grid + aria-label(取标题)。时间轴视图每列 role=gridcell(含 aria-label 日期),半小时格为 <button>(aria-label=日期+时:分)。week/range 视图有日期表头 role=columnheader(day 视图对齐 Semi 无列头)。month 视图:星期表头 role=columnheader,日格 role=gridcell,today 格 aria-current=date,日格可点击(Enter/Space)。月视图「还有 N 项」用 Popover(trigger=click,showCloseButton,title=日期),关闭回调 onClose。

设计变量

变量默认值用法
--cd-calendar-color-bg var(--cd-color-bg-2)Semi $color-calendar-bg(时间列 .time-items 背景)
--cd-calendar-color-bg-active var(--cd-color-primary)Semi $color-calendar-bg-active(今日日期 .today-date 实底)
--cd-calendar-color-curr-border var(--cd-color-danger)Semi $color-calendar_curr-border(当前时间线 .grid-curr-line border)
--cd-calendar-color-currcircle-bg-default var(--cd-color-danger)Semi $color-calendar_currCircle-bg-default(当前时间原点 .grid-curr-circle 底)
--cd-calendar-color-date-text-default var(--cd-color-text-0)Semi $color-calendar_date-text-default(当月日期 .month-same 文字)
--cd-calendar-color-day-border var(--cd-color-border)Semi $color-calendar_day-border(网格 / 时间轴描边)
--cd-calendar-color-day-text-default var(--cd-color-text-2)Semi $color-calendar_day-text-default(星期 / 时间列 / 非当月文字)
--cd-calendar-color-sticky-bg var(--cd-color-bg-2)Semi $color-calendar_sticky-bg(.sticky-top / .sticky-left 背景)
--cd-calendar-color-text-active var(--cd-color-bg-1)Semi $color-calendar-text-active(今日日期 .today-date 文字)
--cd-calendar-color-weekend-bg var(--cd-color-fill-0)Semi $color-calendar_weekend-bg(.weekend 背景)