生态产品多个设计器现已发布候选版本

查看生态总览
跳转到内容

CalendarRangePicker 日历范围选择器 ​

在日历网格中先选起点再选终点,选出一段连续的天、周、月、季度或年。

用法 ​

先落下起点再落下终点,也可以按住拖动经过;两端都落定才写值,Escape 撤销起点

2026年11月
一二三四五六日
26
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
6
区间:(未选)

组件结构 ​

加粗的是必需部件。

data-scope="calendar-range-picker":root · header · prev-year-trigger · prev-trigger · next-trigger · next-year-trigger · heading · heading-year-trigger · heading-month-trigger · grid · grid-head · week-day · grid-body · week-row · week-number · cell · cell-trigger

示例 ​

并排两个月 ​

visible-count=2:起止常跨月,并排查看两页更便于选择;翻页时整个窗口一起移动

2026年9月
2026年10月
一二三四五六日
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
6
7
8
9
10
11
一二三四五六日
28
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
8
区间:2026-09-28 → 2026-10-06

不可用的日期 ​

allows-non-contiguous-ranges 允许区间跨过周末,只是这些日期不铺设轨道;isDateUnavailable 可得到起点,据此限制区间长度

2026年11月
一二三四五六日
26
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
6
区间:(未选)

按周选择 ​

granularity=week:rows 已按行切好,周视图一行一个整周,每行写一个 week-row;值是两端两周的周首日;月、季度与年同理

2026年11月
W44 10/26–11/01
W45 11/02–11/08
W46 11/09–11/15
W47 11/16–11/22
W48 11/23–11/29
W49 11/30–12/06
周区间:(未选)

只改终点 ​

activeIndex=1 时起点当锚:点在起点之后只改终点,点在起点之前从那一天重新开始挑

2026年10月
一二三四五六日
28
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
8
区间:2026-10-05 → 2026-10-09

设计指引 ​

何时使用 ​

  • 需要查看整月分布再选择一段起止:预订入住与退房、报表统计区间、排班周期。
  • 起止常跨月,需要并排查看两个月再决定。

何时不用 ​

特性 ​

  • 先选起点再选终点:起点只记录在组件内,两端都落定后才写值;Escape 撤销起点后原区间保持不变。
  • 支持按住拖选:按下即落起点,拖到另一格松开即完成;按住已选区间的一端拖动可以直接改写该端;触屏按住片刻才开始拖动,轻点仍是普通点选。
  • 焦点离开网格时,未完成的区间在起点到聚焦日之间就地收口,不留悬空的起点。
  • activeIndex={1} 时只改终点:已有起点当锚,点在起点当天或之后即落终点、起点不动;点在起点之前的日子从那一天重新开始挑。与 antd 的「从终点输入框继续改」一致;React Aria 的区间日历每次点选都重新开始,没有这一档。
  • 落起点后可选范围默认被夹在两侧最近的不可用日之间,allowsNonContiguousRanges 允许跨过它们;isDateUnavailable 的第二个参数是当前起点,可据此限制区间长度。
  • 已选区间的任一端越界或不可用即标记为不合法,也可以用 invalid 显式声明。
  • granularity 决定周期格的生成方式;周、月、季度和年区间共用同一套 Period 边界判断。
  • 周、月、季度与年这几层同样按行渲染:插槽里的 rows(多面板读 panels[i].rows)已按列数切好——周一行一格,月与年一行三格,季度一行四格;一行写一个 week-row,格子放进行里。网格是 role=grid,行承担 role=row,格子不直接铺进网格。
  • visibleCount 并排展示连续的月份,翻页时整个视窗一起移动;起止常跨月时建议为 2。多个面板始终联动、一起翻页,不提供解绑(Element Plus 的 unlink-panels 那一档):两张月历各翻各的之后,方向键跨出一张月历时焦点该落到哪一张、另一张跟不跟着走都没有一致的答案,读屏用户也失去「这几张是连续的月」这条线索。起止相隔很远时点标题里的年 / 月直接跳,或在输入行键入;React Aria 的 visibleDuration 同样只有联动一种。
  • calendarPeriodValue 将两端转换为 { granularity, start, end, keys },可直接用于查询参数。
  • 周首日、月份名与星期名跟随 locale,与日历选择器使用同一套解析链;firstDayOfWeek(0 = 星期日 … 6 = 星期六)单独改周首日,月份名与星期名仍按 locale。星期表头缺省只写一个字(weekdayFormat 为 narrow),需要缩写时设为 short,读屏名称始终是星期全称。
  • week 粒度按 ISO 周(星期一到星期日)成段,周序号也按 ISO 周计,与 locale 和 firstDayOfWeek 都无关。以星期日开头的 locale(如 en-US)下,日视图的一行比 ISO 周早一天开始,行首的周序号取这一行中间那天所在的 ISO 周;要让日视图的每一行正好是一个 ISO 周,把 firstDayOfWeek 设为 1。

组合 ​

  • 内嵌在日期范围选择器的浮层中,由它持有聚焦日与层级切换。
  • 与日历选择器共用同一套部件名与皮肤槽,只多出区间轨道的几条状态。

