import type { CSSProperties, ReactNode } from 'react'; import type { Dayjs } from 'dayjs'; /** * value / defaultValue 的 dayjs 兼容类型(组件内部统一为 Dayjs) */ export declare type TimeNavigatorValue = Dayjs | string | null; /** * 时间范围(HH:mm 或 HH:mm:ss,相对 referenceDate 的营业日) * - 同自然日:如 08:00–22:00 * - 跨日:结束钟面 ≤ 开始时视为次日结束,如 02:01–02:00 表示至次日 02:00 */ export interface TimeRangeOption { start: string; end: string; } /** * 拖动/指示器模式 * - axis-moves:指示器固定视口中央,刻度移动(默认) * - cursor-moves:刻度固定,指示器在轴上移动 */ export declare type CursorMode = 'axis-moves' | 'cursor-moves'; /** * 布局方向 */ export declare type TimeNavigatorOrientation = 'horizontal' | 'vertical'; /** * PisellTimeNavigator 组件 Props */ export interface PisellTimeNavigatorProps { /** * 当前选中时间(受控)。支持 dayjs 实例或可被 dayjs 解析的字符串 */ value?: TimeNavigatorValue; /** * 时间变更回调(受控时必传) */ onChange?: (value: Dayjs) => void; /** * 默认选中时间(非受控) */ defaultValue?: TimeNavigatorValue; /** * 时间轴锚定到的日历日(startOf day)。`range` 的 HH:mm 均相对于该日。 * 不传则与历史一致:取「当天」0 点,避免跨天后刻度错位。 */ referenceDate?: TimeNavigatorValue; /** * 是否 Realtime 模式:value 自动跟随系统当前时间更新 * @default false */ realtime?: boolean; /** * 时间范围(支持跨日营业,见 {@link TimeRangeOption})。不传则默认当日 00:00–24:00 */ range?: TimeRangeOption; /** * 吸附步长(分钟),如 15、30、60 * @default 15 */ stepMinutes?: number; /** * 大刻度间隔(分钟),用于整点刻度;不传则与 stepMinutes 一致或 60 * @default 60 */ majorStepMinutes?: number; /** * 指示器/轴移动模式 * @default 'axis-moves' */ cursorMode?: CursorMode; /** * 横向或竖向展示 * @default 'horizontal' */ orientation?: TimeNavigatorOrientation; /** * 横向且 `cursorMode === 'axis-moves'` 时,每个时间槽的像素宽度(格间距)。 * 不传则 **82**(`CELL_SIZE_H`)。`cursor-moves` 时格宽由视口压缩计算,本字段不生效。 */ horizontalAxisCellSizePx?: number; /** * 横向时间轴轨道高度(px):滚动容器、轴、`scale`/`cursor` 层共用的高度。 * 仅 `orientation === 'horizontal'` 时生效;不传为 **48**(默认设计规格)。 */ horizontalTrackHeightPx?: number; /** * 营业时间范围(视觉高亮,可选限制选择范围) */ businessHours?: TimeRangeOption; /** * 禁用时间段,禁止选中(点击/吸附到该区间无效) */ disabledRanges?: TimeRangeOption[]; /** * 是否显示 Now 按钮(固定入口) * @default true */ showNowButton?: boolean; /** * 为 true 时禁止用户拖动/滚动时间轴、点击刻度改时间(仍随 `value` 程序性对齐视口;用于「跟随当前时刻」等只读轴) * @default false */ userInteractionLocked?: boolean; /** * 是否吸附到 step 刻度 * @default false */ snapToStep?: boolean; /** * 是否开启惯性滚动(拖动松手后减速) * @default false */ inertia?: boolean; /** * 过去时间淡化背景色(CSS 颜色值) */ pastTimeFade?: string; /** * 容器样式覆盖 */ containerStyle?: CSSProperties; /** * 刻度层样式覆盖 */ scaleStyle?: CSSProperties; /** * 时间气泡/竖线样式覆盖(区分 realtime 时由组件内部应用主题色) */ cursorStyle?: CSSProperties; /** * Now 按钮样式覆盖 */ nowButtonStyle?: CSSProperties; /** * 自定义类名 */ className?: string; /** * 根节点自定义样式 */ style?: CSSProperties; /** * dayjs locale */ locale?: string; /** * 时间气泡展示格式(dayjs format) * @default 'HH:mm' */ timeFormat?: string; /** * 自定义游标/拖拽气泡文案;不传则按 `timeFormat` 格式化 `value`。 * 预约跨日营业可传相对顶栏锚定日的「次日 HH:mm」。 */ formatTimeLabel?: (value: Dayjs) => string; /** * 自定义 Now 按钮内容(覆盖默认文案与图标时使用) */ renderNowButton?: () => ReactNode; /** * 横向轴上与刻度槽位数一致的密度序列(任意正数,内部按最大值归一化折线高度) */ densitySeries?: number[]; /** * 未传 `densitySeries` 时按 `referenceDate` 拉取;日历日变更会重新请求,过期响应丢弃 */ loadDensity?: (params: { referenceDate: Dayjs; stepMinutes: number; }) => Promise; /** * 用户开始操作时间轴(拖轴、点刻度、键盘、拖指针等)时回调;用于上层关闭「跟随当前」等。 */ onUserInteraction?: () => void; }