@xiongtao.xt/tau-plugins 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +4 -2
- package/package.json +31 -3
- package/runtime.js +1 -0
- package/types/packages/editor/api.d.ts +10 -0
- package/types/packages/editor/contracts.d.ts +3 -0
- package/types/packages/editor/src/api/command.d.ts +61 -0
- package/types/packages/editor/src/api/copy.d.ts +23 -0
- package/types/packages/editor/src/api/drag.d.ts +24 -0
- package/types/packages/editor/src/api/extension.d.ts +100 -0
- package/types/packages/editor/src/api/index.d.ts +54 -0
- package/types/packages/editor/src/api/ingest.d.ts +39 -0
- package/types/packages/editor/src/api/legacy.d.ts +10 -0
- package/types/packages/editor/src/api/marks.d.ts +35 -0
- package/types/packages/editor/src/api/menu.d.ts +37 -0
- package/types/packages/editor/src/api/submission.d.ts +38 -0
- package/types/packages/editor/src/api/toolbar.d.ts +3 -0
- package/types/packages/editor/src/components/AddParagraph/index.d.ts +11 -0
- package/types/packages/editor/src/components/BlockDrag/index.d.ts +35 -0
- package/types/packages/editor/src/components/ElementMenu/index.d.ts +11 -0
- package/types/packages/editor/src/components/FloatingToolbar/index.d.ts +23 -0
- package/types/packages/editor/src/components/HoveringToolbar/FloatingSubmenu.d.ts +19 -0
- package/types/packages/editor/src/components/HoveringToolbar/context.d.ts +8 -0
- package/types/packages/editor/src/components/HoveringToolbar/floatingPosition.d.ts +22 -0
- package/types/packages/editor/src/components/InlineChromiumBugFix/index.d.ts +2 -0
- package/types/packages/editor/src/components/OverlayBackDismiss/index.d.ts +4 -0
- package/types/packages/editor/src/hooks/useIsLastElement.d.ts +3 -0
- package/types/packages/editor/src/kit/elementEmpty.d.ts +5 -0
- package/types/packages/editor/src/menu/conversion.d.ts +3 -0
- package/types/packages/editor/src/model/paragraph.d.ts +5 -0
- package/types/packages/editor/src/services/editorNotifier.d.ts +4 -0
- package/types/packages/editor/src/services/errorReporter.d.ts +13 -0
- package/types/packages/editor/src/services/hooks.d.ts +11 -0
- package/types/packages/editor/src/services/notifier.d.ts +46 -0
- package/types/packages/editor/src/services/overlayBackDismiss.d.ts +10 -0
- package/types/packages/editor/src/services/registry.d.ts +6 -0
- package/types/packages/editor/src/services/tokens.d.ts +10 -0
- package/types/packages/editor/src/theme/ThemeService.d.ts +24 -0
- package/types/packages/editor/src/theme/context.d.ts +26 -0
- package/types/packages/editor/src/types/block-panel.d.ts +12 -0
- package/types/packages/editor/src/types/custom-element.d.ts +10 -0
- package/types/packages/editor/src/types/editor.d.ts +37 -0
- package/types/packages/editor/src/types/element/paragraph.d.ts +6 -0
- package/types/packages/editor/src/types/hotkeys.d.ts +6 -0
- package/types/packages/editor/src/types/hovering-bar.d.ts +8 -0
- package/types/packages/editor/src/types/index.d.ts +7 -0
- package/types/packages/editor/src/types/text.d.ts +1 -0
- package/types/packages/editor/src/types.d.ts +1 -0
- package/types/packages/editor/src/ui/CaretRight.d.ts +3 -0
- package/types/packages/editor/src/ui/Tooltip.d.ts +7 -0
- package/types/packages/editor/src/utils/blockNavigation.d.ts +28 -0
- package/types/packages/editor/src/utils/commandTarget.d.ts +4 -0
- package/types/packages/editor/src/utils/container.d.ts +3 -0
- package/types/packages/editor/src/utils/editor.d.ts +16 -0
- package/types/packages/editor/src/utils/element.d.ts +11 -0
- package/types/packages/editor/src/utils/insertElement.d.ts +11 -0
- package/types/packages/editor/src/utils/nodeOperations.d.ts +19 -0
- package/types/packages/editor/src/utils/paragraphShortcut.d.ts +4 -0
- package/types/packages/editor/src/utils/path.d.ts +6 -0
- package/types/packages/editor/src/utils/plugin.d.ts +4 -0
- package/types/packages/editor/src/utils/selectionSnapshot.d.ts +3 -0
- package/types/packages/editor/src/utils/zoomPan.d.ts +14 -0
- package/types/packages/markdown/src/codec.d.ts +86 -0
- package/types/packages/markdown/src/index.d.ts +7 -0
- package/types/packages/markdown/src/markdown-helper.d.ts +28 -0
- package/types/packages/markdown/src/markdown.d.ts +35 -0
- package/types/packages/markdown/src/markdownSerializerRegistry.d.ts +47 -0
- package/types/packages/markdown/src/model.d.ts +7 -0
- package/types/packages/markdown/src/positionMapper.d.ts +161 -0
- package/types/packages/markdown/src/processor.d.ts +27 -0
- package/types/packages/markdown/src/textCodec.d.ts +39 -0
- package/types/packages/markdown/src/types.d.ts +8 -0
- package/types/packages/plugins/src/contract.d.ts +47 -0
- package/types/packages/plugins/src/editor.d.ts +37 -0
- package/types/packages/plugins/src/index.d.ts +6 -0
- package/types/packages/plugins/src/pages.d.ts +23 -0
- package/types/packages/plugins/src/settings.d.ts +19 -0
- package/types/packages/shared/service-contract.d.ts +6 -0
- package/types/packages/shared/service-registry.d.ts +25 -0
- package/types/packages/themes/src/bootstrap.d.ts +26 -0
- package/types/packages/themes/src/defineTheme.d.ts +45 -0
- package/types/packages/themes/src/index.d.ts +10 -0
- package/types/packages/themes/src/register.d.ts +9 -0
- package/types/packages/themes/src/themes/ink.theme.d.ts +11 -0
- package/types/packages/themes/src/themes/mint.theme.d.ts +11 -0
- package/types/packages/themes/src/themes/ocean.theme.d.ts +12 -0
- package/types/packages/themes/src/themes/paper.theme.d.ts +16 -0
- package/types/packages/themes/src/themes/sakura.theme.d.ts +11 -0
- package/types/packages/themes/src/themes/wisteria.theme.d.ts +10 -0
- package/types/packages/themes/src/tokenContract.d.ts +30 -0
- package/types/packages/ui/src/UiProvider.d.ts +17 -0
- package/types/packages/ui/src/cn.d.ts +23 -0
- package/types/packages/ui/src/hooks/fadeScrollClass.d.ts +8 -0
- package/types/packages/ui/src/hooks/index.d.ts +3 -0
- package/types/packages/ui/src/hooks/isEditableTarget.d.ts +2 -0
- package/types/packages/ui/src/hooks/lockBodyScroll.d.ts +1 -0
- package/types/packages/ui/src/hooks/scrollbarAutoHide.d.ts +9 -0
- package/types/packages/ui/src/hooks/useEdgeFade.d.ts +22 -0
- package/types/packages/ui/src/index.d.ts +47 -0
- package/types/packages/ui/src/patterns/FormRow.d.ts +20 -0
- package/types/packages/ui/src/primitives/AnchoredPanel.d.ts +53 -0
- package/types/packages/ui/src/primitives/Button.d.ts +31 -0
- package/types/packages/ui/src/primitives/Checkbox.d.ts +24 -0
- package/types/packages/ui/src/primitives/ConfirmDialog.d.ts +44 -0
- package/types/packages/ui/src/primitives/Dialog.d.ts +82 -0
- package/types/packages/ui/src/primitives/Drawer.d.ts +87 -0
- package/types/packages/ui/src/primitives/EditText.d.ts +32 -0
- package/types/packages/ui/src/primitives/ErrorBoundary.d.ts +16 -0
- package/types/packages/ui/src/primitives/FadeScroll.d.ts +18 -0
- package/types/packages/ui/src/primitives/FileDropZone.d.ts +14 -0
- package/types/packages/ui/src/primitives/FilterPill.d.ts +19 -0
- package/types/packages/ui/src/primitives/IconButton.d.ts +6 -0
- package/types/packages/ui/src/primitives/If.d.ts +6 -0
- package/types/packages/ui/src/primitives/ImagePreview.d.ts +16 -0
- package/types/packages/ui/src/primitives/Loading.d.ts +18 -0
- package/types/packages/ui/src/primitives/LoadingOverlay.d.ts +7 -0
- package/types/packages/ui/src/primitives/Menu.d.ts +93 -0
- package/types/packages/ui/src/primitives/Notification.d.ts +110 -0
- package/types/packages/ui/src/primitives/Panel.d.ts +28 -0
- package/types/packages/ui/src/primitives/Popover.d.ts +58 -0
- package/types/packages/ui/src/primitives/PortalToBody.d.ts +7 -0
- package/types/packages/ui/src/primitives/Radio.d.ts +27 -0
- package/types/packages/ui/src/primitives/RadioGroup.d.ts +32 -0
- package/types/packages/ui/src/primitives/ResizableAndHideableSidebar.d.ts +40 -0
- package/types/packages/ui/src/primitives/ResizeHandle.d.ts +23 -0
- package/types/packages/ui/src/primitives/Segmented.d.ts +44 -0
- package/types/packages/ui/src/primitives/Select.d.ts +78 -0
- package/types/packages/ui/src/primitives/Switch.d.ts +23 -0
- package/types/packages/ui/src/primitives/Tabs.d.ts +17 -0
- package/types/packages/ui/src/primitives/Tag.d.ts +24 -0
- package/types/packages/ui/src/primitives/Toast.d.ts +67 -0
- package/types/packages/ui/src/primitives/Tooltip.d.ts +40 -0
- package/types/packages/ui/src/primitives/ValueDisplay.d.ts +25 -0
- package/types/packages/ui/src/primitives/YearHeatmap.d.ts +15 -0
- package/types/packages/ui/src/primitives/anchoredPosition.d.ts +44 -0
- package/types/packages/ui/src/primitives/datepicker/DatePicker.d.ts +71 -0
- package/types/packages/ui/src/primitives/datepicker/DateRangePicker.d.ts +70 -0
- package/types/packages/ui/src/primitives/datepicker/calendarEngine.d.ts +45 -0
- package/types/packages/ui/src/primitives/editTextClasses.d.ts +1 -0
- package/types/packages/ui/src/primitives/input/Input.d.ts +35 -0
- package/types/packages/ui/src/primitives/input/NumberInput.d.ts +25 -0
- package/types/packages/ui/src/primitives/input/Textarea.d.ts +14 -0
- package/types/packages/ui/src/primitives/mergeRefs.d.ts +6 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Switch —— 开关基础件(Input 方案 A 语言,mockups/switch/,2026-09-19 定稿)。
|
|
3
|
+
*
|
|
4
|
+
* 语义载体 button[role=switch][aria-checked]:值语义是开/关(对读屏比 checkbox
|
|
5
|
+
* 准确),Space/Enter 原生切换,focus-visible 才显 ring。
|
|
6
|
+
*
|
|
7
|
+
* 形制(「轨道是槽、thumb 是浮起物」,mockups 定稿):
|
|
8
|
+
* - 未选中轨道消费 bg-track(控件轨道语义 token,非表面阶梯——深色主题取
|
|
9
|
+
* 中调暖棕,亮于 surface 使 thumb 可辨且不显黑;新增主题零组件改动)
|
|
10
|
+
* - thumb 恒为 surface 亮底 + ink-3 描边环(在其上清晰分辨),选中后描边
|
|
11
|
+
* 功成身退(透明);选中轨道转 accent 实底
|
|
12
|
+
* - hover 落在 thumb 描边加深(ink-2),聚焦时让位;拨动 160ms ease-out
|
|
13
|
+
*/
|
|
14
|
+
import { type ComponentProps, type ReactNode } from "react";
|
|
15
|
+
export interface SwitchProps extends Omit<ComponentProps<"button">, "onChange" | "children"> {
|
|
16
|
+
checked?: boolean;
|
|
17
|
+
defaultChecked?: boolean;
|
|
18
|
+
onCheckedChange?: (value: boolean) => void;
|
|
19
|
+
/** 渲染在开关左侧的关联文字(点击切换);纯读屏标签用 aria-label */
|
|
20
|
+
label?: ReactNode;
|
|
21
|
+
size?: "sm" | "md";
|
|
22
|
+
}
|
|
23
|
+
export declare function Switch({ checked: checkedProp, defaultChecked, onCheckedChange, label, size, disabled, className, ...props }: SwitchProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type ReactNode } from "react";
|
|
2
|
+
export interface TabItem<K extends string = string> {
|
|
3
|
+
key: K;
|
|
4
|
+
label: ReactNode;
|
|
5
|
+
children: ReactNode;
|
|
6
|
+
}
|
|
7
|
+
export interface TabsProps<K extends string = string> {
|
|
8
|
+
items: readonly TabItem<K>[];
|
|
9
|
+
activeKey?: K;
|
|
10
|
+
defaultActiveKey?: K;
|
|
11
|
+
onChange?: (key: K) => void;
|
|
12
|
+
/** 标签居中(默认左对齐) */
|
|
13
|
+
centered?: boolean;
|
|
14
|
+
className?: string;
|
|
15
|
+
}
|
|
16
|
+
/** 下划线式标签页(与 desktop 设置页同一视觉语言);方向键在标签间移动 */
|
|
17
|
+
export declare function Tabs<K extends string = string>({ items, activeKey: activeKeyProp, defaultActiveKey, onChange, centered, className, }: TabsProps<K>): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tag —— 值展示标签(A+B 结合 II「点 + 软底」,mockups/tag/plan-ab-dot-soft.html,
|
|
3
|
+
* 2026-09-19 定稿)。
|
|
4
|
+
*
|
|
5
|
+
* soft 底 + 同系 solid 文字(B 的色块扫读)+ 可选 solid 色点(A 的色相焦点):
|
|
6
|
+
* 三层同色阶,Notion select 选项标签语感。无色 = 无分类——默认 gray 走
|
|
7
|
+
* group 底 + ink-2 文字且恒无点。纯展示 span:非交互、无命中要求;
|
|
8
|
+
* onRemove 数据驱动显 ×(button + aria-label,伪元素把热区扩到 24、
|
|
9
|
+
* focus-visible 才显 ring、点击不冒泡——表格行点击不受牵连)。
|
|
10
|
+
*
|
|
11
|
+
* 单尺寸(高 22、字 tau-sm)无档;长文本 truncate 由容器约束 max-width。
|
|
12
|
+
*/
|
|
13
|
+
import type { ComponentProps } from "react";
|
|
14
|
+
export declare const TAG_COLORS: readonly ["red", "orange", "yellow", "green", "gray", "blue", "purple"];
|
|
15
|
+
export type TagColor = (typeof TAG_COLORS)[number];
|
|
16
|
+
export interface TagProps extends Omit<ComponentProps<"span">, "color"> {
|
|
17
|
+
/** 分类色(7 色板,与 ColorSwatch 同源);语义状态复用色板,不另设 status */
|
|
18
|
+
color?: TagColor;
|
|
19
|
+
/** 色相焦点(默认开);gray 恒无点——无色 = 无分类 */
|
|
20
|
+
showDot?: boolean;
|
|
21
|
+
/** 传了才渲染移除钮 ×(热区 24,点击不冒泡) */
|
|
22
|
+
onRemove?: () => void;
|
|
23
|
+
}
|
|
24
|
+
export declare function Tag({ color, showDot, onRemove, className, children, ...props }: TagProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Toast 基础件 —— 轻量内联胶囊。
|
|
3
|
+
*
|
|
4
|
+
* 单行胶囊:类型语义色只落图标(ok/danger/warn/info,深浅主题同构),一句话 +
|
|
5
|
+
* 可选动作;无关闭钮——整条点击关闭(Sonner 惯例),悬停冻结自动关闭,
|
|
6
|
+
* 同一位置上限 4 条(挤掉最老)。
|
|
7
|
+
* 位置四选一:top-center(默认)/ top-right / bottom-right / bottom-center,
|
|
8
|
+
* 全局默认可经 toast.config 调整、单条可覆写;层级 z-[200],高于命令面板
|
|
9
|
+
* (z-[101]),搜索报错等反馈在面板打开时仍可见。不接 Esc(浮层退场注册表
|
|
10
|
+
* 只登记阻断后退的浮层,见 D-003)。
|
|
11
|
+
*
|
|
12
|
+
* 用法:app 壳层挂载 <ToastHost /> 一次;任意处调用 toast.success("已保存")、
|
|
13
|
+
* toast.error("失败")、toast.loading → toast.resolve(id) 或 toast.promise(p, {...})。
|
|
14
|
+
*/
|
|
15
|
+
export type ToastType = "success" | "error" | "warning" | "info" | "loading";
|
|
16
|
+
export type ToastPosition = "top-center" | "top-right" | "bottom-right" | "bottom-center";
|
|
17
|
+
export interface ToastOptions {
|
|
18
|
+
/** 内联动作(如「撤销」),点击后 toast 关闭 */
|
|
19
|
+
action?: {
|
|
20
|
+
label: string;
|
|
21
|
+
onClick: () => void;
|
|
22
|
+
};
|
|
23
|
+
position?: ToastPosition;
|
|
24
|
+
/** 落定后的停留毫秒数;0 = 落定后也常驻(只靠点击关闭)。载入中恒常驻,与本值无关 */
|
|
25
|
+
duration?: number;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* 单条胶囊(受 item 驱动的纯展示件)。导出供样板间(src/showcase)构造
|
|
29
|
+
* duration=0 的常显标本——产品代码仍应只消费 toast 命令式 API 与 ToastHost。
|
|
30
|
+
*/
|
|
31
|
+
export interface ToastItem {
|
|
32
|
+
id: number;
|
|
33
|
+
type: ToastType;
|
|
34
|
+
message: string;
|
|
35
|
+
action?: ToastOptions["action"];
|
|
36
|
+
position: ToastPosition;
|
|
37
|
+
duration: number;
|
|
38
|
+
}
|
|
39
|
+
declare const defaults: {
|
|
40
|
+
position: ToastPosition;
|
|
41
|
+
duration: number;
|
|
42
|
+
};
|
|
43
|
+
export declare const toast: {
|
|
44
|
+
/** 调整全局默认(位置 / 时长) */
|
|
45
|
+
config(patch: Partial<typeof defaults>): void;
|
|
46
|
+
show(type: ToastType, message: string, opts?: ToastOptions): number;
|
|
47
|
+
success(message: string, opts?: ToastOptions): number;
|
|
48
|
+
error(message: string, opts?: ToastOptions): number;
|
|
49
|
+
warning(message: string, opts?: ToastOptions): number;
|
|
50
|
+
info(message: string, opts?: ToastOptions): number;
|
|
51
|
+
/** 载入中常驻;结束后 resolve(转成功)或 reject(转失败),落定起按 duration 收尾 */
|
|
52
|
+
loading(message: string, opts?: ToastOptions): number;
|
|
53
|
+
resolve(id: number, message?: string): void;
|
|
54
|
+
reject(id: number, message?: string): void;
|
|
55
|
+
dismiss(id?: number): void;
|
|
56
|
+
/** promise 形态:loading → 成功/失败(文案支持按结果取值) */
|
|
57
|
+
promise<T>(promise: Promise<T>, messages: {
|
|
58
|
+
loading: string;
|
|
59
|
+
success?: string | ((data: T) => string);
|
|
60
|
+
error?: string | ((err: unknown) => string);
|
|
61
|
+
}, opts?: ToastOptions): Promise<T>;
|
|
62
|
+
};
|
|
63
|
+
export declare function ToastHost(): import("react/jsx-runtime").JSX.Element;
|
|
64
|
+
export declare function ToastPill({ item }: {
|
|
65
|
+
item: ToastItem;
|
|
66
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
67
|
+
export {};
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tooltip 基础件 —— Portal + 自研 JS mini 定位引擎(选型与排除记录见 D-004)。
|
|
3
|
+
*
|
|
4
|
+
* Portal(body 追加 fixed 元素)+ 自研 mini 定位引擎(D-004;定位生命周期收口
|
|
5
|
+
* useAnchoredPosition,箭头复用 FloatingArrow——D-014 四家共用底盘),中间件链:
|
|
6
|
+
* offset(间距 8)→ flip(主轴放不下翻对侧)→ shift(交叉轴夹回视口,边距 8)→
|
|
7
|
+
* arrow(锚点中心在边缘上的投影,两端各留 10px)。
|
|
8
|
+
*
|
|
9
|
+
* 行为内建(不做成 props):hover intent(450ms 进入 / 移出即隐 / 400ms 内重开免延迟——
|
|
10
|
+
* 相邻触发器快速扫过不重复等待);focus-visible 显示;aria-describedby 自动接线;
|
|
11
|
+
* disabled 子元素自动包 wrapper(pointer 事件被吞);锚点位置变化时 rAF 跟随(动态锚,
|
|
12
|
+
* 如趋势图 hover 热区随鼠标移动);scroll(capture)/resize 重算。
|
|
13
|
+
* 反相配色复用 bg-ink-1 / text-ink-inverse(深浅主题各自反相,对比度由 token 保障)。
|
|
14
|
+
* 不接 Esc、不进浮层退场注册表(瞬态非阻断,同 Toast 的 D-003 口径);
|
|
15
|
+
* 不承载可交互内容——可点的说明浮层是 Popover/Menu 的职责。
|
|
16
|
+
*/
|
|
17
|
+
import { type ReactElement, type ReactNode } from "react";
|
|
18
|
+
import { type AnchoredAlign, type AnchoredPlacement, type AnchoredSide } from "./anchoredPosition";
|
|
19
|
+
/** 引擎类型的历史名(D-004 起对外暴露;D-014 引擎更名后保留别名,存量引用不动) */
|
|
20
|
+
export type TooltipPlacement = AnchoredPlacement;
|
|
21
|
+
export type TooltipSide = AnchoredSide;
|
|
22
|
+
export type TooltipAlign = AnchoredAlign;
|
|
23
|
+
export interface TooltipProps {
|
|
24
|
+
content: ReactNode;
|
|
25
|
+
placement?: TooltipPlacement;
|
|
26
|
+
/** 箭头(默认开;8px 菱形,尖端单角 2.5px 圆角,随 flip 自动换边) */
|
|
27
|
+
arrow?: boolean;
|
|
28
|
+
/** 显示延迟毫秒(默认 450;400ms 内重开免延迟) */
|
|
29
|
+
delay?: number;
|
|
30
|
+
/** 暂停提示并清理内部打开状态与延迟;优先于 open,不影响子元素交互。 */
|
|
31
|
+
disabled?: boolean;
|
|
32
|
+
/** 受控模式(对齐 §5.3 浮层 open 契约):传入后组件不再做 hover intent,由调用方管理 */
|
|
33
|
+
open?: boolean;
|
|
34
|
+
onOpenChange?: (open: boolean) => void;
|
|
35
|
+
/** 触发器(克隆注入事件与 aria-describedby;disabled 元素自动包 wrapper) */
|
|
36
|
+
children: ReactElement;
|
|
37
|
+
/** 浮层追加类名(经 cn 合并,可覆盖层级等默认值,如编辑器悬浮工具条之上的 z-[10110]) */
|
|
38
|
+
className?: string;
|
|
39
|
+
}
|
|
40
|
+
export declare function Tooltip({ content, placement, arrow, delay, disabled, open: openProp, onOpenChange, children, className, }: TooltipProps): import("react/jsx-runtime").JSX.Element | null;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ValueDisplay —— 值展示件(占位迁移合集):ColorSwatch / ProgressBar / Rating。
|
|
3
|
+
* Tag 已按设计稿定稿拆出 primitives/Tag.tsx(2026-09-19);本文件剩余三件
|
|
4
|
+
* 仍是未经设计稿评审的占位实现(ValueDisplay 族逐件定稿时迁出),勿在
|
|
5
|
+
* 此基础上加能力。
|
|
6
|
+
*/
|
|
7
|
+
import { type TagColor } from "./Tag";
|
|
8
|
+
export declare function ColorSwatch({ value, onChange, disabled, }: {
|
|
9
|
+
value: TagColor;
|
|
10
|
+
onChange: (value: TagColor) => void;
|
|
11
|
+
disabled?: boolean;
|
|
12
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
13
|
+
export declare function ProgressBar({ value, max, label, }: {
|
|
14
|
+
value: number;
|
|
15
|
+
max?: number;
|
|
16
|
+
label: string;
|
|
17
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
18
|
+
export declare function Rating({ value, onValueChange, max, step, readOnly, label, }: {
|
|
19
|
+
value: number | null;
|
|
20
|
+
onValueChange?: (value: number | null) => void;
|
|
21
|
+
max?: number;
|
|
22
|
+
step?: 0.5 | 1;
|
|
23
|
+
readOnly?: boolean;
|
|
24
|
+
label?: string;
|
|
25
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 全年活动热力图(圆点)—— 今日页回顾段的自绘图表
|
|
3
|
+
* (圆点、色阶随 scale 递增、周列贴底对齐、hover 呼吸、全宽自适应;
|
|
4
|
+
* 图例含连续活跃天数角标)。
|
|
5
|
+
* 零业务依赖:输入为 {date, count}[] 纯数据;色阶为 accent 的 alpha 派生,随主题换肤。
|
|
6
|
+
*/
|
|
7
|
+
import { type ReactNode } from "react";
|
|
8
|
+
export interface YearHeatmapDay {
|
|
9
|
+
date: string;
|
|
10
|
+
count: number;
|
|
11
|
+
}
|
|
12
|
+
export declare function YearHeatmap({ days, caption }: {
|
|
13
|
+
days: YearHeatmapDay[];
|
|
14
|
+
caption?: ReactNode;
|
|
15
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 浮层定位引擎(Tooltip / Select / Menu / Popover 共用,D-004;D-014 起更名
|
|
3
|
+
* anchoredPosition——四家消费后不再顶着 tooltip 专名)——不依赖 React,可单独单测。
|
|
4
|
+
* 中间件链:offset(间距默认 8)→ flip(主轴放不下翻对侧)→ shift(夹回视口,边距 8)→
|
|
5
|
+
* arrow(锚点中心在边缘上的投影,两端各留 10px)。
|
|
6
|
+
* 独立成文件:组件文件只导出组件(react-refresh 约束)。
|
|
7
|
+
*
|
|
8
|
+
* shift 的闸门:**锚点与视口不相交时完全不夹**。无条件夹会让锚点滚出视口后浮层
|
|
9
|
+
* 被强行钉在视口边缘、与锚点脱钩——一屏多个离屏锚点就全挤在同一条边上。锚点
|
|
10
|
+
* 离屏时让它自然跟随锚点离屏即可——几何上就不可见,无需额外的显示态管理。
|
|
11
|
+
*/
|
|
12
|
+
export type AnchoredSide = "top" | "right" | "bottom" | "left";
|
|
13
|
+
export type AnchoredAlign = "start" | "center" | "end";
|
|
14
|
+
export type AnchoredPlacement = AnchoredSide | `${AnchoredSide}-${AnchoredAlign}`;
|
|
15
|
+
/** 引擎可选参数:gap 覆写与锚点的间距(Select/Menu 下拉用 4,Tooltip/Popover 用默认 8)。 */
|
|
16
|
+
export interface AnchoredPositionOptions {
|
|
17
|
+
gap?: number;
|
|
18
|
+
}
|
|
19
|
+
export interface AnchoredPosition {
|
|
20
|
+
x: number;
|
|
21
|
+
y: number;
|
|
22
|
+
side: AnchoredSide;
|
|
23
|
+
arrowX: number | null;
|
|
24
|
+
arrowY: number | null;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* anchor 为触发器矩形;pop 只需要尺寸(jsdom 可用普通对象伪造)。
|
|
28
|
+
*/
|
|
29
|
+
export declare function computeAnchoredPosition(anchor: {
|
|
30
|
+
left: number;
|
|
31
|
+
top: number;
|
|
32
|
+
right: number;
|
|
33
|
+
bottom: number;
|
|
34
|
+
width: number;
|
|
35
|
+
height: number;
|
|
36
|
+
}, pop: {
|
|
37
|
+
offsetWidth: number;
|
|
38
|
+
offsetHeight: number;
|
|
39
|
+
}, placement: AnchoredPlacement, opts?: AnchoredPositionOptions): AnchoredPosition;
|
|
40
|
+
/**
|
|
41
|
+
* 引擎投影值 → 箭头 inline 定位。箭头须为浮层的 firstElementChild(含箭头时);
|
|
42
|
+
* 每条边都显式写入(另一侧置 auto),side 翻转后不留上一姿态的残留。
|
|
43
|
+
*/
|
|
44
|
+
export declare function applyArrowPosition({ side, arrowX, arrowY }: AnchoredPosition, pop: HTMLElement): void;
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DatePicker 基础件 —— 经典月历单日期(A+ 形态,mockups/datepicker/)。
|
|
3
|
+
*
|
|
4
|
+
* 值形状拆分的单日期侧:value: string | null("YYYY-MM-DD",precision="minute"
|
|
5
|
+
* 时 "YYYY-MM-DD HH:mm");范围归 DateRangePicker(同一引擎,别在此加 range)。
|
|
6
|
+
*
|
|
7
|
+
* 分层(同 Popover/AnchoredPanel):DatePickerPanel 是可独立使用的内嵌面板
|
|
8
|
+
* (受控显示 + onCommit 确定,块级渲染,无开合无定位——宿主托管场景直接用它,
|
|
9
|
+
* 如行内编辑器浮层);DatePicker = 触发器 + 开合 + 定位 + 外点仲裁 + Panel。
|
|
10
|
+
*
|
|
11
|
+
* 行为内建(不做成 props):
|
|
12
|
+
* - 提交模型跟着 precision 走:day 点日期即提交;minute 点日期只挂起,
|
|
13
|
+
* 底栏时刻区(TimeField:自由键入 + 步长网格)+「确定」显式提交——带时间的
|
|
14
|
+
* 值改起来贵,不做即点即定;预设(presets)取值即完整,一律即点即定
|
|
15
|
+
* - 钻取导航:点标题 days → months → 年代(12 格),‹ › 步长随视图换
|
|
16
|
+
* - 键盘全表:触发器 ↑↓·Enter 开面板;面板内方向键 / PgUp·PgDn 翻月 / T 今天 /
|
|
17
|
+
* Enter 提交;Esc 逐层退场(时刻网格先收,再关面板),焦点归还触发器
|
|
18
|
+
* - 定位复用 D-004 引擎(bottom + gap 4,flip 跟随);外点关闭(useLayerDismiss);
|
|
19
|
+
* 层级 z-[250] 与 Select/Menu 同层
|
|
20
|
+
* - 预设行显示在日历下方:presets 数据驱动(label + 取值函数),内容与措辞
|
|
21
|
+
* 归使用方,组件不内置业务词表;当前值命中时该 chip 高亮回显
|
|
22
|
+
*/
|
|
23
|
+
import { type ReactNode, type Ref } from "react";
|
|
24
|
+
import { type DatePrecision } from "./calendarEngine";
|
|
25
|
+
export type { DatePrecision } from "./calendarEngine";
|
|
26
|
+
export interface DatePickerPreset {
|
|
27
|
+
label: ReactNode;
|
|
28
|
+
/** 调用时求值("今天"这类动态日期每次打开都新鲜);返回 null 表示清空 */
|
|
29
|
+
value: () => string | null;
|
|
30
|
+
}
|
|
31
|
+
export interface DatePickerPanelProps {
|
|
32
|
+
/** 受控显示值("YYYY-MM-DD" / "YYYY-MM-DD HH:mm") */
|
|
33
|
+
value: string | null;
|
|
34
|
+
/** 确定提交:day 点日期 / minute 确定 / 预设 / 今天 / 清空 */
|
|
35
|
+
onCommit: (value: string | null) => void;
|
|
36
|
+
precision?: DatePrecision;
|
|
37
|
+
presets?: readonly DatePickerPreset[];
|
|
38
|
+
timeStep?: number;
|
|
39
|
+
disabled?: boolean;
|
|
40
|
+
/** 禁用日期谓词(入参 "YYYY-MM-DD",业务侧零 Date 依赖) */
|
|
41
|
+
isDateDisabled?: (day: string) => boolean;
|
|
42
|
+
className?: string;
|
|
43
|
+
ref?: Ref<HTMLDivElement>;
|
|
44
|
+
}
|
|
45
|
+
export declare function DatePickerPanel({ value, onCommit, precision, presets, timeStep, disabled, isDateDisabled, className, ref, }: DatePickerPanelProps): import("react/jsx-runtime").JSX.Element;
|
|
46
|
+
export interface DatePickerProps {
|
|
47
|
+
value?: string | null;
|
|
48
|
+
defaultValue?: string | null;
|
|
49
|
+
onValueChange?: (value: string | null) => void;
|
|
50
|
+
/** 值粒度:day(默认,"YYYY-MM-DD")| minute("YYYY-MM-DD HH:mm",底栏时刻区 + 确定提交) */
|
|
51
|
+
precision?: DatePrecision;
|
|
52
|
+
/** 预设行(日历下方):数据驱动,即点即定 */
|
|
53
|
+
presets?: readonly DatePickerPreset[];
|
|
54
|
+
placeholder?: string;
|
|
55
|
+
size?: "sm" | "md";
|
|
56
|
+
/** 触发器 hover 浮出清除(值回 null) */
|
|
57
|
+
clearable?: boolean;
|
|
58
|
+
/** 禁用日期谓词(入参 "YYYY-MM-DD",业务侧零 Date 依赖) */
|
|
59
|
+
isDateDisabled?: (day: string) => boolean;
|
|
60
|
+
/** 时刻网格步长(分钟),默认 15 */
|
|
61
|
+
timeStep?: number;
|
|
62
|
+
disabled?: boolean;
|
|
63
|
+
/** Field 体系错误态(danger 描边) */
|
|
64
|
+
status?: "error";
|
|
65
|
+
/** 浮层受控(§5.3 契约;样板间常显标本用它) */
|
|
66
|
+
open?: boolean;
|
|
67
|
+
onOpenChange?: (open: boolean) => void;
|
|
68
|
+
className?: string;
|
|
69
|
+
ref?: Ref<HTMLButtonElement>;
|
|
70
|
+
}
|
|
71
|
+
export declare function DatePicker({ value: valueProp, defaultValue, onValueChange, precision, presets, placeholder, size, clearable, isDateDisabled, timeStep, disabled, status, open: openProp, onOpenChange, className, ref, }: DatePickerProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DateRangePicker 基础件 —— 范围形态(B 形态并入,mockups/datepicker/ 方案 B)。
|
|
3
|
+
*
|
|
4
|
+
* 值形状拆分的范围侧:value: readonly [string, string] | null(两端均
|
|
5
|
+
* "YYYY-MM-DD",precision="minute" 时为 "YYYY-MM-DD HH:mm";升序,逆序输入按升序读取)。与 DatePicker 同一引擎(CalendarPanel/弹层契约/触发器皮),
|
|
6
|
+
* 收起预设列与底栏、去掉 range 即回到单日期形态——不是第二个日历,是同一结构的
|
|
7
|
+
* 范围扩展态。
|
|
8
|
+
*
|
|
9
|
+
* 分层(同 DatePicker/DatePickerPanel):DateRangePickerPanel 是可独立使用的
|
|
10
|
+
* 内嵌面板(受控显示 + onCommit 确定,块级渲染,无开合无定位——宿主托管场景
|
|
11
|
+
* 直接用它);DateRangePicker = 触发器 + 开合 + 定位 + 外点仲裁 + Panel。
|
|
12
|
+
*
|
|
13
|
+
* 行为内建(不做成 props):
|
|
14
|
+
* - 提交模型:手选范围走「点起点 → 悬停预览 → 点终点(自动交换)→ 确定」三道闸
|
|
15
|
+
* (范围错一格就触发下游重查询,不做即点即定);预设即选即定
|
|
16
|
+
* - 双月并排(跨月范围不翻页):左 ‹ 右 › 承载翻月,中间 line-2 弱分隔;
|
|
17
|
+
* 界外日隐藏,同一天不会在两个面板重复出现
|
|
18
|
+
* - minute 精度:两月下方各一个时刻区(左开始 / 右结束),同日结束早于开始时禁止确定
|
|
19
|
+
* - 用色纪律:端点 accent 实底、中段 accent-soft,色彩表意不装饰
|
|
20
|
+
* - 底栏摘要("9月12日 – 9月19日 · 共 8 天")是提交前最后一眼确认
|
|
21
|
+
* - 键盘:Enter 确定 / Esc 放弃预览并关闭(焦点归还触发器)
|
|
22
|
+
*/
|
|
23
|
+
import { type Ref } from "react";
|
|
24
|
+
import { type DatePrecision } from "./calendarEngine";
|
|
25
|
+
export interface DateRangePreset {
|
|
26
|
+
label: string;
|
|
27
|
+
/** 调用时求值("本周"这类动态范围每次打开都新鲜);返回 null 表示清空 */
|
|
28
|
+
range: () => readonly [string, string] | null;
|
|
29
|
+
}
|
|
30
|
+
export interface DateRangePickerPanelProps {
|
|
31
|
+
/** 受控显示值(两端按 precision 的值串,升序) */
|
|
32
|
+
value: readonly [string, string] | null;
|
|
33
|
+
/** day 只选日期;minute 追加开始/结束时刻区。默认 day */
|
|
34
|
+
precision?: DatePrecision;
|
|
35
|
+
/** 时刻网格步长(分钟),默认 15 */
|
|
36
|
+
timeStep?: number;
|
|
37
|
+
/** 确定提交:手选「确定」/ 预设即点即定 / 清空 */
|
|
38
|
+
onCommit: (value: [string, string] | null) => void;
|
|
39
|
+
/** 面板当前展示的区间(含未确定的草稿)变化时回调;只选了起点时终点为 "" */
|
|
40
|
+
onPreviewChange?: (value: readonly [string, string] | null) => void;
|
|
41
|
+
presets?: readonly DateRangePreset[];
|
|
42
|
+
disabled?: boolean;
|
|
43
|
+
/** 禁用日期谓词(入参 "YYYY-MM-DD",业务侧零 Date 依赖) */
|
|
44
|
+
isDateDisabled?: (day: string) => boolean;
|
|
45
|
+
className?: string;
|
|
46
|
+
ref?: Ref<HTMLDivElement>;
|
|
47
|
+
}
|
|
48
|
+
export declare function DateRangePickerPanel({ value: valueProp, onCommit, onPreviewChange, precision, timeStep, presets, disabled, isDateDisabled, className, ref, }: DateRangePickerPanelProps): import("react/jsx-runtime").JSX.Element;
|
|
49
|
+
export interface DateRangePickerProps {
|
|
50
|
+
value?: readonly [string, string] | null;
|
|
51
|
+
defaultValue?: readonly [string, string] | null;
|
|
52
|
+
onValueChange?: (value: [string, string] | null) => void;
|
|
53
|
+
/** day 只选日期;minute 追加开始/结束时刻区。默认 day */
|
|
54
|
+
precision?: DatePrecision;
|
|
55
|
+
/** 时刻网格步长(分钟),默认 15 */
|
|
56
|
+
timeStep?: number;
|
|
57
|
+
/** 预设列(面板左列):数据驱动,即选即定 */
|
|
58
|
+
presets?: readonly DateRangePreset[];
|
|
59
|
+
placeholder?: string;
|
|
60
|
+
size?: "sm" | "md";
|
|
61
|
+
clearable?: boolean;
|
|
62
|
+
isDateDisabled?: (day: string) => boolean;
|
|
63
|
+
disabled?: boolean;
|
|
64
|
+
status?: "error";
|
|
65
|
+
open?: boolean;
|
|
66
|
+
onOpenChange?: (open: boolean) => void;
|
|
67
|
+
className?: string;
|
|
68
|
+
ref?: Ref<HTMLButtonElement>;
|
|
69
|
+
}
|
|
70
|
+
export declare function DateRangePicker({ value: valueProp, defaultValue, onValueChange, precision, timeStep, presets, placeholder, size, clearable, isDateDisabled, disabled, status, open: openProp, onOpenChange, className, ref, }: DateRangePickerProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 日历引擎 —— DatePicker / DateRangePicker 共享的纯函数层。
|
|
3
|
+
*
|
|
4
|
+
* 值协议(string,不外泄 Date 对象):
|
|
5
|
+
* - precision="day" → "YYYY-MM-DD"
|
|
6
|
+
* - precision="minute" → "YYYY-MM-DD HH:mm"
|
|
7
|
+
* 解析一律本地时区并做回读校验("2026-02-31" 这类越界串返回 null,不静默滚动)。
|
|
8
|
+
* 六周固定 42 格:面板高度不随月跳变,界外日参与导航与点选(跨月自动接管视图)。
|
|
9
|
+
*/
|
|
10
|
+
export declare const WEEKDAY_LABELS: readonly ["一", "二", "三", "四", "五", "六", "日"];
|
|
11
|
+
export declare const WEEKDAY_NAMES: readonly ["日", "一", "二", "三", "四", "五", "六"];
|
|
12
|
+
export type DatePrecision = "day" | "minute";
|
|
13
|
+
export declare function toDateKey(date: Date): string;
|
|
14
|
+
/** "YYYY-MM-DD" → 本地 Date(当天 00:00);格式不符或日历上不存在的日期返回 null */
|
|
15
|
+
export declare function parseDateKey(key: string): Date | null;
|
|
16
|
+
export declare function formatValue(date: Date, precision: DatePrecision): string;
|
|
17
|
+
/** 接受两种精度的值串;带无效时刻的 minute 串按 day 落(时刻归一化见 normalizeTimeInput) */
|
|
18
|
+
export declare function parseValue(value: string): Date | null;
|
|
19
|
+
export declare function sameDay(a: Date, b: Date): boolean;
|
|
20
|
+
export declare function addDays(date: Date, n: number): Date;
|
|
21
|
+
export declare function addMonths(date: Date, n: number): Date;
|
|
22
|
+
/** 周一起始的当周周一 */
|
|
23
|
+
export declare function startOfWeekMonday(date: Date): Date;
|
|
24
|
+
/** 某月的六周固定网格(周一起始;首尾补界外日,inMonth 标记界内) */
|
|
25
|
+
export declare function monthCells(year: number, monthIndex: number): {
|
|
26
|
+
date: Date;
|
|
27
|
+
key: string;
|
|
28
|
+
inMonth: boolean;
|
|
29
|
+
}[];
|
|
30
|
+
/**
|
|
31
|
+
* 时刻归一化:"9" → "09:00"、"9:5" → "09:05"、"09:05" 直映(中文冒号兼容);
|
|
32
|
+
* 越界(时 >23 / 分 >59)或非数字返回 null。
|
|
33
|
+
*/
|
|
34
|
+
export declare function normalizeTimeInput(text: string): string | null;
|
|
35
|
+
/** 一天的时刻网格刻度(step 分钟,默认 15):"00:00"、"00:15" … "23:45" */
|
|
36
|
+
export declare function timeGridValues(step?: number): string[];
|
|
37
|
+
/** 时刻 → 网格最近刻度("10:37" 步长 15 → "10:30");值不在步长上时网格无命中格 */
|
|
38
|
+
export declare function nearestStep(time: string, step?: number): string;
|
|
39
|
+
/** 触发器显示格式:"2026年9月19日"(minute 追加 " 15:00") */
|
|
40
|
+
export declare function formatDisplay(value: string): string;
|
|
41
|
+
/**
|
|
42
|
+
* 范围显示格式:同年省年份("9月12日 – 9月19日"),跨年两端补全;
|
|
43
|
+
* minute 值追加时刻,同日只写一次日期("9月12日 09:00 – 18:00")
|
|
44
|
+
*/
|
|
45
|
+
export declare function formatRangeDisplay(start: string, end: string): string;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const EDIT_TEXT_PLACEHOLDER = "data-[empty=true]:before:content-[attr(data-placeholder)] before:absolute before:left-0 before:top-0 before:w-full before:pointer-events-none before:select-none before:whitespace-pre-wrap before:text-[var(--placeholder-color,var(--tau-ink-3))]";
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Input —— 文本输入基础件(方案 A「经典描边」,mockups/input/,2026-09-19 定稿)。
|
|
3
|
+
*
|
|
4
|
+
* 形制:surface 亮底 + line-1 描边 + radius-sm——「浮起物」语感(2026-09-17 表单
|
|
5
|
+
* 控件口径),与 Select / DatePicker 触发器同族同皮;focus = accent 描边 + 3px ring。
|
|
6
|
+
* 原生 input 零样式透传(IME / autofill / 无障碍白送),形制挂容器上。
|
|
7
|
+
*
|
|
8
|
+
* 状态语义:
|
|
9
|
+
* - 错误态正源是原生 aria-invalid(无 status prop):容器经 has- 变体换 danger
|
|
10
|
+
* 描边 / danger-soft ring——视觉与读屏语义锁死在同一属性上;判定(zod)与
|
|
11
|
+
* 错误文案(Field 体系框外)、touched 策略都归表单层
|
|
12
|
+
* - 只读:框在、精气神收掉——readOnly 透传后文字转 ink-2、光标 default、
|
|
13
|
+
* hover/focus 零响应(仍可选中复制);禁用 = 原生 disabled + 整体降透明
|
|
14
|
+
*
|
|
15
|
+
* 槽位:lead 前缀 icon(16px lucide,focus 转 accent-text)+ clearable 清空 ×
|
|
16
|
+
* (容器 hover/focus 且有值时显现——visibility:hidden 不响应自身 hover,挂容器;
|
|
17
|
+
* tabIndex=-1 不抢 Tab 流,清空后焦点留在输入框)。
|
|
18
|
+
* 文本后缀 / addon 组合等装备位归后续裁决(mockups 方案 D),不预置。
|
|
19
|
+
*/
|
|
20
|
+
import { type ComponentProps } from "react";
|
|
21
|
+
import type { LucideIcon } from "lucide-react";
|
|
22
|
+
export interface InputProps extends Omit<ComponentProps<"input">, "size"> {
|
|
23
|
+
/** 前缀 icon(16px lucide;focus 时转 accent-text) */
|
|
24
|
+
lead?: LucideIcon;
|
|
25
|
+
/** 有值时容器 hover/focus 显现清空 ×;点击清空并保留焦点 */
|
|
26
|
+
clearable?: boolean;
|
|
27
|
+
size?: "sm" | "md";
|
|
28
|
+
/** 形态:outlined(默认,亮底描边浮起物)| bare(无皮行内形态——无边框背景与
|
|
29
|
+
* focus 反馈,高度与选中表现归宿主,如行内编辑单元格) */
|
|
30
|
+
variant?: "outlined" | "bare";
|
|
31
|
+
/** 外框容器的类名(默认 w-full 撑满):定宽 / flex 伸缩等布局写这里;
|
|
32
|
+
* className 落到内部 <input>(文字对齐、字号等) */
|
|
33
|
+
wrapperClassName?: string;
|
|
34
|
+
}
|
|
35
|
+
export declare function Input({ lead: Lead, clearable, size, variant, className, wrapperClassName, onChange, defaultValue, ref, ...props }: InputProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NumberInput —— 数值输入(Input 同形 + beforeinput 事前拦截,mockups/input/ 方案 A)。
|
|
3
|
+
*
|
|
4
|
+
* 值契约:value: number | null(string 草稿只在内部,blur/Enter 归一化提交)。
|
|
5
|
+
*
|
|
6
|
+
* 事前拦截(2026-09-19 用户裁决,取代「事后标红」):
|
|
7
|
+
* - 原生 beforeinput 监听用「当前值 + 选区 + 待插入文本」预判结果,不合数字格式直接
|
|
8
|
+
* preventDefault——键盘输入 / 粘贴 / 拖放的非数字内容根本进不来
|
|
9
|
+
* - 粘贴含杂质不生硬拒绝:先清洗("¥1,200" → "1200")再以 setRangeText 插入,
|
|
10
|
+
* 实在洗不干净才放弃(静默,无红字)
|
|
11
|
+
* - 合法中间态("5." / "-.")放行,否则没法输小数;IME 组合期间放行
|
|
12
|
+
* (insertCompositionText 不可取消),compositionend 兜底清洗
|
|
13
|
+
* - blur / Enter 归一化:"5." → 5、".5" → 0.5、去多余前导零
|
|
14
|
+
*/
|
|
15
|
+
import { type ComponentProps } from "react";
|
|
16
|
+
export interface NumberInputProps extends Omit<ComponentProps<"input">, "value" | "defaultValue" | "onChange" | "type" | "size"> {
|
|
17
|
+
value: number | null;
|
|
18
|
+
onValueChange: (value: number | null) => void;
|
|
19
|
+
size?: "sm" | "md";
|
|
20
|
+
/** 形态透传 Input:bare 为无皮行内形态(无边框背景与 focus 反馈,归宿主) */
|
|
21
|
+
variant?: "outlined" | "bare";
|
|
22
|
+
/** 透传 Input:外框容器类名(定宽写这里;className 落到内部 <input>) */
|
|
23
|
+
wrapperClassName?: string;
|
|
24
|
+
}
|
|
25
|
+
export declare function NumberInput({ value, onValueChange, variant, onBlur, onKeyDown, ref, ...props }: NumberInputProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Textarea —— 多行文本输入(与 Input 同形,mockups/input/ 方案 A)。
|
|
3
|
+
*
|
|
4
|
+
* 与 Input 共用形制语言(surface + line-1 + focus ring);差异只有三点:
|
|
5
|
+
* 多行布局、纵向起始对齐、maxLength 传值时右下角自动出计数器
|
|
6
|
+
* (超限转 danger——超限即不可再输,计数是唯一提示,安静而确定)。
|
|
7
|
+
* 错误态同样走原生 aria-invalid(视觉与读屏同源),文案归 Field 体系。
|
|
8
|
+
*/
|
|
9
|
+
import { type ComponentProps } from "react";
|
|
10
|
+
export interface TextareaProps extends ComponentProps<"textarea"> {
|
|
11
|
+
/** 传值即在右下角渲染计数器(n / maxLength,超限转 danger) */
|
|
12
|
+
maxLength?: number;
|
|
13
|
+
}
|
|
14
|
+
export declare function Textarea({ className, onChange, defaultValue, maxLength, rows, ...props }: TextareaProps): import("react/jsx-runtime").JSX.Element;
|