最佳实践 ​

  • 区间中段保持连续淡色带,起止使用实心端点;挑到一半的预览铺中性淡底,落定时淡变成品牌淡底——品牌淡底专属选中,还没确认的一段不借用它。悬停预览不显示独立的普通悬停样式。
  • 今天在数字下方标一颗品牌色圆点、数字保持正文色,落在区间里时圆点压在淡色带的下沿,仍与起止端点的实心面分得开。
  • 周区间按整周格连续预览,月份、季度和年份区间共用同一套 Period 边界判断。
  • 落起点后把焦点移动一格,让键盘用户看出正在选择一段而不是一天。
  • 起止常跨月时设置 visibleCount="2",避免用户来回翻页。

反模式 ​

  • 把周、月、季度或年的格子直接铺进网格:网格底下没有行,读屏报不出格子落在第几行第几列。
  • 用两个日历选择器分别选起止:中间的日期不铺轨道,也没有拖选与预览。
  • 不可选的日期无法聚焦,键盘用户无从知道该位置的内容。

API 参考 ​

产物 ​

层值
自定义元素<xh-calendar-range-picker>
Vue 组件XhCalendarRangePickerCell XhCalendarRangePickerCellTrigger XhCalendarRangePickerGrid XhCalendarRangePickerGridBody XhCalendarRangePickerGridHead XhCalendarRangePickerHeader XhCalendarRangePickerHeading XhCalendarRangePickerHeadingMonthTrigger XhCalendarRangePickerHeadingYearTrigger XhCalendarRangePickerNextTrigger XhCalendarRangePickerNextYearTrigger XhCalendarRangePickerPrevTrigger XhCalendarRangePickerPrevYearTrigger XhCalendarRangePickerRoot XhCalendarRangePickerWeekDay XhCalendarRangePickerWeekNumber XhCalendarRangePickerWeekRow
组合式函数useCalendarRangePicker
状态机calendarRangePickerMachine
皮肤@xihan-ui/styles/calendar-range-picker.css

事件 ​

自定义元素将载荷放在 detail;Vue 使用同名 emit。

事件载荷说明
value-changeCalendarRangePickerValueChangeDetails区间两端都落定;detail 为 { value: string[] },长度恒为 2
focused-value-changeCalendarFocusChangeDetails聚焦日变化;detail 为 { focusedValue: string }
active-view-changeCalendarViewChangeDetails切换到另一层级;detail 为 { activeView: 'day'|'week'|'month'|'quarter'|'year' }

插槽 ​

仅列出带载荷的插槽。

Vue 组件插槽载荷说明
XhCalendarRangePickerRootdefaultCalendarRangePickerRootSlotProps

React 适配器 props ​

只列各组件自己声明的那些:继承自 ComponentPropsWithRef 的 DOM 属性不在其中,根组件上与上面 Props 表同名的也不重复列。Vue 的对应物是上面的插槽表。

React 组件属性类型必填说明
XhCalendarRangePickerCellvaluestring是ISO 日期串。
XhCalendarRangePickerCellindexnumber属于第几个面板,默认 0。多面板时必须提供:同一天会同时出现在两个面板中 (8 月末的几天也铺在 9 月的首行),是否为本月只有连同面板一起看才能判定。
XhCalendarRangePickerGridindexnumber属于第几个面板,默认 0。单面板时不必写。
XhCalendarRangePickerHeadingindexnumber属于第几个面板,默认 0。单面板时不必写。
XhCalendarRangePickerHeadingMonthTriggerindexnumber属于第几个面板,默认 0。单面板时不必写。
XhCalendarRangePickerHeadingYearTriggerindexnumber属于第几个面板,默认 0。单面板时不必写。
XhCalendarRangePickerRootvaluestring | string[]
XhCalendarRangePickerRootdefaultValuestring | string[]
XhCalendarRangePickerRootfocusedValuestring
XhCalendarRangePickerRootdefaultFocusedValuestring
XhCalendarRangePickerRootminstring
XhCalendarRangePickerRootmaxstring
XhCalendarRangePickerRootisDateUnavailable(value: string, anchor: string | null) => boolean
XhCalendarRangePickerRootallowsNonContiguousRangesboolean区间允许跨过不可用的日期;默认关闭,落下起点后只能选到两侧最近的不可用日为止。
XhCalendarRangePickerRootactiveIndex0 | 1下一次点选落在哪一端;为 1 且已有起点时只改终点。
XhCalendarRangePickerRootinvalidboolean校验失败:根带 data-invalid,区间内的格子报告 aria-invalid。
XhCalendarRangePickerRootlocalestring
XhCalendarRangePickerRootfirstDayOfWeeknumber周首日,0 = 星期日 … 6 = 星期六;不给按 locale。
XhCalendarRangePickerRoottimeZonestring
XhCalendarRangePickerRootdisabledboolean
XhCalendarRangePickerRootreadOnlyboolean
XhCalendarRangePickerRootweekdayFormatCalendarWeekdayFormat
XhCalendarRangePickerRootfixedWeeksboolean
XhCalendarRangePickerRootgranularityCalendarGranularity选择粒度。
XhCalendarRangePickerRootactiveViewCalendarView面板当前所处的层级;给定即受控,默认跟随 granularity。
XhCalendarRangePickerRootdefaultActiveViewCalendarView非受控初值,默认同 granularity。
XhCalendarRangePickerRootvisibleCountnumber并排展示几页,默认 1。
XhCalendarRangePickerRoottranslationsPartial<CalendarRangePickerTranslations>
XhCalendarRangePickerRootonValueChangeCalendarRangePickerProps['onValueChange']
XhCalendarRangePickerRootonFocusedValueChangeCalendarRangePickerProps['onFocusedValueChange']
XhCalendarRangePickerRootonActiveViewChangeCalendarRangePickerProps['onActiveViewChange']
XhCalendarRangePickerRootchildrenSlotChildren<CalendarRangePickerRootSlotProps>
XhCalendarRangePickerWeekDayvaluenumber | string是列序 0-6,兼收字符串。
XhCalendarRangePickerWeekNumbervaluestring是该行行首那一天的 ISO 串。

