@plumeai/plugin-sdk 0.0.0-stage → 0.1.3

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.
Files changed (210) hide show
  1. package/LICENSE +21 -0
  2. package/bin/plume-plugin.mjs +70 -0
  3. package/dist/client/styles/src/index.d.ts +123 -0
  4. package/dist/client/ui/src/avatar/AgentAvatar.d.ts +42 -0
  5. package/dist/client/ui/src/avatar/AvatarPile.d.ts +36 -0
  6. package/dist/client/ui/src/avatar/AvatarStack.d.ts +26 -0
  7. package/dist/client/ui/src/avatar/art.d.ts +32 -0
  8. package/dist/client/ui/src/fileIcon.d.ts +33 -0
  9. package/dist/client/ui/src/hooks/useCopied.d.ts +16 -0
  10. package/dist/client/ui/src/hooks/useLiveRefresh.d.ts +22 -0
  11. package/dist/client/ui/src/hooks/useNarrow.d.ts +16 -0
  12. package/dist/client/ui/src/i18n/context.d.ts +17 -0
  13. package/dist/client/ui/src/i18n/index.d.ts +2 -0
  14. package/dist/client/ui/src/i18n/list.d.ts +20 -0
  15. package/dist/client/ui/src/i18n/locales.d.ts +10 -0
  16. package/dist/client/ui/src/i18n/messages/en.d.ts +1418 -0
  17. package/dist/client/ui/src/i18n/messages/index.d.ts +6 -0
  18. package/dist/client/ui/src/i18n/messages/zh-CN.d.ts +1263 -0
  19. package/dist/client/ui/src/i18n/plural.d.ts +16 -0
  20. package/dist/client/ui/src/i18n/translate.d.ts +43 -0
  21. package/dist/client/ui/src/icons/index.d.ts +5 -0
  22. package/dist/client/ui/src/image/AnnotateCanvas.d.ts +29 -0
  23. package/dist/client/ui/src/image/AnnotateToolbar.d.ts +73 -0
  24. package/dist/client/ui/src/image/Annotator.d.ts +154 -0
  25. package/dist/client/ui/src/image/annotate.d.ts +227 -0
  26. package/dist/client/ui/src/image/paint.d.ts +35 -0
  27. package/dist/client/ui/src/image/screenshot-geometry.d.ts +112 -0
  28. package/dist/client/ui/src/image/useBarDrag.d.ts +31 -0
  29. package/dist/client/ui/src/image/useMovableBar.d.ts +26 -0
  30. package/dist/client/ui/src/image/useToolbarPlacement.d.ts +42 -0
  31. package/dist/client/ui/src/index.d.ts +140 -0
  32. package/dist/client/ui/src/inputs/ColorField.d.ts +9 -0
  33. package/dist/client/ui/src/inputs/ComposerToggle.d.ts +23 -0
  34. package/dist/client/ui/src/inputs/DateRangeField.d.ts +25 -0
  35. package/dist/client/ui/src/inputs/NativeField.d.ts +5 -0
  36. package/dist/client/ui/src/inputs/SearchField.d.ts +21 -0
  37. package/dist/client/ui/src/inputs/Segmented.d.ts +23 -0
  38. package/dist/client/ui/src/inputs/Select.d.ts +32 -0
  39. package/dist/client/ui/src/inputs/ShortcutRecorder.d.ts +8 -0
  40. package/dist/client/ui/src/inputs/Slider.d.ts +13 -0
  41. package/dist/client/ui/src/inputs/TextArea.d.ts +30 -0
  42. package/dist/client/ui/src/inputs/Toggle.d.ts +10 -0
  43. package/dist/client/ui/src/inputs/WorktreeToggle.d.ts +19 -0
  44. package/dist/client/ui/src/inputs/day-range.d.ts +57 -0
  45. package/dist/client/ui/src/inputs/pickers.d.ts +40 -0
  46. package/dist/client/ui/src/inputs/useFieldFade.d.ts +1 -0
  47. package/dist/client/ui/src/keyboard.d.ts +21 -0
  48. package/dist/client/ui/src/layout/ApprovalFrame.d.ts +33 -0
  49. package/dist/client/ui/src/layout/Collapse.d.ts +9 -0
  50. package/dist/client/ui/src/layout/CopyMark.d.ts +19 -0
  51. package/dist/client/ui/src/layout/Disclosure.d.ts +66 -0
  52. package/dist/client/ui/src/layout/ErrorBoundary.d.ts +26 -0
  53. package/dist/client/ui/src/layout/PageTopRow.d.ts +19 -0
  54. package/dist/client/ui/src/layout/PanelEmpty.d.ts +17 -0
  55. package/dist/client/ui/src/layout/ResizeHandle.d.ts +24 -0
  56. package/dist/client/ui/src/layout/RetainedViews.d.ts +32 -0
  57. package/dist/client/ui/src/layout/Settings.d.ts +41 -0
  58. package/dist/client/ui/src/layout/Splitter.d.ts +25 -0
  59. package/dist/client/ui/src/lib/agent-avatar.d.ts +58 -0
  60. package/dist/client/ui/src/lib/code/font-stack.d.ts +12 -0
  61. package/dist/client/ui/src/lib/code/themes.d.ts +35 -0
  62. package/dist/client/ui/src/lib/date-format.d.ts +8 -0
  63. package/dist/client/ui/src/lib/dispatches.d.ts +8 -0
  64. package/dist/client/ui/src/lib/hour-style.d.ts +13 -0
  65. package/dist/client/ui/src/lib/number-draft.d.ts +24 -0
  66. package/dist/client/ui/src/lib/relative-time.d.ts +18 -0
  67. package/dist/client/ui/src/lib/tiling.d.ts +89 -0
  68. package/dist/client/ui/src/lib/typing.d.ts +19 -0
  69. package/dist/client/ui/src/motion/RollWords.d.ts +26 -0
  70. package/dist/client/ui/src/motion/RollingText.d.ts +43 -0
  71. package/dist/client/ui/src/motion/TypedText.d.ts +9 -0
  72. package/dist/client/ui/src/motion/freeze.d.ts +22 -0
  73. package/dist/client/ui/src/motion/held.d.ts +17 -0
  74. package/dist/client/ui/src/motion/loaders.d.ts +65 -0
  75. package/dist/client/ui/src/motion/reduced.d.ts +13 -0
  76. package/dist/client/ui/src/motion/ticked.d.ts +24 -0
  77. package/dist/client/ui/src/motion/ticker.d.ts +31 -0
  78. package/dist/client/ui/src/motion/tokens.d.ts +29 -0
  79. package/dist/client/ui/src/motion/useNow.d.ts +6 -0
  80. package/dist/client/ui/src/overlay/Confirm.d.ts +96 -0
  81. package/dist/client/ui/src/overlay/ContextMenu.d.ts +40 -0
  82. package/dist/client/ui/src/overlay/Dialog.d.ts +60 -0
  83. package/dist/client/ui/src/overlay/Menu.d.ts +90 -0
  84. package/dist/client/ui/src/overlay/Overlay.d.ts +17 -0
  85. package/dist/client/ui/src/overlay/Popover.d.ts +127 -0
  86. package/dist/client/ui/src/overlay/Tooltip.d.ts +14 -0
  87. package/dist/client/ui/src/overlay/afterimage.d.ts +20 -0
  88. package/dist/client/ui/src/overlay/chrome-top.d.ts +8 -0
  89. package/dist/client/ui/src/overlay/hover-layers.d.ts +41 -0
  90. package/dist/client/ui/src/overlay/portal.d.ts +21 -0
  91. package/dist/client/ui/src/overlay/scrims.d.ts +20 -0
  92. package/dist/client/ui/src/overlay/tooltip-attribute.d.ts +62 -0
  93. package/dist/client/ui/src/primitives/Button.d.ts +64 -0
  94. package/dist/client/ui/src/primitives/Caret.d.ts +25 -0
  95. package/dist/client/ui/src/primitives/ChoiceMark.d.ts +12 -0
  96. package/dist/client/ui/src/primitives/ClosableTab.d.ts +23 -0
  97. package/dist/client/ui/src/primitives/CountUp.d.ts +21 -0
  98. package/dist/client/ui/src/primitives/GitHubMark.d.ts +12 -0
  99. package/dist/client/ui/src/primitives/IconButton.d.ts +55 -0
  100. package/dist/client/ui/src/primitives/MarkNumber.d.ts +12 -0
  101. package/dist/client/ui/src/primitives/RowDeleteButton.d.ts +6 -0
  102. package/dist/client/ui/src/primitives/Skeleton.d.ts +36 -0
  103. package/dist/client/ui/src/primitives/TabStrip.d.ts +29 -0
  104. package/dist/client/ui/src/primitives/Text.d.ts +341 -0
  105. package/dist/client/ui/src/primitives/TimeAgo.d.ts +13 -0
  106. package/dist/client/ui/src/primitives/useCountUp.d.ts +23 -0
  107. package/dist/client/ui/src/row/FlowRow.d.ts +31 -0
  108. package/dist/client/ui/src/row/HoverRow.d.ts +28 -0
  109. package/dist/client/ui/src/scroll/BackToLatest.d.ts +19 -0
  110. package/dist/client/ui/src/scroll/OverlayScrollbar.d.ts +9 -0
  111. package/dist/client/ui/src/scroll/ScrollText.d.ts +24 -0
  112. package/dist/client/ui/src/scroll/Scroller.d.ts +66 -0
  113. package/dist/client/ui/src/scroll/Sideways.d.ts +30 -0
  114. package/dist/client/ui/src/scroll/fade.d.ts +2 -0
  115. package/dist/client/ui/src/scroll/follow.d.ts +157 -0
  116. package/dist/client/ui/src/scroll/measure-batch.d.ts +13 -0
  117. package/dist/client/ui/src/scroll/memory.d.ts +22 -0
  118. package/dist/client/ui/src/scroll/signature.d.ts +24 -0
  119. package/dist/client/ui/src/scroll/useFollowBottom.d.ts +80 -0
  120. package/dist/client/ui/src/scroll/useSideways.d.ts +29 -0
  121. package/dist/contract/src/app.d.ts +16 -0
  122. package/dist/contract/src/changes.d.ts +50 -0
  123. package/dist/contract/src/diagnostics.d.ts +86 -0
  124. package/dist/contract/src/index.d.ts +18 -0
  125. package/dist/contract/src/plugin.d.ts +1391 -0
  126. package/dist/contract/src/resources.d.ts +79 -0
  127. package/dist/contract/src/service.d.ts +806 -0
  128. package/dist/contract/src/ui.d.ts +1039 -0
  129. package/dist/contract/src/usage.d.ts +102 -0
  130. package/dist/core/llm/ai/anthropic-messages-request.d.ts +82 -0
  131. package/dist/core/llm/ai/anthropic-messages.d.ts +43 -0
  132. package/dist/core/llm/ai/cache-routing.d.ts +53 -0
  133. package/dist/core/llm/ai/chat-delta.d.ts +107 -0
  134. package/dist/core/llm/ai/compat-key.d.ts +19 -0
  135. package/dist/core/llm/ai/endpoint.d.ts +57 -0
  136. package/dist/core/llm/ai/failure.d.ts +181 -0
  137. package/dist/core/llm/ai/index.d.ts +16 -0
  138. package/dist/core/llm/ai/openai-chat-completions-request.d.ts +49 -0
  139. package/dist/core/llm/ai/openai-chat-completions.d.ts +37 -0
  140. package/dist/core/llm/ai/openai-responses-request.d.ts +63 -0
  141. package/dist/core/llm/ai/openai-responses.d.ts +11 -0
  142. package/dist/core/llm/ai/prefix-fingerprint.d.ts +20 -0
  143. package/dist/core/llm/ai/reasoning-compat.d.ts +69 -0
  144. package/dist/core/llm/ai/request-params-compat.d.ts +39 -0
  145. package/dist/core/llm/ai/retry.d.ts +130 -0
  146. package/dist/core/llm/ai/sanitize-history.d.ts +23 -0
  147. package/dist/core/llm/ai/think-tag.d.ts +37 -0
  148. package/dist/core/llm/ai/thinking-options.d.ts +35 -0
  149. package/dist/core/llm/ai/tool-names.d.ts +17 -0
  150. package/dist/core/llm/ai/tool-pairing-compat.d.ts +53 -0
  151. package/dist/core/llm/ai/tool-result-images-compat.d.ts +24 -0
  152. package/dist/core/llm/ai/tool-schema.d.ts +20 -0
  153. package/dist/core/llm/ai/usage-fields.d.ts +30 -0
  154. package/dist/core/llm/ai/vendors/index.d.ts +20 -0
  155. package/dist/core/llm/ai/vendors/thinking.d.ts +39 -0
  156. package/dist/core/llm/ai/vendors/types.d.ts +47 -0
  157. package/dist/core/llm/config/image-models.d.ts +34 -0
  158. package/dist/core/llm/config/retry-policy.d.ts +35 -0
  159. package/dist/core/llm/images/chat-images.d.ts +11 -0
  160. package/dist/core/llm/images/dimensions.d.ts +15 -0
  161. package/dist/core/llm/images/generate.d.ts +15 -0
  162. package/dist/core/llm/images/openai-images.d.ts +11 -0
  163. package/dist/core/llm/images/quota.d.ts +9 -0
  164. package/dist/core/llm/images/shape.d.ts +44 -0
  165. package/dist/core/llm/images/types.d.ts +118 -0
  166. package/dist/core/llm/model-catalog-format.d.ts +50 -0
  167. package/dist/core/llm/model-catalog.d.ts +51 -0
  168. package/dist/core/llm/types/message.d.ts +450 -0
  169. package/dist/core/llm/types/provider.d.ts +169 -0
  170. package/dist/core/llm/types/tool.d.ts +23 -0
  171. package/dist/core/llm/types.d.ts +10 -0
  172. package/dist/core/llm/utils/pricing.d.ts +18 -0
  173. package/dist/core/llm/utils/record.d.ts +2 -0
  174. package/dist/core/llm/utils/sse.d.ts +69 -0
  175. package/dist/infra/rpc/src/endpoint.d.ts +36 -0
  176. package/dist/infra/rpc/src/index.d.ts +2 -0
  177. package/dist/infra/rpc/src/rpc.d.ts +54 -0
  178. package/dist/theme.css +336 -0
  179. package/dist/ui.d.ts +2 -0
  180. package/lib/build.mjs +143 -0
  181. package/lib/check.mjs +23 -0
  182. package/lib/dev.mjs +52 -0
  183. package/lib/icons.mjs +2 -0
  184. package/lib/init.mjs +109 -0
  185. package/lib/install.mjs +80 -0
  186. package/lib/link.mjs +44 -0
  187. package/lib/lint/i18n.mjs +149 -0
  188. package/lib/lint/imports.mjs +83 -0
  189. package/lib/lint/index.mjs +54 -0
  190. package/lib/lint/styles.mjs +160 -0
  191. package/lib/manifest.d.mts +9 -0
  192. package/lib/manifest.mjs +99 -0
  193. package/lib/targets.mjs +60 -0
  194. package/package.json +34 -4
  195. package/skill/SKILL.md +150 -0
  196. package/skill/references/components.md +2830 -0
  197. package/skill/references/logic.md +526 -0
  198. package/skill/references/style-i18n.md +70 -0
  199. package/skill/references/ui.md +532 -0
  200. package/template/AGENTS.md +17 -0
  201. package/template/CLAUDE.md +1 -0
  202. package/template/README.md +12 -0
  203. package/template/gitignore +2 -0
  204. package/template/src/index.ts +28 -0
  205. package/template/src/messages.ts +16 -0
  206. package/template/src/types.ts +8 -0
  207. package/template/src/ui.tsx +30 -0
  208. package/template/tsconfig.json +7 -0
  209. package/tsconfig.json +25 -0
  210. package/README.md +0 -3
