跳转到内容

DatePicker 日期选择器 ​

将可键入的分段日期框、日历触发器和选择浮层组合成一个字段。

用法 ​

输入或选择日期

交付日期
yyyy
/
mm
/
dd

组件结构 ​

加粗的是必需部件。

data-scope="date-picker":root · label · control · segment-group · trigger · clear-trigger · positioner · content · preset-group · preset · calendar · time-column · time-item · confirm-trigger

示例 ​

不可用日期 ​

禁止选择周末

工作日
yyyy
-
mm
-
dd

状态 ​

禁用、只读与校验失败

禁用
2026
-
07
-
28
只读
2026
-
07
-
28
校验失败
2026
-
07
-
28

快捷选项 ​

提供常用日期

提醒日期
yyyy
-
mm
-
dd

日期与时间 ​

同时选择日期和时间

会议开始
yyyy
/
mm
/
dd
hh
:
mm

周期选择 ​

granularity 决定输入行铺设哪几段、浮层铺设哪一档格子

统计周期
yyyy
/
mm
/
dd

设计指引 ​

何时使用 ​

  • 用户需要查看月份和星期信息后选择日期。
  • 需要选择日期时间,或一次挑多个不连续的日子。

何时不用 ​

特性 ​

  • granularity 支持 day / week / month / quarter / year,selectionMode 独立控制单选或多选。
  • 周选择直接渲染整周周期格;不再需要 weekSelection 特殊开关。
  • min、max 与 isDateUnavailable 限制可选日期。
  • presets 提供常用日期快捷项。
  • showTime 在 granularity=day + selectionMode=single 时让输入行显示完整日期时间,并加入时、分或秒选择列。
  • 日期时间组合面板让时间列与日期内容区从同一水平线开始;各时间列只纵向滚动,底部操作独占一行。
  • 输入值、展开状态和聚焦日期均可受控。
  • 点击输入行可以继续逐段键入,点击日历图标则把焦点送入日历;展开期间输入框保持激活边界。
  • 填齐了但越界即整个字段标为不合法,也可以用 invalid 显式声明。
  • 切换粒度会清空旧选择,输入段、网格和周期边界随后一起切换,不做隐式转换。
  • 空值时显示日历入口;有值且渲染了清空按钮时,由清空按钮原位接替日历图标。
  • 聚焦边界、段位强调与日期格按压都使用短过渡;减弱动效仍由全局动效轴收敛。

组合 ​

  • 浮层内嵌日历选择器,翻月、层级切换与键盘导航由它负责。
  • 输入行内嵌日期字段的段位,逐段键入与加减由它负责。

最佳实践 ​

  • 使用明确的字段标签。
  • 标准输入行应同时包含清空按钮与日历图标触发器;二者按值互斥显示。参与表单时同时渲染隐藏输入。
  • 默认只展开一个日历面板;需要多面板时显式传 visibleCount。
  • 需要统一查询值时,使用 calendarPeriodValue(granularity, 'single', value) 得到周期首尾与回显键。
  • 快速选年可在 year 网格中渲染受范围约束的年份集合;网格使用三列紧凑布局与内部滚动。
  • 不可用日期应同时提供原因。
  • 常用日期优先提供快捷项。

反模式 ​

  • 未经说明就预先选择今天。
  • 让浮层遮挡当前输入值。
  • 用多选模拟区间:中间的日期不会自动补齐,也没有拖选与预览。

API 参考 ​

产物 ​

层值
自定义元素<xh-date-picker>
Vue 组件XhDatePickerCalendar XhDatePickerCell XhDatePickerCellTrigger XhDatePickerClearTrigger XhDatePickerConfirmTrigger XhDatePickerContent XhDatePickerControl XhDatePickerGrid XhDatePickerGridBody XhDatePickerGridHead XhDatePickerHeader XhDatePickerHeading XhDatePickerHeadingMonthTrigger XhDatePickerHeadingYearTrigger XhDatePickerHiddenInput XhDatePickerLabel XhDatePickerNextTrigger XhDatePickerNextYearTrigger XhDatePickerPositioner XhDatePickerPreset XhDatePickerPresetGroup XhDatePickerPrevTrigger XhDatePickerPrevYearTrigger XhDatePickerRoot XhDatePickerSegment XhDatePickerSegmentGroup XhDatePickerTimePanel XhDatePickerTrigger XhDatePickerWeekDay XhDatePickerWeekNumber XhDatePickerWeekRow
组合式函数useDatePicker
状态机datePickerMachine
皮肤@xihan-ui/styles/date-picker.css

Props ​

