跳转到内容

TimeRangePicker 时间范围选择器 new

将起止两组可键入的分段时间框、范围分隔符、时钟触发器和两组并排的分列选择浮层组合成一个字段。

用法

起止两组输入框与两组选择面板共享同一份值;按 15 分钟列出选项并实时显示结果

09:00
18:00
当前值:09:00 → 18:00

组件结构

加粗的是必需部件。

data-scope="time-range-picker"root · label · control · segment-group · segment · range-separator · trigger · clear-trigger · positioner · content · preset-group · preset · column-group · column-group-label · column · item · hidden-input

示例

可选时段

min/max 与另一端边界把界外格标为禁用,两组列的结构与滚动位置保持稳定

10:00
--:--
当前值:(未填齐)

快捷选项

presets 在两组列旁边多排一列,点击一条即把两端整份写入值并收起

--:--
--:--
当前值:(未填齐)

逐格判定

isTimeUnavailable 收到值、列与端,起点只能整点开始、终点只能半点结束

--:--
--:--
当前值:(未填齐)

十二小时制

hourCycle 决定两组段位与时列的写法,上下午各成一段一列

09:00上午
05:30下午
当前值:09:00 → 17:30

设计指引

何时使用

  • 用户需要选择一段起止时间:营业时段、预约时段、会议起止。
  • 可选时间是离散的(每 15 分钟一档),或需要限制可选时段。

何时不用

特性

  • 值始终为区间两端 [start, end],按位存放:只填了终点时是 ['', 终点],受控回写按同一下标对应。
  • 起止各一组段位,range-separator 隔在中间;方向键换段不跨组,nameendName 各自决定两份隐藏输入是否参与提交。
  • 浮层内起止两组时间列并排,左右键跨组换列;选中一格只改对应端的段,浮层不收起。
  • 终点组以起点为下界、起点组以终点为上界:另一端填满后,界外的格留在原位并标为禁用,列高、滚动位置与焦点节点不跳。
  • step 分列设定各列的步长;min / maxisTimeUnavailable 只改变格子的可选性,第三个参数是哪一端。
  • presets 提供“上午”“全天”等整段快捷项,值使用 ISO 8601 的区间写法拼接两端,点击后两端整份写入值并收起。
  • 终点早于起点、任一端越界时整个字段标为不合法,也可以用 invalid 显式声明。
  • 触发器打开空值时焦点直接落到起点组的第一项;从输入段打开时继续保留键入焦点,展开后落到正在编辑一端的时间列。

组合

最佳实践

  • 使用明确的字段标签,两组段位各自报告“开始时间”“结束时间”。
  • 起止段组之间必须渲染 range-separator,不依赖空白区分两端。
  • 浮层内两组时间列各带一个小标题(column-group-label),便于分辨起点与终点。
  • 常用时段优先提供快捷项,时刻在 computed / memo 中计算后再传入。

反模式

  • 用两个时间选择器拼接一个区间:两端之间没有互相裁剪,也不校验先后顺序。
  • 步长设为 1 分钟:一列六十格,两组一百二十格,滚动过长。

API 参考

产物

自定义元素<xh-time-range-picker>
Vue 组件XhTimeRangePickerClearTrigger XhTimeRangePickerColumn XhTimeRangePickerColumnGroup XhTimeRangePickerColumnGroupLabel XhTimeRangePickerContent XhTimeRangePickerControl XhTimeRangePickerHiddenInput XhTimeRangePickerItem XhTimeRangePickerLabel XhTimeRangePickerPositioner XhTimeRangePickerPreset XhTimeRangePickerPresetGroup XhTimeRangePickerRangeSeparator XhTimeRangePickerRoot XhTimeRangePickerSegment XhTimeRangePickerSegmentGroup XhTimeRangePickerTrigger
组合式函数useTimeRangePicker
状态机timeRangePickerMachine
皮肤@xihan-ui/styles/time-range-picker.css

Props