状态 ​

以下名称仅用于内部状态机。

状态:idle · anchored

事件:RANGE.ANCHOR · RANGE.COMMIT · DRAG.SET · HOVER.SET · HOVER.CLEAR · PRESS.START · PRESS.END

判据:startsRange · endsFromStart · anchorsRange · canPress

connect API ​

getXxxProps() 返回对应部件的宿主属性。

成员类型说明
rangeAnchorstring | null区间选到一半时的起点(周期首日的 ISO 串);其余时候为 null。
draggingboolean指针正按在格子上拖动选择区间。
setRangeAnchor(next: string | null) => void直接改写区间起点;传 null 撤销选到一半的区间。

无障碍 ​

键盘 ​

规格出处:W3C APG

按键生效条件行为
Tab / Shift+Tabfocus outside the grid整张网格只占一个 Tab 位:焦点进入聚焦日那一格
ArrowLeftfocus in grid焦点前移一天;越过月首即翻到上一月并落在那一天。粗粒度视图里走一格(一个月 / 一季 / 一年)
ArrowRightfocus in grid焦点后移一天;越过月末即翻到下一月并落在那一天。粗粒度视图里走一格
ArrowUpfocus in grid焦点上移一周(减七天),跨月照样翻页。粗粒度视图里上移一行
ArrowDownfocus in grid焦点下移一周(加七天),跨月照样翻页。粗粒度视图里下移一行
Homefocus in grid焦点移到本周第一天;周首日随 locale 变。粗粒度视图里移到本行头一格
Endfocus in grid焦点移到本周最后一天。粗粒度视图里移到本行末一格
PageUpfocus in grid退一个月,日号不变(月末日被目标月夹住:3 月 31 日退成 2 月 29 日)。粗粒度视图里退一整页
PageDownfocus in grid进一个月,日号不变。粗粒度视图里进一整页
Shift+PageUpfocus in grid退一年;粗粒度视图里退十页
Shift+PageDownfocus in grid进一年;粗粒度视图里进十页
Enter / Spacefocus in grid, 聚焦周期可用且非只读先落起点再落终点。落起点后焦点自动前进一格(挑不了就退一格),方向键走到哪儿预览就铺到哪儿;落终点那一下把两端一并写出。还没钻到 granularity 那一档时这一下是往下钻一层
Escapefocus in grid, 区间已落起点撤掉起点,原来的区间原样还在;不拦默认行为,外层浮层照常收起
Tab / Shift+Tabfocus in grid, 区间已落起点焦点离开前把区间收在起点到聚焦日之间;不拦默认行为,焦点照常离开
Enter / Spaceheld in prev-year-trigger / prev-trigger / next-trigger / next-year-trigger / heading-year-trigger / heading-month-trigger / cell-trigger, 该部件可按按住期间该部件投影 data-pressed,与指针 :active 同一副按压面;抬起或失焦撤下,按住途中整张转入禁用也撤下。落起点那一下焦点前进一格,按压面随焦点一起走。整张禁用时谁都不进;只读时日期格不进(翻页与钻层照常);到界的翻页钮与到顶的标题是原生 disabled,不可选的格子是 aria-disabled,都不进

ARIA ​

以下属性由 connect 生成。

部件属性值
prev-year-triggeraria-labeltranslations.prevYearTrigger(view)
prev-triggeraria-labeltranslations.prevTrigger(view)
next-triggeraria-labeltranslations.nextTrigger(view)
next-year-triggeraria-labeltranslations.nextYearTrigger(view)
gridaria-disabled'true' | 'false'
gridaria-labelledbyframe.headingId(panel.index)
gridaria-multiselectable'true'
gridaria-readonly'true' | 'false'
gridrole'grid'
grid-headrole'rowgroup'
week-dayaria-labelmeta?.long
week-dayrole'columnheader'
grid-bodyrole'rowgroup'
week-rowrole'row'
week-numberaria-hidden'true'
week-numberrole'rowheader'
cellaria-selected'true' | 'false'
cellrole'gridcell'
cell-triggeraria-descriptiontranslations.finishRangeSelectionPrompt | translations.startRangeSelectionPrompt | undefined
cell-triggeraria-disabled'true' | 'false'
cell-triggeraria-invalid'true' | undefined
cell-triggeraria-labelframe.dateLabel(state.date, period)
cell-triggerrole'button'