@@ -0,0 +1,12 @@
1
+ import type { HTMLAttributes } from "react";
2
+ /**
3
+ * 一枚圆形序号:把两处说的同一件东西对上号。
4
+ *
5
+ * 正文里划线的那段字末尾挂一枚,审批卡上那条评论前面挂同一个数——人看到卡上的「2」,回到正文里
6
+ * 找的就是那枚「2」,不用再读一遍引文去认。实心强调色、白字、等宽数字:两位数也不变形,深浅两套底色上
7
+ * 都看得清。
8
+ */
9
+ export declare function MarkNumber({ n, className, ...rest }: {
10
+ n: number;
11
+ className?: string;
12
+ } & Omit<HTMLAttributes<HTMLSpanElement>, "children">): import("react").JSX.Element;
@@ -0,0 +1,6 @@
1
+ /** 动作的位置一直占着,包括只有悬停或键盘焦点才让它露出来的时候。 */
2
+ export declare function RowDeleteButton({ label, onClick, pending }: {
3
+ label: string;
4
+ onClick: () => void;
5
+ pending?: boolean;
6
+ }): import("react").JSX.Element;
@@ -0,0 +1,36 @@
1
+ /**
2
+ * 形状像还没到的那样东西的占位。
3
+ *
4
+ * 用处不是在等的时候找点事看——而是内容落地时页面已经是对的形状,什么都不跳。转圈或一行「读取中…」
5
+ * 说的是「等等」,它一消失,底下的一切就重新排一遍;这些占位占的是真实的行和卡片将要占的同一些盒子。
6
+ *
7
+ * 只给*第一次*加载用。一旦有东西可显示,显示它本身胜过显示它的草图——真实内容背后的重新校验
8
+ * 不能动那些内容。
9
+ */
10
+ /**
11
+ * 一次加载是否已经久到值得画占位。
12
+ *
13
+ * 只出现两帧的骨架是一次闪烁,闪烁读起来是故障而不是进度——缓存热的时候一个列表 59ms 就填满了,
14
+ * 其中占位只待了 32ms。阈值以下什么都不显示,这是对一次没人察觉的等待最诚实的描绘。
15
+ */
16
+ export declare function useSlowLoad(loading: boolean, delay?: number): boolean;
17
+ /** 一块暗色的块。`width` 是任意 CSS 长度,一排这样的块看起来能像字而不是像条。 */
18
+ export declare function SkeletonBar({ width, height, className }: {
19
+ width: string;
20
+ height?: number;
21
+ className?: string;
22
+ }): import("react").JSX.Element;
23
+ /**
24
+ * 一格卡片,和目录自己的两栏排版一致。
25
+ *
26
+ * `label` 是告诉读屏的话,代替那些对它毫无意义的形状。
27
+ */
28
+ export declare function SkeletonGrid({ count, label }: {
29
+ count?: number;
30
+ label?: string;
31
+ }): import("react").JSX.Element;
32
+ /** 一摞设置行,和它们代替的那个列表一致。 */
33
+ export declare function SkeletonList({ count, label }: {
34
+ count?: number;
35
+ label?: string;
36
+ }): import("react").JSX.Element;
@@ -0,0 +1,29 @@
1
+ /**
2
+ * 一排标签,一个滑块滑到选中的那个。
3
+ *
4
+ * card / elevated 那一对放在浅色主题下读起来是反的(见 `controls.css` 里 `.plume-tabs` 上面那段)。
5
+ * 这是通用的那个:任意多个标签,每个和自己的文字一样宽,有计数时计数跟在文字旁边。
6
+ *
7
+ * 切换如果是两块底色在一帧里换位,新旧两个标签之间什么都没走,眼睛得去找变化而不是跟着它。滑块会走,
8
+ * 走这一下说明这些是同一条上的几个位置,而不是几个分开的按钮。
9
+ *
10
+ * 滑块是量出来的,不是算出来的——文字宽度各不相同,计数从 9 变 10 会让其中一个变宽。在 layout effect
11
+ * 里量,第一帧画出来时它已经在位;条或某个标签尺寸变了(字体到了、计数变了)再量。第一次放置不做动画:
12
+ * `data-ready` 把过渡压住,直到滑块已经在某个位置上过,这样它不会从角落飞进来。
13
+ */
14
+ import { type ReactNode } from "react";
15
+ export interface TabStripItem<T extends string> {
16
+ id: T;
17
+ label: string;
18
+ /** 跟在文字后面,比文字淡。不传或 `undefined` 什么都不画。 */
19
+ count?: number;
20
+ icon?: ReactNode;
21
+ }
22
+ export declare function TabStrip<T extends string>({ items, value, onChange, label, className, }: {
23
+ items: readonly TabStripItem<T>[];
24
+ value: T;
25
+ onChange: (value: T) => void;
26
+ /** 标签列表的无障碍名。 */
27
+ label: string;
28
+ className?: string;
29
+ }): import("react").JSX.Element;
@@ -0,0 +1,341 @@
1
+ /**
2
+ * 字号档位,做成组件。
3
+ *
4
+ * 档位本身在 `theme.css` 里,每一档带着自己的行高和字距,都由用户设的那一个字号推出来。这个文件只说
5
+ * 哪一档配哪个字重——缺的正是这个搭配。
6
+ *
7
+ * 只靠字号区分层级、档与档只差半个像素的话(一行 12.5,下面那行 12,再下面 11.5),半个像素没有人
8
+ * 看得出。读起来不是三个层级,而是一个层级排得不讲究。
9
+ *
10
+ * 所以每一档在下面配一次字重。标题更大*也*更重,说明更小*也*更淡,层级同时在两个轴上分开,而不是在
11
+ * 一个轴的零头上。`weight` 仍然可以覆盖,给一行要强调又不改字号的情况——但默认值应该对得足够常,
12
+ * 很少需要去动它。
13
+ */
14
+ declare const SIZES: {
15
+ /** 页面标题——一屏一个。 */
16
+ readonly display: "text-display";
17
+ /** 一屏里大分区的标题。 */
18
+ readonly heading: "text-heading";
19
+ /** 小节和卡片的标题。 */
20
+ readonly title: "text-title";
21
+ /** 正文:消息、描述,一句一句读的东西。 */
22
+ readonly body: "text-body";
23
+ /** 控件、行、表格单元——界面的工作字号。 */
24
+ readonly label: "text-label";
25
+ /** 标签下面的次要细节。 */
26
+ readonly detail: "text-detail";
27
+ /** 时间戳、计数、角标。 */
28
+ readonly caption: "text-caption";
29
+ };
30
+ declare const TONES: {
31
+ readonly default: "text-ink";
32
+ readonly muted: "text-ink-muted";
33
+ readonly faint: "text-ink-faint";
34
+ readonly danger: "text-danger";
35
+ readonly accent: "text-accent";
36
+ };
37
+ declare const WEIGHTS: {
38
+ readonly normal: "";
39
+ readonly medium: "font-medium";
40
+ readonly semibold: "font-semibold";
41
+ };
42
+ /** 一段文字:`size` 选字号档位(每档带着自己的行高、字距和默认字重),`tone` 选颜色。 */
43
+ export declare function Text({ size, tone, weight, as, mono, numeric, className, children, ...rest }: {
44
+ size?: keyof typeof SIZES;
45
+ tone?: keyof typeof TONES;
46
+ /** 覆盖这一档平时的字重。 */
47
+ weight?: keyof typeof WEIGHTS;
48
+ /** 渲染成什么元素。默认 `span`,能放进一句话里。 */
49
+ as?: "span" | "p" | "div" | "h1" | "h2" | "h3" | "label" | "code";
50
+ /** 等宽字体,给正文里引用的标识符和路径。 */
51
+ mono?: boolean;
52
+ /**
53
+ * 等宽数字。
54
+ *
55
+ * 给原地变化的数——token 数、计时、diff 统计。比例数字每跳一下字就左右挪,读起来是闪烁。
56
+ */
57
+ numeric?: boolean;
58
+ className?: string;
59
+ children?: React.ReactNode;
60
+ } & React.HTMLAttributes<HTMLElement>): import("react").DetailedReactHTMLElement<{
61
+ dangerouslySetInnerHTML?: {
62
+ __html: string | TrustedHTML;
63
+ } | undefined;
64
+ onCopy?: import("react").ClipboardEventHandler<HTMLElement> | undefined;
65
+ onCopyCapture?: import("react").ClipboardEventHandler<HTMLElement> | undefined;
66
+ onCut?: import("react").ClipboardEventHandler<HTMLElement> | undefined;
67
+ onCutCapture?: import("react").ClipboardEventHandler<HTMLElement> | undefined;
68
+ onPaste?: import("react").ClipboardEventHandler<HTMLElement> | undefined;
69
+ onPasteCapture?: import("react").ClipboardEventHandler<HTMLElement> | undefined;
70
+ onCompositionEnd?: import("react").CompositionEventHandler<HTMLElement> | undefined;
71
+ onCompositionEndCapture?: import("react").CompositionEventHandler<HTMLElement> | undefined;
72
+ onCompositionStart?: import("react").CompositionEventHandler<HTMLElement> | undefined;
73
+ onCompositionStartCapture?: import("react").CompositionEventHandler<HTMLElement> | undefined;
74
+ onCompositionUpdate?: import("react").CompositionEventHandler<HTMLElement> | undefined;
75
+ onCompositionUpdateCapture?: import("react").CompositionEventHandler<HTMLElement> | undefined;
76
+ onFocus?: import("react").FocusEventHandler<HTMLElement> | undefined;
77
+ onFocusCapture?: import("react").FocusEventHandler<HTMLElement> | undefined;
78
+ onBlur?: import("react").FocusEventHandler<HTMLElement> | undefined;
79
+ onBlurCapture?: import("react").FocusEventHandler<HTMLElement> | undefined;
80
+ onChange?: import("react").ChangeEventHandler<HTMLElement, Element> | undefined;
81
+ onChangeCapture?: import("react").ChangeEventHandler<HTMLElement, Element> | undefined;
82
+ onBeforeInput?: import("react").InputEventHandler<HTMLElement> | undefined;
83
+ onBeforeInputCapture?: import("react").InputEventHandler<HTMLElement> | undefined;
84
+ onInput?: import("react").InputEventHandler<HTMLElement> | undefined;
85
+ onInputCapture?: import("react").InputEventHandler<HTMLElement> | undefined;
86
+ onReset?: import("react").ReactEventHandler<HTMLElement> | undefined;
87
+ onResetCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
88
+ onSubmit?: import("react").SubmitEventHandler<HTMLElement> | undefined;
89
+ onSubmitCapture?: import("react").SubmitEventHandler<HTMLElement> | undefined;
90
+ onInvalid?: import("react").ReactEventHandler<HTMLElement> | undefined;
91
+ onInvalidCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
92
+ onLoad?: import("react").ReactEventHandler<HTMLElement> | undefined;
93
+ onLoadCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
94
+ onError?: import("react").ReactEventHandler<HTMLElement> | undefined;
95
+ onErrorCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
96
+ onKeyDown?: import("react").KeyboardEventHandler<HTMLElement> | undefined;
97
+ onKeyDownCapture?: import("react").KeyboardEventHandler<HTMLElement> | undefined;
98
+ onKeyPress?: import("react").KeyboardEventHandler<HTMLElement> | undefined;
99
+ onKeyPressCapture?: import("react").KeyboardEventHandler<HTMLElement> | undefined;
100
+ onKeyUp?: import("react").KeyboardEventHandler<HTMLElement> | undefined;
101
+ onKeyUpCapture?: import("react").KeyboardEventHandler<HTMLElement> | undefined;
102
+ onAbort?: import("react").ReactEventHandler<HTMLElement> | undefined;
103
+ onAbortCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
104
+ onCanPlay?: import("react").ReactEventHandler<HTMLElement> | undefined;
105
+ onCanPlayCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
106
+ onCanPlayThrough?: import("react").ReactEventHandler<HTMLElement> | undefined;
107
+ onCanPlayThroughCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
108
+ onDurationChange?: import("react").ReactEventHandler<HTMLElement> | undefined;
109
+ onDurationChangeCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
110
+ onEmptied?: import("react").ReactEventHandler<HTMLElement> | undefined;
111
+ onEmptiedCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
112
+ onEncrypted?: import("react").ReactEventHandler<HTMLElement> | undefined;
113
+ onEncryptedCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
114
+ onEnded?: import("react").ReactEventHandler<HTMLElement> | undefined;
115
+ onEndedCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
116
+ onLoadedData?: import("react").ReactEventHandler<HTMLElement> | undefined;
117
+ onLoadedDataCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
118
+ onLoadedMetadata?: import("react").ReactEventHandler<HTMLElement> | undefined;
119
+ onLoadedMetadataCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
120
+ onLoadStart?: import("react").ReactEventHandler<HTMLElement> | undefined;
121
+ onLoadStartCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
122
+ onPause?: import("react").ReactEventHandler<HTMLElement> | undefined;
123
+ onPauseCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
124
+ onPlay?: import("react").ReactEventHandler<HTMLElement> | undefined;
125
+ onPlayCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
126
+ onPlaying?: import("react").ReactEventHandler<HTMLElement> | undefined;
127
+ onPlayingCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
128
+ onProgress?: import("react").ReactEventHandler<HTMLElement> | undefined;
129
+ onProgressCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
130
+ onRateChange?: import("react").ReactEventHandler<HTMLElement> | undefined;
131
+ onRateChangeCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
132
+ onSeeked?: import("react").ReactEventHandler<HTMLElement> | undefined;
133
+ onSeekedCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
134
+ onSeeking?: import("react").ReactEventHandler<HTMLElement> | undefined;
135
+ onSeekingCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
136
+ onStalled?: import("react").ReactEventHandler<HTMLElement> | undefined;
137
+ onStalledCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
138
+ onSuspend?: import("react").ReactEventHandler<HTMLElement> | undefined;
139
+ onSuspendCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
140
+ onTimeUpdate?: import("react").ReactEventHandler<HTMLElement> | undefined;
141
+ onTimeUpdateCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
142
+ onVolumeChange?: import("react").ReactEventHandler<HTMLElement> | undefined;
143
+ onVolumeChangeCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
144
+ onWaiting?: import("react").ReactEventHandler<HTMLElement> | undefined;
145
+ onWaitingCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
146
+ onAuxClick?: import("react").MouseEventHandler<HTMLElement> | undefined;
147
+ onAuxClickCapture?: import("react").MouseEventHandler<HTMLElement> | undefined;
148
+ onClick?: import("react").MouseEventHandler<HTMLElement> | undefined;
149
+ onClickCapture?: import("react").MouseEventHandler<HTMLElement> | undefined;
150
+ onContextMenu?: import("react").MouseEventHandler<HTMLElement> | undefined;
151
+ onContextMenuCapture?: import("react").MouseEventHandler<HTMLElement> | undefined;
152
+ onDoubleClick?: import("react").MouseEventHandler<HTMLElement> | undefined;
153
+ onDoubleClickCapture?: import("react").MouseEventHandler<HTMLElement> | undefined;
154
+ onDrag?: import("react").DragEventHandler<HTMLElement> | undefined;
155
+ onDragCapture?: import("react").DragEventHandler<HTMLElement> | undefined;
156
+ onDragEnd?: import("react").DragEventHandler<HTMLElement> | undefined;
157
+ onDragEndCapture?: import("react").DragEventHandler<HTMLElement> | undefined;
158
+ onDragEnter?: import("react").DragEventHandler<HTMLElement> | undefined;
159
+ onDragEnterCapture?: import("react").DragEventHandler<HTMLElement> | undefined;
160
+ onDragExit?: import("react").DragEventHandler<HTMLElement> | undefined;
161
+ onDragExitCapture?: import("react").DragEventHandler<HTMLElement> | undefined;
162
+ onDragLeave?: import("react").DragEventHandler<HTMLElement> | undefined;
163
+ onDragLeaveCapture?: import("react").DragEventHandler<HTMLElement> | undefined;
164
+ onDragOver?: import("react").DragEventHandler<HTMLElement> | undefined;
165
+ onDragOverCapture?: import("react").DragEventHandler<HTMLElement> | undefined;
166
+ onDragStart?: import("react").DragEventHandler<HTMLElement> | undefined;
167
+ onDragStartCapture?: import("react").DragEventHandler<HTMLElement> | undefined;
168
+ onDrop?: import("react").DragEventHandler<HTMLElement> | undefined;
169
+ onDropCapture?: import("react").DragEventHandler<HTMLElement> | undefined;
170
+ onMouseDown?: import("react").MouseEventHandler<HTMLElement> | undefined;
171
+ onMouseDownCapture?: import("react").MouseEventHandler<HTMLElement> | undefined;
172
+ onMouseEnter?: import("react").MouseEventHandler<HTMLElement> | undefined;
173
+ onMouseLeave?: import("react").MouseEventHandler<HTMLElement> | undefined;
174
+ onMouseMove?: import("react").MouseEventHandler<HTMLElement> | undefined;
175
+ onMouseMoveCapture?: import("react").MouseEventHandler<HTMLElement> | undefined;
176
+ onMouseOut?: import("react").MouseEventHandler<HTMLElement> | undefined;
177
+ onMouseOutCapture?: import("react").MouseEventHandler<HTMLElement> | undefined;
178
+ onMouseOver?: import("react").MouseEventHandler<HTMLElement> | undefined;
179
+ onMouseOverCapture?: import("react").MouseEventHandler<HTMLElement> | undefined;
180
+ onMouseUp?: import("react").MouseEventHandler<HTMLElement> | undefined;
181
+ onMouseUpCapture?: import("react").MouseEventHandler<HTMLElement> | undefined;
182
+ onSelect?: import("react").ReactEventHandler<HTMLElement> | undefined;
183
+ onSelectCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
184
+ onTouchCancel?: import("react").TouchEventHandler<HTMLElement> | undefined;
185
+ onTouchCancelCapture?: import("react").TouchEventHandler<HTMLElement> | undefined;
186
+ onTouchEnd?: import("react").TouchEventHandler<HTMLElement> | undefined;
187
+ onTouchEndCapture?: import("react").TouchEventHandler<HTMLElement> | undefined;
188
+ onTouchMove?: import("react").TouchEventHandler<HTMLElement> | undefined;
189
+ onTouchMoveCapture?: import("react").TouchEventHandler<HTMLElement> | undefined;
190
+ onTouchStart?: import("react").TouchEventHandler<HTMLElement> | undefined;
191
+ onTouchStartCapture?: import("react").TouchEventHandler<HTMLElement> | undefined;
192
+ onPointerDown?: import("react").PointerEventHandler<HTMLElement> | undefined;
193
+ onPointerDownCapture?: import("react").PointerEventHandler<HTMLElement> | undefined;
194
+ onPointerMove?: import("react").PointerEventHandler<HTMLElement> | undefined;
195
+ onPointerMoveCapture?: import("react").PointerEventHandler<HTMLElement> | undefined;
196
+ onPointerUp?: import("react").PointerEventHandler<HTMLElement> | undefined;
197
+ onPointerUpCapture?: import("react").PointerEventHandler<HTMLElement> | undefined;
198
+ onPointerCancel?: import("react").PointerEventHandler<HTMLElement> | undefined;
199
+ onPointerCancelCapture?: import("react").PointerEventHandler<HTMLElement> | undefined;
200
+ onPointerEnter?: import("react").PointerEventHandler<HTMLElement> | undefined;
201
+ onPointerLeave?: import("react").PointerEventHandler<HTMLElement> | undefined;
202
+ onPointerOver?: import("react").PointerEventHandler<HTMLElement> | undefined;
203
+ onPointerOverCapture?: import("react").PointerEventHandler<HTMLElement> | undefined;
204
+ onPointerOut?: import("react").PointerEventHandler<HTMLElement> | undefined;
205
+ onPointerOutCapture?: import("react").PointerEventHandler<HTMLElement> | undefined;
206
+ onGotPointerCapture?: import("react").PointerEventHandler<HTMLElement> | undefined;
207
+ onGotPointerCaptureCapture?: import("react").PointerEventHandler<HTMLElement> | undefined;
208
+ onLostPointerCapture?: import("react").PointerEventHandler<HTMLElement> | undefined;
209
+ onLostPointerCaptureCapture?: import("react").PointerEventHandler<HTMLElement> | undefined;
210
+ onScroll?: import("react").UIEventHandler<HTMLElement> | undefined;
211
+ onScrollCapture?: import("react").UIEventHandler<HTMLElement> | undefined;
212
+ onScrollEnd?: import("react").UIEventHandler<HTMLElement> | undefined;
213
+ onScrollEndCapture?: import("react").UIEventHandler<HTMLElement> | undefined;
214
+ onWheel?: import("react").WheelEventHandler<HTMLElement> | undefined;
215
+ onWheelCapture?: import("react").WheelEventHandler<HTMLElement> | undefined;
216
+ onAnimationStart?: import("react").AnimationEventHandler<HTMLElement> | undefined;
217
+ onAnimationStartCapture?: import("react").AnimationEventHandler<HTMLElement> | undefined;
218
+ onAnimationEnd?: import("react").AnimationEventHandler<HTMLElement> | undefined;
219
+ onAnimationEndCapture?: import("react").AnimationEventHandler<HTMLElement> | undefined;
220
+ onAnimationIteration?: import("react").AnimationEventHandler<HTMLElement> | undefined;
221
+ onAnimationIterationCapture?: import("react").AnimationEventHandler<HTMLElement> | undefined;
222
+ onToggle?: import("react").ToggleEventHandler<HTMLElement> | undefined;
223
+ onBeforeToggle?: import("react").ToggleEventHandler<HTMLElement> | undefined;
224
+ onTransitionCancel?: import("react").TransitionEventHandler<HTMLElement> | undefined;
225
+ onTransitionCancelCapture?: import("react").TransitionEventHandler<HTMLElement> | undefined;
226
+ onTransitionEnd?: import("react").TransitionEventHandler<HTMLElement> | undefined;
227
+ onTransitionEndCapture?: import("react").TransitionEventHandler<HTMLElement> | undefined;
228
+ onTransitionRun?: import("react").TransitionEventHandler<HTMLElement> | undefined;
229
+ onTransitionRunCapture?: import("react").TransitionEventHandler<HTMLElement> | undefined;
230
+ onTransitionStart?: import("react").TransitionEventHandler<HTMLElement> | undefined;
231
+ onTransitionStartCapture?: import("react").TransitionEventHandler<HTMLElement> | undefined;
232
+ "aria-activedescendant"?: string | undefined;
233
+ "aria-atomic"?: ("false" | "true" | boolean) | undefined;
234
+ "aria-autocomplete"?: "none" | "inline" | "list" | "both" | undefined;
235
+ "aria-braillelabel"?: string | undefined;
236
+ "aria-brailleroledescription"?: string | undefined;
237
+ "aria-busy"?: ("false" | "true" | boolean) | undefined;
238
+ "aria-checked"?: boolean | "false" | "mixed" | "true" | undefined;
239
+ "aria-colcount"?: number | undefined;
240
+ "aria-colindex"?: number | undefined;
241
+ "aria-colindextext"?: string | undefined;
242
+ "aria-colspan"?: number | undefined;
243
+ "aria-controls"?: string | undefined;
244
+ "aria-current"?: boolean | "false" | "true" | "page" | "step" | "location" | "date" | "time" | undefined;
245
+ "aria-describedby"?: string | undefined;
246
+ "aria-description"?: string | undefined;
247
+ "aria-details"?: string | undefined;
248
+ "aria-disabled"?: ("false" | "true" | boolean) | undefined;
249
+ "aria-dropeffect"?: "none" | "copy" | "execute" | "link" | "move" | "popup" | undefined;
250
+ "aria-errormessage"?: string | undefined;
251
+ "aria-expanded"?: ("false" | "true" | boolean) | undefined;
252
+ "aria-flowto"?: string | undefined;
253
+ "aria-grabbed"?: ("false" | "true" | boolean) | undefined;
254
+ "aria-haspopup"?: boolean | "false" | "true" | "menu" | "listbox" | "tree" | "grid" | "dialog" | undefined;
255
+ "aria-hidden"?: ("false" | "true" | boolean) | undefined;
256
+ "aria-invalid"?: boolean | "false" | "true" | "grammar" | "spelling" | undefined;
257
+ "aria-keyshortcuts"?: string | undefined;
258
+ "aria-label"?: string | undefined;
259
+ "aria-labelledby"?: string | undefined;
260
+ "aria-level"?: number | undefined;
261
+ "aria-live"?: "off" | "assertive" | "polite" | undefined;
262
+ "aria-modal"?: ("false" | "true" | boolean) | undefined;
263
+ "aria-multiline"?: ("false" | "true" | boolean) | undefined;
264
+ "aria-multiselectable"?: ("false" | "true" | boolean) | undefined;
265
+ "aria-orientation"?: "horizontal" | "vertical" | undefined;
266
+ "aria-owns"?: string | undefined;
267
+ "aria-placeholder"?: string | undefined;
268
+ "aria-posinset"?: number | undefined;
269
+ "aria-pressed"?: boolean | "false" | "mixed" | "true" | undefined;
270
+ "aria-readonly"?: ("false" | "true" | boolean) | undefined;
271
+ "aria-relevant"?: "additions" | "additions removals" | "additions text" | "all" | "removals" | "removals additions" | "removals text" | "text" | "text additions" | "text removals" | undefined;
272
+ "aria-required"?: ("false" | "true" | boolean) | undefined;
273
+ "aria-roledescription"?: string | undefined;
274
+ "aria-rowcount"?: number | undefined;
275
+ "aria-rowindex"?: number | undefined;
276
+ "aria-rowindextext"?: string | undefined;
277
+ "aria-rowspan"?: number | undefined;
278
+ "aria-selected"?: ("false" | "true" | boolean) | undefined;
279
+ "aria-setsize"?: number | undefined;
280
+ "aria-sort"?: "none" | "ascending" | "descending" | "other" | undefined;
281
+ "aria-valuemax"?: number | undefined;
282
+ "aria-valuemin"?: number | undefined;
283
+ "aria-valuenow"?: number | undefined;
284
+ "aria-valuetext"?: string | undefined;
285
+ defaultChecked?: boolean | undefined;
286
+ defaultValue?: string | number | readonly string[] | undefined;
287
+ suppressContentEditableWarning?: boolean | undefined;
288
+ suppressHydrationWarning?: boolean | undefined;
289
+ accessKey?: string | undefined;
290
+ autoCapitalize?: "off" | "none" | "on" | "sentences" | "words" | "characters" | undefined | (string & {});
291
+ autoFocus?: boolean | undefined;
292
+ contentEditable?: ("false" | "true" | boolean) | "inherit" | "plaintext-only" | undefined;
293
+ contextMenu?: string | undefined;
294
+ dir?: string | undefined;
295
+ draggable?: ("false" | "true" | boolean) | undefined;
296
+ enterKeyHint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined;
297
+ hidden?: boolean | undefined;
298
+ id?: string | undefined;
299
+ lang?: string | undefined;
300
+ nonce?: string | undefined;
301
+ slot?: string | undefined;
302
+ spellCheck?: ("false" | "true" | boolean) | undefined;
303
+ style?: import("react").CSSProperties | undefined;
304
+ tabIndex?: number | undefined;
305
+ title?: string | undefined;
306
+ translate?: "yes" | "no" | undefined;
307
+ radioGroup?: string | undefined;
308
+ role?: import("react").AriaRole | undefined;
309
+ about?: string | undefined;
310
+ content?: string | undefined;
311
+ datatype?: string | undefined;
312
+ inlist?: any;
313
+ prefix?: string | undefined;
314
+ property?: string | undefined;
315
+ rel?: string | undefined;
316
+ resource?: string | undefined;
317
+ rev?: string | undefined;
318
+ typeof?: string | undefined;
319
+ vocab?: string | undefined;
320
+ autoCorrect?: string | undefined;
321
+ autoSave?: string | undefined;
322
+ color?: string | undefined;
323
+ itemProp?: string | undefined;
324
+ itemScope?: boolean | undefined;
325
+ itemType?: string | undefined;
326
+ itemID?: string | undefined;
327
+ itemRef?: string | undefined;
328
+ results?: number | undefined;
329
+ security?: string | undefined;
330
+ unselectable?: "on" | "off" | undefined;
331
+ popover?: "" | "auto" | "manual" | "hint" | undefined;
332
+ popoverTargetAction?: "toggle" | "show" | "hide" | undefined;
333
+ popoverTarget?: string | undefined;
334
+ inert?: boolean | undefined;
335
+ inputMode?: "none" | "text" | "tel" | "url" | "email" | "numeric" | "decimal" | "search" | undefined;
336
+ is?: string | undefined;
337
+ exportparts?: string | undefined;
338
+ part?: string | undefined;
339
+ className: string;
340
+ }, HTMLElement>;
341
+ export {};
@@ -0,0 +1,13 @@
1
+ /**
2
+ * 一段会自己跟上的时长。
3
+ *
4
+ * 14:02 写进 DOM 的「刚刚」到 14:40 还是「刚刚」——要是没有东西在屏幕上待那么久,这算公平。一个自己会
5
+ * 刷新的列表改变了这一点:行在底下更新,旁边的时长却不动,一行里唯一纯粹取决于时钟的部分成了唯一错的部分。
6
+ *
7
+ * 所有实例共用一个定时器,放在模块作用域里,只在有东西挂着时运行。一拍只重渲染这些标签——行本身按数据
8
+ * 记忆化,数据没变——所以让六十个时长保持准确,代价是每分钟六十个文本节点。
9
+ */
10
+ export declare function TimeAgo({ iso, className }: {
11
+ iso: string;
12
+ className?: string;
13
+ }): import("react").JSX.Element;
@@ -0,0 +1,23 @@
1
+ /**
2
+ * 一个走到新值、而不是直接到达新值的数。
3
+ *
4
+ * token 数不是一下一下跳的——是一块一块落的。用量按消息上报,于是总数停着不动,然后一下子跳几万,
5
+ * 格式化到一位小数之后,读起来像在两个不相干的数之间闪。数怎么都是对的;缺的是「第二个数是从第一个来的」
6
+ * 这种感觉。
7
+ *
8
+ * 所以插值的是*显示*,值本身不插。这里不对上报的数做任何取整或平滑——目标永远是真实的数,也永远会到达。
9
+ * 唯一编出来的是两个数之间的那段路。
10
+ *
11
+ * 有意不做成通用的动画工具。它给一步一步到达、又想看起来连续的读数用;会变的文字用 `RollingText`,
12
+ * 真的每秒跳一次的值直接渲染就好。
13
+ */
14
+ export declare function useCountUp(target: number, ms?: number, options?: {
15
+ /**
16
+ * 变小时是否也走过去,而不是直接设上。
17
+ *
18
+ * 默认关,这里要紧的正是默认值:一轮之内累计数只会增长,往*下*数会显示读数从未有过的值。只在一种
19
+ * 情形下打开:下降和上升一样真实——同一个数按不同的时段重算,90 天 → 7 天是一个真的更小的数,
20
+ * 两者之间的走动正说明这两个读数是同一样东西。
21
+ */
22
+ bidirectional?: boolean;
23
+ }): number;
@@ -0,0 +1,31 @@
1
+ /**
2
+ * 一轮对话的过程行:思考、一段工具活、收起的过程,共用的那个骨架。
3
+ *
4
+ * 模型先想,然后动手,最后才说话。这几种行是同一件事的几个阶段,读者是连着看的,所以必须长得像同一种东西:
5
+ * 三个行高、三个间距、三种「正在跑」的说法连着排下来,每隔几行眼睛就要重新认一次这是什么。
6
+ *
7
+ * 只管骨架:一个前置图标、一段装不下就化开的摘要、一个可选的尾部,最后是展开箭头。展开与否、里面画什么是各自的事。
8
+ * 图标和箭头分居两端:图标说「这一行是什么」,箭头说「点开还是收起」。
9
+ *
10
+ * 「正在跑」只有一种说法:摘要上扫过一道光(`.plume-glide`)。不再有第二个转圈的东西陪着它。
11
+ */
12
+ import { type ReactNode } from "react";
13
+ export declare function FlowRow({ icon, title, summary, trailing, trailFrom, running, open, onToggle, label, danger, ...rest }: {
14
+ /** 前置图标,常驻。它说的是这一行是什么,不参与展开、收起。 */
15
+ icon: ReactNode;
16
+ /** 这一行是什么(「自动压缩」)。不参与化开:装不下时先让出地方的永远该是摘要。 */
17
+ title?: ReactNode;
18
+ /** 这一行做了什么。长了两头化开、鼠标放上去自己读出来;运行中它是唯一带动效的东西。 */
19
+ summary?: ReactNode;
20
+ /** 靠右的附注,比如改动行数。 */
21
+ trailing?: ReactNode;
22
+ /** 挂上时附注从这个宽度缓过来,见 `FlowTrail`。 */
23
+ trailFrom?: number | undefined;
24
+ running?: boolean;
25
+ /** 省略即为不可展开:不可展开的行没有箭头,也没有指针手势。 */
26
+ open?: boolean | undefined;
27
+ onToggle?: (() => void) | undefined;
28
+ label?: string;
29
+ /** 整行红字:这一行说的是一次失败(压缩失败)。 */
30
+ danger?: boolean;
31
+ } & Record<`data-${string}`, string | undefined>): import("react").JSX.Element;
@@ -0,0 +1,28 @@
1
+ /**
2
+ * 列表行的统一外壳:标题撑满整行,图标浮在上面,悬停时渐隐给图标让位。
3
+ *
4
+ * 会话、项目、git 的行都用它。预留一格 `pr-14` 就是一道空槽;76px 的浮层列是同一个洞换了个名字。
5
+ * 悬停只认 `group/row` 和 `[data-plume-hover-row]` 这两个钥匙;每种行各起一个 `group/session`
6
+ * 之类的名字,正是置顶、归档图标不再亮起来的原因。
7
+ */
8
+ import { type ComponentPropsWithoutRef, type ReactNode } from "react";
9
+ /**
10
+ * 控件条量好之前先写进 `--plume-row-controls` 的兜底值。
11
+ *
12
+ * 每个点击区约 21px(`p-1` 加 12.5 的图标)。左边 6px 对应右边的 `pr-1.5`,第一个图标的内距和
13
+ * 最后一个一样。两个按钮的槽给 58px 时比置顶图标多出 17px——那就是多让出去的一段。
14
+ */
15
+ export declare function hoverSlot(actions: 1 | 2 | 3): string;
16
+ export declare function HoverRow({ controls, className, style, children, ...rest }: ComponentPropsWithoutRef<"div"> & {
17
+ controls: string;
18
+ }): import("react").JSX.Element;
19
+ /** 行首的图标列:每一行 git 都是同一个 12px 的框,工作树不额外缩进。 */
20
+ export declare function HoverRowMark({ className, children }: {
21
+ className?: string;
22
+ children: ReactNode;
23
+ }): import("react").JSX.Element;
24
+ /** 按内容收缩的浮层。绝不做成定宽的一列:那样会把空着的框也画出来。 */
25
+ export declare function HoverRowReveal({ className, children }: {
26
+ className?: string;
27
+ children: ReactNode;
28
+ }): import("react").JSX.Element;
@@ -0,0 +1,19 @@
1
+ /**
2
+ * 回到底部的路,只在确实有路可回时才给。
3
+ *
4
+ * 往上翻过的转录,除了一路拖回去,没有别的办法到最新那条消息——而一轮还在输出时,「一路」的终点
5
+ * 还在往下走。所以给一个按钮,浮在输入框正上方、最后一条消息该在的位置。
6
+ *
7
+ * 不管显不显示它都挂着。按需挂载的话,它会以满不透明度直接出现在最终位置,看上去和布局抖了一下一样。
8
+ *
9
+ * 出现和离开不是镜像。出现时稍微往上升一点,因为它是从转录底部来的,也指向那里。离开时原地不动、
10
+ * 直接化掉:它离开是因为你**已经到了**底部,滚动结束时一个按钮往下掉,读起来像最后又往下冲了一下
11
+ * ——正是这个按钮要替你省掉的那一跳,被它当成谢幕动作做了一遍。
12
+ *
13
+ * `pointer-events` 跟着可见性走——看不见却还吞掉转录上点击的按钮,比没有按钮更糟。
14
+ */
15
+ export declare function BackToLatest({ show, unread, onClick }: {
16
+ show: boolean;
17
+ unread: number;
18
+ onClick: () => void;
19
+ }): import("react").JSX.Element;
@@ -0,0 +1,9 @@
1
+ export declare function OverlayScrollbar({ viewport, orientation, placement, }: {
2
+ viewport: React.RefObject<HTMLElement | null>;
3
+ orientation: "vertical" | "horizontal";
4
+ /**
5
+ * `sticky`:轨道排在视口后面,粘在外面那个竖向滚动面的底部,落在内容在末尾预留的一条 10px 上。
6
+ * 视口溢出期间带着 `data-hscroll="on"`,好让它的样式预留那一条——滑块不能盖住最后一行。只用于横向。
7
+ */
8
+ placement?: "overlay" | "sticky";
9
+ }): import("react").JSX.Element | null;
@@ -0,0 +1,24 @@
1
+ import { type ReactNode } from "react";
2
+ /**
3
+ * 一行字,到边上渐隐而不是以省略号结尾,所在的行被悬停时自己读出来。
4
+ *
5
+ * 省略号只报告标题被截了,不说截掉的是什么——每个以「帮我梳理这个项目的整体架构」开头的会话都缩成
6
+ * 同一行没法用的字。渐隐说的是同一件事,但更安静,悬停滚动则真正回答了那个问题。
7
+ *
8
+ * 滚动只朝一个方向、连续地走。左右来回扫读起来像这一行在抽搐,而不是字在被读:眼睛得一次次重新
9
+ * 找到开头。第一份后面跟着一份隐藏的副本,单向才能无缝循环——原文离开时,副本正好落在它开始的位置。
10
+ *
11
+ * 只有字真的读不全时才动:已经装得下的行,指针划过时不能抖。父级行带着 `plume-scroll`,悬停规则
12
+ * 认的就是它。
13
+ */
14
+ export declare function ScrollText({ text, className, textClassName, }: {
15
+ text: ReactNode;
16
+ className?: string;
17
+ /**
18
+ * 加在装字形的那几个 span 上——正文和它循环用的副本——不加在盒子上。
19
+ *
20
+ * 给那些透过字本身画出来的效果用(`background-clip: text`、运行中的流光)。加在盒子上的话,它按
21
+ * 盒子自己那一层的字形裁剪,而跑马灯的 transform 把轨道抬进了单独的一层:悬停时整行变成空白。
22
+ */
23
+ textClassName?: string;
24
+ }): import("react").JSX.Element;