属性类型必填说明
valuestring[]受控的区间两端 [start, end];空缺的一端用空串占位。提供即受控:cell 直读 prop,写入只发 onValueChange 不落内部值。
defaultValuestring[]
openboolean展开态。提供即受控:内部不再自行修改,只发 onOpenChange。
defaultOpenboolean
minstring下界(含)。把浮层中落在界外的选项标为禁用,并把已填的越界值标注出来(不改写它)。终点组还以起点为下界。
maxstring上界(含)。同上。起点组还以终点为上界。
localestringBCP 47 语言标记。决定上午 / 下午的文字,以及未显式提供 hourCycle 时的小时制。
hourCycleTimeHourCycle小时制。未提供时按 locale 推断,locale 也没有时使用 24。
granularityTimeGranularity值精确到哪一段,默认 minute。它同时决定两组分段输入各显示几段、浮层中各排几列。
stepnumber分列的步进(分钟),默认 1。只影响浮层中的可选值,不限制手动输入的分钟数。
presetsTimeRangePickerPreset[]快捷选项(「上午」「全天」等)。提供后浮层中多出一列,点击即两端整份写入值并收起。 时刻需计算后传入:连接层每帧求值,把当前时刻放进渲染期会每帧得出一个新结果。 无法解析、不是恰好两端、任一端落在 min / max 之外或终点早于起点的选项自动不可按下。
disabledboolean禁用:两组分段输入整组退出 Tab 序列、触发器使用原生 disabled,隐藏输入不参与提交。
readOnlyboolean只读:浮层照常展开、列表照常浏览,但值不可修改也不可清空。
invalidboolean校验失败标注。未提供时也会自行判定:任一端越界,或终点早于起点。
requiredboolean必填标注(写入每段的 aria-required)。
namestring起点隐藏输入的表单字段名;提供后才带 name。
endNamestring终点隐藏输入的表单字段名;未提供时终点不参与提交。
variantControlVariant形态:outline / subtle / ghost,决定输入行的描边与底色使用方式。默认 outline。
toneTone语气:brand / neutral / success / warning / danger / info,决定聚焦与选中强调使用哪族颜色。
sizeSize尺寸:sm / md / lg,输入行与浮层中的格子一并换档。
placementPlacement
dirDirection文字方向,默认 ltr。只改写浮层在行内轴上 start 与 end 的落点。
offsetnumber
isTimeUnavailable(value: string, unit: TimePickerColumnUnit, index: TimeRangePickerEndIndex) => boolean逐值可选性。接收两位补零的值、所属的列与端:同一个 '30' 在分钟列与秒列含义不同, 起点与终点也可以各有规则。与 min / max 的界外值同等处理:判定为真的格子仍可聚焦,只是不可选中。
translationsPartial<TimeRangePickerTranslations>段位与两端读屏名的覆盖;未提供时使用内置英文语义名。
onValueChange(details: TimeRangePickerValueChangeDetails) => voidvalue 变化意图回调;受控时是唯一出口,非受控时随内部写入一并通知。
onOpenChange(details: TimeRangePickerOpenChangeDetails) => voidopen 变化意图回调;受控时是唯一出口,非受控时随内部转移一并通知。

事件

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

事件载荷说明
value-changeTimeRangePickerValueChangeDetails两端变化;detail 为 { value: string[] },只填终点时为 ['', end]
open-changeTimeRangePickerOpenChangeDetailsopen 状态变化;detail 为 { open: boolean }

插槽

仅列出带载荷的插槽。

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

状态

公开状态写入 data-state

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

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

状态open · closed

事件OPEN · TOGGLE · CLOSE · CONTROLLED.OPEN · CONTROLLED.CLOSE · VALUE.SET · VALUE.CLEAR · SEGMENT.STEP · SEGMENT.DIGIT · SEGMENT.CLEAR · SEGMENT.PERIOD · SEGMENT.FOCUS · SEGMENT.BLUR · OPTION.FOCUS · ITEM.SELECT · FORM.RESET · PRESS.START · PRESS.END

判据isOpenControlled · canEdit · closesOnPreset · canPress

connect API

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