样式参考 ​

皮肤 ​

@xihan-ui/styles/calendar-range-picker.css 按 [data-scope="calendar-range-picker"][data-part="root"] 部件选择器书写,发布产物以挂载类 .xh-scope-calendar-range-picker 代替其中的 data-scope(特异性相同),位于 xihan.components 层。覆盖样式使用 xihan.overrides,部件选择器照常可用。

forced-colors: active 下另有一套规则:颜色交给系统,边框与状态标记改用系统色关键字。

数据属性 ​

由 connect 生成;条件不成立时不输出无值属性。

部件属性值
rootdata-disabled''(条件成立时才出现)
rootdata-invalid''(条件成立时才出现)
rootdata-readonly''(条件成立时才出现)
prev-year-triggerdata-disabled''(条件成立时才出现)
prev-year-triggerdata-pressed''(条件成立时才出现)
prev-year-triggerdata-xh-action-control''
prev-year-triggerdata-xh-action-display'always'
prev-year-triggerdata-xh-action-profile'icon'
prev-year-triggerdata-xh-action-size'xs'
prev-year-triggerdata-xh-action-variant'ghost'
prev-triggerdata-disabled''(条件成立时才出现)
prev-triggerdata-pressed''(条件成立时才出现)
prev-triggerdata-xh-action-control''
prev-triggerdata-xh-action-display'always'
prev-triggerdata-xh-action-profile'icon'
prev-triggerdata-xh-action-size'xs'
prev-triggerdata-xh-action-variant'ghost'
next-triggerdata-disabled''(条件成立时才出现)
next-triggerdata-pressed''(条件成立时才出现)
next-triggerdata-xh-action-control''
next-triggerdata-xh-action-display'always'
next-triggerdata-xh-action-profile'icon'
next-triggerdata-xh-action-size'xs'
next-triggerdata-xh-action-variant'ghost'
next-year-triggerdata-disabled''(条件成立时才出现)
next-year-triggerdata-pressed''(条件成立时才出现)
next-year-triggerdata-xh-action-control''
next-year-triggerdata-xh-action-display'always'
next-year-triggerdata-xh-action-profile'icon'
next-year-triggerdata-xh-action-size'xs'
next-year-triggerdata-xh-action-variant'ghost'
headingdata-indexframe.panelOf(panel).index
headingdata-viewview
heading-year-triggerdata-disabled''(条件成立时才出现)
heading-year-triggerdata-indexframe.panelOf(panel).index
heading-year-triggerdata-pressed''(条件成立时才出现)
heading-year-triggerdata-viewview
heading-year-triggerdata-xh-action-control''
heading-year-triggerdata-xh-action-display'always'
heading-year-triggerdata-xh-action-profile'text'
heading-year-triggerdata-xh-action-size'xs'
heading-year-triggerdata-xh-action-variant'ghost'
heading-month-triggerdata-disabled''(条件成立时才出现)
heading-month-triggerdata-indexframe.panelOf(panel).index
heading-month-triggerdata-pressed''(条件成立时才出现)
heading-month-triggerdata-viewview
heading-month-triggerdata-xh-action-control''
heading-month-triggerdata-xh-action-display'always'
heading-month-triggerdata-xh-action-profile'text'
heading-month-triggerdata-xh-action-size'xs'
heading-month-triggerdata-xh-action-variant'ghost'
griddata-disabled''(条件成立时才出现)
griddata-dragging''(条件成立时才出现)
griddata-indexframe.panelOf(panel).index
griddata-readonly''(条件成立时才出现)
griddata-viewview
week-rowdata-viewview
celldata-disabled''(条件成立时才出现)
celldata-focus''(条件成立时才出现)
celldata-in-range''(条件成立时才出现)
celldata-invalid''(条件成立时才出现)
celldata-outside-month''(条件成立时才出现)
celldata-range-end''(条件成立时才出现)
celldata-range-preview''(条件成立时才出现)
celldata-range-start''(条件成立时才出现)
celldata-selected''(条件成立时才出现)
celldata-today''(条件成立时才出现)
celldata-viewview
cell-triggerdata-disabled''(条件成立时才出现)
cell-triggerdata-focus''(条件成立时才出现)
cell-triggerdata-in-range''(条件成立时才出现)
cell-triggerdata-invalid''(条件成立时才出现)
cell-triggerdata-outside-month''(条件成立时才出现)
cell-triggerdata-pressed''(条件成立时才出现)
cell-triggerdata-range-end''(条件成立时才出现)
cell-triggerdata-range-preview''(条件成立时才出现)
cell-triggerdata-range-start''(条件成立时才出现)
cell-triggerdata-selected''(条件成立时才出现)
cell-triggerdata-today''(条件成立时才出现)
cell-triggerdata-viewview
cell-triggerdata-xh-action-control''
cell-triggerdata-xh-action-display'always'
cell-triggerdata-xh-action-profile'text'
cell-triggerdata-xh-action-size'xs'
cell-triggerdata-xh-action-variant'ghost'

CSS 变量 ​