属性类型必填说明
valuestring | string[]选中值,ISO 串。提供即受控:读取直取 prop,写入只发 onValueChange 不落内部值。 单选可写裸串,内部一律归一为数组。
defaultValuestring | string[]
openboolean展开态。提供即受控:内部不再自行修改,只发 onOpenChange。
defaultOpenboolean
minstring可选范围下界(含当天),ISO 串。日历与分段输入共用这一条。
maxstring可选范围上界(含当天),ISO 串。
localestring决定周首日、月份文案与段位先后(zh-CN 年月日、en-US 月日年)。 未提供时按宿主语言,宿主也没有时按 en-US。
timeZonestring判定今天与格式化文案使用的时区,默认取宿主本地时区。
selectionModeCalendarPickerSelectionMode选择模式,默认 single。区间选择是另一个组件(日期范围选择器)。
isDateUnavailable(value: string) => boolean不可用判定,接收 ISO 串。界外与判定为真的日期同等处理。
disabledboolean整个控件禁用:trigger 为原生 disabled,段位退出 Tab 序列,日历格子全部为 aria-disabled。
readOnlyboolean只读:浮层照常展开、日历照常翻月浏览,但选中值不可修改。
invalidboolean校验失败:段位报告 aria-invalid,各角色节点带 data-invalid。 未提供时也会自行判定:已填齐但越界。
requiredboolean必填标注,写入每一段的 aria-required。
namestring表单字段名;提供后隐藏输入才带 name,ISO 串随表单一并提交。
granularityCalendarGranularity选择粒度;与 selectionMode 正交。输入行与周期网格都由它决定。
activeViewCalendarView面板当前所在的层级。提供即受控;未提供时跟随 granularity,每次展开都回到目标粒度。 点击标题中的年 / 月会修改它。 没有配套的 defaultActiveView:面板每次展开都会重置该档,非受控初值没有生效时刻, 提供后也观察不到任何效果。修改初始层级使用 granularity。
segmentsDateSegmentSet输入行铺设的段。未提供时按 granularity 推导:按周为「2026-33」、按月为「2026-05」、 按季度为「2026-Q2」、按年为「2026」,按天则按 locale 排列年月日。
presetsDatePickerPreset[]快捷选项(「今天」「明天」等)。提供后浮层中多出一列,点击即整份写入选中值。 日期需计算后传入:连接层每帧求值,把 today() 放进渲染期会跨零点得出两个结果。 与 selectionMode 不匹配(单选提供了多条)、落在 min / max 之外或被 isDateUnavailable 判定不可用的选项 自动不可按下;showTime 下写入的日期附带当前已选的时间。
visibleCountnumber展示的连续日历面板数;默认 1。
fixedWeeksboolean日历恒渲染六行,默认开启。关闭后网格按当月实际周数收缩,翻页时浮层高度随之变化。
defaultFocusedValuestring初始聚焦日,ISO 串;同时决定展开时先落在哪一页。 未提供时回退为首个选中值,再回退为今天。表单重置回到该值。
variantControlVariant形态:outline / subtle / ghost,决定输入行的描边与底色使用方式。默认 outline。
toneTone语气:brand / neutral / success / warning / danger / info,决定聚焦与选中强调使用哪族颜色。
sizeSize尺寸:sm / md / lg,输入行与浮层中的日历格一并换档。
placementPlacement
dirDirection文字方向,默认 ltr。只改写浮层在行内轴上 start 与 end 的落点。
offsetnumber
translationsPartial<DatePickerTranslations>
closeOnSelectboolean选完即收起,默认 true。多选不收起。
showTimeboolean一体化时间:值升格为 'YYYY-MM-DDTHH:mm[:ss]',面板中多出时间列, 选完日期不收起、由确认按钮收口。只在 day + single 下生效。
timeGranularityDatePickerTimeGranularityshowTime 的时间段精度,默认 minute。
onValueChange(details: DatePickerValueChangeDetails) => voidvalue 变化意图回调;受控时是唯一出口,非受控时随内部写入一并通知。
onOpenChange(details: DatePickerOpenChangeDetails) => voidopen 变化意图回调;受控时是唯一出口,非受控时随内部转移一并通知。
onFocusedValueChange(details: DatePickerFocusChangeDetails) => void聚焦日变化(方向键、翻月、展开、段位输入都会发出)。 网格由外部渲染,不监听该事件时日历不会换月。
onActiveViewChange(details: CalendarViewChangeDetails) => void面板所在层级变化(点击标题向上、点击格子向下都会发出);受控时是唯一出口。

DatePickerPreset ​

presets 的元素。

字段类型必填说明
valuestring是
labelstring是显示文案,同时是该项的可及名。
disabledboolean禁用该项:方向键仍可停留,但按下不写值。

事件 ​

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

事件载荷说明
value-changeDatePickerValueChangeDetails选中集合变化;detail 为 { value: string[] }
open-changeDatePickerOpenChangeDetailsopen 状态变化;detail 为 { open: boolean }
focused-value-changeDatePickerFocusChangeDetails聚焦日变化(展示月可能随之变化);detail 为 { focusedValue: string },作者据此重绘网格
active-view-changeCalendarViewChangeDetails切换到另一层级(点击标题向上、点击格子向下);detail 为 { activeView: 'day'|'week'|'month'|'quarter'|'year' },作者据此重绘网格

插槽 ​

仅列出带载荷的插槽。

Vue 组件插槽载荷说明
XhDatePickerPresetdefault—条目内容;未写时使用数据中的 label。
XhDatePickerPresetGroupdefaultDatePickerPresetsSlotProps自行铺设条目;未写时按 presets 数据自动铺设,两者产出的 DOM 一致。
XhDatePickerRootdefaultDatePickerRootSlotProps
XhDatePickerSegmentdefaultDatePickerSegmentSlotProps

React 适配器 props ​

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

