@wzrhine/react 0.0.0-stage → 0.2.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 +99 -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 +63 -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 +49 -0
- package/dist/components/AlertDialog.d.ts.map +1 -0
- package/dist/components/AlertDialog.js +122 -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/Badge.d.ts +17 -0
- package/dist/components/Badge.d.ts.map +1 -0
- package/dist/components/Badge.js +16 -0
- package/dist/components/Badge.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 +33 -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 +49 -0
- package/dist/components/Dialog.d.ts.map +1 -0
- package/dist/components/Dialog.js +48 -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 +25 -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 +22 -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/Icon.d.ts +25 -0
- package/dist/components/Icon.d.ts.map +1 -0
- package/dist/components/Icon.js +38 -0
- package/dist/components/Icon.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 +54 -0
- package/dist/components/NumberField.d.ts.map +1 -0
- package/dist/components/NumberField.js +27 -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 +49 -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 +68 -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/ResizeHandle.d.ts +32 -0
- package/dist/components/ResizeHandle.d.ts.map +1 -0
- package/dist/components/ResizeHandle.js +33 -0
- package/dist/components/ResizeHandle.js.map +1 -0
- package/dist/components/ScrollArea.d.ts +60 -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/Tree.d.ts +28 -0
- package/dist/components/Tree.d.ts.map +1 -0
- package/dist/components/Tree.js +129 -0
- package/dist/components/Tree.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/Workbench.d.ts +31 -0
- package/dist/components/Workbench.d.ts.map +1 -0
- package/dist/components/Workbench.js +71 -0
- package/dist/components/Workbench.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/navigation.d.ts +38 -0
- package/dist/components/navigation.d.ts.map +1 -0
- package/dist/components/navigation.js +96 -0
- package/dist/components/navigation.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 +678 -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 +533 -0
- package/dist/index.d.ts +129 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +67 -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 +209 -0
- package/dist/provider/messages.d.ts.map +1 -0
- package/dist/provider/messages.js +168 -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 +67 -3
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* Location path (ADR-0005 §4): `<nav>` + ordered list; the last item without `href` is the
|
|
4
|
+
* current page. Separators are CSS-generated, so assistive tech reads only the items.
|
|
5
|
+
* Long paths collapse their middle items behind a button that expands in place.
|
|
6
|
+
*
|
|
7
|
+
* <Breadcrumb items={[{ label: '档案库', href: '#/' }, { label: '样本', href: '#/samples' }, { label: 'ARC-1024' }]} />
|
|
8
|
+
*/
|
|
9
|
+
export interface BreadcrumbItem {
|
|
10
|
+
label: React.ReactNode;
|
|
11
|
+
/** Omit for the current page; items with `href` render as links. */
|
|
12
|
+
href?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface BreadcrumbLinkProps {
|
|
15
|
+
href: string;
|
|
16
|
+
className: string;
|
|
17
|
+
title?: string;
|
|
18
|
+
children: React.ReactNode;
|
|
19
|
+
}
|
|
20
|
+
export type BreadcrumbProps = Omit<React.HTMLAttributes<HTMLElement>, 'children'> & {
|
|
21
|
+
items: readonly BreadcrumbItem[];
|
|
22
|
+
/** Accessible name of the navigation landmark. */
|
|
23
|
+
label?: string;
|
|
24
|
+
/**
|
|
25
|
+
* Collapse when the path has more than this many items: the first item and the last two stay,
|
|
26
|
+
* the rest hide behind an expand button. `0` never collapses.
|
|
27
|
+
*/
|
|
28
|
+
maxItems?: number;
|
|
29
|
+
/** Accessible name of the expand button; receives the total number of levels. */
|
|
30
|
+
expandLabel?: (count: number) => string;
|
|
31
|
+
/** Render links with a router component instead of `<a>`. */
|
|
32
|
+
renderLink?: (props: BreadcrumbLinkProps) => React.ReactNode;
|
|
33
|
+
};
|
|
34
|
+
export declare const Breadcrumb: React.ForwardRefExoticComponent<Omit<React.HTMLAttributes<HTMLElement>, "children"> & {
|
|
35
|
+
items: readonly BreadcrumbItem[];
|
|
36
|
+
/** Accessible name of the navigation landmark. */
|
|
37
|
+
label?: string;
|
|
38
|
+
/**
|
|
39
|
+
* Collapse when the path has more than this many items: the first item and the last two stay,
|
|
40
|
+
* the rest hide behind an expand button. `0` never collapses.
|
|
41
|
+
*/
|
|
42
|
+
maxItems?: number;
|
|
43
|
+
/** Accessible name of the expand button; receives the total number of levels. */
|
|
44
|
+
expandLabel?: (count: number) => string;
|
|
45
|
+
/** Render links with a router component instead of `<a>`. */
|
|
46
|
+
renderLink?: (props: BreadcrumbLinkProps) => React.ReactNode;
|
|
47
|
+
} & React.RefAttributes<HTMLElement>>;
|
|
48
|
+
//# sourceMappingURL=Breadcrumb.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Breadcrumb.d.ts","sourceRoot":"","sources":["../../src/components/Breadcrumb.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B;;;;;;GAMG;AAEH,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,oEAAoE;IACpE,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,UAAU,CAAC,GAAG;IAClF,KAAK,EAAE,SAAS,cAAc,EAAE,CAAC;IACjC,kDAAkD;IAClD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iFAAiF;IACjF,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IACxC,6DAA6D;IAC7D,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,KAAK,CAAC,SAAS,CAAC;CAC9D,CAAC;AAoBF,eAAO,MAAM,UAAU;WAhCd,SAAS,cAAc,EAAE;IAChC,kDAAkD;YAC1C,MAAM;IACd;;;OAGG;eACQ,MAAM;IACjB,iFAAiF;kBACnE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM;IACvC,6DAA6D;iBAChD,CAAC,KAAK,EAAE,mBAAmB,KAAK,KAAK,CAAC,SAAS;qCAyG5D,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx } 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
|
+
const textOf = (node) => typeof node === 'string' || typeof node === 'number' ? String(node) : undefined;
|
|
7
|
+
/** Labels up to this many characters never shrink: truncating them would leave nothing readable. */
|
|
8
|
+
const SHORT_LABEL = 4;
|
|
9
|
+
/**
|
|
10
|
+
* Width (in em of the trail's mono type) of the first three characters plus an ellipsis: the
|
|
11
|
+
* narrowest an ancestor may get. Only used for labels longer than SHORT_LABEL, so the minimum
|
|
12
|
+
* is always smaller than the label itself and can never open a gap after it.
|
|
13
|
+
*/
|
|
14
|
+
function shrinkFloor(text) {
|
|
15
|
+
const wide = (ch) => /[\u1100-\u115f\u2e80-\ua4cf\uac00-\ud7a3\uf900-\ufaff\ufe30-\ufe4f\uff00-\uff60\uffe0-\uffe6]/.test(ch);
|
|
16
|
+
// 1em per CJK glyph, 0.6em per Latin mono glyph, plus the 0.12em caps tracking each.
|
|
17
|
+
const glyphs = [...text].slice(0, 3).reduce((sum, ch) => sum + (wide(ch) ? 1.12 : 0.72), 0);
|
|
18
|
+
return Math.round((glyphs + 0.72) * 100) / 100;
|
|
19
|
+
}
|
|
20
|
+
export const Breadcrumb = React.forwardRef(function Breadcrumb({ items, label: labelProp, maxItems = 4, expandLabel: expandLabelProp, renderLink, className, ...rest }, ref) {
|
|
21
|
+
const { messages, formatNumber } = useRhineLocale();
|
|
22
|
+
const label = labelProp ?? messages.breadcrumb.nav;
|
|
23
|
+
const expandLabel = (count) => expandLabelProp ? expandLabelProp(count) : messages.breadcrumb.expand(count, formatNumber);
|
|
24
|
+
const [expanded, setExpanded] = React.useState(false);
|
|
25
|
+
const listRef = React.useRef(null);
|
|
26
|
+
const collapsible = maxItems > 0 && items.length > maxItems && items.length > 3;
|
|
27
|
+
const collapsed = collapsible && !expanded;
|
|
28
|
+
const hiddenFrom = 1;
|
|
29
|
+
const hiddenTo = items.length - 2;
|
|
30
|
+
const expand = () => {
|
|
31
|
+
setExpanded(true);
|
|
32
|
+
// The button disappears; move focus to the first revealed link so it is not lost.
|
|
33
|
+
requestAnimationFrame(() => {
|
|
34
|
+
listRef.current?.querySelectorAll('a, [aria-current]')[hiddenFrom]?.focus();
|
|
35
|
+
});
|
|
36
|
+
};
|
|
37
|
+
if (items.length === 0)
|
|
38
|
+
return null;
|
|
39
|
+
return (_jsx("nav", { ...rest, ref: ref, className: cx('rl-breadcrumb', className), "aria-label": rest['aria-label'] ?? label, "data-slot": "breadcrumb", children: _jsx("ol", { ref: listRef, className: "rl-breadcrumb__list", children: items.map((item, index) => {
|
|
40
|
+
if (collapsed && index >= hiddenFrom && index < hiddenTo) {
|
|
41
|
+
if (index !== hiddenFrom)
|
|
42
|
+
return null;
|
|
43
|
+
return (_jsx("li", { className: "rl-breadcrumb__item", "data-collapsed": "", children: _jsx("button", { type: "button", className: "rl-breadcrumb__expand", "aria-label": expandLabel(items.length), onClick: expand, children: _jsx("span", { "aria-hidden": "true", children: "\u2026" }) }) }, "collapsed"));
|
|
44
|
+
}
|
|
45
|
+
const last = index === items.length - 1;
|
|
46
|
+
const current = last && !item.href;
|
|
47
|
+
const title = textOf(item.label);
|
|
48
|
+
// Ancestors with a long text label may shrink to a floor; everything else keeps its width.
|
|
49
|
+
const floor = !last && title && [...title].length > SHORT_LABEL ? shrinkFloor(title) : undefined;
|
|
50
|
+
return (_jsx("li", { className: "rl-breadcrumb__item", "data-shrink": floor != null || undefined, style: floor != null ? { '--rl-crumb-floor': `${floor}em` } : undefined, children: item.href ? (renderLink ? (renderLink({ href: item.href, className: 'rl-breadcrumb__link', title, children: item.label })) : (_jsx("a", { className: "rl-breadcrumb__link", href: item.href, title: title, children: item.label }))) : (_jsx("span", { className: "rl-breadcrumb__current", "aria-current": current ? 'page' : undefined, title: title,
|
|
51
|
+
// Focus target after expanding; never in the tab order.
|
|
52
|
+
tabIndex: collapsible ? -1 : undefined, children: item.label })) }, index));
|
|
53
|
+
}) }) }));
|
|
54
|
+
});
|
|
55
|
+
//# sourceMappingURL=Breadcrumb.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Breadcrumb.js","sourceRoot":"","sources":["../../src/components/Breadcrumb.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
type MotionConflictingProps = 'onDrag' | 'onDragStart' | 'onDragEnd' | 'onAnimationStart' | 'onAnimationEnd' | 'onAnimationIteration';
|
|
3
|
+
export type ButtonVariant = 'primary' | 'accent' | 'secondary' | 'ghost';
|
|
4
|
+
export type ButtonSize = 'sm' | 'md' | 'lg';
|
|
5
|
+
export type ButtonTone = 'default' | 'danger';
|
|
6
|
+
export type ButtonProps = Omit<React.ComponentPropsWithoutRef<'button'>, 'disabled' | MotionConflictingProps> & {
|
|
7
|
+
/** Visual weight. `primary` = ink fill; `accent` = research-orange signal, use once per view. */
|
|
8
|
+
variant?: ButtonVariant;
|
|
9
|
+
size?: ButtonSize;
|
|
10
|
+
tone?: ButtonTone;
|
|
11
|
+
/** Blocks activation and announces busy state while keeping focus and the accessible name. */
|
|
12
|
+
loading?: boolean;
|
|
13
|
+
disabled?: boolean;
|
|
14
|
+
/** Decorative leading icon; hidden from assistive tech. */
|
|
15
|
+
iconStart?: React.ReactNode;
|
|
16
|
+
/** Decorative trailing icon; hidden from assistive tech. */
|
|
17
|
+
iconEnd?: React.ReactNode;
|
|
18
|
+
};
|
|
19
|
+
export declare const Button: React.ForwardRefExoticComponent<Omit<Omit<React.DetailedHTMLProps<React.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "ref">, MotionConflictingProps | "disabled"> & {
|
|
20
|
+
/** Visual weight. `primary` = ink fill; `accent` = research-orange signal, use once per view. */
|
|
21
|
+
variant?: ButtonVariant;
|
|
22
|
+
size?: ButtonSize;
|
|
23
|
+
tone?: ButtonTone;
|
|
24
|
+
/** Blocks activation and announces busy state while keeping focus and the accessible name. */
|
|
25
|
+
loading?: boolean;
|
|
26
|
+
disabled?: boolean;
|
|
27
|
+
/** Decorative leading icon; hidden from assistive tech. */
|
|
28
|
+
iconStart?: React.ReactNode;
|
|
29
|
+
/** Decorative trailing icon; hidden from assistive tech. */
|
|
30
|
+
iconEnd?: React.ReactNode;
|
|
31
|
+
} & React.RefAttributes<HTMLButtonElement>>;
|
|
32
|
+
export {};
|
|
33
|
+
//# sourceMappingURL=Button.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Button.d.ts","sourceRoot":"","sources":["../../src/components/Button.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAQ/B,KAAK,sBAAsB,GACvB,QAAQ,GACR,aAAa,GACb,WAAW,GACX,kBAAkB,GAClB,gBAAgB,GAChB,sBAAsB,CAAC;AAE3B,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,QAAQ,GAAG,WAAW,GAAG,OAAO,CAAC;AACzE,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAC5C,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,QAAQ,CAAC;AAE9C,MAAM,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,wBAAwB,CAAC,QAAQ,CAAC,EAAE,UAAU,GAAG,sBAAsB,CAAC,GAAG;IAC9G,iGAAiG;IACjG,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,8FAA8F;IAC9F,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,2DAA2D;IAC3D,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC5B,4DAA4D;IAC5D,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,CAAC;AAEF,eAAO,MAAM,MAAM;IAbjB,iGAAiG;cACvF,aAAa;WAChB,UAAU;WACV,UAAU;IACjB,8FAA8F;cACpF,OAAO;eACN,OAAO;IAClB,2DAA2D;gBAC/C,KAAK,CAAC,SAAS;IAC3B,4DAA4D;cAClD,KAAK,CAAC,SAAS;2CAoFzB,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { AnimatePresence, motion } from 'motion/react';
|
|
5
|
+
import { fadePresence, pressScale } from '../motion/presets.js';
|
|
6
|
+
import { useRhineMotion } from '../motion/useRhineMotion.js';
|
|
7
|
+
import { cx } from '../utils/cx.js';
|
|
8
|
+
import { Spinner } from './Spinner.js';
|
|
9
|
+
export const Button = React.forwardRef(function Button({ variant = 'primary', size = 'md', tone = 'default', loading = false, disabled = false, type = 'button', iconStart, iconEnd, children, className, onClick, ...rest }, ref) {
|
|
10
|
+
const motionPrefs = useRhineMotion();
|
|
11
|
+
const interactive = !disabled && !loading;
|
|
12
|
+
const handleClick = (event) => {
|
|
13
|
+
if (loading) {
|
|
14
|
+
// Also stops implicit form submission for type="submit".
|
|
15
|
+
event.preventDefault();
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
onClick?.(event);
|
|
19
|
+
};
|
|
20
|
+
return (_jsxs(motion.button, { ...rest, ref: ref, type: type,
|
|
21
|
+
// Native disabled removes focus; loading keeps the button focusable via aria-disabled.
|
|
22
|
+
disabled: disabled, "aria-disabled": loading || undefined, "aria-busy": loading || undefined, "data-slot": "button", "data-variant": variant, "data-size": size, "data-tone": tone, "data-loading": loading || undefined, className: cx('rl-button', className), onClick: handleClick, whileTap: interactive && !motionPrefs.reduced ? { scale: pressScale } : undefined, transition: motionPrefs.get('press'), children: [_jsxs(motion.span, { className: "rl-button__content", initial: false, animate: { opacity: loading ? 0 : 1 }, transition: motionPrefs.get('fast'), children: [iconStart != null && (_jsx("span", { className: "rl-button__icon", "aria-hidden": "true", children: iconStart })), _jsx("span", { className: "rl-button__label", children: children }), iconEnd != null && (_jsx("span", { className: "rl-button__icon", "aria-hidden": "true", children: iconEnd }))] }), _jsx(AnimatePresence, { initial: false, children: loading && (_jsx(motion.span, { className: "rl-button__spinner", "aria-hidden": "true", ...fadePresence, transition: motionPrefs.get('fast'), children: _jsx(Spinner, {}) }, "spinner")) })] }));
|
|
23
|
+
});
|
|
24
|
+
//# sourceMappingURL=Button.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Button.js","sourceRoot":"","sources":["../../src/components/Button.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AA6BvC,MAAM,CAAC,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU,CAAiC,SAAS,MAAM,CACpF,EACE,OAAO,GAAG,SAAS,EACnB,IAAI,GAAG,IAAI,EACX,IAAI,GAAG,SAAS,EAChB,OAAO,GAAG,KAAK,EACf,QAAQ,GAAG,KAAK,EAChB,IAAI,GAAG,QAAQ,EACf,SAAS,EACT,OAAO,EACP,QAAQ,EACR,SAAS,EACT,OAAO,EACP,GAAG,IAAI,EACR,EACD,GAAG;IAEH,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IACrC,MAAM,WAAW,GAAG,CAAC,QAAQ,IAAI,CAAC,OAAO,CAAC;IAE1C,MAAM,WAAW,GAAG,CAAC,KAA0C,EAAE,EAAE;QACjE,IAAI,OAAO,EAAE,CAAC;YACZ,yDAAyD;YACzD,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,OAAO;QACT,CAAC;QACD,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;IACnB,CAAC,CAAC;IAEF,OAAO,CACL,MAAC,MAAM,CAAC,MAAM,OACR,IAAI,EACR,GAAG,EAAE,GAAG,EACR,IAAI,EAAE,IAAI;QACV,uFAAuF;QACvF,QAAQ,EAAE,QAAQ,mBACH,OAAO,IAAI,SAAS,eACxB,OAAO,IAAI,SAAS,eACrB,QAAQ,kBACJ,OAAO,eACV,IAAI,eACJ,IAAI,kBACD,OAAO,IAAI,SAAS,EAClC,SAAS,EAAE,EAAE,CAAC,WAAW,EAAE,SAAS,CAAC,EACrC,OAAO,EAAE,WAAW,EACpB,QAAQ,EAAE,WAAW,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,SAAS,EACjF,UAAU,EAAE,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,aAEpC,MAAC,MAAM,CAAC,IAAI,IACV,SAAS,EAAC,oBAAoB,EAC9B,OAAO,EAAE,KAAK,EACd,OAAO,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EACrC,UAAU,EAAE,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,aAElC,SAAS,IAAI,IAAI,IAAI,CACpB,eAAM,SAAS,EAAC,iBAAiB,iBAAa,MAAM,YACjD,SAAS,GACL,CACR,EACD,eAAM,SAAS,EAAC,kBAAkB,YAAE,QAAQ,GAAQ,EACnD,OAAO,IAAI,IAAI,IAAI,CAClB,eAAM,SAAS,EAAC,iBAAiB,iBAAa,MAAM,YACjD,OAAO,GACH,CACR,IACW,EACd,KAAC,eAAe,IAAC,OAAO,EAAE,KAAK,YAC5B,OAAO,IAAI,CACV,KAAC,MAAM,CAAC,IAAI,IAEV,SAAS,EAAC,oBAAoB,iBAClB,MAAM,KACd,YAAY,EAChB,UAAU,EAAE,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,YAEnC,KAAC,OAAO,KAAG,IANP,SAAS,CAOD,CACf,GACe,IACJ,CACjB,CAAC;AACJ,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { Checkbox as BaseCheckbox } from '@base-ui/react/checkbox';
|
|
3
|
+
import { CheckboxGroup as BaseCheckboxGroup } from '@base-ui/react/checkbox-group';
|
|
4
|
+
import { Field as BaseField } from '@base-ui/react/field';
|
|
5
|
+
import type { FieldValidationMode } from './Field.js';
|
|
6
|
+
/**
|
|
7
|
+
* Checkbox on Base UI Checkbox (ADR-0001). The whole row — box and text — is one `<label>`,
|
|
8
|
+
* so the text is the accessible name and the click target. Inside `<CheckboxGroup>` the
|
|
9
|
+
* checkbox becomes a group item and its `value` is submitted under the group's `name`.
|
|
10
|
+
*
|
|
11
|
+
* <Checkbox name="notify" label="复核完成后通知我" description="通过联系邮箱发送。" />
|
|
12
|
+
*/
|
|
13
|
+
type BaseRootProps = React.ComponentProps<typeof BaseCheckbox.Root>;
|
|
14
|
+
export type CheckboxProps = Omit<BaseRootProps, 'className' | 'style' | 'render' | 'children' | 'nativeButton' | 'aria-label' | 'aria-labelledby'> & {
|
|
15
|
+
/** Visible label and accessible name. Use `hideLabel` where the context already shows it (table rows). */
|
|
16
|
+
label: React.ReactNode;
|
|
17
|
+
/** The name comes from `label`; a second naming channel would drift from the visible text. */
|
|
18
|
+
'aria-label'?: never;
|
|
19
|
+
'aria-labelledby'?: never;
|
|
20
|
+
/** Keep the label for assistive tech only. */
|
|
21
|
+
hideLabel?: boolean;
|
|
22
|
+
description?: React.ReactNode;
|
|
23
|
+
/** Error text for a standalone checkbox (e.g. a required confirmation). Ignored inside a group. */
|
|
24
|
+
error?: React.ReactNode;
|
|
25
|
+
/** Drive the error state from an external validator; pair with `error`. */
|
|
26
|
+
invalid?: boolean;
|
|
27
|
+
validationMode?: FieldValidationMode;
|
|
28
|
+
className?: string;
|
|
29
|
+
style?: React.CSSProperties;
|
|
30
|
+
};
|
|
31
|
+
export declare const Checkbox: React.ForwardRefExoticComponent<Omit<CheckboxProps, "ref"> & React.RefAttributes<HTMLElement>>;
|
|
32
|
+
type BaseGroupProps = React.ComponentProps<typeof BaseCheckboxGroup>;
|
|
33
|
+
export type ChoiceOrientation = 'vertical' | 'horizontal';
|
|
34
|
+
export type CheckboxGroupProps = Pick<BaseGroupProps, 'value' | 'defaultValue' | 'onValueChange' | 'allValues'> & {
|
|
35
|
+
/** Rendered as the fieldset legend; names the group. */
|
|
36
|
+
label: React.ReactNode;
|
|
37
|
+
description?: React.ReactNode;
|
|
38
|
+
error?: React.ReactNode;
|
|
39
|
+
invalid?: boolean;
|
|
40
|
+
/** Form field name; every checked item submits its `value` under it. */
|
|
41
|
+
name?: string;
|
|
42
|
+
disabled?: boolean;
|
|
43
|
+
/** Custom validation over the checked values; return an error string or null. */
|
|
44
|
+
validate?: React.ComponentProps<typeof BaseField.Root>['validate'];
|
|
45
|
+
validationMode?: FieldValidationMode;
|
|
46
|
+
/** Visual marker only; enforce "at least one" with `validate`. */
|
|
47
|
+
required?: boolean;
|
|
48
|
+
optional?: boolean;
|
|
49
|
+
orientation?: ChoiceOrientation;
|
|
50
|
+
className?: string;
|
|
51
|
+
style?: React.CSSProperties;
|
|
52
|
+
children: React.ReactNode;
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* <CheckboxGroup label="通知方式" name="channels" defaultValue={['email']}>
|
|
56
|
+
* <Checkbox value="email" label="邮件" />
|
|
57
|
+
* <Checkbox value="digest" label="每周摘要" />
|
|
58
|
+
* </CheckboxGroup>
|
|
59
|
+
*/
|
|
60
|
+
export declare const CheckboxGroup: React.ForwardRefExoticComponent<Pick<Omit<import("@base-ui/react/checkbox-group").CheckboxGroupProps, "ref"> & React.RefAttributes<HTMLDivElement>, "value" | "defaultValue" | "onValueChange" | "allValues"> & {
|
|
61
|
+
/** Rendered as the fieldset legend; names the group. */
|
|
62
|
+
label: React.ReactNode;
|
|
63
|
+
description?: React.ReactNode;
|
|
64
|
+
error?: React.ReactNode;
|
|
65
|
+
invalid?: boolean;
|
|
66
|
+
/** Form field name; every checked item submits its `value` under it. */
|
|
67
|
+
name?: string;
|
|
68
|
+
disabled?: boolean;
|
|
69
|
+
/** Custom validation over the checked values; return an error string or null. */
|
|
70
|
+
validate?: React.ComponentProps<typeof BaseField.Root>["validate"];
|
|
71
|
+
validationMode?: FieldValidationMode;
|
|
72
|
+
/** Visual marker only; enforce "at least one" with `validate`. */
|
|
73
|
+
required?: boolean;
|
|
74
|
+
optional?: boolean;
|
|
75
|
+
orientation?: ChoiceOrientation;
|
|
76
|
+
className?: string;
|
|
77
|
+
style?: React.CSSProperties;
|
|
78
|
+
children: React.ReactNode;
|
|
79
|
+
} & React.RefAttributes<HTMLDivElement>>;
|
|
80
|
+
export {};
|
|
81
|
+
//# sourceMappingURL=Checkbox.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Checkbox.d.ts","sourceRoot":"","sources":["../../src/components/Checkbox.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { Checkbox as BaseCheckbox } from '@base-ui/react/checkbox';
|
|
5
|
+
import { CheckboxGroup as BaseCheckboxGroup } from '@base-ui/react/checkbox-group';
|
|
6
|
+
import { Field as BaseField } from '@base-ui/react/field';
|
|
7
|
+
import { Fieldset as BaseFieldset } from '@base-ui/react/fieldset';
|
|
8
|
+
import { cx } from '../utils/cx.js';
|
|
9
|
+
import { ChoiceGroupContext, FieldErrorMessage, LabelText } from './fieldParts.js';
|
|
10
|
+
function CheckIcon() {
|
|
11
|
+
return (_jsx("svg", { viewBox: "0 0 16 16", "aria-hidden": "true", focusable: "false", children: _jsx("path", { d: "m3.5 8.25 3 3 6-6.5" }) }));
|
|
12
|
+
}
|
|
13
|
+
function MixedIcon() {
|
|
14
|
+
return (_jsx("svg", { viewBox: "0 0 16 16", "aria-hidden": "true", focusable: "false", children: _jsx("path", { d: "M4 8h8" }) }));
|
|
15
|
+
}
|
|
16
|
+
export const Checkbox = React.forwardRef(function Checkbox({ label, hideLabel = false, description, error, invalid, validationMode, required, disabled, name, indeterminate, className, style, ...rest }, ref) {
|
|
17
|
+
const inGroup = React.useContext(ChoiceGroupContext) === 'checkbox';
|
|
18
|
+
const control = (_jsxs(BaseField.Label, { className: "rl-choice__label", children: [_jsx(BaseCheckbox.Root, { ...rest, ref: ref, name: inGroup ? undefined : name, required: required, disabled: inGroup ? disabled : undefined, indeterminate: indeterminate, className: "rl-checkbox", "data-slot": "checkbox", children: _jsx(BaseCheckbox.Indicator, { className: "rl-checkbox__indicator", keepMounted: true, children: indeterminate ? _jsx(MixedIcon, {}) : _jsx(CheckIcon, {}) }) }), _jsx("span", { className: hideLabel ? 'rl-visually-hidden' : 'rl-choice__text', children: _jsx(LabelText, { label: label, required: !inGroup && required }) })] }));
|
|
19
|
+
const describe = description != null && (_jsx(BaseField.Description, { className: "rl-choice__description", children: description }));
|
|
20
|
+
if (inGroup) {
|
|
21
|
+
return (_jsxs(BaseField.Item, { className: cx('rl-choice', className), style: style, disabled: disabled, "data-kind": "checkbox", children: [control, describe] }));
|
|
22
|
+
}
|
|
23
|
+
return (_jsxs(BaseField.Root, { className: cx('rl-choice', className), style: style, name: name, disabled: disabled, invalid: invalid, validationMode: validationMode, "data-kind": "checkbox", "data-hide-label": hideLabel || undefined, children: [control, describe, (error != null || name != null) && _jsx(FieldErrorMessage, { error: error, match: invalid ? true : undefined, name: name })] }));
|
|
24
|
+
});
|
|
25
|
+
/**
|
|
26
|
+
* <CheckboxGroup label="通知方式" name="channels" defaultValue={['email']}>
|
|
27
|
+
* <Checkbox value="email" label="邮件" />
|
|
28
|
+
* <Checkbox value="digest" label="每周摘要" />
|
|
29
|
+
* </CheckboxGroup>
|
|
30
|
+
*/
|
|
31
|
+
export const CheckboxGroup = React.forwardRef(function CheckboxGroup({ label, description, error, invalid, name, disabled, validate, validationMode, required = false, optional = false, orientation = 'vertical', className, style, children, ...groupProps }, ref) {
|
|
32
|
+
return (_jsxs(BaseField.Root, { ref: ref, name: name, disabled: disabled, invalid: invalid, validate: validate, validationMode: validationMode, className: cx('rl-choice-group', className), style: style, "data-slot": "checkbox-group", children: [_jsxs(BaseFieldset.Root, { className: "rl-choice-group__fieldset", render: _jsx(BaseCheckboxGroup, { ...groupProps, disabled: disabled }), children: [_jsx(BaseFieldset.Legend, { className: "rl-choice-group__legend", children: _jsx(LabelText, { label: label, required: required, optional: optional }) }), _jsx("div", { className: "rl-choice-group__items", "data-orientation": orientation, children: _jsx(ChoiceGroupContext.Provider, { value: "checkbox", children: children }) })] }), description != null && _jsx(BaseField.Description, { className: "rl-field__description", children: description }), (error != null || name != null) && _jsx(FieldErrorMessage, { error: error, match: invalid ? true : undefined, name: name })] }));
|
|
33
|
+
});
|
|
34
|
+
//# sourceMappingURL=Checkbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Checkbox.js","sourceRoot":"","sources":["../../src/components/Checkbox.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* Show / hide one region on Base UI Collapsible (ADR-0010 §2). The trigger is a real `<button>`
|
|
4
|
+
* with `aria-expanded` / `aria-controls`; the panel animates its height through Base UI's
|
|
5
|
+
* `--collapsible-panel-height` variable (CSS transition, interruptible: toggling mid-flight
|
|
6
|
+
* reverses from the current height). Reduced motion zeroes the duration token, so it snaps.
|
|
7
|
+
*
|
|
8
|
+
* The panel is unmounted while closed unless `keepMounted` is set, so collapsed content never
|
|
9
|
+
* lingers in the accessibility tree and heavy content mounts only on first open.
|
|
10
|
+
*
|
|
11
|
+
* <Collapsible trigger={<span>工具详情</span>}>…</Collapsible>
|
|
12
|
+
*/
|
|
13
|
+
export type CollapsibleProps = Omit<React.HTMLAttributes<HTMLDivElement>, 'children' | 'onChange'> & {
|
|
14
|
+
/** Content of the trigger button (label, status, meta). The chevron is added unless `chevron={false}`. */
|
|
15
|
+
trigger: React.ReactNode;
|
|
16
|
+
children?: React.ReactNode;
|
|
17
|
+
open?: boolean;
|
|
18
|
+
defaultOpen?: boolean;
|
|
19
|
+
onOpenChange?: (open: boolean) => void;
|
|
20
|
+
disabled?: boolean;
|
|
21
|
+
/** Keep the panel in the DOM (hidden) while closed, e.g. to preserve scroll position inside it. */
|
|
22
|
+
keepMounted?: boolean;
|
|
23
|
+
/** Show the rotating chevron at the end of the trigger. */
|
|
24
|
+
chevron?: boolean;
|
|
25
|
+
/** Extra props for the trigger button (accessible name override, data attributes). */
|
|
26
|
+
triggerProps?: Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'children' | 'type'>;
|
|
27
|
+
/** Class name for the panel element. */
|
|
28
|
+
panelClassName?: string;
|
|
29
|
+
};
|
|
30
|
+
export declare const Collapsible: React.ForwardRefExoticComponent<Omit<React.HTMLAttributes<HTMLDivElement>, "children" | "onChange"> & {
|
|
31
|
+
/** Content of the trigger button (label, status, meta). The chevron is added unless `chevron={false}`. */
|
|
32
|
+
trigger: React.ReactNode;
|
|
33
|
+
children?: React.ReactNode;
|
|
34
|
+
open?: boolean;
|
|
35
|
+
defaultOpen?: boolean;
|
|
36
|
+
onOpenChange?: (open: boolean) => void;
|
|
37
|
+
disabled?: boolean;
|
|
38
|
+
/** Keep the panel in the DOM (hidden) while closed, e.g. to preserve scroll position inside it. */
|
|
39
|
+
keepMounted?: boolean;
|
|
40
|
+
/** Show the rotating chevron at the end of the trigger. */
|
|
41
|
+
chevron?: boolean;
|
|
42
|
+
/** Extra props for the trigger button (accessible name override, data attributes). */
|
|
43
|
+
triggerProps?: Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, "children" | "type">;
|
|
44
|
+
/** Class name for the panel element. */
|
|
45
|
+
panelClassName?: string;
|
|
46
|
+
} & React.RefAttributes<HTMLDivElement>>;
|
|
47
|
+
//# sourceMappingURL=Collapsible.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Collapsible.d.ts","sourceRoot":"","sources":["../../src/components/Collapsible.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B;;;;;;;;;;GAUG;AAEH,MAAM,MAAM,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,UAAU,GAAG,UAAU,CAAC,GAAG;IACnG,0GAA0G;IAC1G,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,mGAAmG;IACnG,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,2DAA2D;IAC3D,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,sFAAsF;IACtF,YAAY,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,UAAU,GAAG,MAAM,CAAC,CAAC;IACxF,wCAAwC;IACxC,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAUF,eAAO,MAAM,WAAW;IAzBtB,0GAA0G;aACjG,KAAK,CAAC,SAAS;eACb,KAAK,CAAC,SAAS;WACnB,OAAO;kBACA,OAAO;mBACN,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI;eAC3B,OAAO;IAClB,mGAAmG;kBACrF,OAAO;IACrB,2DAA2D;cACjD,OAAO;IACjB,sFAAsF;mBACvE,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,UAAU,GAAG,MAAM,CAAC;IACvF,wCAAwC;qBACvB,MAAM;wCAgDvB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { Collapsible as BaseCollapsible } from '@base-ui/react/collapsible';
|
|
5
|
+
import { cx } from '../utils/cx.js';
|
|
6
|
+
function Chevron() {
|
|
7
|
+
return (_jsx("svg", { className: "rl-collapsible__chevron", viewBox: "0 0 16 16", "aria-hidden": "true", focusable: "false", children: _jsx("path", { d: "m4 6 4 4 4-4" }) }));
|
|
8
|
+
}
|
|
9
|
+
export const Collapsible = React.forwardRef(function Collapsible({ trigger, children, open, defaultOpen, onOpenChange, disabled, keepMounted = false, chevron = true, triggerProps, panelClassName, className, ...rest }, ref) {
|
|
10
|
+
return (_jsxs(BaseCollapsible.Root, { ...rest, ref: ref, open: open, defaultOpen: defaultOpen, onOpenChange: onOpenChange ? (next) => onOpenChange(next) : undefined, disabled: disabled, className: cx('rl-collapsible', className), "data-slot": "collapsible", children: [_jsxs(BaseCollapsible.Trigger, { ...triggerProps, className: cx('rl-collapsible__trigger', triggerProps?.className), children: [_jsx("span", { className: "rl-collapsible__label", children: trigger }), chevron && _jsx(Chevron, {})] }), _jsx(BaseCollapsible.Panel, { keepMounted: keepMounted, className: cx('rl-collapsible__panel', panelClassName), children: _jsx("div", { className: "rl-collapsible__content", children: children }) })] }));
|
|
11
|
+
});
|
|
12
|
+
//# sourceMappingURL=Collapsible.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Collapsible.js","sourceRoot":"","sources":["../../src/components/Collapsible.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,WAAW,IAAI,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC5E,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AAgCpC,SAAS,OAAO;IACd,OAAO,CACL,cAAK,SAAS,EAAC,yBAAyB,EAAC,OAAO,EAAC,WAAW,iBAAa,MAAM,EAAC,SAAS,EAAC,OAAO,YAC/F,eAAM,CAAC,EAAC,cAAc,GAAG,GACrB,CACP,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,CAAC,UAAU,CAAmC,SAAS,WAAW,CAChG,EACE,OAAO,EACP,QAAQ,EACR,IAAI,EACJ,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,WAAW,GAAG,KAAK,EACnB,OAAO,GAAG,IAAI,EACd,YAAY,EACZ,cAAc,EACd,SAAS,EACT,GAAG,IAAI,EACR,EACD,GAAG;IAEH,OAAO,CACL,MAAC,eAAe,CAAC,IAAI,OACf,IAAI,EACR,GAAG,EAAE,GAAG,EACR,IAAI,EAAE,IAAI,EACV,WAAW,EAAE,WAAW,EACxB,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,EACrE,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,EAAE,CAAC,gBAAgB,EAAE,SAAS,CAAC,eAChC,aAAa,aAEvB,MAAC,eAAe,CAAC,OAAO,OAAK,YAAY,EAAE,SAAS,EAAE,EAAE,CAAC,yBAAyB,EAAE,YAAY,EAAE,SAAS,CAAC,aAC1G,eAAM,SAAS,EAAC,uBAAuB,YAAE,OAAO,GAAQ,EACvD,OAAO,IAAI,KAAC,OAAO,KAAG,IACC,EAC1B,KAAC,eAAe,CAAC,KAAK,IAAC,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE,EAAE,CAAC,uBAAuB,EAAE,cAAc,CAAC,YACrG,cAAK,SAAS,EAAC,yBAAyB,YAAE,QAAQ,GAAO,GACnC,IACH,CACxB,CAAC;AACJ,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import type { InputSize } from './Input.js';
|
|
3
|
+
/**
|
|
4
|
+
* Searchable single-value select on Base UI Combobox (ADR-0001, ADR-0010 §2): a text input that
|
|
5
|
+
* filters a listbox. Base UI provides the combobox / listbox semantics, `aria-activedescendant`
|
|
6
|
+
* navigation (↓ opens, ↑ / ↓ move, Enter selects, Esc closes, then clears), Home / End in the input,
|
|
7
|
+
* and IME handling (filtering waits for `compositionend`; Enter during composition does not select).
|
|
8
|
+
* The label, description and error come from the built-in Field.
|
|
9
|
+
*
|
|
10
|
+
* <Combobox label="档案类别" items={categories} name="category" />
|
|
11
|
+
*
|
|
12
|
+
* Server-side search: pass `filter={null}`, drive `items` from `onInputValueChange` and show
|
|
13
|
+
* `loading` while a request is in flight. Popup motion is a CSS transition (--rl-motion-fast).
|
|
14
|
+
*/
|
|
15
|
+
export interface ComboboxOption {
|
|
16
|
+
/** Submitted value and the key of the option. */
|
|
17
|
+
value: string;
|
|
18
|
+
/** Visible text; also what the input shows once selected and what the default filter matches. */
|
|
19
|
+
label: string;
|
|
20
|
+
/** Secondary line under the label. */
|
|
21
|
+
description?: React.ReactNode;
|
|
22
|
+
disabled?: boolean;
|
|
23
|
+
/** Group heading; options sharing it are listed together in first-seen order. */
|
|
24
|
+
group?: string;
|
|
25
|
+
}
|
|
26
|
+
/** Return `true` when `option` matches the typed `query` (already trimmed). */
|
|
27
|
+
export type ComboboxFilter = (option: ComboboxOption, query: string) => boolean;
|
|
28
|
+
export type ComboboxProps = {
|
|
29
|
+
/** Visible label and accessible name of the input. */
|
|
30
|
+
label: React.ReactNode;
|
|
31
|
+
description?: React.ReactNode;
|
|
32
|
+
/** Error text; shown on native validity failure, or always together with `invalid`. */
|
|
33
|
+
error?: React.ReactNode;
|
|
34
|
+
items: readonly ComboboxOption[];
|
|
35
|
+
value?: string | null;
|
|
36
|
+
defaultValue?: string | null;
|
|
37
|
+
onValueChange?: (value: string | null) => void;
|
|
38
|
+
/** Text in the input (controlled). Use with `onInputValueChange` for async search. */
|
|
39
|
+
inputValue?: string;
|
|
40
|
+
defaultInputValue?: string;
|
|
41
|
+
onInputValueChange?: (inputValue: string) => void;
|
|
42
|
+
open?: boolean;
|
|
43
|
+
onOpenChange?: (open: boolean) => void;
|
|
44
|
+
/** Shows a status row with a spinner and marks the list busy. */
|
|
45
|
+
loading?: boolean;
|
|
46
|
+
/** Status text while `loading` (default from messages). */
|
|
47
|
+
loadingText?: React.ReactNode;
|
|
48
|
+
/** Shown when nothing matches (default from messages). */
|
|
49
|
+
emptyText?: React.ReactNode;
|
|
50
|
+
/**
|
|
51
|
+
* Matching logic. Default: locale-aware "contains" on `label`. `null` turns filtering off,
|
|
52
|
+
* for results that are already filtered on the server.
|
|
53
|
+
*/
|
|
54
|
+
filter?: ComboboxFilter | null;
|
|
55
|
+
placeholder?: string;
|
|
56
|
+
/** Form field name; the selected `value` is submitted. */
|
|
57
|
+
name?: string;
|
|
58
|
+
required?: boolean;
|
|
59
|
+
disabled?: boolean;
|
|
60
|
+
readOnly?: boolean;
|
|
61
|
+
invalid?: boolean;
|
|
62
|
+
size?: InputSize;
|
|
63
|
+
/** Show the clear button while a value is selected (default `true`). */
|
|
64
|
+
clearable?: boolean;
|
|
65
|
+
/** Accessible name of the clear button (default from messages). */
|
|
66
|
+
clearLabel?: string;
|
|
67
|
+
/** Accessible name of the open-list button (default from messages). */
|
|
68
|
+
openLabel?: string;
|
|
69
|
+
id?: string;
|
|
70
|
+
className?: string;
|
|
71
|
+
style?: React.CSSProperties;
|
|
72
|
+
};
|
|
73
|
+
export declare const Combobox: React.ForwardRefExoticComponent<ComboboxProps & React.RefAttributes<HTMLInputElement>>;
|
|
74
|
+
//# sourceMappingURL=Combobox.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Combobox.d.ts","sourceRoot":"","sources":["../../src/components/Combobox.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAM/B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAG5C;;;;;;;;;;;GAWG;AAEH,MAAM,WAAW,cAAc;IAC7B,iDAAiD;IACjD,KAAK,EAAE,MAAM,CAAC;IACd,iGAAiG;IACjG,KAAK,EAAE,MAAM,CAAC;IACd,sCAAsC;IACtC,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,iFAAiF;IACjF,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,+EAA+E;AAC/E,MAAM,MAAM,cAAc,GAAG,CAAC,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;AAEhF,MAAM,MAAM,aAAa,GAAG;IAC1B,sDAAsD;IACtD,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,uFAAuF;IACvF,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,KAAK,EAAE,SAAS,cAAc,EAAE,CAAC;IACjC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAC/C,sFAAsF;IACtF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kBAAkB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAClD,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,iEAAiE;IACjE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,2DAA2D;IAC3D,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,0DAA0D;IAC1D,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC5B;;;OAGG;IACH,MAAM,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0DAA0D;IAC1D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,wEAAwE;IACxE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,mEAAmE;IACnE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uEAAuE;IACvE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B,CAAC;AA0DF,eAAO,MAAM,QAAQ,wFAkJnB,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { Combobox as BaseCombobox } from '@base-ui/react/combobox';
|
|
5
|
+
import { useRhineLocale } from '../provider/messages.js';
|
|
6
|
+
import { usePortalContainer } from '../provider/portal.js';
|
|
7
|
+
import { cx } from '../utils/cx.js';
|
|
8
|
+
import { Field } from './Field.js';
|
|
9
|
+
import { Spinner } from './Spinner.js';
|
|
10
|
+
/** Groups in first-seen order; ungrouped options form a heading-less group of their own. */
|
|
11
|
+
function groupOptions(items) {
|
|
12
|
+
if (!items.some((item) => item.group != null && item.group !== ''))
|
|
13
|
+
return null;
|
|
14
|
+
const groups = new Map();
|
|
15
|
+
for (const item of items) {
|
|
16
|
+
const key = item.group ?? '';
|
|
17
|
+
let group = groups.get(key);
|
|
18
|
+
if (!group) {
|
|
19
|
+
group = { label: key, items: [] };
|
|
20
|
+
groups.set(key, group);
|
|
21
|
+
}
|
|
22
|
+
group.items.push(item);
|
|
23
|
+
}
|
|
24
|
+
return [...groups.values()];
|
|
25
|
+
}
|
|
26
|
+
function Chevron() {
|
|
27
|
+
return (_jsx("svg", { viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "1.75", "aria-hidden": "true", focusable: "false", children: _jsx("path", { d: "m4 6 4 4 4-4", strokeLinecap: "round", strokeLinejoin: "round" }) }));
|
|
28
|
+
}
|
|
29
|
+
function ClearIcon() {
|
|
30
|
+
return (_jsx("svg", { viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "1.75", "aria-hidden": "true", focusable: "false", children: _jsx("path", { d: "m4.5 4.5 7 7m0-7-7 7", strokeLinecap: "round" }) }));
|
|
31
|
+
}
|
|
32
|
+
function Check() {
|
|
33
|
+
return (_jsx("svg", { viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "1.75", "aria-hidden": "true", focusable: "false", children: _jsx("path", { d: "m3 8.5 3.5 3.5L13 4.5", strokeLinecap: "round", strokeLinejoin: "round" }) }));
|
|
34
|
+
}
|
|
35
|
+
function Option({ option }) {
|
|
36
|
+
return (_jsxs(BaseCombobox.Item, { value: option.value, disabled: option.disabled, className: "rl-combobox__item", children: [_jsx(BaseCombobox.ItemIndicator, { className: "rl-combobox__indicator", children: _jsx(Check, {}) }), _jsxs("span", { className: "rl-combobox__item-text", children: [_jsx("span", { className: "rl-combobox__item-label", children: option.label }), option.description != null && _jsx("span", { className: "rl-combobox__item-description", children: option.description })] })] }));
|
|
37
|
+
}
|
|
38
|
+
export const Combobox = React.forwardRef(function Combobox({ label, description, error, items, value, defaultValue, onValueChange, inputValue, defaultInputValue, onInputValueChange, open, onOpenChange, loading = false, loadingText, emptyText, filter, placeholder, name, required, disabled, readOnly, invalid, size = 'md', clearable = true, clearLabel, openLabel, id, className, style, }, ref) {
|
|
39
|
+
const container = usePortalContainer();
|
|
40
|
+
const { messages, locale } = useRhineLocale();
|
|
41
|
+
const copy = messages.combobox;
|
|
42
|
+
const triggerTextId = `${React.useId()}-open`;
|
|
43
|
+
// Labels of every option seen so far, so a selected value keeps its label after async results change.
|
|
44
|
+
const labels = React.useRef(new Map());
|
|
45
|
+
for (const item of items)
|
|
46
|
+
labels.current.set(item.value, item.label);
|
|
47
|
+
const groups = React.useMemo(() => groupOptions(items), [items]);
|
|
48
|
+
const collection = React.useMemo(() => BaseCombobox.createItems(groups ?? items, {
|
|
49
|
+
getValue: (item) => item.value,
|
|
50
|
+
getLabel: (item) => item.label,
|
|
51
|
+
}), [groups, items]);
|
|
52
|
+
const handleKeyDown = (event) => {
|
|
53
|
+
// Belt and braces for IME: Base UI already ignores keyCode 229; some engines only set isComposing.
|
|
54
|
+
if (event.nativeEvent.isComposing)
|
|
55
|
+
event.preventBaseUIHandler?.();
|
|
56
|
+
};
|
|
57
|
+
return (_jsx(Field, { label: label, description: description, error: error, required: required, invalid: invalid, disabled: disabled, name: name, className: cx('rl-combobox-field', className), style: style, children: _jsxs(BaseCombobox.Root, { items: collection, value: value, defaultValue: defaultValue, onValueChange: onValueChange ? (next) => onValueChange(next ?? null) : undefined, inputValue: inputValue, defaultInputValue: defaultInputValue, onInputValueChange: onInputValueChange ? (next) => onInputValueChange(next) : undefined, open: open, onOpenChange: onOpenChange ? (next) => onOpenChange(next) : undefined, filter: filter === null ? null : filter ? (item, query) => filter(item, query) : undefined, itemToStringLabel: (v) => labels.current.get(v) ?? v, locale: locale, name: name, required: required, disabled: disabled, readOnly: readOnly, id: id, children: [_jsxs(BaseCombobox.InputGroup, { className: "rl-combobox", "data-slot": "combobox", "data-size": size, "data-invalid": invalid || undefined, "data-disabled": disabled || undefined, "data-readonly": readOnly || undefined, children: [_jsx(BaseCombobox.Input, { ref: ref, className: "rl-combobox__input", placeholder: placeholder, ...(invalid ? { 'aria-invalid': true } : null), onKeyDown: handleKeyDown }), clearable && !readOnly && (_jsx(BaseCombobox.Clear, { className: "rl-combobox__clear", "aria-label": clearLabel ?? copy.clear, children: _jsx(ClearIcon, {}) })), _jsxs(BaseCombobox.Trigger, { className: "rl-combobox__trigger", "aria-labelledby": triggerTextId, children: [_jsx(Chevron, {}), _jsx("span", { id: triggerTextId, className: "rl-visually-hidden", children: openLabel ?? copy.openList })] })] }), _jsx(BaseCombobox.Portal, { container: container, children: _jsx(BaseCombobox.Positioner, { className: "rl-combobox__positioner", sideOffset: 4, collisionPadding: 8, positionMethod: "fixed", children: _jsxs(BaseCombobox.Popup, { className: "rl-combobox__popup", "aria-busy": loading || undefined, children: [_jsx(BaseCombobox.Status, { className: "rl-combobox__status", children: loading ? (_jsxs(_Fragment, { children: [_jsx(Spinner, { size: "sm" }), _jsx("span", { children: loadingText ?? copy.loading })] })) : null }), _jsx(BaseCombobox.Empty, { className: "rl-combobox__empty", children: loading ? null : (emptyText ?? copy.empty) }), _jsx(BaseCombobox.List, { className: "rl-combobox__list", children: groups
|
|
58
|
+
? (group) => (_jsxs(BaseCombobox.Group, { items: group.items, className: "rl-combobox__group", children: [group.label !== '' && _jsx(BaseCombobox.GroupLabel, { className: "rl-combobox__group-label", children: group.label }), _jsx(BaseCombobox.Collection, { children: (option) => _jsx(Option, { option: option }, option.value) })] }, `g-${group.label}`))
|
|
59
|
+
: (option) => _jsx(Option, { option: option }, option.value) })] }) }) })] }) }));
|
|
60
|
+
});
|
|
61
|
+
//# sourceMappingURL=Combobox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Combobox.js","sourceRoot":"","sources":["../../src/components/Combobox.tsx"],"names":[],"mappings":"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"}
|