成员类型说明
openboolean
valuestring[]区间两端,按位存放;空缺的一端为空串,尾部的空缺裁掉。
startstring | null起点的 ISO 时间串;尚未填全时为 null。
endstring | null终点的 ISO 时间串;尚未填全时为 null。
emptyboolean两端都尚未填全。
outOfRangeboolean任一端已填全但落在 min / max 之外。只是标注,不改写值。
reversedboolean两端都已填全但终点早于起点。只是标注,不改写值。
disabledboolean
readOnlyboolean
invalidboolean与根节点的 data-invalid 同一口径:作者标记的、越界的、终点早于起点的都计入。
hourCycleTimeHourCycle实际生效的小时制(prop 未提供时由 locale 推断的值)。
granularityTimeGranularity
stepnumber实际生效的分列步进。
segmentsTimeSegmentType[]两组段位各自当前参与显示的段,文档序;两组相同。未列入的段由 connect 写上 hidden 收起。
focusedSegmentTimeRangePickerSegmentRef | null焦点所在的段;焦点在分段输入外时为 null。
columnGroupsreadonly [TimeRangePickerColumnGroup, TimeRangePickerColumnGroup]起止两组时列:每组应排列的稳定列及完整选项(已按 step 取样)。界外项由 isItemDisabled 标记,作者据此渲染浮层。
focusedColumnTimeRangePickerColumnRef | null
focusedItemstring | null
presetsreadonly TimeRangePickerPresetState[]快捷选项逐条的状态,数据顺序。未提供 presets 时为空数组。
canClearboolean清空按钮当前是否可按。
getSegmentText(props: TimeRangePickerSegmentProps) => string某一端某一段应显示的文字(空段是占位串)。各适配器都用它填充文本,保证同构。
getItemText(props: TimeRangePickerItemTextProps) => string某一格应显示的文字。数字列即格子自身的值,上下午列按 locale 给出「上午 / 下午」。 各适配器都用它填充文本,保证同构。
isItemSelected(props: TimeRangePickerItemProps) => boolean
isItemDisabled(props: TimeRangePickerItemProps) => boolean落在 min / max 之外、被另一端限制(或整个控件禁用):仍在列表中,但不可选、方向键跳过。
setOpen(next: boolean) => void
setValue(next: string[]) => void整份写入两端。
clear() => void
getRootProps() => T['element']
getLabelProps() => T['label']
getControlProps() => T['element']
getSegmentGroupProps(props: TimeRangePickerEndProps) => T['element']一端的段位容器:起止各一个,data-index 区分,各报「开始时间」「结束时间」。
getSegmentProps(props: TimeRangePickerSegmentProps) => T['element']分段输入:一段一个节点,与 TimeField 的段同构(role=spinbutton + roving tabindex)。
getRangeSeparatorProps() => T['element']起止两组段位之间的视觉分隔,退出可访问树。
getTriggerProps() => T['button']
getClearTriggerProps() => T['button']
getPositionerProps() => T['element']
getContentProps() => T['element']
getPresetGroupProps() => T['element']快捷选项列(role=listbox);未提供 presets 时带 hidden。
getPresetProps(props: TimeRangePickerPresetProps) => T['element']一条快捷选项(role=option):点击把两端整份写入值并收起浮层。
getColumnGroupProps(props: TimeRangePickerEndProps) => T['element']一端的时列外壳:起止各一个并排,data-index 区分,各报「开始时间」「结束时间」。
getColumnGroupLabelProps(props: TimeRangePickerEndProps) => T['element']时列外壳顶部的小标题(「开始」「结束」),纯视觉,退出可访问树。
getColumnProps(props: TimeRangePickerColumnProps) => T['element']
getItemProps(props: TimeRangePickerItemProps) => T['element']
getHiddenInputProps(props: TimeRangePickerEndProps) => T['input']表单出口:起止各一份 type=hidden 的原生输入,随表单提交各自的 ISO 串。

无障碍

键盘

规格出处:W3C APG