React 组件属性类型必填说明
XhDatePickerCalendarindexnumber | string并排的第几张面板,默认 0。写在这里,面板内的标题、网格与格子就不必各写一遍。
XhDatePickerCellvaluestring是ISO 日期串。
XhDatePickerCellindexnumber | string属于第几个面板;未写时跟随所在的日历。同一天会同时出现在两个面板中 (8 月末的几天也铺在 9 月的首行),是否为本月只有连同面板一起看才能判定。
XhDatePickerGridindexnumber | string属于第几个面板;未写时跟随所在的日历。
XhDatePickerHeadingindexnumber | string属于第几个面板;未写时跟随所在的日历。
XhDatePickerHeadingMonthTriggerindexnumber | string属于第几个面板;未写时跟随所在的日历。
XhDatePickerHeadingYearTriggerindexnumber | string属于第几个面板;未写时跟随所在的日历。
XhDatePickerPositionercontainer() => Element | null浮层挂载的容器;未提供时按全局配置,再未提供时挂载到 body。
XhDatePickerPresetvaluestring是该条目的身份,与 presets 数据中的 value 逐字对应。
XhDatePickerPresetGroupchildrenSlotChildren<DatePickerPresetsSlotProps>自行铺设条目;未写时按 presets 数据自动铺设,两者产出的 DOM 一致。
XhDatePickerRootchildrenSlotChildren<DatePickerRootSlotProps>
XhDatePickerSegmentindexnumber | string段位下标,兼收字符串。
XhDatePickerSegmentsegmentDateSegmentType按段名声明该格。段集中没有该段时它收起;与 index 二选一,两个都写时按段名计算。
XhDatePickerSegmentchildrenSlotChildren<DatePickerSegmentSlotProps>
XhDatePickerWeekDayvaluenumber | string是列序 0-6,兼收字符串。
XhDatePickerWeekNumbervaluestring是该行行首那一天的 ISO 串。

状态 ​

公开状态写入 data-state。

部件取值
root'open' | 'closed'
control'open' | 'closed'
trigger'open' | 'closed'
positioner'open' | 'closed'
content'open' | 'closed'
preset'checked' | 'unchecked'
calendar'open' | 'closed'
time-item'checked' | 'unchecked'

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

状态:open · closed

事件:OPEN · TOGGLE · CLOSE · CONTROLLED.OPEN · CONTROLLED.CLOSE · VALUE.SET · VALUE.CLEAR · FOCUSED.SET · VIEW.SET · FORM.RESET · PRESS.START · PRESS.END

判据:isOpenControlled · closesOnSelect · canPress

connect API ​

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

成员类型说明
openboolean
valuestring[]选中集合,ISO 串;形状不随模式变化。
valueAsStringstring | null首个选中值;无选中时为 null。
selectionModeCalendarPickerSelectionMode
periodValueCalendarPeriodValue | nullsingle 的规范化周期值;multiple 没有连续区间语义,返回 null。
focusedValuestring生效聚焦日(三路收口后的结果),恒非空。日历展示哪个月由它决定。
granularityCalendarGranularity作者选择的粒度。
activeViewCalendarView面板当前所在的层级。
disabledboolean
readOnlyboolean
invalidboolean校验失败:作者标记的或越界。
canClearboolean清空按钮当前是否可按。
setOpen(next: boolean) => void
setValue(next: string[]) => void
clear() => void
setActiveView(next: CalendarView) => void直接切换到某一层级。
presetsreadonly DatePickerPresetState[]快捷选项逐条的状态,数据顺序。未提供 presets 时为空数组。
showTimebooleanshowTime 生效(已开启且为单选模式)。
timeColumnsreadonly TimePickerColumn<DatePickerTimeUnit>[]时间列(时 / 分[/ 秒]);未开启 showTime 时为空数组。
timeValuestring | null当前时间段('HH:mm[:ss]');尚无值时为 null。
calendarCalendarPickerApi<T>内嵌日历:选日期、翻月、键盘导航都在它身上。
fieldDatePickerFieldApi<T>内嵌分段输入。
getRootProps() => T['element']
getLabelProps() => T['element']
getControlProps() => T['element']
getSegmentGroupProps() => T['element']role=group 的分段容器,段位挂在其中。
getTriggerProps() => T['button']
getClearTriggerProps() => T['button']
getPositionerProps() => T['element']
getContentProps() => T['element']
getPresetGroupProps() => T['element']快捷选项列(role=listbox);未提供 presets 时带 hidden。
getPresetProps(props: DatePickerPresetProps) => T['element']一条快捷选项(role=option):点击把整份日期写入选中值。
getCalendarProps() => T['element']内嵌日历的挂载点,同时充当日历的根节点。
getTimeColumnProps(props: DatePickerTimeColumnProps) => T['element']时间列容器(时 / 分[/ 秒]各一列);未开启 showTime 时带 hidden。
getTimeItemProps(props: DatePickerTimeItemProps) => T['element']时间选项:点击把该单位写入值(没有日期时以聚焦日作为日期段起值)。
getConfirmTriggerProps() => T['button']确认按钮:showTime 的收口;未开启 showTime 时带 hidden。

无障碍 ​

键盘 ​

规格出处:W3C APG