本组件公开覆盖槽由独立皮肤的实际消费位生成;默认来源、作用部件和状态均与 CSS 同源。

变量部件CSS 属性状态默认来源说明
--xh-calendar-range-picker-cell-bg-disabledcellbackground-colordisabled
in-range
not([data-in-range])
--xh-bg-subtlecalendar-range-picker 的 cell 部件 background-color 覆盖槽。
--xh-calendar-range-picker-cell-bg-hovercell-triggerbackground-colordisabled
hover
loading
not([data-disabled])
not([data-loading])
--xh-_action-variant-bg-hovercalendar-range-picker 的 cell-trigger 部件 background-color 覆盖槽。
--xh-calendar-range-picker-cell-bg-pressedcell-triggerbackground-colordisabled
is(:active, [data-pressed])
loading
not([data-disabled])
not([data-loading])
pressed
--xh-_action-variant-bg-pressedcalendar-range-picker 的 cell-trigger 部件 background-color 覆盖槽。
--xh-calendar-range-picker-cell-bg-selectedcell-trigger--xh-ink-surface
background-color
disabled
focus-visible
hover
in-range
is([data-range-start], [data-range-end])
loading
not([data-disabled])
not([data-in-range])
not([data-loading])
not([data-outside-month])
outside-month
range-end
range-start
selected
xh-ink-surface
--xh-bg-brandcalendar-range-picker 的 cell-trigger 部件 --xh-ink-surface、background-color 覆盖槽。
--xh-calendar-range-picker-cell-bg-selected-activecell-triggerbackground-colordisabled
in-range
is(:active, [data-pressed])
is([data-range-start], [data-range-end])
loading
not([data-disabled])
not([data-in-range])
not([data-loading])
not([data-outside-month])
outside-month
pressed
range-end
range-start
selected
--xh-bg-brand-activecalendar-range-picker 的 cell-trigger 部件 background-color 覆盖槽。
--xh-calendar-range-picker-cell-bg-selected-disabledcell-trigger--xh-ink-surface
background-color
disabled
selected
xh-ink-surface
--xh-bg-subtle-hovercalendar-range-picker 的 cell-trigger 部件 --xh-ink-surface、background-color 覆盖槽。
--xh-calendar-range-picker-cell-fgcell-triggercolor@media print
default
disabled
focus-visible
hover
in-range
is(:active, [data-pressed])
is([data-range-start], [data-range-end])
loading
not([data-disabled])
not([data-in-range])
not([data-loading])
not([data-outside-month])
outside-month
pressed
range-end
range-start
selected
--xh-fg-defaultcalendar-range-picker 的 cell-trigger 部件 color 覆盖槽。
--xh-calendar-range-picker-cell-fg-outsidecell-triggercolordisabled
focus-visible
hover
is(:active, [data-pressed])
loading
not([data-disabled])
not([data-loading])
outside-month
pressed
--xh-fg-subtlecalendar-range-picker 的 cell-trigger 部件 color 覆盖槽。
--xh-calendar-range-picker-cell-fg-selectedcell-triggercolordisabled
focus-visible
hover
in-range
is(:active, [data-pressed])
is([data-range-start], [data-range-end])
loading
not([data-disabled])
not([data-in-range])
not([data-loading])
not([data-outside-month])
outside-month
pressed
range-end
range-start
selected
--xh-fg-on-brandcalendar-range-picker 的 cell-trigger 部件 color 覆盖槽。
--xh-calendar-range-picker-cell-font-sizecell-triggerfont-sizedefault--xh-text-body-sizecalendar-range-picker 的 cell-trigger 部件 font-size 覆盖槽。
--xh-calendar-range-picker-cell-font-weightcell-triggerfont-weightdefault--xh-font-weight-mediumcalendar-range-picker 的 cell-trigger 部件 font-weight 覆盖槽。
--xh-calendar-range-picker-cell-font-weight-outsidecell-triggerfont-weightoutside-month--xh-font-weight-regularcalendar-range-picker 的 cell-trigger 部件 font-weight 覆盖槽。
--xh-calendar-range-picker-cell-min-wgrid
week-row
grid-template-columns
min-inline-size
@media (pointer: coarse)
default
has(> [data-part='week-number'])
is([data-view='week'], [data-view='month'], [data-view='quarter'], [data-view='year'])
not([hidden])
view=month
view=quarter
view=week
view=year
--xh-control-h-mdcalendar-range-picker 的 grid、week-row 部件 grid-template-columns、min-inline-size 覆盖槽。
--xh-calendar-range-picker-cell-pxcellpadding-inlinedefault--xh-space-0calendar-range-picker 的 cell 部件 padding-inline 覆盖槽。
--xh-calendar-range-picker-cell-pycellborder-end-end-radius
border-end-start-radius
border-start-end-radius
border-start-start-radius
inset-block
inset-inline-end
inset-inline-start
padding-block
default
disabled
in-range
is([data-view='week'], [data-view='month'], [data-view='quarter'], [data-view='year'])
not([data-in-range])
not([data-outside-month])
outside-month
range-end
range-start
view=day
view=month
view=quarter
view=week
view=year
--xh-space-1_5calendar-range-picker 的 cell 部件 border-end-end-radius、border-end-start-radius、border-start-end-radius、border-start-start-radius、inset-block、inset-inline-end、inset-inline-start、padding-block 覆盖槽。
--xh-calendar-range-picker-cell-radiuscell-triggerborder-radiusview=day--xh-shape-circlecalendar-range-picker 的 cell-trigger 部件 border-radius 覆盖槽。
--xh-calendar-range-picker-cell-sizecell
cell-trigger
block-size
inline-size
inset-block
inset-block-start
inset-inline-end
inset-inline-start
min-inline-size
default
disabled
in-range
not([data-in-range])
not([data-outside-month])
outside-month
range-end
range-start
today
view=day
xh-action-profile=icon
--xh-_action-profile-visual-size
--xh-control-action-size
calendar-range-picker 的 cell、cell-trigger 部件 block-size、inline-size、inset-block、inset-block-start、inset-inline-end、inset-inline-start、min-inline-size 覆盖槽。
--xh-calendar-range-picker-disabled-insetcellinset-blockdisabled
in-range
not([data-in-range])
--xh-space-0_5calendar-range-picker 的 cell 部件 inset-block 覆盖槽。
--xh-calendar-range-picker-gaprootgapdefault--xh-space-0calendar-range-picker 的 root 部件 gap 覆盖槽。
--xh-calendar-range-picker-grid-gapgridgapdefault--xh-space-0calendar-range-picker 的 grid 部件 gap 覆盖槽。
--xh-calendar-range-picker-grid-pxgrid
week-row
grid-template-columns
min-inline-size
padding-inline
@media (pointer: coarse)
default
has(> [data-part='week-number'])
is([data-view='week'], [data-view='month'], [data-view='quarter'], [data-view='year'])
not([hidden])
view=month
view=quarter
view=week
view=year
--xh-space-4calendar-range-picker 的 grid、week-row 部件 grid-template-columns、min-inline-size、padding-inline 覆盖槽。
--xh-calendar-range-picker-grid-pygridpadding-blockdefault--xh-space-3calendar-range-picker 的 grid 部件 padding-block 覆盖槽。
--xh-calendar-range-picker-header-borderheaderborder-block-enddefault--xh-material-solid-bordercalendar-range-picker 的 header 部件 border-block-end 覆盖槽。
--xh-calendar-range-picker-header-gapheadergapdefault--xh-space-1calendar-range-picker 的 header 部件 gap 覆盖槽。
--xh-calendar-range-picker-header-pxheaderpadding-inlinedefault--xh-space-4calendar-range-picker 的 header 部件 padding-inline 覆盖槽。
--xh-calendar-range-picker-header-pyheadermin-block-size
padding-block
default--xh-space-2calendar-range-picker 的 header 部件 min-block-size、padding-block 覆盖槽。
--xh-calendar-range-picker-heading-fgheading
heading-month-trigger
heading-year-trigger
colordefault
disabled
focus-visible
hover
is(:active, [data-pressed])
loading
not([data-disabled])
not([data-loading])
not([hidden])
pressed
--xh-fg-defaultcalendar-range-picker 的 heading、heading-month-trigger、heading-year-trigger 部件 color 覆盖槽。
--xh-calendar-range-picker-heading-font-sizeheading
heading-month-trigger
heading-year-trigger
font-sizedefault
not([hidden])
--xh-text-label-sizecalendar-range-picker 的 heading、heading-month-trigger、heading-year-trigger 部件 font-size 覆盖槽。
--xh-calendar-range-picker-heading-font-weightheading
heading-month-trigger
heading-year-trigger
font-weightdefault
not([hidden])
--xh-font-weight-mediumcalendar-range-picker 的 heading、heading-month-trigger、heading-year-trigger 部件 font-weight 覆盖槽。
--xh-calendar-range-picker-heading-trigger-bg-hoverheading-month-trigger
heading-year-trigger
background-colordisabled
hover
loading
not([data-disabled])
not([data-loading])
not([hidden])
--xh-_action-variant-bg-hovercalendar-range-picker 的 heading-month-trigger、heading-year-trigger 部件 background-color 覆盖槽。
--xh-calendar-range-picker-heading-trigger-bg-pressedheading-month-trigger
heading-year-trigger
background-colordisabled
is(:active, [data-pressed])
loading
not([data-disabled])
not([data-loading])
not([hidden])
pressed
--xh-_action-variant-bg-pressedcalendar-range-picker 的 heading-month-trigger、heading-year-trigger 部件 background-color 覆盖槽。
--xh-calendar-range-picker-heading-trigger-pxheading-month-trigger
heading-year-trigger
padding-inlinenot([hidden])--xh-space-0_5calendar-range-picker 的 heading-month-trigger、heading-year-trigger 部件 padding-inline 覆盖槽。
--xh-calendar-range-picker-heading-trigger-radiusheading-month-trigger
heading-year-trigger
border-radiusnot([hidden])--xh-shape-controlcalendar-range-picker 的 heading-month-trigger、heading-year-trigger 部件 border-radius 覆盖槽。
--xh-calendar-range-picker-icon-sizeheader--xh-icon-sizedefault--xh-glyph-size-smcalendar-range-picker 的 header 部件 --xh-icon-size 覆盖槽。
--xh-calendar-range-picker-nav-bgnext-trigger
next-year-trigger
prev-trigger
prev-year-trigger
--xh-ink-surface
background-color
default
focus-visible
xh-ink-surface
--xh-_action-variant-bg-focus-visible
--xh-_action-variant-bg-rest
calendar-range-picker 的 next-trigger、next-year-trigger、prev-trigger、prev-year-trigger 部件 --xh-ink-surface、background-color 覆盖槽。
--xh-calendar-range-picker-nav-bg-hovernext-trigger
next-year-trigger
prev-trigger
prev-year-trigger
background-colordisabled
hover
loading
not([data-disabled])
not([data-loading])
--xh-_action-variant-bg-hovercalendar-range-picker 的 next-trigger、next-year-trigger、prev-trigger、prev-year-trigger 部件 background-color 覆盖槽。
--xh-calendar-range-picker-nav-bg-pressednext-trigger
next-year-trigger
prev-trigger
prev-year-trigger
background-colordisabled
is(:active, [data-pressed])
loading
not([data-disabled])
not([data-loading])
pressed
--xh-_action-variant-bg-pressedcalendar-range-picker 的 next-trigger、next-year-trigger、prev-trigger、prev-year-trigger 部件 background-color 覆盖槽。
--xh-calendar-range-picker-nav-fgnext-trigger
next-year-trigger
prev-trigger
prev-year-trigger
colordefault
focus-visible
--xh-fg-mutedcalendar-range-picker 的 next-trigger、next-year-trigger、prev-trigger、prev-year-trigger 部件 color 覆盖槽。
--xh-calendar-range-picker-nav-fg-hovernext-trigger
next-year-trigger
prev-trigger
prev-year-trigger
colordisabled
hover
is(:active, [data-pressed])
loading
not([data-disabled])
not([data-loading])
pressed
--xh-fg-defaultcalendar-range-picker 的 next-trigger、next-year-trigger、prev-trigger、prev-year-trigger 部件 color 覆盖槽。
--xh-calendar-range-picker-nav-radiusnext-trigger
next-year-trigger
prev-trigger
prev-year-trigger
border-radiusdefault--xh-shape-circlecalendar-range-picker 的 next-trigger、next-year-trigger、prev-trigger、prev-year-trigger 部件 border-radius 覆盖槽。
--xh-calendar-range-picker-nav-sizenext-trigger
next-year-trigger
prev-trigger
prev-year-trigger
block-size
inline-size
min-inline-size
default
xh-action-profile=icon
--xh-_action-profile-visual-sizecalendar-range-picker 的 next-trigger、next-year-trigger、prev-trigger、prev-year-trigger 部件 block-size、inline-size、min-inline-size 覆盖槽。
--xh-calendar-range-picker-period-gapgrid
week-row
column-gap
gap
is([data-view='month'], [data-view='year'])
is([data-view='week'], [data-view='month'], [data-view='quarter'], [data-view='year'])
view=month
view=quarter
view=week
view=year
--xh-space-0calendar-range-picker 的 grid、week-row 部件 column-gap、gap 覆盖槽。
--xh-calendar-range-picker-period-pxcellborder-end-end-radius
border-end-start-radius
border-start-end-radius
border-start-start-radius
padding-inline
in-range
is([data-view='week'], [data-view='month'], [data-view='quarter'], [data-view='year'])
range-end
range-start
view=month
view=quarter
view=week
view=year
--xh-space-1calendar-range-picker 的 cell 部件 border-end-end-radius、border-end-start-radius、border-start-end-radius、border-start-start-radius、padding-inline 覆盖槽。
--xh-calendar-range-picker-period-radiuscell
cell-trigger
border-end-end-radius
border-end-start-radius
border-radius
border-start-end-radius
border-start-start-radius
default
in-range
is([data-view='week'], [data-view='month'], [data-view='quarter'], [data-view='year'])
range-end
range-start
view=month
view=quarter
view=week
view=year
--xh-shape-controlcalendar-range-picker 的 cell、cell-trigger 部件 border-end-end-radius、border-end-start-radius、border-radius、border-start-end-radius、border-start-start-radius 覆盖槽。
--xh-calendar-range-picker-range-bgcellbackground-colorin-range
not([data-outside-month])
outside-month
--xh-bg-brand-subtlecalendar-range-picker 的 cell 部件 background-color 覆盖槽。
--xh-calendar-range-picker-range-cap-radiuscellborder-end-end-radius
border-end-start-radius
border-start-end-radius
border-start-start-radius
in-range
range-end
range-start
--xh-_calendar-range-picker-range-capcalendar-range-picker 的 cell 部件 border-end-end-radius、border-end-start-radius、border-start-end-radius、border-start-start-radius 覆盖槽。
--xh-calendar-range-picker-range-cell-bg-hovercell-triggerbackground-colordisabled
hover
in-range
loading
not([data-disabled])
not([data-loading])
not([data-outside-month], [data-disabled], [data-range-start], [data-range-end])
outside-month
range-end
range-start
--xh-bg-brand-subtle-hovercalendar-range-picker 的 cell-trigger 部件 background-color 覆盖槽。
--xh-calendar-range-picker-range-cell-bg-pressedcell-triggerbackground-colordisabled
in-range
is(:active, [data-pressed])
loading
not([data-disabled])
not([data-loading])
not([data-outside-month], [data-disabled], [data-range-start], [data-range-end])
outside-month
pressed
range-end
range-start
--xh-bg-brand-subtle-activecalendar-range-picker 的 cell-trigger 部件 background-color 覆盖槽。
--xh-calendar-range-picker-range-insetcellborder-end-end-radius
border-end-start-radius
border-start-end-radius
border-start-start-radius
inset-block
inset-inline-end
inset-inline-start
in-range
is([data-view='week'], [data-view='month'], [data-view='quarter'], [data-view='year'])
not([data-outside-month])
outside-month
range-end
range-start
view=day
view=month
view=quarter
view=week
view=year
--xh-space-0_5calendar-range-picker 的 cell 部件 border-end-end-radius、border-end-start-radius、border-start-end-radius、border-start-start-radius、inset-block、inset-inline-end、inset-inline-start 覆盖槽。
--xh-calendar-range-picker-range-preview-bgcellbackground-colorin-range
not([data-outside-month])
outside-month
range-preview
--xh-bg-subtlecalendar-range-picker 的 cell 部件 background-color 覆盖槽。
--xh-calendar-range-picker-range-preview-cell-bg-hovercell-triggerbackground-colordisabled
hover
in-range
loading
not([data-disabled])
not([data-loading])
not([data-outside-month], [data-disabled], [data-range-start], [data-range-end])
outside-month
range-end
range-preview
range-start
--xh-bg-subtle-hovercalendar-range-picker 的 cell-trigger 部件 background-color 覆盖槽。
--xh-calendar-range-picker-range-preview-cell-bg-pressedcell-triggerbackground-colordisabled
in-range
is(:active, [data-pressed])
loading
not([data-disabled])
not([data-loading])
not([data-outside-month], [data-disabled], [data-range-start], [data-range-end])
outside-month
pressed
range-end
range-preview
range-start
--xh-bg-subtle-activecalendar-range-picker 的 cell-trigger 部件 background-color 覆盖槽。
--xh-calendar-range-picker-row-gapgrid-body
grid-head
gapdefault--xh-space-0calendar-range-picker 的 grid-body、grid-head 部件 gap 覆盖槽。
--xh-calendar-range-picker-today-mark-bgcellbackground-colortoday--xh-fg-brandcalendar-range-picker 的 cell 部件 background-color 覆盖槽。
--xh-calendar-range-picker-today-mark-sizecellblock-size
border
inline-size
@media print
today
--xh-space-1calendar-range-picker 的 cell 部件 block-size、border、inline-size 覆盖槽。
--xh-calendar-range-picker-week-cell-pxcell-triggerpadding-inlineview=week--xh-space-3calendar-range-picker 的 cell-trigger 部件 padding-inline 覆盖槽。
--xh-calendar-range-picker-week-day-fgweek-daycolordefault--xh-fg-subtlecalendar-range-picker 的 week-day 部件 color 覆盖槽。
--xh-calendar-range-picker-week-day-font-sizeweek-dayfont-sizedefault--xh-text-body-sizecalendar-range-picker 的 week-day 部件 font-size 覆盖槽。
--xh-calendar-range-picker-week-day-font-weightweek-dayfont-weightdefault--xh-font-weight-regularcalendar-range-picker 的 week-day 部件 font-weight 覆盖槽。
--xh-calendar-range-picker-week-day-hweek-dayblock-sizedefault--xh-control-h-mdcalendar-range-picker 的 week-day 部件 block-size 覆盖槽。
--xh-calendar-range-picker-week-number-fgweek-numbercolordefault--xh-fg-subtlecalendar-range-picker 的 week-number 部件 color 覆盖槽。
--xh-calendar-range-picker-week-number-font-sizeweek-numberfont-sizedefault--xh-text-caption-sizecalendar-range-picker 的 week-number 部件 font-size 覆盖槽。
--xh-calendar-range-picker-week-number-wweek-rowgrid-template-columns@media (pointer: coarse)
has(> [data-part='week-number'])
not([hidden])
--xh-control-h-mdcalendar-range-picker 的 week-row 部件 grid-template-columns 覆盖槽。
--xh-calendar-range-picker-year-grid-max-hgridmax-block-sizeview=year--xh-viewport-h-smcalendar-range-picker 的 grid 部件 max-block-size 覆盖槽。

动效 ​

动效角色:按压 · 状态(见动效规范)。

background-color 走 transition 过渡。时长与缓动读动效令牌,改令牌即改全局节奏。

系统开启减弱动效时由令牌层统一收敛,皮肤不另作判断。

响应式 ​

皮肤另按输入能力分档:pointer: coarse:同一份皮肤在触屏与带指针的设备上不一样,与视口宽度无关。

RTL ​

皮肤用逻辑属性排布(inline-start 一族),dir="rtl" 下自动镜像;另有按 dir 分支的规则。

Released under The MIT License