按键生效条件行为
ArrowDown / ArrowUpfocus in trigger, closed, not disabled展开浮层,焦点落到起点那组的时列(已选的时仍可选就停在它上面,否则停在首格)
Enter / Spacefocus in trigger, not disabled按钮的默认激活即展开/收起(不额外拦键,否则会一开一关)
ArrowDownopen, focus in 某一列列内下移一格,到尾回绕;被 min/max 或另一端禁用的格自动跳过
ArrowUpopen, focus in 某一列列内上移一格,到头回绕;被 min/max 或另一端禁用的格自动跳过
Homeopen, focus in 某一列焦点移到本列首格
Endopen, focus in 某一列焦点移到本列末格
ArrowRightopen换到下一列并落在该列的锚点上;起点那组的末列再往右进终点那组,已在最后一列则不动,不回绕
ArrowLeftopen换到上一列并落在该列的锚点上;终点那组的首列再往左回起点那组,已在第一列则不动,不回绕
Enter / Spaceopen, 焦点停在可选的格上, not disabled/readOnly把这一格写进对应那一端的段;浮层不收起(其余列与另一端还要接着挑)
ArrowUp / ArrowDown / Home / Endopen, focus in 快捷选项列在快捷选项之间移动焦点,到头回绕;时分秒那几列的处理器在这一列内不参与
Enter / Spaceopen, focus in 某条快捷选项, not disabled/readOnly把这条快捷选项的两端整份写进值并收起浮层
Escapeopen收起浮层并把焦点归还触发器,两端不变
Tab / Shift+Tabopen收起浮层且不拦按键,焦点按 Tab 序列自然离开,不抢回触发器
ArrowUpfocus in 某一段, not disabled/readOnly本段加一格,到头回绕;空段落到该段下界
ArrowDownfocus in 某一段, not disabled/readOnly本段减一格,到头回绕;空段落到该段上界
ArrowRightfocus in 某一段, not disabled焦点移到本组下一段;已在本组末段则不动,不跨进另一端那组
ArrowLeftfocus in 某一段, not disabled焦点移到本组上一段;已在本组首段则不动,不跨回另一端那组
Homefocus in 某一段, not disabled焦点移到本组首段
Endfocus in 某一段, not disabled焦点移到本组末段
0-9focus in 数字段, not disabled/readOnly把数字并进本段;本段再吃不下第二位时自动跳到本组下一段
Backspace / Deletefocus in 某一段, not disabled/readOnly清掉本段;小时被清时上下午段仍保留原来的上午/下午
a / pfocus in 上下午段, 12 小时制, not disabled/readOnlya 取上午、p 取下午(不区分大小写)
Alt+ArrowDownfocus in 某一段, closed, not disabled展开浮层并把焦点移入正在编辑一端的时列;触发按钮是可选部件,键盘入口不能只挂在它上面
Enterfocus in 某一段, open收起浮层。段位里敲出来的值不触发「选完即收」(那时人还在打字),这是那条路的收口手势
Enter / Spaceheld on trigger(not disabled)、clear-trigger(可清)、preset 或 item(open, not disabled/readOnly, 该条可按)按住期间该部件投影 data-pressed,与指针 :active 同一副按压面;抬起或失焦撤下,浮层收起时一并撤下

ARIA

以下属性由 connect 生成。