按键生效条件行为
Enter / Spacefocus in trigger, closed展开日历浮层,焦点落到当前聚焦日那一格
Enter / Spacefocus in trigger, open收起浮层,焦点回到 trigger
Escapeopen收起浮层并把焦点还给展开前那个控件(通常是 trigger),选中值不变
Tab / Shift+Tabopen不拦按键:焦点按 Tab 序列自然离开,浮层随即收起且不抢回焦点
Enter / Spaceopen, focus in grid选中聚焦日(由日历完成);closeOnSelect 时收起浮层,多选不收起
ArrowUp / ArrowDown / Home / Endopen, focus in 快捷选项列在快捷选项之间移动焦点,到头回绕;不写值
Enter / Spaceopen, focus in 某条快捷选项把这条快捷选项整份写进选中值;closeOnSelect 时收起浮层
Alt+ArrowDownfocus in 某一段, closed, not disabled展开浮层并把焦点移入;触发按钮是可选部件,键盘入口不能只挂在它上面
Enterfocus in 某一段, open收起浮层。段位里敲出来的值不触发「选完即收」(那时人还在打字),这是那条路的收口手势
Enter / Spaceheld on trigger / confirm-trigger(not disabled)、clear-trigger(可清)、preset 或 time-item(open, not disabled/readOnly, 该条可按)按住期间该部件投影 data-pressed,与指针 :active 同一副按压面;抬起或失焦撤下,浮层收起时一并撤下。日历里的部件由 calendar-picker 自己投影

ARIA ​

以下属性由 connect 生成。

部件属性值
segment-grouparia-disabled'true' | 'false'
segment-grouparia-labelledbylabel 部件的 id
segment-grouprole'group'
triggeraria-controlscontent 部件的 id
triggeraria-expanded'true' | 'false'
triggeraria-haspopup'dialog'
triggeraria-labelledbylabel 部件的 id
clear-triggeraria-labellabel.clearTrigger
contentaria-hidden!open || undefined
contentaria-labelledbylabel 部件的 id
contentaria-modal'false'
contentrole'dialog'
preset-grouparia-disabled'true' | 'false'
preset-grouparia-labellabel.presets
preset-grouparia-multiselectable'false'
preset-grouparia-orientation'vertical'
preset-grouprole'listbox'
presetaria-disabled'true' | 'false'
presetaria-selected'true' | 'false'
presetrole'option'
time-columnaria-disabled'true' | 'false'
time-columnaria-labellabel[unit]
time-columnaria-multiselectable'false'
time-columnaria-orientation'vertical'
time-columnrole'listbox'
time-itemaria-selected'true' | 'false'
time-itemrole'option'

样式参考 ​

皮肤 ​

@xihan-ui/styles/date-picker.css 使用 [data-scope="date-picker"][data-part="root"] 部件选择器,位于 xihan.components 与 xihan.motion 层。覆盖样式使用 xihan.overrides。

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

数据属性 ​

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

部件属性值
rootdata-disabled''(条件成立时才出现)
rootdata-invalid''(条件成立时才出现)
rootdata-readonly''(条件成立时才出现)
rootdata-sizeprops.size
rootdata-state'open' | 'closed'
rootdata-toneprops.tone
rootdata-variantprops.variant
labeldata-disabled''(条件成立时才出现)
controldata-disabled''(条件成立时才出现)
controldata-invalid''(条件成立时才出现)
controldata-readonly''(条件成立时才出现)
controldata-state'open' | 'closed'
controldata-variantprops.variant
controldata-xh-field-chrome''
controldata-xh-field-sizeprops.size
segment-groupdata-complete''(条件成立时才出现)
segment-groupdata-disabled''(条件成立时才出现)
segment-groupdata-empty''(条件成立时才出现)
segment-groupdata-invalid''(条件成立时才出现)
segment-groupdata-out-of-range''(条件成立时才出现)
segment-groupdata-readonly''(条件成立时才出现)
triggerdata-disabled''(条件成立时才出现)
triggerdata-pressed''(条件成立时才出现)
triggerdata-state'open' | 'closed'
triggerdata-xh-action-control''
triggerdata-xh-action-display'always'
triggerdata-xh-action-profile'field-inset'
triggerdata-xh-action-sizeprops.size
triggerdata-xh-action-variant'ghost'
clear-triggerdata-pressed''(条件成立时才出现)
clear-triggerdata-xh-action-control''
clear-triggerdata-xh-action-display'has-value'
clear-triggerdata-xh-action-has-value''(条件成立时才出现)
clear-triggerdata-xh-action-profile'field-inset'
clear-triggerdata-xh-action-sizeprops.size
clear-triggerdata-xh-action-variant'ghost'
positionerdata-hidden''(条件成立时才出现)
positionerdata-placement定位引擎算出的实际落位
positionerdata-positioned''(条件成立时才出现)
positionerdata-sizeprops.size
positionerdata-state'open' | 'closed'
positionerdata-toneprops.tone
positionerdata-variantprops.variant
contentdata-placement定位引擎算出的实际落位
contentdata-state'open' | 'closed'
presetdata-disabled''(条件成立时才出现)
presetdata-pressed''(条件成立时才出现)
presetdata-state'checked' | 'unchecked'
presetdata-valuev
presetdata-xh-collection-context'overlay'
presetdata-xh-collection-item''
presetdata-xh-collection-sizeprops.size
calendardata-disabled''(条件成立时才出现)
calendardata-readonly''(条件成立时才出现)
calendardata-state'open' | 'closed'
time-columndata-unitlive[at]!.getAttribute('data-unit') as DatePickerTime…
time-itemdata-pressed''(条件成立时才出现)
time-itemdata-state'checked' | 'unchecked'
time-itemdata-unitlive[at]!.getAttribute('data-unit') as DatePickerTime…
time-itemdata-valuev
time-itemdata-xh-collection-context'overlay'
time-itemdata-xh-collection-item''
time-itemdata-xh-collection-sizeprops.size
confirm-triggerdata-pressed''(条件成立时才出现)
confirm-triggerdata-xh-action-control''
confirm-triggerdata-xh-action-display'always'
confirm-triggerdata-xh-action-profile'text'
confirm-triggerdata-xh-action-size'sm'
confirm-triggerdata-xh-action-variant'solid'
confirm-triggerdata-xh-ink-surface''

