@wzrhine/react 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/CHANGELOG.md +80 -0
- package/LICENSE +21 -0
- package/README.md +37 -3
- package/dist/advanced.css +398 -0
- package/dist/archive.css +704 -0
- package/dist/command.css +671 -0
- package/dist/components/Accordion.d.ts +82 -0
- package/dist/components/Accordion.d.ts.map +1 -0
- package/dist/components/Accordion.js +19 -0
- package/dist/components/Accordion.js.map +1 -0
- package/dist/components/Alert.d.ts +60 -0
- package/dist/components/Alert.d.ts.map +1 -0
- package/dist/components/Alert.js +29 -0
- package/dist/components/Alert.js.map +1 -0
- package/dist/components/AlertDialog.d.ts +41 -0
- package/dist/components/AlertDialog.d.ts.map +1 -0
- package/dist/components/AlertDialog.js +101 -0
- package/dist/components/AlertDialog.js.map +1 -0
- package/dist/components/ArchiveCard.d.ts +58 -0
- package/dist/components/ArchiveCard.d.ts.map +1 -0
- package/dist/components/ArchiveCard.js +40 -0
- package/dist/components/ArchiveCard.js.map +1 -0
- package/dist/components/Breadcrumb.d.ts +48 -0
- package/dist/components/Breadcrumb.d.ts.map +1 -0
- package/dist/components/Breadcrumb.js +55 -0
- package/dist/components/Breadcrumb.js.map +1 -0
- package/dist/components/Button.d.ts +30 -0
- package/dist/components/Button.d.ts.map +1 -0
- package/dist/components/Button.js +24 -0
- package/dist/components/Button.js.map +1 -0
- package/dist/components/Checkbox.d.ts +81 -0
- package/dist/components/Checkbox.d.ts.map +1 -0
- package/dist/components/Checkbox.js +34 -0
- package/dist/components/Checkbox.js.map +1 -0
- package/dist/components/Collapsible.d.ts +47 -0
- package/dist/components/Collapsible.d.ts.map +1 -0
- package/dist/components/Collapsible.js +12 -0
- package/dist/components/Collapsible.js.map +1 -0
- package/dist/components/Combobox.d.ts +74 -0
- package/dist/components/Combobox.d.ts.map +1 -0
- package/dist/components/Combobox.js +61 -0
- package/dist/components/Combobox.js.map +1 -0
- package/dist/components/CommandPalette.d.ts +77 -0
- package/dist/components/CommandPalette.d.ts.map +1 -0
- package/dist/components/CommandPalette.js +150 -0
- package/dist/components/CommandPalette.js.map +1 -0
- package/dist/components/ContextMenu.d.ts +31 -0
- package/dist/components/ContextMenu.d.ts.map +1 -0
- package/dist/components/ContextMenu.js +25 -0
- package/dist/components/ContextMenu.js.map +1 -0
- package/dist/components/DataTable.d.ts +83 -0
- package/dist/components/DataTable.d.ts.map +1 -0
- package/dist/components/DataTable.js +97 -0
- package/dist/components/DataTable.js.map +1 -0
- package/dist/components/Dialog.d.ts +45 -0
- package/dist/components/Dialog.d.ts.map +1 -0
- package/dist/components/Dialog.js +46 -0
- package/dist/components/Dialog.js.map +1 -0
- package/dist/components/Drawer.d.ts +56 -0
- package/dist/components/Drawer.d.ts.map +1 -0
- package/dist/components/Drawer.js +92 -0
- package/dist/components/Drawer.js.map +1 -0
- package/dist/components/EmptyState.d.ts +39 -0
- package/dist/components/EmptyState.d.ts.map +1 -0
- package/dist/components/EmptyState.js +19 -0
- package/dist/components/EmptyState.js.map +1 -0
- package/dist/components/Field.d.ts +37 -0
- package/dist/components/Field.d.ts.map +1 -0
- package/dist/components/Field.js +12 -0
- package/dist/components/Field.js.map +1 -0
- package/dist/components/Fieldset.d.ts +24 -0
- package/dist/components/Fieldset.d.ts.map +1 -0
- package/dist/components/Fieldset.js +17 -0
- package/dist/components/Fieldset.js.map +1 -0
- package/dist/components/FileDropZone.d.ts +60 -0
- package/dist/components/FileDropZone.d.ts.map +1 -0
- package/dist/components/FileDropZone.js +121 -0
- package/dist/components/FileDropZone.js.map +1 -0
- package/dist/components/Form.d.ts +21 -0
- package/dist/components/Form.d.ts.map +1 -0
- package/dist/components/Form.js +20 -0
- package/dist/components/Form.js.map +1 -0
- package/dist/components/IconButton.d.ts +25 -0
- package/dist/components/IconButton.d.ts.map +1 -0
- package/dist/components/IconButton.js +14 -0
- package/dist/components/IconButton.js.map +1 -0
- package/dist/components/Input.d.ts +24 -0
- package/dist/components/Input.d.ts.map +1 -0
- package/dist/components/Input.js +15 -0
- package/dist/components/Input.js.map +1 -0
- package/dist/components/Menu.d.ts +66 -0
- package/dist/components/Menu.d.ts.map +1 -0
- package/dist/components/Menu.js +34 -0
- package/dist/components/Menu.js.map +1 -0
- package/dist/components/MetadataList.d.ts +51 -0
- package/dist/components/MetadataList.d.ts.map +1 -0
- package/dist/components/MetadataList.js +25 -0
- package/dist/components/MetadataList.js.map +1 -0
- package/dist/components/NumberField.d.ts +52 -0
- package/dist/components/NumberField.d.ts.map +1 -0
- package/dist/components/NumberField.js +21 -0
- package/dist/components/NumberField.js.map +1 -0
- package/dist/components/Pagination.d.ts +40 -0
- package/dist/components/Pagination.d.ts.map +1 -0
- package/dist/components/Pagination.js +64 -0
- package/dist/components/Pagination.js.map +1 -0
- package/dist/components/Popover.d.ts +44 -0
- package/dist/components/Popover.d.ts.map +1 -0
- package/dist/components/Popover.js +14 -0
- package/dist/components/Popover.js.map +1 -0
- package/dist/components/Progress.d.ts +57 -0
- package/dist/components/Progress.d.ts.map +1 -0
- package/dist/components/Progress.js +31 -0
- package/dist/components/Progress.js.map +1 -0
- package/dist/components/Radio.d.ts +61 -0
- package/dist/components/Radio.d.ts.map +1 -0
- package/dist/components/Radio.js +18 -0
- package/dist/components/Radio.js.map +1 -0
- package/dist/components/RecordHeader.d.ts +53 -0
- package/dist/components/RecordHeader.d.ts.map +1 -0
- package/dist/components/RecordHeader.js +19 -0
- package/dist/components/RecordHeader.js.map +1 -0
- package/dist/components/ScrollArea.d.ts +55 -0
- package/dist/components/ScrollArea.d.ts.map +1 -0
- package/dist/components/ScrollArea.js +63 -0
- package/dist/components/ScrollArea.js.map +1 -0
- package/dist/components/Select.d.ts +39 -0
- package/dist/components/Select.d.ts.map +1 -0
- package/dist/components/Select.js +24 -0
- package/dist/components/Select.js.map +1 -0
- package/dist/components/Separator.d.ts +26 -0
- package/dist/components/Separator.d.ts.map +1 -0
- package/dist/components/Separator.js +22 -0
- package/dist/components/Separator.js.map +1 -0
- package/dist/components/Skeleton.d.ts +31 -0
- package/dist/components/Skeleton.d.ts.map +1 -0
- package/dist/components/Skeleton.js +17 -0
- package/dist/components/Skeleton.js.map +1 -0
- package/dist/components/Slider.d.ts +65 -0
- package/dist/components/Slider.d.ts.map +1 -0
- package/dist/components/Slider.js +30 -0
- package/dist/components/Slider.js.map +1 -0
- package/dist/components/Spinner.d.ts +23 -0
- package/dist/components/Spinner.d.ts.map +1 -0
- package/dist/components/Spinner.js +13 -0
- package/dist/components/Spinner.js.map +1 -0
- package/dist/components/SplitButton.d.ts +59 -0
- package/dist/components/SplitButton.d.ts.map +1 -0
- package/dist/components/SplitButton.js +30 -0
- package/dist/components/SplitButton.js.map +1 -0
- package/dist/components/Stat.d.ts +53 -0
- package/dist/components/Stat.d.ts.map +1 -0
- package/dist/components/Stat.js +23 -0
- package/dist/components/Stat.js.map +1 -0
- package/dist/components/StatusBadge.d.ts +19 -0
- package/dist/components/StatusBadge.d.ts.map +1 -0
- package/dist/components/StatusBadge.js +8 -0
- package/dist/components/StatusBadge.js.map +1 -0
- package/dist/components/StatusIndicator.d.ts +29 -0
- package/dist/components/StatusIndicator.d.ts.map +1 -0
- package/dist/components/StatusIndicator.js +8 -0
- package/dist/components/StatusIndicator.js.map +1 -0
- package/dist/components/Surface.d.ts +29 -0
- package/dist/components/Surface.d.ts.map +1 -0
- package/dist/components/Surface.js +8 -0
- package/dist/components/Surface.js.map +1 -0
- package/dist/components/Switch.d.ts +22 -0
- package/dist/components/Switch.d.ts.map +1 -0
- package/dist/components/Switch.js +11 -0
- package/dist/components/Switch.js.map +1 -0
- package/dist/components/Tabs.d.ts +45 -0
- package/dist/components/Tabs.d.ts.map +1 -0
- package/dist/components/Tabs.js +49 -0
- package/dist/components/Tabs.js.map +1 -0
- package/dist/components/Text.d.ts +33 -0
- package/dist/components/Text.d.ts.map +1 -0
- package/dist/components/Text.js +21 -0
- package/dist/components/Text.js.map +1 -0
- package/dist/components/Textarea.d.ts +54 -0
- package/dist/components/Textarea.d.ts.map +1 -0
- package/dist/components/Textarea.js +31 -0
- package/dist/components/Textarea.js.map +1 -0
- package/dist/components/Timeline.d.ts +35 -0
- package/dist/components/Timeline.d.ts.map +1 -0
- package/dist/components/Timeline.js +13 -0
- package/dist/components/Timeline.js.map +1 -0
- package/dist/components/Toast.d.ts +67 -0
- package/dist/components/Toast.d.ts.map +1 -0
- package/dist/components/Toast.js +94 -0
- package/dist/components/Toast.js.map +1 -0
- package/dist/components/Tooltip.d.ts +26 -0
- package/dist/components/Tooltip.d.ts.map +1 -0
- package/dist/components/Tooltip.js +15 -0
- package/dist/components/Tooltip.js.map +1 -0
- package/dist/components/VisuallyHidden.d.ts +17 -0
- package/dist/components/VisuallyHidden.d.ts.map +1 -0
- package/dist/components/VisuallyHidden.js +12 -0
- package/dist/components/VisuallyHidden.js.map +1 -0
- package/dist/components/fieldParts.d.ts +17 -0
- package/dist/components/fieldParts.d.ts.map +1 -0
- package/dist/components/fieldParts.js +22 -0
- package/dist/components/fieldParts.js.map +1 -0
- package/dist/components/meter-utils.d.ts +15 -0
- package/dist/components/meter-utils.d.ts.map +1 -0
- package/dist/components/meter-utils.js +15 -0
- package/dist/components/meter-utils.js.map +1 -0
- package/dist/components/pagination-utils.d.ts +10 -0
- package/dist/components/pagination-utils.d.ts.map +1 -0
- package/dist/components/pagination-utils.js +36 -0
- package/dist/components/pagination-utils.js.map +1 -0
- package/dist/components.css +632 -0
- package/dist/data.css +600 -0
- package/dist/disclosure.css +93 -0
- package/dist/drawer.css +226 -0
- package/dist/feedback.css +454 -0
- package/dist/forms.css +516 -0
- package/dist/index.d.ts +117 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +61 -0
- package/dist/index.js.map +1 -0
- package/dist/motion/lifecycle.d.ts +44 -0
- package/dist/motion/lifecycle.d.ts.map +1 -0
- package/dist/motion/lifecycle.js +73 -0
- package/dist/motion/lifecycle.js.map +1 -0
- package/dist/motion/presence.d.ts +69 -0
- package/dist/motion/presence.d.ts.map +1 -0
- package/dist/motion/presence.js +103 -0
- package/dist/motion/presence.js.map +1 -0
- package/dist/motion/presets.d.ts +63 -0
- package/dist/motion/presets.d.ts.map +1 -0
- package/dist/motion/presets.js +30 -0
- package/dist/motion/presets.js.map +1 -0
- package/dist/motion/resolve.d.ts +31 -0
- package/dist/motion/resolve.d.ts.map +1 -0
- package/dist/motion/resolve.js +40 -0
- package/dist/motion/resolve.js.map +1 -0
- package/dist/motion/useRhineMotion.d.ts +19 -0
- package/dist/motion/useRhineMotion.d.ts.map +1 -0
- package/dist/motion/useRhineMotion.js +19 -0
- package/dist/motion/useRhineMotion.js.map +1 -0
- package/dist/motion/visibility.d.ts +6 -0
- package/dist/motion/visibility.d.ts.map +1 -0
- package/dist/motion/visibility.js +31 -0
- package/dist/motion/visibility.js.map +1 -0
- package/dist/overlays.css +465 -0
- package/dist/provider/RhineProvider.d.ts +65 -0
- package/dist/provider/RhineProvider.d.ts.map +1 -0
- package/dist/provider/RhineProvider.js +26 -0
- package/dist/provider/RhineProvider.js.map +1 -0
- package/dist/provider/messages.d.ts +190 -0
- package/dist/provider/messages.d.ts.map +1 -0
- package/dist/provider/messages.js +160 -0
- package/dist/provider/messages.js.map +1 -0
- package/dist/provider/portal.d.ts +17 -0
- package/dist/provider/portal.d.ts.map +1 -0
- package/dist/provider/portal.js +20 -0
- package/dist/provider/portal.js.map +1 -0
- package/dist/reset.css +45 -0
- package/dist/split.css +159 -0
- package/dist/status.css +353 -0
- package/dist/utils/cx.d.ts +2 -0
- package/dist/utils/cx.d.ts.map +1 -0
- package/dist/utils/cx.js +4 -0
- package/dist/utils/cx.js.map +1 -0
- package/package.json +62 -3
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* Placeholder block for content that is still loading (ADR-0006 §7). Always `aria-hidden`:
|
|
4
|
+
* the container owns `aria-busy` and a visible or visually hidden 「正在加载」 text.
|
|
5
|
+
* Pulses on `--rl-motion-loop`; static under reduced motion.
|
|
6
|
+
*
|
|
7
|
+
* <div aria-busy="true">
|
|
8
|
+
* <Skeleton shape="text" lines={3} />
|
|
9
|
+
* <span className="rl-visually-hidden">正在加载</span>
|
|
10
|
+
* </div>
|
|
11
|
+
*/
|
|
12
|
+
export type SkeletonShape = 'text' | 'block' | 'circle';
|
|
13
|
+
export type SkeletonProps = Omit<React.HTMLAttributes<HTMLSpanElement>, 'children' | 'role'> & {
|
|
14
|
+
shape?: SkeletonShape;
|
|
15
|
+
/** CSS length, e.g. `'12rem'`, `'60%'` or `'var(--rl-space-16)'`. */
|
|
16
|
+
width?: string;
|
|
17
|
+
/** CSS length. Text defaults to one line height; block and circle to `--rl-space-16`. */
|
|
18
|
+
height?: string;
|
|
19
|
+
/** Text only: number of lines; the last one is 60% wide. */
|
|
20
|
+
lines?: number;
|
|
21
|
+
};
|
|
22
|
+
export declare const Skeleton: React.ForwardRefExoticComponent<Omit<React.HTMLAttributes<HTMLSpanElement>, "children" | "role"> & {
|
|
23
|
+
shape?: SkeletonShape;
|
|
24
|
+
/** CSS length, e.g. `'12rem'`, `'60%'` or `'var(--rl-space-16)'`. */
|
|
25
|
+
width?: string;
|
|
26
|
+
/** CSS length. Text defaults to one line height; block and circle to `--rl-space-16`. */
|
|
27
|
+
height?: string;
|
|
28
|
+
/** Text only: number of lines; the last one is 60% wide. */
|
|
29
|
+
lines?: number;
|
|
30
|
+
} & React.RefAttributes<HTMLSpanElement>>;
|
|
31
|
+
//# sourceMappingURL=Skeleton.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Skeleton.d.ts","sourceRoot":"","sources":["../../src/components/Skeleton.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B;;;;;;;;;GASG;AAEH,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;AAExD,MAAM,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,eAAe,CAAC,EAAE,UAAU,GAAG,MAAM,CAAC,GAAG;IAC7F,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,qEAAqE;IACrE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yFAAyF;IACzF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4DAA4D;IAC5D,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAIF,eAAO,MAAM,QAAQ;YAXX,aAAa;IACrB,qEAAqE;YAC7D,MAAM;IACd,yFAAyF;aAChF,MAAM;IACf,4DAA4D;YACpD,MAAM;yCA4Cd,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { cx } from '../utils/cx.js';
|
|
5
|
+
export const Skeleton = React.forwardRef(function Skeleton({ shape = 'text', width, height, lines = 1, className, style, ...rest }, ref) {
|
|
6
|
+
const vars = {
|
|
7
|
+
...style,
|
|
8
|
+
...(width !== undefined && { '--rl-skeleton-width': width }),
|
|
9
|
+
...(height !== undefined && { '--rl-skeleton-height': height }),
|
|
10
|
+
};
|
|
11
|
+
const count = shape === 'text' ? Math.max(1, Math.floor(lines)) : 1;
|
|
12
|
+
if (count > 1) {
|
|
13
|
+
return (_jsx("span", { ...rest, ref: ref, className: cx('rl-skeleton-lines', className), "data-slot": "skeleton", style: vars, "aria-hidden": "true", children: Array.from({ length: count }, (_, i) => (_jsx("span", { className: "rl-skeleton", "data-shape": "text", "data-last": i === count - 1 || undefined }, i))) }));
|
|
14
|
+
}
|
|
15
|
+
return (_jsx("span", { ...rest, ref: ref, className: cx('rl-skeleton', className), "data-slot": "skeleton", "data-shape": shape, style: vars, "aria-hidden": "true" }));
|
|
16
|
+
});
|
|
17
|
+
//# sourceMappingURL=Skeleton.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Skeleton.js","sourceRoot":"","sources":["../../src/components/Skeleton.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AA2BpC,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,CAAiC,SAAS,QAAQ,CACxF,EAAE,KAAK,GAAG,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,GAAG,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,EACvE,GAAG;IAEH,MAAM,IAAI,GAAkB;QAC1B,GAAG,KAAK;QACR,GAAG,CAAC,KAAK,KAAK,SAAS,IAAI,EAAE,qBAAqB,EAAE,KAAK,EAAE,CAAC;QAC5D,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,EAAE,sBAAsB,EAAE,MAAM,EAAE,CAAC;KAChE,CAAC;IACF,MAAM,KAAK,GAAG,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAEpE,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACd,OAAO,CACL,kBACM,IAAI,EACR,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CAAC,mBAAmB,EAAE,SAAS,CAAC,eACnC,UAAU,EACpB,KAAK,EAAE,IAAI,iBACC,MAAM,YAEjB,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CACvC,eAAc,SAAS,EAAC,aAAa,gBAAY,MAAM,eAAY,CAAC,KAAK,KAAK,GAAG,CAAC,IAAI,SAAS,IAApF,CAAC,CAAuF,CACpG,CAAC,GACG,CACR,CAAC;IACJ,CAAC;IAED,OAAO,CACL,kBACM,IAAI,EACR,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CAAC,aAAa,EAAE,SAAS,CAAC,eAC7B,UAAU,gBACR,KAAK,EACjB,KAAK,EAAE,IAAI,iBACC,MAAM,GAClB,CACH,CAAC;AACJ,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* Value on a continuous or stepped scale, on Base UI Slider (ADR-0010 §2). Each thumb is a
|
|
4
|
+
* native `<input type="range">` (visually hidden inside the thumb), named by the visible `label`
|
|
5
|
+
* through `aria-labelledby`, so the value submits with the form under `name`.
|
|
6
|
+
*
|
|
7
|
+
* Keyboard (Base UI): ←/↓ and →/↑ step, Shift + arrow or PageUp/PageDown take `largeStep`,
|
|
8
|
+
* Home/End jump to min/max. Dragging writes position directly; no transition runs while dragging.
|
|
9
|
+
*
|
|
10
|
+
* Discrete levels (e.g. an effort setting) use `marks`: ticks + labels under the track, and the
|
|
11
|
+
* mark label becomes the spoken value (`aria-valuetext`) when the thumb sits on it.
|
|
12
|
+
*
|
|
13
|
+
* <Slider label="执行强度" min={0} max={4} marks={levels} defaultValue={2} />
|
|
14
|
+
* <Slider label="温度范围" defaultValue={[20, 60]} thumbLabels={['下限', '上限']} />
|
|
15
|
+
*/
|
|
16
|
+
export interface SliderMark {
|
|
17
|
+
value: number;
|
|
18
|
+
/** Visible tick label; also the spoken value when the thumb is on this mark. */
|
|
19
|
+
label?: React.ReactNode;
|
|
20
|
+
/** Spoken text when `label` is not a string. */
|
|
21
|
+
valueText?: string;
|
|
22
|
+
}
|
|
23
|
+
type SliderValue = number | readonly number[];
|
|
24
|
+
/** The value shape `onValueChange` reports: a number for single sliders, an array for ranges. */
|
|
25
|
+
export type SliderChangeValue<V extends SliderValue> = V extends number ? number : number[];
|
|
26
|
+
export type SliderProps<V extends SliderValue = number> = Omit<React.HTMLAttributes<HTMLDivElement>, 'children' | 'defaultValue' | 'onChange' | 'aria-label' | 'aria-labelledby'> & {
|
|
27
|
+
/** Visible label; names every thumb (required, ADR-0001 naming rule). */
|
|
28
|
+
label: React.ReactNode;
|
|
29
|
+
/** The name comes from `label` (use `thumbLabels` for range thumbs). */
|
|
30
|
+
'aria-label'?: never;
|
|
31
|
+
'aria-labelledby'?: never;
|
|
32
|
+
/** Keep the label for assistive tech only. */
|
|
33
|
+
hideLabel?: boolean;
|
|
34
|
+
description?: React.ReactNode;
|
|
35
|
+
/** Single number, or an array for a range slider (one thumb per entry). */
|
|
36
|
+
value?: V;
|
|
37
|
+
defaultValue?: V;
|
|
38
|
+
onValueChange?: (value: SliderChangeValue<V>) => void;
|
|
39
|
+
/** Fires once per interaction (pointer release, key press). */
|
|
40
|
+
onValueCommitted?: (value: SliderChangeValue<V>) => void;
|
|
41
|
+
min?: number;
|
|
42
|
+
max?: number;
|
|
43
|
+
step?: number;
|
|
44
|
+
/** Step for PageUp / PageDown and Shift + arrow (default 10). */
|
|
45
|
+
largeStep?: number;
|
|
46
|
+
/** Minimum distance, in steps, between range thumbs. */
|
|
47
|
+
minStepsBetweenValues?: number;
|
|
48
|
+
marks?: readonly SliderMark[];
|
|
49
|
+
/** Intl options for the displayed and spoken value; locale comes from RhineProvider. */
|
|
50
|
+
format?: Intl.NumberFormatOptions;
|
|
51
|
+
/** Custom text for one value (display and default `aria-valuetext`). Wins over `format`. */
|
|
52
|
+
formatValue?: (value: number) => string;
|
|
53
|
+
/** Spoken value per thumb; wins over mark labels and `formatValue`. */
|
|
54
|
+
getAriaValueText?: (formattedValue: string, value: number, index: number) => string;
|
|
55
|
+
/** Distinct accessible names for range thumbs (e.g. ['下限', '上限']). */
|
|
56
|
+
thumbLabels?: readonly string[];
|
|
57
|
+
/** Show the current value next to the label (`<output>`). */
|
|
58
|
+
showValue?: boolean;
|
|
59
|
+
name?: string;
|
|
60
|
+
disabled?: boolean;
|
|
61
|
+
ref?: React.Ref<HTMLDivElement>;
|
|
62
|
+
};
|
|
63
|
+
export declare function Slider<V extends SliderValue = number>({ label, hideLabel, description, value, defaultValue, onValueChange, onValueCommitted, min, max, step, largeStep, minStepsBetweenValues, marks, format, formatValue, getAriaValueText, thumbLabels, showValue, name, disabled, className, ref, ...rest }: SliderProps<V>): React.JSX.Element;
|
|
64
|
+
export {};
|
|
65
|
+
//# sourceMappingURL=Slider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Slider.d.ts","sourceRoot":"","sources":["../../src/components/Slider.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B;;;;;;;;;;;;;GAaG;AAEH,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,gFAAgF;IAChF,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,gDAAgD;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,KAAK,WAAW,GAAG,MAAM,GAAG,SAAS,MAAM,EAAE,CAAC;AAC9C,iGAAiG;AACjG,MAAM,MAAM,iBAAiB,CAAC,CAAC,SAAS,WAAW,IAAI,CAAC,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,CAAC;AAE5F,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,WAAW,GAAG,MAAM,IAAI,IAAI,CAC5D,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,EACpC,UAAU,GAAG,cAAc,GAAG,UAAU,GAAG,YAAY,GAAG,iBAAiB,CAC5E,GAAG;IACF,yEAAyE;IACzE,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,wEAAwE;IACxE,YAAY,CAAC,EAAE,KAAK,CAAC;IACrB,iBAAiB,CAAC,EAAE,KAAK,CAAC;IAC1B,8CAA8C;IAC9C,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,2EAA2E;IAC3E,KAAK,CAAC,EAAE,CAAC,CAAC;IACV,YAAY,CAAC,EAAE,CAAC,CAAC;IACjB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;IACtD,+DAA+D;IAC/D,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;IACzD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iEAAiE;IACjE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wDAAwD;IACxD,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,KAAK,CAAC,EAAE,SAAS,UAAU,EAAE,CAAC;IAC9B,wFAAwF;IACxF,MAAM,CAAC,EAAE,IAAI,CAAC,mBAAmB,CAAC;IAClC,4FAA4F;IAC5F,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IACxC,uEAAuE;IACvE,gBAAgB,CAAC,EAAE,CAAC,cAAc,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IACpF,sEAAsE;IACtE,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,6DAA6D;IAC7D,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;CACjC,CAAC;AAQF,wBAAgB,MAAM,CAAC,CAAC,SAAS,WAAW,GAAG,MAAM,EAAE,EACrD,KAAK,EACL,SAAiB,EACjB,WAAW,EACX,KAAK,EACL,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,GAAO,EACP,GAAS,EACT,IAAQ,EACR,SAAS,EACT,qBAAqB,EACrB,KAAK,EACL,MAAM,EACN,WAAW,EACX,gBAAgB,EAChB,WAAW,EACX,SAAiB,EACjB,IAAI,EACJ,QAAQ,EACR,SAAS,EACT,GAAG,EACH,GAAG,IAAI,EACR,EAAE,WAAW,CAAC,CAAC,CAAC,qBAoFhB"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { Slider as BaseSlider } from '@base-ui/react/slider';
|
|
5
|
+
import { useRhineLocale } from '../provider/messages.js';
|
|
6
|
+
import { cx } from '../utils/cx.js';
|
|
7
|
+
function markText(mark) {
|
|
8
|
+
if (!mark)
|
|
9
|
+
return undefined;
|
|
10
|
+
if (mark.valueText != null)
|
|
11
|
+
return mark.valueText;
|
|
12
|
+
return typeof mark.label === 'string' || typeof mark.label === 'number' ? String(mark.label) : undefined;
|
|
13
|
+
}
|
|
14
|
+
export function Slider({ label, hideLabel = false, description, value, defaultValue, onValueChange, onValueCommitted, min = 0, max = 100, step = 1, largeStep, minStepsBetweenValues, marks, format, formatValue, getAriaValueText, thumbLabels, showValue = false, name, disabled, className, ref, ...rest }) {
|
|
15
|
+
const { locale } = useRhineLocale();
|
|
16
|
+
const descriptionId = React.useId();
|
|
17
|
+
const current = value ?? defaultValue;
|
|
18
|
+
const thumbCount = Array.isArray(current) ? current.length : 1;
|
|
19
|
+
const range = max - min || 1;
|
|
20
|
+
const markFor = (v) => marks?.find((m) => m.value === v);
|
|
21
|
+
const textFor = (formatted, v) => markText(markFor(v)) ?? (formatValue ? formatValue(v) : formatted);
|
|
22
|
+
const valueText = (formatted, v, index) => getAriaValueText ? getAriaValueText(formatted, v, index) : textFor(formatted, v);
|
|
23
|
+
// Base UI may hand out a frozen array; copy it so callers can keep and mutate their state.
|
|
24
|
+
const normalize = (next) => (Array.isArray(next) ? [...next] : next);
|
|
25
|
+
return (_jsxs(BaseSlider.Root, { ...rest, ref: ref, value: value, defaultValue: defaultValue, onValueChange: onValueChange ? (next) => onValueChange(normalize(next)) : undefined, onValueCommitted: onValueCommitted ? (next) => onValueCommitted(normalize(next)) : undefined, min: min, max: max, step: step, largeStep: largeStep, minStepsBetweenValues: minStepsBetweenValues, format: format, locale: locale, name: name, disabled: disabled, className: cx('rl-slider', className), "data-slot": "slider", "data-has-marks": marks?.some((m) => m.label != null) || undefined, children: [_jsxs("div", { className: cx('rl-slider__header', hideLabel && !showValue && 'rl-visually-hidden'), children: [_jsx(BaseSlider.Label, { className: cx('rl-slider__label', hideLabel && 'rl-visually-hidden'), children: label }), showValue && (_jsx(BaseSlider.Value, { className: "rl-slider__value", children: (formatted, values) => values.map((v, i) => textFor(formatted[i] ?? String(v), v)).join(' – ') }))] }), _jsxs(BaseSlider.Control, { className: "rl-slider__control", children: [_jsxs(BaseSlider.Track, { className: "rl-slider__track", children: [_jsx(BaseSlider.Indicator, { className: "rl-slider__indicator" }), Array.from({ length: thumbCount }, (_, index) => (_jsx(BaseSlider.Thumb, { index: index, className: "rl-slider__thumb", getAriaLabel: thumbLabels ? (i) => thumbLabels[i] ?? '' : undefined, getAriaValueText: valueText, "aria-describedby": description != null ? descriptionId : undefined }, index)))] }), marks && marks.length > 0 && (_jsx("div", { className: "rl-slider__marks", "aria-hidden": "true", children: marks.map((mark) => {
|
|
26
|
+
const percent = ((Math.min(max, Math.max(min, mark.value)) - min) / range) * 100;
|
|
27
|
+
return (_jsxs("span", { className: "rl-slider__mark", "data-edge": percent === 0 ? 'start' : percent === 100 ? 'end' : undefined, style: { '--rl-slider-mark-position': `${percent}%` }, children: [_jsx("span", { className: "rl-slider__tick" }), mark.label != null && _jsx("span", { className: "rl-slider__mark-label", children: mark.label })] }, mark.value));
|
|
28
|
+
}) }))] }), description != null && (_jsx("p", { id: descriptionId, className: "rl-slider__description", children: description }))] }));
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=Slider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Slider.js","sourceRoot":"","sources":["../../src/components/Slider.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* Indeterminate activity indicator (ADR-0006 §7). With `label` it is a polite status
|
|
4
|
+
* (`role="status"` + visually hidden text); without, it is decorative and the surrounding
|
|
5
|
+
* control carries the busy state (e.g. Button `aria-busy`). Rotation runs on motion/react and
|
|
6
|
+
* stops under reduced motion (OS or RhineProvider), leaving a longer static arc.
|
|
7
|
+
*
|
|
8
|
+
* <Spinner size="sm" label="正在加载记录" />
|
|
9
|
+
*/
|
|
10
|
+
export type SpinnerSize = 'sm' | 'md' | 'lg';
|
|
11
|
+
export type SpinnerProps = Omit<React.HTMLAttributes<HTMLSpanElement>, 'children' | 'role'> & {
|
|
12
|
+
/** Maps to the icon-size tokens. */
|
|
13
|
+
size?: SpinnerSize;
|
|
14
|
+
/** Spoken status text, e.g. 「正在加载」. Omit for a decorative spinner. */
|
|
15
|
+
label?: string;
|
|
16
|
+
};
|
|
17
|
+
export declare const Spinner: React.ForwardRefExoticComponent<Omit<React.HTMLAttributes<HTMLSpanElement>, "children" | "role"> & {
|
|
18
|
+
/** Maps to the icon-size tokens. */
|
|
19
|
+
size?: SpinnerSize;
|
|
20
|
+
/** Spoken status text, e.g. 「正在加载」. Omit for a decorative spinner. */
|
|
21
|
+
label?: string;
|
|
22
|
+
} & React.RefAttributes<HTMLSpanElement>>;
|
|
23
|
+
//# sourceMappingURL=Spinner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Spinner.d.ts","sourceRoot":"","sources":["../../src/components/Spinner.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAM/B;;;;;;;GAOG;AAEH,MAAM,MAAM,WAAW,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAE7C,MAAM,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,eAAe,CAAC,EAAE,UAAU,GAAG,MAAM,CAAC,GAAG;IAC5F,oCAAoC;IACpC,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,sEAAsE;IACtE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,eAAO,MAAM,OAAO;IANlB,oCAAoC;WAC7B,WAAW;IAClB,sEAAsE;YAC9D,MAAM;yCAkCd,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { motion } from 'motion/react';
|
|
5
|
+
import { transition } from '../motion/presets.js';
|
|
6
|
+
import { useRhineMotion } from '../motion/useRhineMotion.js';
|
|
7
|
+
import { cx } from '../utils/cx.js';
|
|
8
|
+
export const Spinner = React.forwardRef(function Spinner({ size = 'md', label, className, ...rest }, ref) {
|
|
9
|
+
const { reduced } = useRhineMotion();
|
|
10
|
+
const named = label !== undefined && label !== '';
|
|
11
|
+
return (_jsxs("span", { ...rest, ref: ref, className: cx('rl-spinner', className), "data-slot": "spinner", "data-size": size, "data-reduced": reduced || undefined, role: named ? 'status' : undefined, "aria-hidden": named ? undefined : true, children: [_jsxs(motion.svg, { className: "rl-spinner__svg", viewBox: "0 0 16 16", "aria-hidden": "true", focusable: "false", animate: reduced ? { rotate: 0 } : { rotate: 360 }, transition: reduced ? transition.instant : transition.loop, children: [_jsx("circle", { className: "rl-spinner__track", cx: "8", cy: "8", r: "6" }), _jsx("circle", { className: "rl-spinner__arc", cx: "8", cy: "8", r: "6", pathLength: "100" })] }), named && _jsx("span", { className: "rl-visually-hidden", children: label })] }));
|
|
12
|
+
});
|
|
13
|
+
//# sourceMappingURL=Spinner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Spinner.js","sourceRoot":"","sources":["../../src/components/Spinner.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AAoBpC,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU,CAAgC,SAAS,OAAO,CACrF,EAAE,IAAI,GAAG,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,EAC1C,GAAG;IAEH,MAAM,EAAE,OAAO,EAAE,GAAG,cAAc,EAAE,CAAC;IACrC,MAAM,KAAK,GAAG,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,CAAC;IAClD,OAAO,CACL,mBACM,IAAI,EACR,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CAAC,YAAY,EAAE,SAAS,CAAC,eAC5B,SAAS,eACR,IAAI,kBACD,OAAO,IAAI,SAAS,EAClC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,iBACrB,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,aAErC,MAAC,MAAM,CAAC,GAAG,IACT,SAAS,EAAC,iBAAiB,EAC3B,OAAO,EAAC,WAAW,iBACP,MAAM,EAClB,SAAS,EAAC,OAAO,EACjB,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,EAClD,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,aAE1D,iBAAQ,SAAS,EAAC,mBAAmB,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,EAAC,CAAC,EAAC,GAAG,GAAG,EAC5D,iBAAQ,SAAS,EAAC,iBAAiB,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,EAAC,CAAC,EAAC,GAAG,EAAC,UAAU,EAAC,KAAK,GAAG,IAChE,EACZ,KAAK,IAAI,eAAM,SAAS,EAAC,oBAAoB,YAAE,KAAK,GAAQ,IACxD,CACR,CAAC;AACJ,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import type { ButtonSize, ButtonVariant } from './Button.js';
|
|
3
|
+
import type { MenuAlign, MenuSide } from './Menu.js';
|
|
4
|
+
/**
|
|
5
|
+
* A primary action with an attached menu of related actions ("导出 CSV ▾ → 导出 JSON / 导出 PDF").
|
|
6
|
+
* Both halves are real `<button>`s inside a `role="group"` named by `label`, drawn in one frame.
|
|
7
|
+
* The main part is the public Button (loading keeps focus and announces busy); the toggle is an
|
|
8
|
+
* IconButton (name from `menuLabel`) that opens the public Menu (Base UI: menu / menuitem
|
|
9
|
+
* semantics, arrow keys, typeahead, Escape returns focus to the toggle). Enter / Space / ↓ on the
|
|
10
|
+
* toggle open the menu. While `loading` the toggle is `aria-disabled` and refuses to open (it keeps
|
|
11
|
+
* focus, so choosing a menu item that starts the busy state never drops focus to the page), and an
|
|
12
|
+
* open menu closes. `disabled` disables both halves natively. Motion: Button press + Menu CSS
|
|
13
|
+
* transition only.
|
|
14
|
+
*
|
|
15
|
+
* <SplitButton label="导出 CSV" menuLabel="更多导出格式" onClick={exportCsv}>
|
|
16
|
+
* <MenuItem onSelect={exportJson}>导出 JSON</MenuItem>
|
|
17
|
+
* </SplitButton>
|
|
18
|
+
*/
|
|
19
|
+
export type SplitButtonProps = Omit<React.HTMLAttributes<HTMLDivElement>, 'onClick' | 'children' | 'role' | 'aria-label'> & {
|
|
20
|
+
/** Text of the main action; also names the group. */
|
|
21
|
+
label: string;
|
|
22
|
+
onClick?: (event: React.MouseEvent<HTMLButtonElement>) => void;
|
|
23
|
+
/** Accessible name of the menu toggle, e.g. 「更多导出方式」. */
|
|
24
|
+
menuLabel: string;
|
|
25
|
+
/** Menu content: MenuItem, MenuGroup, MenuSeparator… */
|
|
26
|
+
children: React.ReactNode;
|
|
27
|
+
variant?: ButtonVariant;
|
|
28
|
+
size?: ButtonSize;
|
|
29
|
+
disabled?: boolean;
|
|
30
|
+
/** Busy main action; the toggle stays focusable but will not open until it settles. */
|
|
31
|
+
loading?: boolean;
|
|
32
|
+
/** Decorative leading icon of the main action. */
|
|
33
|
+
iconStart?: React.ReactNode;
|
|
34
|
+
menuSide?: MenuSide;
|
|
35
|
+
menuAlign?: MenuAlign;
|
|
36
|
+
menuOpen?: boolean;
|
|
37
|
+
onMenuOpenChange?: (open: boolean) => void;
|
|
38
|
+
};
|
|
39
|
+
export declare const SplitButton: React.ForwardRefExoticComponent<Omit<React.HTMLAttributes<HTMLDivElement>, "children" | "role" | "aria-label" | "onClick"> & {
|
|
40
|
+
/** Text of the main action; also names the group. */
|
|
41
|
+
label: string;
|
|
42
|
+
onClick?: (event: React.MouseEvent<HTMLButtonElement>) => void;
|
|
43
|
+
/** Accessible name of the menu toggle, e.g. 「更多导出方式」. */
|
|
44
|
+
menuLabel: string;
|
|
45
|
+
/** Menu content: MenuItem, MenuGroup, MenuSeparator… */
|
|
46
|
+
children: React.ReactNode;
|
|
47
|
+
variant?: ButtonVariant;
|
|
48
|
+
size?: ButtonSize;
|
|
49
|
+
disabled?: boolean;
|
|
50
|
+
/** Busy main action; the toggle stays focusable but will not open until it settles. */
|
|
51
|
+
loading?: boolean;
|
|
52
|
+
/** Decorative leading icon of the main action. */
|
|
53
|
+
iconStart?: React.ReactNode;
|
|
54
|
+
menuSide?: MenuSide;
|
|
55
|
+
menuAlign?: MenuAlign;
|
|
56
|
+
menuOpen?: boolean;
|
|
57
|
+
onMenuOpenChange?: (open: boolean) => void;
|
|
58
|
+
} & React.RefAttributes<HTMLDivElement>>;
|
|
59
|
+
//# sourceMappingURL=SplitButton.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SplitButton.d.ts","sourceRoot":"","sources":["../../src/components/SplitButton.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAI7D,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAErD;;;;;;;;;;;;;;GAcG;AAEH,MAAM,MAAM,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,SAAS,GAAG,UAAU,GAAG,MAAM,GAAG,YAAY,CAAC,GAAG;IAC1H,qDAAqD;IACrD,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;IAC/D,yDAAyD;IACzD,SAAS,EAAE,MAAM,CAAC;IAClB,wDAAwD;IACxD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,uFAAuF;IACvF,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,kDAAkD;IAClD,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC5B,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;CAC5C,CAAC;AAkBF,eAAO,MAAM,WAAW;IApCtB,qDAAqD;WAC9C,MAAM;cACH,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,iBAAiB,CAAC,KAAK,IAAI;IAC9D,yDAAyD;eAC9C,MAAM;IACjB,wDAAwD;cAC9C,KAAK,CAAC,SAAS;cACf,aAAa;WAChB,UAAU;eACN,OAAO;IAClB,uFAAuF;cAC7E,OAAO;IACjB,kDAAkD;gBACtC,KAAK,CAAC,SAAS;eAChB,QAAQ;gBACP,SAAS;eACV,OAAO;uBACC,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI;wCAmF1C,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { cx } from '../utils/cx.js';
|
|
5
|
+
import { Button } from './Button.js';
|
|
6
|
+
import { IconButton } from './IconButton.js';
|
|
7
|
+
import { Menu } from './Menu.js';
|
|
8
|
+
const toggleVariant = {
|
|
9
|
+
primary: 'primary',
|
|
10
|
+
// Accent has no IconButton twin; split.css paints the toggle with the accent tokens.
|
|
11
|
+
accent: 'primary',
|
|
12
|
+
secondary: 'secondary',
|
|
13
|
+
ghost: 'ghost',
|
|
14
|
+
};
|
|
15
|
+
function Chevron() {
|
|
16
|
+
return (_jsx("svg", { viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "1.5", "aria-hidden": "true", focusable: "false", children: _jsx("path", { d: "m4 6 4 4 4-4", strokeLinecap: "round", strokeLinejoin: "round" }) }));
|
|
17
|
+
}
|
|
18
|
+
export const SplitButton = React.forwardRef(function SplitButton({ label, onClick, menuLabel, children, variant = 'primary', size = 'md', disabled = false, loading = false, iconStart, menuSide = 'bottom', menuAlign = 'end', menuOpen, onMenuOpenChange, className, ...rest }, ref) {
|
|
19
|
+
const [innerOpen, setInnerOpen] = React.useState(false);
|
|
20
|
+
const open = (menuOpen ?? innerOpen) && !loading && !disabled;
|
|
21
|
+
const handleOpenChange = (next) => {
|
|
22
|
+
if (next && loading)
|
|
23
|
+
return;
|
|
24
|
+
if (menuOpen === undefined)
|
|
25
|
+
setInnerOpen(next);
|
|
26
|
+
onMenuOpenChange?.(next);
|
|
27
|
+
};
|
|
28
|
+
return (_jsxs("div", { ...rest, ref: ref, role: "group", "aria-label": label, className: cx('rl-split-button', className), "data-slot": "split-button", "data-variant": variant, "data-size": size, "data-disabled": disabled || undefined, children: [_jsx(Button, { className: "rl-split-button__main", variant: variant, size: size, disabled: disabled, loading: loading, iconStart: iconStart, onClick: onClick, children: label }), _jsx(Menu, { side: menuSide, align: menuAlign, open: open, onOpenChange: handleOpenChange, disabled: disabled, trigger: _jsx(IconButton, { className: "rl-split-button__toggle", label: menuLabel, icon: _jsx(Chevron, {}), variant: toggleVariant[variant], size: size, disabled: disabled, "aria-disabled": loading || undefined }), children: children })] }));
|
|
29
|
+
});
|
|
30
|
+
//# sourceMappingURL=SplitButton.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SplitButton.js","sourceRoot":"","sources":["../../src/components/SplitButton.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAwCjC,MAAM,aAAa,GAA6C;IAC9D,OAAO,EAAE,SAAS;IAClB,qFAAqF;IACrF,MAAM,EAAE,SAAS;IACjB,SAAS,EAAE,WAAW;IACtB,KAAK,EAAE,OAAO;CACf,CAAC;AAEF,SAAS,OAAO;IACd,OAAO,CACL,cAAK,OAAO,EAAC,WAAW,EAAC,IAAI,EAAC,MAAM,EAAC,MAAM,EAAC,cAAc,EAAC,WAAW,EAAC,KAAK,iBAAa,MAAM,EAAC,SAAS,EAAC,OAAO,YAC/G,eAAM,CAAC,EAAC,cAAc,EAAC,aAAa,EAAC,OAAO,EAAC,cAAc,EAAC,OAAO,GAAG,GAClE,CACP,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,CAAC,UAAU,CAAmC,SAAS,WAAW,CAChG,EACE,KAAK,EACL,OAAO,EACP,SAAS,EACT,QAAQ,EACR,OAAO,GAAG,SAAS,EACnB,IAAI,GAAG,IAAI,EACX,QAAQ,GAAG,KAAK,EAChB,OAAO,GAAG,KAAK,EACf,SAAS,EACT,QAAQ,GAAG,QAAQ,EACnB,SAAS,GAAG,KAAK,EACjB,QAAQ,EACR,gBAAgB,EAChB,SAAS,EACT,GAAG,IAAI,EACR,EACD,GAAG;IAEH,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxD,MAAM,IAAI,GAAG,CAAC,QAAQ,IAAI,SAAS,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,QAAQ,CAAC;IAC9D,MAAM,gBAAgB,GAAG,CAAC,IAAa,EAAE,EAAE;QACzC,IAAI,IAAI,IAAI,OAAO;YAAE,OAAO;QAC5B,IAAI,QAAQ,KAAK,SAAS;YAAE,YAAY,CAAC,IAAI,CAAC,CAAC;QAC/C,gBAAgB,EAAE,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC,CAAC;IACF,OAAO,CACL,kBACM,IAAI,EACR,GAAG,EAAE,GAAG,EACR,IAAI,EAAC,OAAO,gBACA,KAAK,EACjB,SAAS,EAAE,EAAE,CAAC,iBAAiB,EAAE,SAAS,CAAC,eACjC,cAAc,kBACV,OAAO,eACV,IAAI,mBACA,QAAQ,IAAI,SAAS,aAEpC,KAAC,MAAM,IAAC,SAAS,EAAC,uBAAuB,EAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,YACjJ,KAAK,GACC,EACT,KAAC,IAAI,IACH,IAAI,EAAE,QAAQ,EACd,KAAK,EAAE,SAAS,EAChB,IAAI,EAAE,IAAI,EACV,YAAY,EAAE,gBAAgB,EAC9B,QAAQ,EAAE,QAAQ,EAClB,OAAO,EACL,KAAC,UAAU,IACT,SAAS,EAAC,yBAAyB,EACnC,KAAK,EAAE,SAAS,EAChB,IAAI,EAAE,KAAC,OAAO,KAAG,EACjB,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC,EAC/B,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,QAAQ,mBACH,OAAO,IAAI,SAAS,GACnC,YAGH,QAAQ,GACJ,IACH,CACP,CAAC;AACJ,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* Labelled figure with an optional change (ADR-0005 §5). A rise is not assumed to be good:
|
|
4
|
+
* the caller sets `delta.tone`. Missing values show "—" and are read as "无数据"; the component
|
|
5
|
+
* never substitutes 0.
|
|
6
|
+
*
|
|
7
|
+
* <Stat label="待复核记录" value={128} unit="条" delta={{ value: -12, label: '较上周' }} />
|
|
8
|
+
*/
|
|
9
|
+
export type StatTone = 'neutral' | 'success' | 'warning' | 'danger' | 'info';
|
|
10
|
+
export interface StatDelta {
|
|
11
|
+
/** Signed change. The sign drives the arrow; it says nothing about good or bad. */
|
|
12
|
+
value: number;
|
|
13
|
+
/** Displayed change; defaults to the signed number (e.g. "+12", "−3"). */
|
|
14
|
+
text?: React.ReactNode;
|
|
15
|
+
/** Context, e.g. "较上周". */
|
|
16
|
+
label?: React.ReactNode;
|
|
17
|
+
tone?: StatTone;
|
|
18
|
+
}
|
|
19
|
+
export type StatProps = Omit<React.HTMLAttributes<HTMLElement>, 'children'> & {
|
|
20
|
+
label: React.ReactNode;
|
|
21
|
+
/** Number or preformatted text. `null` / `undefined` = no data. */
|
|
22
|
+
value: number | string | null | undefined;
|
|
23
|
+
/** Formatting for numeric `value` (Intl.NumberFormat). */
|
|
24
|
+
format?: Intl.NumberFormatOptions;
|
|
25
|
+
locale?: Intl.LocalesArgument;
|
|
26
|
+
unit?: React.ReactNode;
|
|
27
|
+
delta?: StatDelta;
|
|
28
|
+
/** Business status of the figure; shown as a side rule, never as the only signal. */
|
|
29
|
+
status?: StatTone;
|
|
30
|
+
description?: React.ReactNode;
|
|
31
|
+
loading?: boolean;
|
|
32
|
+
size?: 'sm' | 'md' | 'lg';
|
|
33
|
+
/** Spoken text for missing values. */
|
|
34
|
+
emptyLabel?: string;
|
|
35
|
+
};
|
|
36
|
+
export declare const Stat: React.ForwardRefExoticComponent<Omit<React.HTMLAttributes<HTMLElement>, "children"> & {
|
|
37
|
+
label: React.ReactNode;
|
|
38
|
+
/** Number or preformatted text. `null` / `undefined` = no data. */
|
|
39
|
+
value: number | string | null | undefined;
|
|
40
|
+
/** Formatting for numeric `value` (Intl.NumberFormat). */
|
|
41
|
+
format?: Intl.NumberFormatOptions;
|
|
42
|
+
locale?: Intl.LocalesArgument;
|
|
43
|
+
unit?: React.ReactNode;
|
|
44
|
+
delta?: StatDelta;
|
|
45
|
+
/** Business status of the figure; shown as a side rule, never as the only signal. */
|
|
46
|
+
status?: StatTone;
|
|
47
|
+
description?: React.ReactNode;
|
|
48
|
+
loading?: boolean;
|
|
49
|
+
size?: "sm" | "md" | "lg";
|
|
50
|
+
/** Spoken text for missing values. */
|
|
51
|
+
emptyLabel?: string;
|
|
52
|
+
} & React.RefAttributes<HTMLElement>>;
|
|
53
|
+
//# sourceMappingURL=Stat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Stat.d.ts","sourceRoot":"","sources":["../../src/components/Stat.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B;;;;;;GAMG;AAEH,MAAM,MAAM,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE7E,MAAM,WAAW,SAAS;IACxB,mFAAmF;IACnF,KAAK,EAAE,MAAM,CAAC;IACd,0EAA0E;IAC1E,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,2BAA2B;IAC3B,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,IAAI,CAAC,EAAE,QAAQ,CAAC;CACjB;AAED,MAAM,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,UAAU,CAAC,GAAG;IAC5E,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,mEAAmE;IACnE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC1C,0DAA0D;IAC1D,MAAM,CAAC,EAAE,IAAI,CAAC,mBAAmB,CAAC;IAClC,MAAM,CAAC,EAAE,IAAI,CAAC,eAAe,CAAC;IAC9B,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,qFAAqF;IACrF,MAAM,CAAC,EAAE,QAAQ,CAAC;IAClB,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,sCAAsC;IACtC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAWF,eAAO,MAAM,IAAI;WA1BR,KAAK,CAAC,SAAS;IACtB,mEAAmE;WAC5D,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS;IACzC,0DAA0D;aACjD,IAAI,CAAC,mBAAmB;aACxB,IAAI,CAAC,eAAe;WACtB,KAAK,CAAC,SAAS;YACd,SAAS;IACjB,qFAAqF;aAC5E,QAAQ;kBACH,KAAK,CAAC,SAAS;cACnB,OAAO;WACV,IAAI,GAAG,IAAI,GAAG,IAAI;IACzB,sCAAsC;iBACzB,MAAM;qCA+EnB,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { useRhineLocale } from '../provider/messages.js';
|
|
5
|
+
import { cx } from '../utils/cx.js';
|
|
6
|
+
import { Skeleton } from './Skeleton.js';
|
|
7
|
+
function DeltaIcon({ direction }) {
|
|
8
|
+
const d = direction === 'up' ? 'M8 12.5V3.5M4 7.5l4-4 4 4' : direction === 'down' ? 'M8 3.5v9M4 8.5l4 4 4-4' : 'M3.5 8h9';
|
|
9
|
+
return (_jsx("svg", { className: "rl-stat__delta-icon", viewBox: "0 0 16 16", "aria-hidden": "true", focusable: "false", children: _jsx("path", { d: d }) }));
|
|
10
|
+
}
|
|
11
|
+
export const Stat = React.forwardRef(function Stat({ label, value, format, locale, unit, delta, status, description, loading = false, size = 'md', emptyLabel: emptyLabelProp, className, ...rest }, ref) {
|
|
12
|
+
const { messages, locale: contextLocale } = useRhineLocale();
|
|
13
|
+
// ADR-0009 §3: the component's own `locale` wins over the provider's.
|
|
14
|
+
const numberLocale = locale ?? contextLocale;
|
|
15
|
+
const emptyLabel = emptyLabelProp ?? messages.stat.empty;
|
|
16
|
+
const empty = value === null || value === undefined || value === '';
|
|
17
|
+
const display = empty ? null : typeof value === 'number' ? new Intl.NumberFormat(numberLocale, format).format(value) : value;
|
|
18
|
+
const direction = delta ? (delta.value > 0 ? 'up' : delta.value < 0 ? 'down' : 'flat') : null;
|
|
19
|
+
const deltaText = delta?.text ??
|
|
20
|
+
(delta ? `${delta.value > 0 ? '+' : delta.value < 0 ? '−' : '±'}${new Intl.NumberFormat(numberLocale).format(Math.abs(delta.value))}` : null);
|
|
21
|
+
return (_jsxs("dl", { ...rest, ref: ref, className: cx('rl-stat', className), "data-slot": "stat", "data-size": size, "data-status": status, "aria-busy": loading || undefined, children: [_jsx("dt", { className: "rl-stat__label", children: label }), _jsxs("dd", { className: "rl-stat__value", "data-empty": (!loading && empty) || undefined, children: [loading ? (_jsx(Skeleton, { className: "rl-stat__skeleton", width: "calc(var(--rl-space-16) * 1.25)" })) : empty ? (_jsxs(_Fragment, { children: [_jsx("span", { "aria-hidden": "true", children: "\u2014" }), _jsx("span", { className: "rl-visually-hidden", children: emptyLabel })] })) : (_jsxs(_Fragment, { children: [_jsx("span", { className: "rl-stat__number", children: display }), unit != null && _jsx("span", { className: "rl-stat__unit", children: unit })] })), loading && _jsx("span", { className: "rl-visually-hidden", children: messages.stat.loading })] }), delta && direction && !loading && (_jsxs("dd", { className: "rl-stat__delta", "data-tone": delta.tone ?? 'neutral', "data-direction": direction, children: [_jsx(DeltaIcon, { direction: direction }), _jsx("span", { className: "rl-visually-hidden", children: messages.stat[direction] }), _jsx("span", { className: "rl-stat__delta-value", children: deltaText }), delta.label != null && _jsx("span", { className: "rl-stat__delta-label", children: delta.label })] })), description != null && _jsx("dd", { className: "rl-stat__description", children: description })] }));
|
|
22
|
+
});
|
|
23
|
+
//# sourceMappingURL=Stat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Stat.js","sourceRoot":"","sources":["../../src/components/Stat.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
export type StatusKind = 'neutral' | 'info' | 'success' | 'warning' | 'danger';
|
|
3
|
+
export type StatusBadgeSize = 'sm' | 'md';
|
|
4
|
+
export type StatusBadgeAppearance = 'subtle' | 'outline';
|
|
5
|
+
export type StatusBadgeProps = React.ComponentPropsWithoutRef<'span'> & {
|
|
6
|
+
/** Business status. Always paired with visible text; colour is never the only signal. */
|
|
7
|
+
status?: StatusKind;
|
|
8
|
+
size?: StatusBadgeSize;
|
|
9
|
+
/** `subtle` tints the background; `outline` keeps a neutral fill for dense tables. */
|
|
10
|
+
appearance?: StatusBadgeAppearance;
|
|
11
|
+
};
|
|
12
|
+
export declare const StatusBadge: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLSpanElement>, HTMLSpanElement>, "ref"> & {
|
|
13
|
+
/** Business status. Always paired with visible text; colour is never the only signal. */
|
|
14
|
+
status?: StatusKind;
|
|
15
|
+
size?: StatusBadgeSize;
|
|
16
|
+
/** `subtle` tints the background; `outline` keeps a neutral fill for dense tables. */
|
|
17
|
+
appearance?: StatusBadgeAppearance;
|
|
18
|
+
} & React.RefAttributes<HTMLSpanElement>>;
|
|
19
|
+
//# sourceMappingURL=StatusBadge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StatusBadge.d.ts","sourceRoot":"","sources":["../../src/components/StatusBadge.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;AAC/E,MAAM,MAAM,eAAe,GAAG,IAAI,GAAG,IAAI,CAAC;AAC1C,MAAM,MAAM,qBAAqB,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEzD,MAAM,MAAM,gBAAgB,GAAG,KAAK,CAAC,wBAAwB,CAAC,MAAM,CAAC,GAAG;IACtE,yFAAyF;IACzF,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB,sFAAsF;IACtF,UAAU,CAAC,EAAE,qBAAqB,CAAC;CACpC,CAAC;AAEF,eAAO,MAAM,WAAW;IAPtB,yFAAyF;aAChF,UAAU;WACZ,eAAe;IACtB,sFAAsF;iBACzE,qBAAqB;yCAqBlC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { cx } from '../utils/cx.js';
|
|
5
|
+
export const StatusBadge = React.forwardRef(function StatusBadge({ status = 'neutral', size = 'md', appearance = 'subtle', className, children, ...rest }, ref) {
|
|
6
|
+
return (_jsxs("span", { ...rest, ref: ref, className: cx('rl-badge', className), "data-slot": "status-badge", "data-status": status, "data-size": size, "data-appearance": appearance, children: [_jsx("span", { className: "rl-badge__indicator", "aria-hidden": "true" }), _jsx("span", { className: "rl-badge__label", children: children })] }));
|
|
7
|
+
});
|
|
8
|
+
//# sourceMappingURL=StatusBadge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StatusBadge.js","sourceRoot":"","sources":["../../src/components/StatusBadge.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AAcpC,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,CAAC,UAAU,CAAoC,SAAS,WAAW,CACjG,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,GAAG,IAAI,EAAE,UAAU,GAAG,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,EACxF,GAAG;IAEH,OAAO,CACL,mBACM,IAAI,EACR,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CAAC,UAAU,EAAE,SAAS,CAAC,eAC1B,cAAc,iBACX,MAAM,eACR,IAAI,qBACE,UAAU,aAE3B,eAAM,SAAS,EAAC,qBAAqB,iBAAa,MAAM,GAAG,EAC3D,eAAM,SAAS,EAAC,iBAAiB,YAAE,QAAQ,GAAQ,IAC9C,CACR,CAAC;AACJ,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import type { StatusKind } from './StatusBadge.js';
|
|
3
|
+
/**
|
|
4
|
+
* Inline live/system status: a shaped marker plus visible text, e.g. "同步中 · 2 分钟前".
|
|
5
|
+
* For changing values set `live` so updates are announced politely. The optional pulse is a
|
|
6
|
+
* Showcase-grade signal only for genuinely live connections; it stops under reduced motion
|
|
7
|
+
* and is never used to imply activity that is not happening.
|
|
8
|
+
*/
|
|
9
|
+
export type StatusIndicatorProps = Omit<React.HTMLAttributes<HTMLSpanElement>, 'children'> & {
|
|
10
|
+
tone?: StatusKind;
|
|
11
|
+
label: React.ReactNode;
|
|
12
|
+
/** Secondary detail after the label, e.g. last-updated text. */
|
|
13
|
+
detail?: React.ReactNode;
|
|
14
|
+
/** Announce changes to `label` / `detail` via a polite live region. */
|
|
15
|
+
live?: boolean;
|
|
16
|
+
/** Soft pulse on the marker for a real, active connection. Disabled by reduced motion. */
|
|
17
|
+
pulse?: boolean;
|
|
18
|
+
};
|
|
19
|
+
export declare const StatusIndicator: React.ForwardRefExoticComponent<Omit<React.HTMLAttributes<HTMLSpanElement>, "children"> & {
|
|
20
|
+
tone?: StatusKind;
|
|
21
|
+
label: React.ReactNode;
|
|
22
|
+
/** Secondary detail after the label, e.g. last-updated text. */
|
|
23
|
+
detail?: React.ReactNode;
|
|
24
|
+
/** Announce changes to `label` / `detail` via a polite live region. */
|
|
25
|
+
live?: boolean;
|
|
26
|
+
/** Soft pulse on the marker for a real, active connection. Disabled by reduced motion. */
|
|
27
|
+
pulse?: boolean;
|
|
28
|
+
} & React.RefAttributes<HTMLSpanElement>>;
|
|
29
|
+
//# sourceMappingURL=StatusIndicator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StatusIndicator.d.ts","sourceRoot":"","sources":["../../src/components/StatusIndicator.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD;;;;;GAKG;AAEH,MAAM,MAAM,oBAAoB,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,eAAe,CAAC,EAAE,UAAU,CAAC,GAAG;IAC3F,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,gEAAgE;IAChE,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,uEAAuE;IACvE,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,0FAA0F;IAC1F,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF,eAAO,MAAM,eAAe;WAVnB,UAAU;WACV,KAAK,CAAC,SAAS;IACtB,gEAAgE;aACvD,KAAK,CAAC,SAAS;IACxB,uEAAuE;WAChE,OAAO;IACd,0FAA0F;YAClF,OAAO;yCAuBf,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { cx } from '../utils/cx.js';
|
|
5
|
+
export const StatusIndicator = React.forwardRef(function StatusIndicator({ tone = 'neutral', label, detail, live = false, pulse = false, className, ...rest }, ref) {
|
|
6
|
+
return (_jsxs("span", { ...rest, ref: ref, className: cx('rl-status', className), "data-slot": "status-indicator", "data-tone": tone, "data-pulse": pulse || undefined, role: live ? 'status' : undefined, "aria-live": live ? 'polite' : undefined, children: [_jsx("span", { className: "rl-status__marker", "aria-hidden": "true" }), _jsx("span", { className: "rl-status__label", children: label }), detail != null && _jsx("span", { className: "rl-status__detail", children: detail })] }));
|
|
7
|
+
});
|
|
8
|
+
//# sourceMappingURL=StatusIndicator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StatusIndicator.js","sourceRoot":"","sources":["../../src/components/StatusIndicator.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AAqBpC,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,CAAC,UAAU,CAAwC,SAAS,eAAe,CAC7G,EAAE,IAAI,GAAG,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,GAAG,KAAK,EAAE,KAAK,GAAG,KAAK,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,EACpF,GAAG;IAEH,OAAO,CACL,mBACM,IAAI,EACR,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CAAC,WAAW,EAAE,SAAS,CAAC,eAC3B,kBAAkB,eACjB,IAAI,gBACH,KAAK,IAAI,SAAS,EAC9B,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,eACtB,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,aAEtC,eAAM,SAAS,EAAC,mBAAmB,iBAAa,MAAM,GAAG,EACzD,eAAM,SAAS,EAAC,kBAAkB,YAAE,KAAK,GAAQ,EAChD,MAAM,IAAI,IAAI,IAAI,eAAM,SAAS,EAAC,mBAAmB,YAAE,MAAM,GAAQ,IACjE,CACR,CAAC;AACJ,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
export type SurfaceTone = 'default' | 'subtle' | 'raised';
|
|
3
|
+
export type SurfacePadding = 'none' | 'sm' | 'md' | 'lg';
|
|
4
|
+
export type SurfaceElement = 'section' | 'div' | 'article' | 'aside';
|
|
5
|
+
export type SurfaceProps = React.ComponentPropsWithoutRef<'section'> & {
|
|
6
|
+
/** Layer tone. Hierarchy is expressed through tone first, shadow only for `raised`. */
|
|
7
|
+
tone?: SurfaceTone;
|
|
8
|
+
padding?: SurfacePadding;
|
|
9
|
+
/** Show a 1px outline. Decorative only; never the sole interactive boundary. */
|
|
10
|
+
bordered?: boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Rendered element. Defaults to `section`, which needs an accessible name
|
|
13
|
+
* (`aria-labelledby`) to be exposed as a landmark; use `div` for purely visual grouping.
|
|
14
|
+
*/
|
|
15
|
+
as?: SurfaceElement;
|
|
16
|
+
};
|
|
17
|
+
export declare const Surface: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement>, "ref"> & {
|
|
18
|
+
/** Layer tone. Hierarchy is expressed through tone first, shadow only for `raised`. */
|
|
19
|
+
tone?: SurfaceTone;
|
|
20
|
+
padding?: SurfacePadding;
|
|
21
|
+
/** Show a 1px outline. Decorative only; never the sole interactive boundary. */
|
|
22
|
+
bordered?: boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Rendered element. Defaults to `section`, which needs an accessible name
|
|
25
|
+
* (`aria-labelledby`) to be exposed as a landmark; use `div` for purely visual grouping.
|
|
26
|
+
*/
|
|
27
|
+
as?: SurfaceElement;
|
|
28
|
+
} & React.RefAttributes<HTMLElement>>;
|
|
29
|
+
//# sourceMappingURL=Surface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Surface.d.ts","sourceRoot":"","sources":["../../src/components/Surface.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAC1D,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AACzD,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,KAAK,GAAG,SAAS,GAAG,OAAO,CAAC;AAErE,MAAM,MAAM,YAAY,GAAG,KAAK,CAAC,wBAAwB,CAAC,SAAS,CAAC,GAAG;IACrE,uFAAuF;IACvF,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,gFAAgF;IAChF,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;OAGG;IACH,EAAE,CAAC,EAAE,cAAc,CAAC;CACrB,CAAC;AAEF,eAAO,MAAM,OAAO;IAZlB,uFAAuF;WAChF,WAAW;cACR,cAAc;IACxB,gFAAgF;eACrE,OAAO;IAClB;;;OAGG;SACE,cAAc;qCAkBnB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { cx } from '../utils/cx.js';
|
|
5
|
+
export const Surface = React.forwardRef(function Surface({ tone = 'default', padding = 'md', bordered = true, as: Element = 'section', className, ...rest }, ref) {
|
|
6
|
+
return (_jsx(Element, { ...rest, ref: ref, "data-slot": "surface", "data-tone": tone, "data-padding": padding, "data-bordered": bordered || undefined, className: cx('rl-surface', className) }));
|
|
7
|
+
});
|
|
8
|
+
//# sourceMappingURL=Surface.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Surface.js","sourceRoot":"","sources":["../../src/components/Surface.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AAmBpC,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU,CAA4B,SAAS,OAAO,CACjF,EAAE,IAAI,GAAG,SAAS,EAAE,OAAO,GAAG,IAAI,EAAE,QAAQ,GAAG,IAAI,EAAE,EAAE,EAAE,OAAO,GAAG,SAAS,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,EAClG,GAAG;IAEH,OAAO,CACL,KAAC,OAAO,OACF,IAAI,EACR,GAAG,EAAE,GAAgC,eAC3B,SAAS,eACR,IAAI,kBACD,OAAO,mBACN,QAAQ,IAAI,SAAS,EACpC,SAAS,EAAE,EAAE,CAAC,YAAY,EAAE,SAAS,CAAC,GACtC,CACH,CAAC;AACJ,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { Switch as BaseSwitch } from '@base-ui/react/switch';
|
|
3
|
+
/**
|
|
4
|
+
* On/off setting that takes effect immediately (role="switch"). For a choice that is only
|
|
5
|
+
* applied on submit, or that needs a "required" check, use Checkbox instead.
|
|
6
|
+
*
|
|
7
|
+
* <Switch label="自动归档" description="复核通过 30 天后移入归档。" checked={auto} onCheckedChange={setAuto} />
|
|
8
|
+
*/
|
|
9
|
+
type BaseRootProps = React.ComponentProps<typeof BaseSwitch.Root>;
|
|
10
|
+
export type SwitchProps = Omit<BaseRootProps, 'className' | 'style' | 'render' | 'children' | 'nativeButton' | 'required' | 'aria-label' | 'aria-labelledby'> & {
|
|
11
|
+
label: React.ReactNode;
|
|
12
|
+
hideLabel?: boolean;
|
|
13
|
+
/** The name comes from `label`; a second naming channel would drift from the visible text. */
|
|
14
|
+
'aria-label'?: never;
|
|
15
|
+
'aria-labelledby'?: never;
|
|
16
|
+
description?: React.ReactNode;
|
|
17
|
+
className?: string;
|
|
18
|
+
style?: React.CSSProperties;
|
|
19
|
+
};
|
|
20
|
+
export declare const Switch: React.ForwardRefExoticComponent<Omit<SwitchProps, "ref"> & React.RefAttributes<HTMLElement>>;
|
|
21
|
+
export {};
|
|
22
|
+
//# sourceMappingURL=Switch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Switch.d.ts","sourceRoot":"","sources":["../../src/components/Switch.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAI7D;;;;;GAKG;AAEH,KAAK,aAAa,GAAG,KAAK,CAAC,cAAc,CAAC,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;AAElE,MAAM,MAAM,WAAW,GAAG,IAAI,CAC5B,aAAa,EACb,WAAW,GAAG,OAAO,GAAG,QAAQ,GAAG,UAAU,GAAG,cAAc,GAAG,UAAU,GAAG,YAAY,GAAG,iBAAiB,CAC/G,GAAG;IACF,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,8FAA8F;IAC9F,YAAY,CAAC,EAAE,KAAK,CAAC;IACrB,iBAAiB,CAAC,EAAE,KAAK,CAAC;IAC1B,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B,CAAC;AAEF,eAAO,MAAM,MAAM,8FA0BjB,CAAC"}
|