部件属性
controlaria-disabled'true' | 'false'
controlaria-invalid'true' | 'false'
controlaria-labelledbylabel 部件的 id
controlrole'group'
segment-grouparia-disabled'true' | 'false'
segment-grouparia-labelendLabel(index, translations)
segment-grouprole'group'
segmentaria-disabled'true' | 'false'
segmentaria-invalid'true' | 'false'
segmentaria-labeltranslations?.[segment]
segmentaria-readonly'true' | 'false'
segmentaria-required'true' | 'false'
segmentaria-valuemaxrange.max
segmentaria-valueminrange.min
segmentaria-valuenowsegmentNumber(drafts[index], segment, hourCycle)
segmentaria-valuetexttimeSegmentText(drafts[index], segment, { hourCycle, …
segmentrole'spinbutton'
range-separatoraria-hidden'true'
triggeraria-controlscontent 部件的 id
triggeraria-expanded'true' | 'false'
triggeraria-haspopup'dialog'
triggeraria-labelledbylabel 部件的 id
clear-triggeraria-labeltranslations?.clearTrigger
contentaria-hidden!open || undefined
contentaria-labelledbylabel 部件的 id
contentaria-modal'false'
contentrole'dialog'
preset-grouparia-disabled'true' | 'false'
preset-grouparia-labeltranslations?.presets
preset-grouparia-multiselectable'false'
preset-grouparia-orientation'vertical'
preset-grouprole'listbox'
presetaria-disabled'true' | 'false'
presetaria-selected'true' | 'false'
presetrole'option'
column-grouparia-labelendLabel(index, translations)
column-grouprole'group'
column-group-labelaria-hidden'true'
columnaria-disabled'true' | 'false'
columnaria-labeltranslations?.[unit]
columnaria-multiselectable'false'
columnaria-orientation'vertical'
columnrole'listbox'
itemaria-disabled'true' | 'false'
itemaria-selected'true' | 'false'
itemrole'option'

样式参考

皮肤

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

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

数据属性

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

部件属性
rootdata-disabled''(条件成立时才出现)
rootdata-empty''(条件成立时才出现)
rootdata-invalid''(条件成立时才出现)
rootdata-out-of-range''(条件成立时才出现)
rootdata-readonly''(条件成立时才出现)
rootdata-sizeprops.size
rootdata-state'open' | 'closed'
rootdata-toneprops.tone
rootdata-variantprops.variant
labeldata-disabled''(条件成立时才出现)
controldata-disabled''(条件成立时才出现)
controldata-empty''(条件成立时才出现)
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-indexString(index)
segment-groupdata-invalid''(条件成立时才出现)
segment-groupdata-out-of-range''(条件成立时才出现)
segment-groupdata-readonly''(条件成立时才出现)
segmentdata-disabled''(条件成立时才出现)
segmentdata-focus''(条件成立时才出现)
segmentdata-invalid''(条件成立时才出现)
segmentdata-placeholder''(条件成立时才出现)
segmentdata-readonly''(条件成立时才出现)
range-separatordata-disabled''(条件成立时才出现)
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-xh-collection-context'overlay'
presetdata-xh-collection-item''
presetdata-xh-collection-sizeprops.size
column-groupdata-disabled''(条件成立时才出现)
column-groupdata-focus''(条件成立时才出现)
column-groupdata-indexString(index)
column-groupdata-state'open' | 'closed'
column-group-labeldata-disabled''(条件成立时才出现)
column-group-labeldata-indexString(index)
columndata-disabled''(条件成立时才出现)
columndata-state'open' | 'closed'
itemdata-disabled''(条件成立时才出现)
itemdata-highlighted''(条件成立时才出现)
itemdata-pressed''(条件成立时才出现)
itemdata-state'checked' | 'unchecked'
itemdata-xh-collection-context'overlay'
itemdata-xh-collection-item''
itemdata-xh-collection-sizeprops.size
hidden-inputdata-indexString(index)

CSS 变量

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

变量部件CSS 属性状态默认来源说明
--xh-time-range-picker-action-bgclear-trigger
trigger
background-colordefault--xh-_action-variant-bg-resttime-range-picker 的 clear-trigger、trigger 部件 background-color 覆盖槽。
--xh-time-range-picker-action-bg-activeclear-trigger
trigger
background-colordisabled
is(:active, [data-pressed])
loading
not([data-disabled])
not([data-loading])
pressed
--xh-_action-variant-bg-pressedtime-range-picker 的 clear-trigger、trigger 部件 background-color 覆盖槽。
--xh-time-range-picker-action-bg-hoverclear-trigger
trigger
background-colordisabled
hover
loading
not([data-disabled])
not([data-loading])
state=open
--xh-_action-variant-bg-hovertime-range-picker 的 clear-trigger、trigger 部件 background-color 覆盖槽。
--xh-time-range-picker-action-fgclear-trigger
trigger
colordefault--xh-fg-mutedtime-range-picker 的 clear-trigger、trigger 部件 color 覆盖槽。
--xh-time-range-picker-action-fg-hoverclear-trigger
trigger
colordisabled
hover
loading
not([data-disabled])
not([data-loading])
state=open
--xh-fg-defaulttime-range-picker 的 clear-trigger、trigger 部件 color 覆盖槽。
--xh-time-range-picker-action-font-sizeclear-trigger
trigger
font-sizedefault--xh-text-secondary-sizetime-range-picker 的 clear-trigger、trigger 部件 font-size 覆盖槽。
--xh-time-range-picker-action-radiusclear-trigger
trigger
border-radiusdefault--xh-shape-insettime-range-picker 的 clear-trigger、trigger 部件 border-radius 覆盖槽。
--xh-time-range-picker-action-sizeclear-trigger
trigger
block-size
inline-size
min-inline-size
default
xh-action-profile=field-inset
--xh-_action-profile-visual-sizetime-range-picker 的 clear-trigger、trigger 部件 block-size、inline-size、min-inline-size 覆盖槽。
--xh-time-range-picker-column-dividercolumn
preset-group
border-inline-end
border-inline-start
default--xh-material-frosted-separatortime-range-picker 的 column、preset-group 部件 border-inline-end、border-inline-start 覆盖槽。
--xh-time-range-picker-column-gapcolumngapdefault0time-range-picker 的 column 部件 gap 覆盖槽。
--xh-time-range-picker-column-group-dividercolumn-groupborder-inline-startdefault--xh-material-frosted-separatortime-range-picker 的 column-group 部件 border-inline-start 覆盖槽。
--xh-time-range-picker-column-group-gapcolumn-groupmargin-inline-start
padding-inline-start
default--xh-space-2time-range-picker 的 column-group 部件 margin-inline-start、padding-inline-start 覆盖槽。
--xh-time-range-picker-column-group-label-fgcolumn-group-labelcolordefault--xh-fg-subtletime-range-picker 的 column-group-label 部件 color 覆盖槽。
--xh-time-range-picker-column-group-label-pxcolumn-group-labelpadding-inlinedefault--xh-space-1time-range-picker 的 column-group-label 部件 padding-inline 覆盖槽。
--xh-time-range-picker-column-group-label-pycolumn-group
column-group-label
block-size
padding-block
padding-block-start
default--xh-space-1time-range-picker 的 column-group、column-group-label 部件 block-size、padding-block、padding-block-start 覆盖槽。
--xh-time-range-picker-column-group-pycolumn-group
column-group-label
block-size
padding-block-start
default--xh-time-range-picker-column-group-label-pytime-range-picker 的 column-group、column-group-label 部件 block-size、padding-block-start 覆盖槽。
--xh-time-range-picker-column-hcolumnblock-sizedefault--xh-viewport-h-smtime-range-picker 的 column 部件 block-size 覆盖槽。
--xh-time-range-picker-column-min-wcolumnmin-inline-sizedefault--xh-overlay-column-min-wtime-range-picker 的 column 部件 min-inline-size 覆盖槽。
--xh-time-range-picker-column-pxcolumnpadding-inlinedefault0time-range-picker 的 column 部件 padding-inline 覆盖槽。
--xh-time-range-picker-content-bgcontentbackgrounddefault--xh-bg-surfacetime-range-picker 的 content 部件 background 覆盖槽。
--xh-time-range-picker-content-bordercontentborderdefault--xh-border-defaulttime-range-picker 的 content 部件 border 覆盖槽。
--xh-time-range-picker-content-fgcontentcolordefault--xh-fg-defaulttime-range-picker 的 content 部件 color 覆盖槽。
--xh-time-range-picker-content-max-hcontentmax-block-sizedefault--xh-viewport-h-lgtime-range-picker 的 content 部件 max-block-size 覆盖槽。
--xh-time-range-picker-content-pxcontentpadding-inlinedefault--xh-space-2time-range-picker 的 content 部件 padding-inline 覆盖槽。
--xh-time-range-picker-content-pycontentpadding-blockdefault--xh-space-2time-range-picker 的 content 部件 padding-block 覆盖槽。
--xh-time-range-picker-content-radiuscontentborder-radiusdefault--xh-shape-overlaytime-range-picker 的 content 部件 border-radius 覆盖槽。
--xh-time-range-picker-content-shadowcontentbox-shadowdefault--xh-elevation-floatingtime-range-picker 的 content 部件 box-shadow 覆盖槽。
--xh-time-range-picker-control-bgcontrolbackground-colorxh-field-chrome--xh-_field-variant-bg-resttime-range-picker 的 control 部件 background-color 覆盖槽。
--xh-time-range-picker-control-bg-disabledcontrolbackground-colordisabled
xh-field-chrome
--xh-_field-variant-bg-disabledtime-range-picker 的 control 部件 background-color 覆盖槽。
--xh-time-range-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-hovertime-range-picker 的 control 部件 background-color 覆盖槽。
--xh-time-range-picker-control-bg-readonlycontrolbackground-colorreadonly
xh-field-chrome
--xh-_field-variant-bg-read-onlytime-range-picker 的 control 部件 background-color 覆盖槽。
--xh-time-range-picker-control-bordercontrolborderxh-field-chrome--xh-_field-variant-border-resttime-range-picker 的 control 部件 border 覆盖槽。
--xh-time-range-picker-control-border-focuscontrolborder-colordisabled
focus-within
not([data-disabled])
xh-field-chrome
--xh-_field-variant-border-focustime-range-picker 的 control 部件 border-color 覆盖槽。
--xh-time-range-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-hovertime-range-picker 的 control 部件 border-color 覆盖槽。
--xh-time-range-picker-control-border-invalidcontrolborder-colorinvalid
xh-field-chrome
--xh-_field-variant-border-invalidtime-range-picker 的 control 部件 border-color 覆盖槽。
--xh-time-range-picker-control-fgcontrolcolorxh-field-chrome--xh-fg-defaulttime-range-picker 的 control 部件 color 覆盖槽。
--xh-time-range-picker-control-gapcontrol
range-separator
gap
margin-inline
default
xh-field-chrome
--xh-_time-range-picker-gaptime-range-picker 的 control、range-separator 部件 gap、margin-inline 覆盖槽。
--xh-time-range-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-_time-range-picker-control-htime-range-picker 的 control 部件 block-size、min-block-size 覆盖槽。
--xh-time-range-picker-control-min-wcontrol
root
min-inline-sizedefault
xh-field-chrome
--xh-control-min-wtime-range-picker 的 control、root 部件 min-inline-size 覆盖槽。
--xh-time-range-picker-control-pxcontrolpadding-inlinexh-field-chrome--xh-_time-range-picker-control-pxtime-range-picker 的 control 部件 padding-inline 覆盖槽。
--xh-time-range-picker-control-radiuscontrolborder-radiusxh-field-chrome--xh-shape-controltime-range-picker 的 control 部件 border-radius 覆盖槽。
--xh-time-range-picker-control-shadowcontrolbox-shadowxh-field-chromenonetime-range-picker 的 control 部件 box-shadow 覆盖槽。
--xh-time-range-picker-control-wrootinline-size
min-inline-size
default--xh-control-wtime-range-picker 的 root 部件 inline-size、min-inline-size 覆盖槽。
--xh-time-range-picker-font-sizecontrolfont-sizedefault--xh-_time-range-picker-font-sizetime-range-picker 的 control 部件 font-size 覆盖槽。
--xh-time-range-picker-gaprootgapdefault--xh-space-1time-range-picker 的 root 部件 gap 覆盖槽。
--xh-time-range-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
time-range-picker 的 control、positioner、root 部件 --xh-icon-size 覆盖槽。
--xh-time-range-picker-item-bg-hoveritembackground-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-subtletime-range-picker 的 item 部件 background-color 覆盖槽。
--xh-time-range-picker-item-bg-presseditembackground-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-hovertime-range-picker 的 item 部件 background-color 覆盖槽。
--xh-time-range-picker-item-check-fgitembackground-colordefault--xh-_time-range-picker-check-fgtime-range-picker 的 item 部件 background-color 覆盖槽。
--xh-time-range-picker-item-check-sizeitemblock-size
inline-size
padding-inline
default--xh-glyph-size-smtime-range-picker 的 item 部件 block-size、inline-size、padding-inline 覆盖槽。
--xh-time-range-picker-item-fgitemcolordefault
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-fgtime-range-picker 的 item 部件 color 覆盖槽。
--xh-time-range-picker-item-fg-selecteditemcolordisabled
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-time-range-picker-item-fgtime-range-picker 的 item 部件 color 覆盖槽。
--xh-time-range-picker-item-font-sizeitemfont-sizedefault--xh-_time-range-picker-font-sizetime-range-picker 的 item 部件 font-size 覆盖槽。
--xh-time-range-picker-item-font-weight-selecteditemfont-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-regulartime-range-picker 的 item 部件 font-weight 覆盖槽。
--xh-time-range-picker-item-hitemblock-sizedefault--xh-overlay-column-item-htime-range-picker 的 item 部件 block-size 覆盖槽。
--xh-time-range-picker-item-pxitempadding-inlinedefault--xh-space-0_5time-range-picker 的 item 部件 padding-inline 覆盖槽。
--xh-time-range-picker-item-pyitempadding-blockdefault0time-range-picker 的 item 部件 padding-block 覆盖槽。
--xh-time-range-picker-item-radiusitemborder-radiusdefault--xh-shape-controltime-range-picker 的 item 部件 border-radius 覆盖槽。
--xh-time-range-picker-label-fglabelcolordefault--xh-fg-defaulttime-range-picker 的 label 部件 color 覆盖槽。
--xh-time-range-picker-label-fg-disabledlabelcolordisabled--xh-fg-subtletime-range-picker 的 label 部件 color 覆盖槽。
--xh-time-range-picker-label-font-sizelabelfont-sizedefault--xh-text-label-sizetime-range-picker 的 label 部件 font-size 覆盖槽。
--xh-time-range-picker-label-font-weightlabelfont-weightdefault--xh-text-label-weighttime-range-picker 的 label 部件 font-weight 覆盖槽。
--xh-time-range-picker-layerpositionerz-indexdefault--xh-_layertime-range-picker 的 positioner 部件 z-index 覆盖槽。
--xh-time-range-picker-literal-fgsegment-groupcolornot([data-scope])--xh-fg-subtletime-range-picker 的 segment-group 部件 color 覆盖槽。
--xh-time-range-picker-placeholder-fgsegmentcolorplaceholder--xh-fg-subtletime-range-picker 的 segment 部件 color 覆盖槽。
--xh-time-range-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-subtletime-range-picker 的 preset 部件 background-color 覆盖槽。
--xh-time-range-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-hovertime-range-picker 的 preset 部件 background-color 覆盖槽。
--xh-time-range-picker-preset-check-fgpresetbackground-colordefault--xh-_time-range-picker-check-fgtime-range-picker 的 preset 部件 background-color 覆盖槽。
--xh-time-range-picker-preset-check-sizepresetblock-size
inline-size
padding-inline-end
default--xh-glyph-size-smtime-range-picker 的 preset 部件 block-size、inline-size、padding-inline-end 覆盖槽。
--xh-time-range-picker-preset-fgpresetcolordefault
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-fg-defaulttime-range-picker 的 preset 部件 color 覆盖槽。
--xh-time-range-picker-preset-fg-checkedpresetcolordisabled
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-time-range-picker-preset-fgtime-range-picker 的 preset 部件 color 覆盖槽。
--xh-time-range-picker-preset-fg-disabledpresetbackground-color
color
default
disabled
--xh-fg-disabledtime-range-picker 的 preset 部件 background-color、color 覆盖槽。
--xh-time-range-picker-preset-group-gappreset-groupgapdefault--xh-list-option-gaptime-range-picker 的 preset-group 部件 gap 覆盖槽。
--xh-time-range-picker-preset-group-hpreset-groupmax-block-sizedefault--xh-viewport-h-smtime-range-picker 的 preset-group 部件 max-block-size 覆盖槽。
--xh-time-range-picker-preset-group-pxpreset-grouppadding-inlinedefault--xh-space-1time-range-picker 的 preset-group 部件 padding-inline 覆盖槽。
--xh-time-range-picker-preset-pxpresetinset-inline-end
padding-inline
padding-inline-end
default--xh-space-3time-range-picker 的 preset 部件 inset-inline-end、padding-inline、padding-inline-end 覆盖槽。
--xh-time-range-picker-preset-pypresetpadding-blockdefault--xh-space-1time-range-picker 的 preset 部件 padding-block 覆盖槽。
--xh-time-range-picker-preset-radiuspresetborder-radiusdefault--xh-shape-controltime-range-picker 的 preset 部件 border-radius 覆盖槽。
--xh-time-range-picker-range-separator-fgrange-separatorcolordefault--xh-fg-subtletime-range-picker 的 range-separator 部件 color 覆盖槽。
--xh-time-range-picker-range-separator-mxrange-separatormargin-inlinedefault--xh-_time-range-picker-range-separator-mxtime-range-picker 的 range-separator 部件 margin-inline 覆盖槽。
--xh-time-range-picker-range-separator-pxrange-separatormargin-inline
padding-inline
default--xh-space-1time-range-picker 的 range-separator 部件 margin-inline、padding-inline 覆盖槽。
--xh-time-range-picker-segment-bg-focussegmentbackgrounddisabled
focus
focus-visible
not([data-disabled])
--xh-_time-range-picker-segment-bgtime-range-picker 的 segment 部件 background 覆盖槽。
--xh-time-range-picker-segment-bg-hoversegmentbackgrounddisabled
focus
hover
not([data-focus], [data-disabled])
--xh-bg-subtletime-range-picker 的 segment 部件 background 覆盖槽。
--xh-time-range-picker-segment-bg-invalid-focussegmentbackgroundfocus
invalid
is([data-focus], :focus-visible)
--xh-bg-subtletime-range-picker 的 segment 部件 background 覆盖槽。
--xh-time-range-picker-segment-fg-focussegmentcolordisabled
focus
focus-visible
not([data-disabled])
placeholder
--xh-_time-range-picker-segment-fgtime-range-picker 的 segment 部件 color 覆盖槽。
--xh-time-range-picker-segment-fg-invalidsegmentcolorinvalid--xh-fg-dangertime-range-picker 的 segment 部件 color 覆盖槽。
--xh-time-range-picker-segment-fg-invalid-focussegmentcolorfocus
invalid
is([data-focus], :focus-visible)
--xh-fg-dangertime-range-picker 的 segment 部件 color 覆盖槽。
--xh-time-range-picker-segment-pxsegmentpadding-inlinedefault--xh-space-0_5time-range-picker 的 segment 部件 padding-inline 覆盖槽。
--xh-time-range-picker-segment-radiussegmentborder-radiusdefault--xh-shape-insettime-range-picker 的 segment 部件 border-radius 覆盖槽。

动效

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

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

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

RTL

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

Released under The MIT License