CSS 变量 ​

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

变量部件CSS 属性状态默认来源说明
--xh-date-picker-action-bgclear-trigger
trigger
--xh-ink-surface
background-color
default
xh-ink-surface
--xh-_action-variant-bg-restdate-picker 的 clear-trigger、trigger 部件 --xh-ink-surface、background-color 覆盖槽。
--xh-date-picker-action-bg-activeclear-trigger
trigger
background-colordisabled
is(:active, [data-pressed])
loading
not([data-disabled])
not([data-loading])
pressed
--xh-_action-variant-bg-presseddate-picker 的 clear-trigger、trigger 部件 background-color 覆盖槽。
--xh-date-picker-action-bg-hoverclear-trigger
trigger
--xh-ink-surface
background-color
disabled
hover
loading
not([data-disabled])
not([data-loading])
state=open
xh-ink-surface
--xh-_action-variant-bg-hoverdate-picker 的 clear-trigger、trigger 部件 --xh-ink-surface、background-color 覆盖槽。
--xh-date-picker-action-fgclear-trigger
trigger
colordefault--xh-fg-muteddate-picker 的 clear-trigger、trigger 部件 color 覆盖槽。
--xh-date-picker-action-fg-hoverclear-trigger
trigger
colordisabled
hover
loading
not([data-disabled])
not([data-loading])
state=open
--xh-fg-defaultdate-picker 的 clear-trigger、trigger 部件 color 覆盖槽。
--xh-date-picker-action-font-sizeclear-trigger
trigger
font-sizedefault--xh-text-secondary-sizedate-picker 的 clear-trigger、trigger 部件 font-size 覆盖槽。
--xh-date-picker-action-radiusclear-trigger
trigger
border-radiusdefault--xh-shape-insetdate-picker 的 clear-trigger、trigger 部件 border-radius 覆盖槽。
--xh-date-picker-action-sizeclear-trigger
trigger
block-size
inline-size
min-inline-size
default
xh-action-profile=field-inset
--xh-_action-profile-visual-sizedate-picker 的 clear-trigger、trigger 部件 block-size、inline-size、min-inline-size 覆盖槽。
--xh-date-picker-calendar-gapcalendar
time-column
gap
margin-block-start
default--xh-space-2date-picker 的 calendar、time-column 部件 gap、margin-block-start 覆盖槽。
--xh-date-picker-column-dividercalendar
preset-group
time-column
background
border-block-end
border-inline-end
border-inline-start
@media (min-width: 768px)
default
has(+ [data-part='time-column'])
--xh-material-frosted-separatordate-picker 的 calendar、preset-group、time-column 部件 background、border-block-end、border-inline-end、border-inline-start 覆盖槽。
--xh-date-picker-confirm-trigger-bgconfirm-trigger--xh-ink-surface
background-color
default
xh-ink-surface
--xh-_action-variant-bg-restdate-picker 的 confirm-trigger 部件 --xh-ink-surface、background-color 覆盖槽。
--xh-date-picker-confirm-trigger-bg-activeconfirm-triggerbackground-colordisabled
is(:active, [data-pressed])
loading
not([data-disabled])
not([data-loading])
pressed
--xh-_action-variant-bg-presseddate-picker 的 confirm-trigger 部件 background-color 覆盖槽。
--xh-date-picker-confirm-trigger-bg-hoverconfirm-triggerbackground-colordisabled
hover
loading
not([data-disabled])
not([data-loading])
--xh-_action-variant-bg-hoverdate-picker 的 confirm-trigger 部件 background-color 覆盖槽。
--xh-date-picker-confirm-trigger-fgconfirm-triggercolordefault
disabled
hover
is(:active, [data-pressed])
loading
not([data-disabled])
not([data-loading])
pressed
--xh-_action-variant-fg-hover
--xh-_action-variant-fg-pressed
--xh-_action-variant-fg-rest
date-picker 的 confirm-trigger 部件 color 覆盖槽。
--xh-date-picker-confirm-trigger-hconfirm-triggerblock-size
inline-size
default
xh-action-profile=field-inset
--xh-_action-profile-visual-sizedate-picker 的 confirm-trigger 部件 block-size、inline-size 覆盖槽。
--xh-date-picker-confirm-trigger-pxconfirm-triggerpadding-inlinedefault--xh-_action-profile-padding-inlinedate-picker 的 confirm-trigger 部件 padding-inline 覆盖槽。
--xh-date-picker-confirm-trigger-radiusconfirm-triggerborder-radiusdefault--xh-shape-controldate-picker 的 confirm-trigger 部件 border-radius 覆盖槽。
--xh-date-picker-confirm-trigger-shadowconfirm-triggerbox-shadowdefault
disabled
hover
is(:active, [data-pressed])
loading
not([data-disabled])
not([data-loading])
pressed
nonedate-picker 的 confirm-trigger 部件 box-shadow 覆盖槽。
--xh-date-picker-content-bgcontentbackgrounddefault--xh-bg-surfacedate-picker 的 content 部件 background 覆盖槽。
--xh-date-picker-content-bordercontentborderdefault--xh-border-defaultdate-picker 的 content 部件 border 覆盖槽。
--xh-date-picker-content-fgcontentcolordefault--xh-fg-defaultdate-picker 的 content 部件 color 覆盖槽。
--xh-date-picker-content-pxcontentpadding-inline@media not all and (min-width: 768px)
default
--xh-space-2date-picker 的 content 部件 padding-inline 覆盖槽。
--xh-date-picker-content-pycontentpadding-blockdefault--xh-space-2date-picker 的 content 部件 padding-block 覆盖槽。
--xh-date-picker-content-radiuscontentborder-radiusdefault--xh-shape-overlaydate-picker 的 content 部件 border-radius 覆盖槽。
--xh-date-picker-content-shadowcontentbox-shadowdefault--xh-elevation-floatingdate-picker 的 content 部件 box-shadow 覆盖槽。
--xh-date-picker-control-bgcontrolbackground-colorxh-field-chrome--xh-_field-variant-bg-restdate-picker 的 control 部件 background-color 覆盖槽。
--xh-date-picker-control-bg-disabledcontrolbackground-colordisabled
xh-field-chrome
--xh-_field-variant-bg-disableddate-picker 的 control 部件 background-color 覆盖槽。
--xh-date-picker-control-bg-hovercontrolbackground-colordisabled
hover
invalid
loading
not([data-disabled])
not([data-invalid])
not([data-loading])
not([data-readonly])
readonly
xh-field-chrome
--xh-_field-variant-bg-hoverdate-picker 的 control 部件 background-color 覆盖槽。
--xh-date-picker-control-bg-readonlycontrolbackground-colorreadonly
xh-field-chrome
--xh-_field-variant-bg-read-onlydate-picker 的 control 部件 background-color 覆盖槽。
--xh-date-picker-control-bordercontrolborderxh-field-chrome--xh-_field-variant-border-restdate-picker 的 control 部件 border 覆盖槽。
--xh-date-picker-control-border-focuscontrolborder-colordisabled
focus-within
not([data-disabled])
xh-field-chrome
--xh-_field-variant-border-focusdate-picker 的 control 部件 border-color 覆盖槽。
--xh-date-picker-control-border-hovercontrolborder-colordisabled
hover
invalid
loading
not([data-disabled])
not([data-invalid])
not([data-loading])
not([data-readonly])
readonly
xh-field-chrome
--xh-_field-variant-border-hoverdate-picker 的 control 部件 border-color 覆盖槽。
--xh-date-picker-control-border-invalidcontrolborder-colorinvalid
xh-field-chrome
--xh-_field-variant-border-invaliddate-picker 的 control 部件 border-color 覆盖槽。
--xh-date-picker-control-fgcontrolcolorxh-field-chrome--xh-fg-defaultdate-picker 的 control 部件 color 覆盖槽。
--xh-date-picker-control-gapcontrolgapxh-field-chrome--xh-_date-picker-gapdate-picker 的 control 部件 gap 覆盖槽。
--xh-date-picker-control-hcontrolblock-size
min-block-size
has([data-xh-field-input][data-xh-field-layout='multi-tag'])
has([data-xh-field-input][data-xh-field-layout='single-line'])
has([data-xh-field-input][data-xh-field-layout='textarea'])
xh-field-chrome
xh-field-input
xh-field-layout=multi-tag
xh-field-layout=single-line
xh-field-layout=textarea
--xh-_date-picker-control-hdate-picker 的 control 部件 block-size、min-block-size 覆盖槽。
--xh-date-picker-control-min-wcontrol
root
min-inline-sizedefault
xh-field-chrome
--xh-control-min-wdate-picker 的 control、root 部件 min-inline-size 覆盖槽。
--xh-date-picker-control-pxcontrolpadding-inlinexh-field-chrome--xh-_date-picker-control-pxdate-picker 的 control 部件 padding-inline 覆盖槽。
--xh-date-picker-control-radiuscontrolborder-radiusxh-field-chrome--xh-shape-controldate-picker 的 control 部件 border-radius 覆盖槽。
--xh-date-picker-control-shadowcontrolbox-shadowxh-field-chromenonedate-picker 的 control 部件 box-shadow 覆盖槽。
--xh-date-picker-control-wrootinline-size
min-inline-size
default--xh-control-wdate-picker 的 root 部件 inline-size、min-inline-size 覆盖槽。
--xh-date-picker-font-sizesegment-groupfont-sizedefault--xh-_date-picker-font-sizedate-picker 的 segment-group 部件 font-size 覆盖槽。
--xh-date-picker-gaprootgapdefault--xh-space-1date-picker 的 root 部件 gap 覆盖槽。
--xh-date-picker-icon-sizecontrol
positioner
root
--xh-icon-sizedefault
is([data-part='root'], [data-part='positioner'])
size=lg
size=sm
xh-field-chrome
--xh-_field-size-glyph-size
--xh-glyph-size-lg
--xh-glyph-size-md
--xh-glyph-size-sm
date-picker 的 control、positioner、root 部件 --xh-icon-size 覆盖槽。
--xh-date-picker-label-fglabelcolordefault--xh-fg-defaultdate-picker 的 label 部件 color 覆盖槽。
--xh-date-picker-label-fg-disabledlabelcolordisabled--xh-fg-subtledate-picker 的 label 部件 color 覆盖槽。
--xh-date-picker-label-font-sizelabelfont-sizedefault--xh-text-label-sizedate-picker 的 label 部件 font-size 覆盖槽。
--xh-date-picker-label-font-weightlabelfont-weightdefault--xh-text-label-weightdate-picker 的 label 部件 font-weight 覆盖槽。
--xh-date-picker-layerpositionerz-indexdefault--xh-_layerdate-picker 的 positioner 部件 z-index 覆盖槽。
--xh-date-picker-literal-fgsegment-groupcolornot([data-scope])--xh-fg-subtledate-picker 的 segment-group 部件 color 覆盖槽。
--xh-date-picker-max-hcontentmax-block-sizedefault--xh-viewport-h-lgdate-picker 的 content 部件 max-block-size 覆盖槽。
--xh-date-picker-panel-dividercalendarborder-block-start
border-inline-start
@media (min-width: 768px)
default
--xh-material-frosted-separatordate-picker 的 calendar 部件 border-block-start、border-inline-start 覆盖槽。
--xh-date-picker-panel-gapcalendar
preset-group
padding-block-start
padding-inline-start
@media (min-width: 768px)
default
--xh-space-3date-picker 的 calendar、preset-group 部件 padding-block-start、padding-inline-start 覆盖槽。
--xh-date-picker-preset-bg-hoverpresetbackground-colordisabled
error
highlighted
hover
is(:focus-visible, [data-highlighted])
is([aria-selected='true'], [data-selected])
not([aria-disabled='true'], [data-disabled], [aria-busy='true'], [data-error])
selected
xh-collection-context=overlay
--xh-bg-subtledate-picker 的 preset 部件 background-color 覆盖槽。
--xh-date-picker-preset-bg-pressedpresetbackground-colordisabled
error
is(:active, [data-pressed])
is([aria-selected='true'], [data-selected])
not([aria-disabled='true'], [data-disabled], [aria-busy='true'], [data-error])
pressed
selected
xh-collection-context=overlay
--xh-bg-subtle-hoverdate-picker 的 preset 部件 background-color 覆盖槽。
--xh-date-picker-preset-check-fgpresetbackground-colordefault--xh-_date-picker-check-fgdate-picker 的 preset 部件 background-color 覆盖槽。
--xh-date-picker-preset-check-sizepresetblock-size
inline-size
padding-inline-end
default--xh-glyph-size-smdate-picker 的 preset 部件 block-size、inline-size、padding-inline-end 覆盖槽。
--xh-date-picker-preset-fg-disabledpresetbackground-color
color
default
disabled
--xh-fg-disableddate-picker 的 preset 部件 background-color、color 覆盖槽。
--xh-date-picker-preset-fg-selectedpresetcolordisabled
error
highlighted
hover
is(:active, [data-pressed])
is(:focus-visible, [data-highlighted])
is([aria-selected='true'], [data-selected])
not([aria-disabled='true'], [data-disabled], [aria-busy='true'], [data-error])
pressed
selected
xh-collection-context=overlay
--xh-fg-defaultdate-picker 的 preset 部件 color 覆盖槽。
--xh-date-picker-preset-group-gappreset-groupgapdefault--xh-list-option-gapdate-picker 的 preset-group 部件 gap 覆盖槽。
--xh-date-picker-preset-group-hpreset-groupmax-block-sizedefault--xh-viewport-h-lgdate-picker 的 preset-group 部件 max-block-size 覆盖槽。
--xh-date-picker-preset-group-paddingpreset-grouppaddingdefault--xh-space-1date-picker 的 preset-group 部件 padding 覆盖槽。
--xh-date-picker-preset-pxpresetinset-inline-end
padding-inline
padding-inline-end
default--xh-space-3date-picker 的 preset 部件 inset-inline-end、padding-inline、padding-inline-end 覆盖槽。
--xh-date-picker-preset-pypresetpadding-blockdefault--xh-space-1date-picker 的 preset 部件 padding-block 覆盖槽。
--xh-date-picker-preset-radiuspresetborder-radiusdefault--xh-shape-controldate-picker 的 preset 部件 border-radius 覆盖槽。
--xh-date-picker-time-column-gaptime-columngapdefault0date-picker 的 time-column 部件 gap 覆盖槽。
--xh-date-picker-time-column-htime-columnblock-sizedefault--xh-viewport-h-mddate-picker 的 time-column 部件 block-size 覆盖槽。
--xh-date-picker-time-column-min-wtime-columnmin-inline-sizedefault--xh-overlay-column-min-wdate-picker 的 time-column 部件 min-inline-size 覆盖槽。
--xh-date-picker-time-column-min-w-mobiletime-columnmin-inline-size@media not all and (min-width: 768px)2.75remdate-picker 的 time-column 部件 min-inline-size 覆盖槽。
--xh-date-picker-time-column-offsettime-columnmargin-block-startdefault--xh-control-h-smdate-picker 的 time-column 部件 margin-block-start 覆盖槽。
--xh-date-picker-time-column-paddingtime-columnpadding-blockdefault--xh-space-1date-picker 的 time-column 部件 padding-block 覆盖槽。
--xh-date-picker-time-column-pxtime-columnpadding-inlinedefault0date-picker 的 time-column 部件 padding-inline 覆盖槽。
--xh-date-picker-time-column-px-mobiletime-columnpadding-inline@media not all and (min-width: 768px)0date-picker 的 time-column 部件 padding-inline 覆盖槽。
--xh-date-picker-time-item-bg-hovertime-itembackground-colordisabled
error
highlighted
hover
is(:focus-visible, [data-highlighted])
is([aria-selected='true'], [data-selected])
not([aria-disabled='true'], [data-disabled], [aria-busy='true'], [data-error])
selected
xh-collection-context=overlay
--xh-bg-subtledate-picker 的 time-item 部件 background-color 覆盖槽。
--xh-date-picker-time-item-bg-pressedtime-itembackground-colordisabled
error
is(:active, [data-pressed])
is([aria-selected='true'], [data-selected])
not([aria-disabled='true'], [data-disabled], [aria-busy='true'], [data-error])
pressed
selected
xh-collection-context=overlay
--xh-bg-subtle-hoverdate-picker 的 time-item 部件 background-color 覆盖槽。
--xh-date-picker-time-item-check-fgtime-itembackground-colordefault--xh-_date-picker-check-fgdate-picker 的 time-item 部件 background-color 覆盖槽。
--xh-date-picker-time-item-check-sizetime-itemblock-size
inline-size
inset-inline-end
padding-inline
@media not all and (min-width: 768px)
default
--xh-_date-picker-time-item-check-sizedate-picker 的 time-item 部件 block-size、inline-size、inset-inline-end、padding-inline 覆盖槽。
--xh-date-picker-time-item-fgtime-itemcolordefault
disabled
error
highlighted
hover
is(:active, [data-pressed])
is(:focus-visible, [data-highlighted])
is([aria-selected='true'], [data-selected])
not([aria-disabled='true'], [data-disabled], [aria-busy='true'], [data-error])
pressed
selected
xh-collection-context=overlay
--xh-material-frosted-fgdate-picker 的 time-item 部件 color 覆盖槽。
--xh-date-picker-time-item-fg-selectedtime-itemcolordisabled
error
highlighted
hover
is(:active, [data-pressed])
is(:focus-visible, [data-highlighted])
is([aria-selected='true'], [data-selected])
not([aria-disabled='true'], [data-disabled], [aria-busy='true'], [data-error])
pressed
selected
xh-collection-context=overlay
--xh-date-picker-time-item-fgdate-picker 的 time-item 部件 color 覆盖槽。
--xh-date-picker-time-item-font-weight-selectedtime-itemfont-weightdisabled
error
highlighted
hover
is(:active, [data-pressed])
is(:focus-visible, [data-highlighted])
is([aria-selected='true'], [data-selected])
not([aria-disabled='true'], [data-disabled], [aria-busy='true'], [data-error])
pressed
selected
xh-collection-context=overlay
--xh-font-weight-regulardate-picker 的 time-item 部件 font-weight 覆盖槽。
--xh-date-picker-time-item-htime-itemblock-sizedefault--xh-control-h-smdate-picker 的 time-item 部件 block-size 覆盖槽。
--xh-date-picker-time-item-pxtime-iteminset-inline-end
padding-inline
default--xh-space-0_5date-picker 的 time-item 部件 inset-inline-end、padding-inline 覆盖槽。
--xh-date-picker-time-item-pytime-itempadding-blockdefault0date-picker 的 time-item 部件 padding-block 覆盖槽。
--xh-date-picker-time-item-radiustime-itemborder-radiusdefault--xh-shape-controldate-picker 的 time-item 部件 border-radius 覆盖槽。

动效 ​

动效角色:按压 · 状态 · 出现(锚定列表)(见动效规范)。

共享关键帧 xh-overlay-slide-in · xh-overlay-slide-out 由 family/motion.css 提供,皮肤 @import 它,单独引入仍成立;opacity 走 transition 过渡。时长与缓动读动效令牌,改令牌即改全局节奏。

皮肤之外还有一段:退场由适配器的退场闸门把关,动画播完才真收起。

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

响应式 ​

皮肤按视口分档:min-width: 768px。

RTL ​

皮肤用逻辑属性排布(inline-start 一族),dir="rtl" 下自动镜像。

Released under The MIT License