@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,13 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { useRhineMessages } from '../provider/messages.js';
|
|
5
|
+
import { cx } from '../utils/cx.js';
|
|
6
|
+
export const Timeline = React.forwardRef(function Timeline({ events, emptyText, className, ...rest }, ref) {
|
|
7
|
+
const messages = useRhineMessages();
|
|
8
|
+
if (events.length === 0) {
|
|
9
|
+
return (_jsx("p", { className: cx('rl-timeline__empty', className), "data-slot": "timeline", children: emptyText === undefined ? messages.timeline.empty : emptyText }));
|
|
10
|
+
}
|
|
11
|
+
return (_jsx("ol", { ...rest, ref: ref, className: cx('rl-timeline', className), "data-slot": "timeline", children: events.map((event) => (_jsxs("li", { className: "rl-timeline__event", "data-tone": event.tone ?? 'neutral', children: [_jsx("time", { className: "rl-timeline__time", dateTime: event.dateTime, children: event.time ?? event.dateTime }), _jsx("span", { className: "rl-timeline__marker", "aria-hidden": "true" }), _jsxs("div", { className: "rl-timeline__body", children: [_jsx("p", { className: "rl-timeline__title", children: event.title }), event.description != null && _jsx("p", { className: "rl-timeline__description", children: event.description }), event.actor != null && _jsx("p", { className: "rl-timeline__actor", children: event.actor })] })] }, event.id))) }));
|
|
12
|
+
});
|
|
13
|
+
//# sourceMappingURL=Timeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Timeline.js","sourceRoot":"","sources":["../../src/components/Timeline.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AA+BpC,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,CAAkC,SAAS,QAAQ,CACzF,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,EACzC,GAAG;IAEH,MAAM,QAAQ,GAAG,gBAAgB,EAAE,CAAC;IACpC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,CACL,YAAG,SAAS,EAAE,EAAE,CAAC,oBAAoB,EAAE,SAAS,CAAC,eAAY,UAAU,YACpE,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,GAC5D,CACL,CAAC;IACJ,CAAC;IACD,OAAO,CACL,gBAAQ,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,CAAC,aAAa,EAAE,SAAS,CAAC,eAAY,UAAU,YAClF,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CACrB,cAAmB,SAAS,EAAC,oBAAoB,eAAY,KAAK,CAAC,IAAI,IAAI,SAAS,aAClF,eAAM,SAAS,EAAC,mBAAmB,EAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,YACzD,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,QAAQ,GACxB,EACP,eAAM,SAAS,EAAC,qBAAqB,iBAAa,MAAM,GAAG,EAC3D,eAAK,SAAS,EAAC,mBAAmB,aAChC,YAAG,SAAS,EAAC,oBAAoB,YAAE,KAAK,CAAC,KAAK,GAAK,EAClD,KAAK,CAAC,WAAW,IAAI,IAAI,IAAI,YAAG,SAAS,EAAC,0BAA0B,YAAE,KAAK,CAAC,WAAW,GAAK,EAC5F,KAAK,CAAC,KAAK,IAAI,IAAI,IAAI,YAAG,SAAS,EAAC,oBAAoB,YAAE,KAAK,CAAC,KAAK,GAAK,IACvE,KATC,KAAK,CAAC,EAAE,CAUZ,CACN,CAAC,GACC,CACN,CAAC;AACJ,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { Toast as BaseToast } from '@base-ui/react/toast';
|
|
3
|
+
import type { StatusKind } from './StatusBadge.js';
|
|
4
|
+
/**
|
|
5
|
+
* Notifications on Base UI Toast (ADR-0001). The viewport is a polite live region (F6 jumps
|
|
6
|
+
* into it); `priority: 'high'` toasts are announced assertively. Toasts pause their timer
|
|
7
|
+
* while hovered or focused, stack with a peek, and can be swiped away on touch.
|
|
8
|
+
* `RhineProvider` mounts the provider and viewport, so call `useToast()` anywhere inside it.
|
|
9
|
+
*
|
|
10
|
+
* ADR-0006 §8: `show({ id })` with a visible id updates that toast in place and restarts its
|
|
11
|
+
* timer; the action closes its toast after running (unless `keepOpen`); toasts with an action
|
|
12
|
+
* stay at least 10 s; `promise()` turns one toast from 处理中 into the result.
|
|
13
|
+
*/
|
|
14
|
+
export type ToastStatus = Exclude<StatusKind, 'neutral'> | 'neutral';
|
|
15
|
+
/** A single follow-up action, e.g. 撤销 / 查看 / 重试. */
|
|
16
|
+
export interface ToastAction {
|
|
17
|
+
label: string;
|
|
18
|
+
onClick: () => void;
|
|
19
|
+
/** Keep the toast open after the action runs. By default it closes. */
|
|
20
|
+
keepOpen?: boolean;
|
|
21
|
+
}
|
|
22
|
+
export interface ToastOptions {
|
|
23
|
+
/** Showing a toast with the id of one still on screen updates it in place (no stacking). */
|
|
24
|
+
id?: string;
|
|
25
|
+
title: React.ReactNode;
|
|
26
|
+
description?: React.ReactNode;
|
|
27
|
+
status?: ToastStatus;
|
|
28
|
+
/**
|
|
29
|
+
* Auto-dismiss delay in ms. `0` keeps it until dismissed; use for errors that need action.
|
|
30
|
+
* Defaults to the provider's `toastTimeout`; with an `action`, to at least 10 s.
|
|
31
|
+
*/
|
|
32
|
+
timeout?: number;
|
|
33
|
+
/** `high` interrupts screen readers (role=alert). Reserve for failures and time-critical notices. */
|
|
34
|
+
priority?: 'low' | 'high';
|
|
35
|
+
/** The page must still offer the same result or an equivalent control; the toast is a shortcut. */
|
|
36
|
+
action?: ToastAction;
|
|
37
|
+
onClose?: () => void;
|
|
38
|
+
}
|
|
39
|
+
/** A promise stage: a title, full options, or (for success / error) a function of the outcome. */
|
|
40
|
+
export type ToastPromiseStage<Arg> = string | ToastOptions | ((value: Arg) => string | ToastOptions);
|
|
41
|
+
export interface ToastPromiseOptions<Value> {
|
|
42
|
+
/** Shown until the promise settles; never auto-dismisses. Status defaults to `info`. */
|
|
43
|
+
loading: string | ToastOptions;
|
|
44
|
+
/** Status defaults to `success`. */
|
|
45
|
+
success: ToastPromiseStage<Value>;
|
|
46
|
+
/** Status defaults to `danger`, priority to `high` and timeout to `0` (stays until dismissed). */
|
|
47
|
+
error: ToastPromiseStage<unknown>;
|
|
48
|
+
}
|
|
49
|
+
export interface ToastApi {
|
|
50
|
+
/** Show a toast; returns its id. With an existing `id`, updates that toast instead. */
|
|
51
|
+
show: (options: ToastOptions) => string;
|
|
52
|
+
/** Replace the content of an existing toast (e.g. 处理中 → 已完成). */
|
|
53
|
+
update: (id: string, options: Partial<ToastOptions>) => void;
|
|
54
|
+
dismiss: (id?: string) => void;
|
|
55
|
+
/**
|
|
56
|
+
* One toast follows the promise: `loading` until it settles, then `success` or `error` in
|
|
57
|
+
* place. Returns a promise with the same outcome (it rejects when the input rejects).
|
|
58
|
+
*/
|
|
59
|
+
promise: <Value>(promise: Promise<Value>, options: ToastPromiseOptions<Value>) => Promise<Value>;
|
|
60
|
+
}
|
|
61
|
+
export type ToastProviderProps = React.ComponentProps<typeof BaseToast.Provider>;
|
|
62
|
+
/** Toast queue. Mounted by RhineProvider; render it yourself only without one. */
|
|
63
|
+
export declare function ToastProvider({ timeout, ...rest }: ToastProviderProps): React.JSX.Element;
|
|
64
|
+
export declare function useToast(): ToastApi;
|
|
65
|
+
/** Viewport that renders queued toasts. Mounted by RhineProvider; render it yourself only without one. */
|
|
66
|
+
export declare function ToastViewport(): React.JSX.Element | null;
|
|
67
|
+
//# sourceMappingURL=Toast.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Toast.d.ts","sourceRoot":"","sources":["../../src/components/Toast.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAI1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD;;;;;;;;;GASG;AAEH,MAAM,MAAM,WAAW,GAAG,OAAO,CAAC,UAAU,EAAE,SAAS,CAAC,GAAG,SAAS,CAAC;AAErE,oDAAoD;AACpD,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,uEAAuE;IACvE,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,4FAA4F;IAC5F,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qGAAqG;IACrG,QAAQ,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IAC1B,mGAAmG;IACnG,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,kGAAkG;AAClG,MAAM,MAAM,iBAAiB,CAAC,GAAG,IAAI,MAAM,GAAG,YAAY,GAAG,CAAC,CAAC,KAAK,EAAE,GAAG,KAAK,MAAM,GAAG,YAAY,CAAC,CAAC;AAErG,MAAM,WAAW,mBAAmB,CAAC,KAAK;IACxC,wFAAwF;IACxF,OAAO,EAAE,MAAM,GAAG,YAAY,CAAC;IAC/B,oCAAoC;IACpC,OAAO,EAAE,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAClC,kGAAkG;IAClG,KAAK,EAAE,iBAAiB,CAAC,OAAO,CAAC,CAAC;CACnC;AAOD,MAAM,WAAW,QAAQ;IACvB,uFAAuF;IACvF,IAAI,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,MAAM,CAAC;IACxC,iEAAiE;IACjE,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,YAAY,CAAC,KAAK,IAAI,CAAC;IAC7D,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B;;;OAGG;IACH,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,mBAAmB,CAAC,KAAK,CAAC,KAAK,OAAO,CAAC,KAAK,CAAC,CAAC;CAClG;AASD,MAAM,MAAM,kBAAkB,GAAG,KAAK,CAAC,cAAc,CAAC,OAAO,SAAS,CAAC,QAAQ,CAAC,CAAC;AAEjF,kFAAkF;AAClF,wBAAgB,aAAa,CAAC,EAAE,OAA8B,EAAE,GAAG,IAAI,EAAE,EAAE,kBAAkB,qBAM5F;AAsCD,wBAAgB,QAAQ,IAAI,QAAQ,CA6BnC;AAiDD,0GAA0G;AAC1G,wBAAgB,aAAa,6BAY5B"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { Toast as BaseToast } from '@base-ui/react/toast';
|
|
5
|
+
import { useRhineMessages } from '../provider/messages.js';
|
|
6
|
+
import { usePortalContainer, usePortalPending } from '../provider/portal.js';
|
|
7
|
+
import { Spinner } from './Spinner.js';
|
|
8
|
+
/** Toasts with an action stay at least this long, so there is time to reach the button. */
|
|
9
|
+
const ACTION_MIN_TIMEOUT = 10000;
|
|
10
|
+
const BASE_DEFAULT_TIMEOUT = 5000;
|
|
11
|
+
/** The provider's default timeout; Base UI keeps it private, so ToastProvider republishes it. */
|
|
12
|
+
const ToastTimeoutContext = React.createContext(BASE_DEFAULT_TIMEOUT);
|
|
13
|
+
/** Toast queue. Mounted by RhineProvider; render it yourself only without one. */
|
|
14
|
+
export function ToastProvider({ timeout = BASE_DEFAULT_TIMEOUT, ...rest }) {
|
|
15
|
+
return (_jsx(ToastTimeoutContext.Provider, { value: timeout, children: _jsx(BaseToast.Provider, { timeout: timeout, ...rest }) }));
|
|
16
|
+
}
|
|
17
|
+
function resolveTimeout(timeout, action, providerTimeout) {
|
|
18
|
+
if (timeout !== undefined || !action)
|
|
19
|
+
return timeout;
|
|
20
|
+
// `0` at the provider means "never auto-dismiss"; keep that.
|
|
21
|
+
return providerTimeout === 0 ? 0 : Math.max(providerTimeout, ACTION_MIN_TIMEOUT);
|
|
22
|
+
}
|
|
23
|
+
function toManager({ id, title, description, status = 'neutral', timeout, priority, action, onClose }, providerTimeout) {
|
|
24
|
+
return {
|
|
25
|
+
...(id !== undefined && { id }),
|
|
26
|
+
title,
|
|
27
|
+
description,
|
|
28
|
+
timeout: resolveTimeout(timeout, action, providerTimeout),
|
|
29
|
+
priority,
|
|
30
|
+
onClose,
|
|
31
|
+
type: status,
|
|
32
|
+
data: { status, action },
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
function resolveStage(stage, value, defaults, providerTimeout) {
|
|
36
|
+
const resolved = typeof stage === 'function' ? stage(value) : stage;
|
|
37
|
+
const options = typeof resolved === 'string' ? { title: resolved } : resolved;
|
|
38
|
+
const merged = toManager({ ...defaults, ...options }, providerTimeout);
|
|
39
|
+
// Base UI owns the toast type during a promise (loading → success / error); keep ours in data.
|
|
40
|
+
const { type: _type, id: _id, ...rest } = merged;
|
|
41
|
+
return rest;
|
|
42
|
+
}
|
|
43
|
+
export function useToast() {
|
|
44
|
+
const manager = BaseToast.useToastManager();
|
|
45
|
+
const providerTimeout = React.useContext(ToastTimeoutContext);
|
|
46
|
+
return React.useMemo(() => ({
|
|
47
|
+
show: (options) => manager.add(toManager(options, providerTimeout)),
|
|
48
|
+
update: (id, { title, description, status, timeout, priority, action }) => manager.update(id, (prev) => ({
|
|
49
|
+
...(title !== undefined && { title }),
|
|
50
|
+
...(description !== undefined && { description }),
|
|
51
|
+
...(timeout !== undefined && { timeout }),
|
|
52
|
+
...(priority !== undefined && { priority }),
|
|
53
|
+
...(status !== undefined && { type: status }),
|
|
54
|
+
data: {
|
|
55
|
+
status: status ?? prev.data?.status ?? 'neutral',
|
|
56
|
+
action: action ?? prev.data?.action,
|
|
57
|
+
},
|
|
58
|
+
})),
|
|
59
|
+
dismiss: (id) => manager.close(id),
|
|
60
|
+
promise: (promise, { loading, success, error }) => manager.promise(promise, {
|
|
61
|
+
loading: resolveStage(loading, undefined, { status: 'info' }, providerTimeout),
|
|
62
|
+
success: (value) => resolveStage(success, value, { status: 'success' }, providerTimeout),
|
|
63
|
+
error: (reason) => resolveStage(error, reason, { status: 'danger', priority: 'high', timeout: 0 }, providerTimeout),
|
|
64
|
+
}),
|
|
65
|
+
}), [manager, providerTimeout]);
|
|
66
|
+
}
|
|
67
|
+
function StatusIcon({ status }) {
|
|
68
|
+
return (_jsxs("svg", { className: "rl-toast__icon", viewBox: "0 0 16 16", "aria-hidden": "true", focusable: "false", "data-status": status, children: [status === 'success' && _jsx("path", { d: "m3.5 8.5 3 3 6-7" }), status === 'danger' && _jsx("path", { d: "M5 5l6 6M11 5l-6 6" }), status === 'warning' && _jsx("path", { d: "M8 2.5 14 13.5H2L8 2.5ZM8 7v2.5M8 11.5v.01" }), status === 'info' && _jsx("path", { d: "M8 7.5V11.5M8 5v.01" }), status === 'neutral' && _jsx("path", { d: "M4 8h8" })] }));
|
|
69
|
+
}
|
|
70
|
+
function ToastList() {
|
|
71
|
+
const { toasts, close } = BaseToast.useToastManager();
|
|
72
|
+
// Read where the viewport is mounted (the provider that owns the queue), not where show() ran.
|
|
73
|
+
const messages = useRhineMessages();
|
|
74
|
+
return toasts.map((toast) => {
|
|
75
|
+
const status = toast.data?.status ?? 'neutral';
|
|
76
|
+
const action = toast.data?.action;
|
|
77
|
+
const runAction = () => {
|
|
78
|
+
action?.onClick();
|
|
79
|
+
if (!action?.keepOpen)
|
|
80
|
+
close(toast.id);
|
|
81
|
+
};
|
|
82
|
+
return (_jsx(BaseToast.Root, { toast: toast, className: "rl-toast", "data-status": status, children: _jsxs(BaseToast.Content, { className: "rl-toast__content", children: [toast.type === 'loading' ? _jsx(Spinner, { size: "md", className: "rl-toast__icon" }) : _jsx(StatusIcon, { status: status }), _jsxs("div", { className: "rl-toast__text", children: [_jsx(BaseToast.Title, { className: "rl-toast__title" }), _jsx(BaseToast.Description, { className: "rl-toast__description" })] }), action && (_jsx(BaseToast.Action, { className: "rl-toast__action", onClick: runAction, children: action.label })), _jsx(BaseToast.Close, { className: "rl-toast__close", "aria-label": messages.toast.close, children: _jsx("svg", { viewBox: "0 0 16 16", "aria-hidden": "true", focusable: "false", children: _jsx("path", { d: "M4 4l8 8M12 4l-8 8" }) }) })] }) }, toast.id));
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
/** Viewport that renders queued toasts. Mounted by RhineProvider; render it yourself only without one. */
|
|
86
|
+
export function ToastViewport() {
|
|
87
|
+
const container = usePortalContainer();
|
|
88
|
+
const messages = useRhineMessages();
|
|
89
|
+
// Wait for the provider's portal node so the viewport never lands outside the themed root.
|
|
90
|
+
if (usePortalPending())
|
|
91
|
+
return null;
|
|
92
|
+
return (_jsx(BaseToast.Portal, { container: container, children: _jsx(BaseToast.Viewport, { className: "rl-toast-viewport", "data-slot": "toast-viewport", "aria-label": messages.toast.region, children: _jsx(ToastList, {}) }) }));
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=Toast.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Toast.js","sourceRoot":"","sources":["../../src/components/Toast.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAwEvC,2FAA2F;AAC3F,MAAM,kBAAkB,GAAG,KAAK,CAAC;AACjC,MAAM,oBAAoB,GAAG,IAAI,CAAC;AAElC,iGAAiG;AACjG,MAAM,mBAAmB,GAAG,KAAK,CAAC,aAAa,CAAC,oBAAoB,CAAC,CAAC;AAItE,kFAAkF;AAClF,MAAM,UAAU,aAAa,CAAC,EAAE,OAAO,GAAG,oBAAoB,EAAE,GAAG,IAAI,EAAsB;IAC3F,OAAO,CACL,KAAC,mBAAmB,CAAC,QAAQ,IAAC,KAAK,EAAE,OAAO,YAC1C,KAAC,SAAS,CAAC,QAAQ,IAAC,OAAO,EAAE,OAAO,KAAM,IAAI,GAAI,GACrB,CAChC,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,OAA2B,EAAE,MAA+B,EAAE,eAAuB;IAC3G,IAAI,OAAO,KAAK,SAAS,IAAI,CAAC,MAAM;QAAE,OAAO,OAAO,CAAC;IACrD,6DAA6D;IAC7D,OAAO,eAAe,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,kBAAkB,CAAC,CAAC;AACnF,CAAC;AAED,SAAS,SAAS,CAChB,EAAE,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAgB,EAChG,eAAuB;IAEvB,OAAO;QACL,GAAG,CAAC,EAAE,KAAK,SAAS,IAAI,EAAE,EAAE,EAAE,CAAC;QAC/B,KAAK;QACL,WAAW;QACX,OAAO,EAAE,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,eAAe,CAAC;QACzD,QAAQ;QACR,OAAO;QACP,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,EAAsB;KAC7C,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CACnB,KAA6B,EAC7B,KAAU,EACV,QAA+D,EAC/D,eAAuB;IAEvB,MAAM,QAAQ,GAAG,OAAO,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IACpE,MAAM,OAAO,GAAiB,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC5F,MAAM,MAAM,GAAG,SAAS,CAAC,EAAE,GAAG,QAAQ,EAAE,GAAG,OAAO,EAAE,EAAE,eAAe,CAAC,CAAC;IACvE,+FAA+F;IAC/F,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,MAAyC,CAAC;IACpF,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,QAAQ;IACtB,MAAM,OAAO,GAAG,SAAS,CAAC,eAAe,EAAa,CAAC;IACvD,MAAM,eAAe,GAAG,KAAK,CAAC,UAAU,CAAC,mBAAmB,CAAC,CAAC;IAC9D,OAAO,KAAK,CAAC,OAAO,CAClB,GAAG,EAAE,CAAC,CAAC;QACL,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;QACnE,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,CACxE,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAC5B,GAAG,CAAC,KAAK,KAAK,SAAS,IAAI,EAAE,KAAK,EAAE,CAAC;YACrC,GAAG,CAAC,WAAW,KAAK,SAAS,IAAI,EAAE,WAAW,EAAE,CAAC;YACjD,GAAG,CAAC,OAAO,KAAK,SAAS,IAAI,EAAE,OAAO,EAAE,CAAC;YACzC,GAAG,CAAC,QAAQ,KAAK,SAAS,IAAI,EAAE,QAAQ,EAAE,CAAC;YAC3C,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;YAC7C,IAAI,EAAE;gBACJ,MAAM,EAAE,MAAM,IAAI,IAAI,CAAC,IAAI,EAAE,MAAM,IAAI,SAAS;gBAChD,MAAM,EAAE,MAAM,IAAI,IAAI,CAAC,IAAI,EAAE,MAAM;aACpC;SACF,CAAC,CAAC;QACL,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAClC,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAChD,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE;YACvB,OAAO,EAAE,YAAY,CAAC,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,eAAe,CAAC;YAC9E,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,eAAe,CAAC;YACxF,KAAK,EAAE,CAAC,MAAe,EAAE,EAAE,CACzB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,eAAe,CAAC;SACnG,CAAC;KACL,CAAC,EACF,CAAC,OAAO,EAAE,eAAe,CAAC,CAC3B,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,EAAE,MAAM,EAA2B;IACrD,OAAO,CACL,eAAK,SAAS,EAAC,gBAAgB,EAAC,OAAO,EAAC,WAAW,iBAAa,MAAM,EAAC,SAAS,EAAC,OAAO,iBAAc,MAAM,aACzG,MAAM,KAAK,SAAS,IAAI,eAAM,CAAC,EAAC,kBAAkB,GAAG,EACrD,MAAM,KAAK,QAAQ,IAAI,eAAM,CAAC,EAAC,oBAAoB,GAAG,EACtD,MAAM,KAAK,SAAS,IAAI,eAAM,CAAC,EAAC,4CAA4C,GAAG,EAC/E,MAAM,KAAK,MAAM,IAAI,eAAM,CAAC,EAAC,qBAAqB,GAAG,EACrD,MAAM,KAAK,SAAS,IAAI,eAAM,CAAC,EAAC,QAAQ,GAAG,IACxC,CACP,CAAC;AACJ,CAAC;AAED,SAAS,SAAS;IAChB,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,SAAS,CAAC,eAAe,EAAa,CAAC;IACjE,+FAA+F;IAC/F,MAAM,QAAQ,GAAG,gBAAgB,EAAE,CAAC;IACpC,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QAC1B,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,EAAE,MAAM,IAAI,SAAS,CAAC;QAC/C,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC;QAClC,MAAM,SAAS,GAAG,GAAG,EAAE;YACrB,MAAM,EAAE,OAAO,EAAE,CAAC;YAClB,IAAI,CAAC,MAAM,EAAE,QAAQ;gBAAE,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACzC,CAAC,CAAC;QACF,OAAO,CACL,KAAC,SAAS,CAAC,IAAI,IAAgB,KAAK,EAAE,KAAK,EAAE,SAAS,EAAC,UAAU,iBAAc,MAAM,YACnF,MAAC,SAAS,CAAC,OAAO,IAAC,SAAS,EAAC,mBAAmB,aAC7C,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,KAAC,OAAO,IAAC,IAAI,EAAC,IAAI,EAAC,SAAS,EAAC,gBAAgB,GAAG,CAAC,CAAC,CAAC,KAAC,UAAU,IAAC,MAAM,EAAE,MAAM,GAAI,EAC7G,eAAK,SAAS,EAAC,gBAAgB,aAC7B,KAAC,SAAS,CAAC,KAAK,IAAC,SAAS,EAAC,iBAAiB,GAAG,EAC/C,KAAC,SAAS,CAAC,WAAW,IAAC,SAAS,EAAC,uBAAuB,GAAG,IACvD,EACL,MAAM,IAAI,CACT,KAAC,SAAS,CAAC,MAAM,IAAC,SAAS,EAAC,kBAAkB,EAAC,OAAO,EAAE,SAAS,YAC9D,MAAM,CAAC,KAAK,GACI,CACpB,EACD,KAAC,SAAS,CAAC,KAAK,IAAC,SAAS,EAAC,iBAAiB,gBAAa,QAAQ,CAAC,KAAK,CAAC,KAAK,YAC3E,cAAK,OAAO,EAAC,WAAW,iBAAa,MAAM,EAAC,SAAS,EAAC,OAAO,YAC3D,eAAM,CAAC,EAAC,oBAAoB,GAAG,GAC3B,GACU,IACA,IAjBD,KAAK,CAAC,EAAE,CAkBZ,CAClB,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,0GAA0G;AAC1G,MAAM,UAAU,aAAa;IAC3B,MAAM,SAAS,GAAG,kBAAkB,EAAE,CAAC;IACvC,MAAM,QAAQ,GAAG,gBAAgB,EAAE,CAAC;IACpC,2FAA2F;IAC3F,IAAI,gBAAgB,EAAE;QAAE,OAAO,IAAI,CAAC;IACpC,OAAO,CACL,KAAC,SAAS,CAAC,MAAM,IAAC,SAAS,EAAE,SAAS,YACpC,KAAC,SAAS,CAAC,QAAQ,IAAC,SAAS,EAAC,mBAAmB,eAAW,gBAAgB,gBAAa,QAAQ,CAAC,KAAK,CAAC,MAAM,YAC5G,KAAC,SAAS,KAAG,GACM,GACJ,CACpB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
export type TooltipSide = 'top' | 'bottom' | 'left' | 'right';
|
|
3
|
+
export type TooltipProps = {
|
|
4
|
+
/** Short visual label. Must match the trigger's accessible name — tooltips are not announced. */
|
|
5
|
+
content: React.ReactNode;
|
|
6
|
+
/**
|
|
7
|
+
* A single focusable element (Button, IconButton, link). It must already have an accessible
|
|
8
|
+
* name; the tooltip only mirrors it for sighted mouse and keyboard users.
|
|
9
|
+
*/
|
|
10
|
+
children: React.ReactElement<Record<string, unknown>>;
|
|
11
|
+
side?: TooltipSide;
|
|
12
|
+
/** Override the provider's hover delay (ms). Focus always opens immediately. */
|
|
13
|
+
delay?: number;
|
|
14
|
+
disabled?: boolean;
|
|
15
|
+
open?: boolean;
|
|
16
|
+
defaultOpen?: boolean;
|
|
17
|
+
onOpenChange?: (open: boolean) => void;
|
|
18
|
+
className?: string;
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Visual label for icon-only or truncated controls (Base UI Tooltip). Not for essential
|
|
22
|
+
* information: tooltips are unavailable to touch and screen-reader users, so put anything
|
|
23
|
+
* important in visible text or a Popover instead.
|
|
24
|
+
*/
|
|
25
|
+
export declare function Tooltip({ content, children, side, delay, disabled, open, defaultOpen, onOpenChange, className, }: TooltipProps): React.JSX.Element;
|
|
26
|
+
//# sourceMappingURL=Tooltip.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Tooltip.d.ts","sourceRoot":"","sources":["../../src/components/Tooltip.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;AAE9D,MAAM,MAAM,YAAY,GAAG;IACzB,iGAAiG;IACjG,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB;;;OAGG;IACH,QAAQ,EAAE,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACtD,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,gFAAgF;IAChF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,EACtB,OAAO,EACP,QAAQ,EACR,IAAY,EACZ,KAAK,EACL,QAAQ,EACR,IAAI,EACJ,WAAW,EACX,YAAY,EACZ,SAAS,GACV,EAAE,YAAY,qBAmBd"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { Tooltip as BaseTooltip } from '@base-ui/react/tooltip';
|
|
4
|
+
import { usePortalContainer } from '../provider/portal.js';
|
|
5
|
+
import { cx } from '../utils/cx.js';
|
|
6
|
+
/**
|
|
7
|
+
* Visual label for icon-only or truncated controls (Base UI Tooltip). Not for essential
|
|
8
|
+
* information: tooltips are unavailable to touch and screen-reader users, so put anything
|
|
9
|
+
* important in visible text or a Popover instead.
|
|
10
|
+
*/
|
|
11
|
+
export function Tooltip({ content, children, side = 'top', delay, disabled, open, defaultOpen, onOpenChange, className, }) {
|
|
12
|
+
const container = usePortalContainer();
|
|
13
|
+
return (_jsxs(BaseTooltip.Root, { open: open, defaultOpen: defaultOpen, onOpenChange: onOpenChange ? (o) => onOpenChange(o) : undefined, disabled: disabled, children: [_jsx(BaseTooltip.Trigger, { render: children, delay: delay }), _jsx(BaseTooltip.Portal, { container: container, children: _jsx(BaseTooltip.Positioner, { side: side, sideOffset: 6, collisionPadding: 8, positionMethod: "fixed", className: "rl-tooltip__positioner", children: _jsx(BaseTooltip.Popup, { className: cx('rl-tooltip', className), "data-slot": "tooltip", children: content }) }) })] }));
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=Tooltip.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Tooltip.js","sourceRoot":"","sources":["../../src/components/Tooltip.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAGb,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AAsBpC;;;;GAIG;AACH,MAAM,UAAU,OAAO,CAAC,EACtB,OAAO,EACP,QAAQ,EACR,IAAI,GAAG,KAAK,EACZ,KAAK,EACL,QAAQ,EACR,IAAI,EACJ,WAAW,EACX,YAAY,EACZ,SAAS,GACI;IACb,MAAM,SAAS,GAAG,kBAAkB,EAAE,CAAC;IACvC,OAAO,CACL,MAAC,WAAW,CAAC,IAAI,IACf,IAAI,EAAE,IAAI,EACV,WAAW,EAAE,WAAW,EACxB,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,EAC/D,QAAQ,EAAE,QAAQ,aAElB,KAAC,WAAW,CAAC,OAAO,IAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,GAAI,EACvD,KAAC,WAAW,CAAC,MAAM,IAAC,SAAS,EAAE,SAAS,YACtC,KAAC,WAAW,CAAC,UAAU,IAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,gBAAgB,EAAE,CAAC,EAAE,cAAc,EAAC,OAAO,EAAC,SAAS,EAAC,wBAAwB,YAC/H,KAAC,WAAW,CAAC,KAAK,IAAC,SAAS,EAAE,EAAE,CAAC,YAAY,EAAE,SAAS,CAAC,eAAY,SAAS,YAC3E,OAAO,GACU,GACG,GACN,IACJ,CACpB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
export interface TreeNode {
|
|
3
|
+
id: string;
|
|
4
|
+
label: React.ReactNode;
|
|
5
|
+
textValue?: string;
|
|
6
|
+
children?: TreeNode[];
|
|
7
|
+
loading?: boolean;
|
|
8
|
+
error?: React.ReactNode;
|
|
9
|
+
disabled?: boolean;
|
|
10
|
+
hasChildren?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export type TreeProps = Omit<React.HTMLAttributes<HTMLDivElement>, 'children' | 'onSelect'> & {
|
|
13
|
+
label: string;
|
|
14
|
+
nodes: readonly TreeNode[];
|
|
15
|
+
selectedId?: string;
|
|
16
|
+
defaultSelectedId?: string;
|
|
17
|
+
onSelect?: (node: TreeNode) => void;
|
|
18
|
+
expandedIds?: readonly string[];
|
|
19
|
+
defaultExpandedIds?: readonly string[];
|
|
20
|
+
onExpandedChange?: (ids: string[]) => void;
|
|
21
|
+
onToggle?: (node: TreeNode, expanded: boolean) => void;
|
|
22
|
+
onLoadChildren?: (node: TreeNode) => void | Promise<void>;
|
|
23
|
+
onRetry?: (node: TreeNode) => void | Promise<void>;
|
|
24
|
+
empty?: React.ReactNode;
|
|
25
|
+
renderActions?: (node: TreeNode) => React.ReactNode;
|
|
26
|
+
};
|
|
27
|
+
export declare function Tree({ label, nodes, selectedId, defaultSelectedId, onSelect, expandedIds, defaultExpandedIds, onExpandedChange, onToggle, onLoadChildren, onRetry, empty, renderActions, className, onKeyDown, ...rest }: TreeProps): React.JSX.Element;
|
|
28
|
+
//# sourceMappingURL=Tree.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Tree.d.ts","sourceRoot":"","sources":["../../src/components/Tree.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AACD,MAAM,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,UAAU,GAAG,UAAU,CAAC,GAAG;IAC5F,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,SAAS,QAAQ,EAAE,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC;IACpC,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,kBAAkB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,gBAAgB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IAC3C,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;IACvD,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,KAAK,CAAC,SAAS,CAAC;CACrD,CAAC;AAEF,wBAAgB,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,QAAQ,EAAE,WAAW,EAAE,kBAAuB,EAAE,gBAAgB,EAAE,QAAQ,EAAE,cAAc,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,SAAS,qBAoGxO"}
|
|
@@ -0,0 +1,129 @@
|
|
|
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 { cx } from '../utils/cx.js';
|
|
5
|
+
import { useRhineMessages } from '../provider/messages.js';
|
|
6
|
+
import { Icon } from './Icon.js';
|
|
7
|
+
export function Tree({ label, nodes, selectedId, defaultSelectedId, onSelect, expandedIds, defaultExpandedIds = [], onExpandedChange, onToggle, onLoadChildren, onRetry, empty, renderActions, className, onKeyDown, ...rest }) {
|
|
8
|
+
const m = useRhineMessages().tree;
|
|
9
|
+
const uid = React.useId();
|
|
10
|
+
const rootRef = React.useRef(null);
|
|
11
|
+
const [selected, setSelected] = React.useState(defaultSelectedId);
|
|
12
|
+
const [innerExpanded, setExpanded] = React.useState([...defaultExpandedIds]);
|
|
13
|
+
const [focused, setFocused] = React.useState(selectedId ?? defaultSelectedId ?? nodes[0]?.id);
|
|
14
|
+
const requested = React.useRef(new Set());
|
|
15
|
+
const expanded = new Set(expandedIds ?? innerExpanded);
|
|
16
|
+
const active = selectedId ?? selected;
|
|
17
|
+
const flat = [];
|
|
18
|
+
const visited = new Set();
|
|
19
|
+
const walk = (list, parent) => list.forEach((node) => {
|
|
20
|
+
if (visited.has(node.id))
|
|
21
|
+
return;
|
|
22
|
+
visited.add(node.id);
|
|
23
|
+
flat.push({ node, parent });
|
|
24
|
+
if (expanded.has(node.id) && node.children)
|
|
25
|
+
walk(node.children, node.id);
|
|
26
|
+
});
|
|
27
|
+
walk(nodes);
|
|
28
|
+
React.useEffect(() => {
|
|
29
|
+
if (!onLoadChildren)
|
|
30
|
+
return;
|
|
31
|
+
for (const { node } of flat) {
|
|
32
|
+
if (expanded.has(node.id) && node.hasChildren && node.children === undefined && !node.loading && !node.error && !requested.current.has(node.id)) {
|
|
33
|
+
requested.current.add(node.id);
|
|
34
|
+
void onLoadChildren(node);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}, [expandedIds, innerExpanded, nodes, onLoadChildren]);
|
|
38
|
+
React.useEffect(() => {
|
|
39
|
+
if (selectedId !== undefined)
|
|
40
|
+
setFocused(selectedId);
|
|
41
|
+
}, [selectedId]);
|
|
42
|
+
const focus = (id) => {
|
|
43
|
+
if (!id)
|
|
44
|
+
return;
|
|
45
|
+
setFocused(id);
|
|
46
|
+
rootRef.current?.querySelectorAll('[role="treeitem"]').forEach((el) => { if (el.dataset.treeId === id)
|
|
47
|
+
el.focus(); });
|
|
48
|
+
};
|
|
49
|
+
const select = (node) => {
|
|
50
|
+
if (node.disabled)
|
|
51
|
+
return;
|
|
52
|
+
if (selectedId === undefined)
|
|
53
|
+
setSelected(node.id);
|
|
54
|
+
onSelect?.(node);
|
|
55
|
+
};
|
|
56
|
+
const toggle = (node, open = !expanded.has(node.id)) => {
|
|
57
|
+
if (node.disabled || (!node.hasChildren && !node.children?.length))
|
|
58
|
+
return;
|
|
59
|
+
const ids = open ? [...expanded, node.id] : [...expanded].filter((id) => id !== node.id);
|
|
60
|
+
if (expandedIds === undefined)
|
|
61
|
+
setExpanded(ids);
|
|
62
|
+
onExpandedChange?.(ids);
|
|
63
|
+
onToggle?.(node, open);
|
|
64
|
+
if (open && node.hasChildren && node.children === undefined && !node.loading && !node.error && !requested.current.has(node.id)) {
|
|
65
|
+
requested.current.add(node.id);
|
|
66
|
+
void onLoadChildren?.(node);
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
const typeahead = React.useRef({ value: '', at: 0 });
|
|
70
|
+
const keyDown = (event) => {
|
|
71
|
+
onKeyDown?.(event);
|
|
72
|
+
if (event.defaultPrevented || event.altKey || event.ctrlKey || event.metaKey)
|
|
73
|
+
return;
|
|
74
|
+
const element = event.target;
|
|
75
|
+
if (element.getAttribute('role') !== 'treeitem')
|
|
76
|
+
return;
|
|
77
|
+
const index = flat.findIndex(({ node }) => node.id === element.dataset.treeId);
|
|
78
|
+
const current = flat[index];
|
|
79
|
+
if (!current)
|
|
80
|
+
return;
|
|
81
|
+
const { node, parent } = current;
|
|
82
|
+
let next;
|
|
83
|
+
if (event.key === 'ArrowDown')
|
|
84
|
+
next = flat[Math.min(index + 1, flat.length - 1)]?.node.id;
|
|
85
|
+
else if (event.key === 'ArrowUp')
|
|
86
|
+
next = flat[Math.max(index - 1, 0)]?.node.id;
|
|
87
|
+
else if (event.key === 'Home')
|
|
88
|
+
next = flat[0]?.node.id;
|
|
89
|
+
else if (event.key === 'End')
|
|
90
|
+
next = flat.at(-1)?.node.id;
|
|
91
|
+
else if (event.key === 'ArrowRight') {
|
|
92
|
+
if (expanded.has(node.id))
|
|
93
|
+
next = node.children?.[0]?.id;
|
|
94
|
+
else
|
|
95
|
+
toggle(node, true);
|
|
96
|
+
}
|
|
97
|
+
else if (event.key === 'ArrowLeft') {
|
|
98
|
+
if (expanded.has(node.id))
|
|
99
|
+
toggle(node, false);
|
|
100
|
+
else
|
|
101
|
+
next = parent;
|
|
102
|
+
}
|
|
103
|
+
else if (event.key === 'Enter' || event.key === ' ')
|
|
104
|
+
select(node);
|
|
105
|
+
else if (event.key.length === 1 && !event.nativeEvent.isComposing) {
|
|
106
|
+
const now = Date.now();
|
|
107
|
+
const query = now - typeahead.current.at < 600 ? typeahead.current.value + event.key : event.key;
|
|
108
|
+
typeahead.current = { value: query, at: now };
|
|
109
|
+
const reordered = [...flat.slice(index + 1), ...flat.slice(0, index + 1)];
|
|
110
|
+
next = reordered.find(({ node: candidate }) => !candidate.disabled && (candidate.textValue ?? String(candidate.label)).toLocaleLowerCase().startsWith(query.toLocaleLowerCase()))?.node.id;
|
|
111
|
+
}
|
|
112
|
+
else
|
|
113
|
+
return;
|
|
114
|
+
event.preventDefault();
|
|
115
|
+
if (next)
|
|
116
|
+
focus(next);
|
|
117
|
+
};
|
|
118
|
+
const tabStop = flat.some(({ node }) => node.id === focused) ? focused : flat[0]?.node.id;
|
|
119
|
+
const renderNodes = (list, depth = 1) => list.map((node, index) => {
|
|
120
|
+
const open = expanded.has(node.id);
|
|
121
|
+
const branch = Boolean(node.hasChildren || node.children?.length);
|
|
122
|
+
const name = node.textValue ?? String(node.label);
|
|
123
|
+
const labelId = `${uid}-${node.id}-label`;
|
|
124
|
+
return _jsxs("li", { role: "treeitem", "data-tree-id": node.id, "aria-level": depth, "aria-posinset": index + 1, "aria-setsize": list.length, "aria-selected": active === node.id, "aria-labelledby": labelId, "aria-expanded": branch ? open : undefined, "aria-disabled": node.disabled || undefined, tabIndex: tabStop === node.id ? 0 : -1, className: "rl-tree__item", onFocus: (event) => { if (event.target === event.currentTarget)
|
|
125
|
+
setFocused(node.id); }, children: [_jsxs("div", { className: "rl-tree__row", "data-selected": active === node.id || undefined, children: [branch && _jsx("button", { type: "button", className: "rl-tree__toggle", tabIndex: -1, disabled: node.disabled, "aria-label": open ? m.collapse(name) : m.expand(name), onClick: () => { focus(node.id); toggle(node); }, children: _jsx(Icon, { name: open ? 'ChevronDown' : 'ChevronRight' }) }), _jsx("button", { type: "button", className: "rl-tree__select", tabIndex: -1, disabled: node.disabled, onClick: () => { focus(node.id); select(node); }, children: _jsx("span", { id: labelId, className: "rl-tree__label", children: node.label }) }), renderActions?.(node)] }), open && _jsxs(_Fragment, { children: [node.loading && _jsx("p", { role: "status", className: "rl-tree__note", children: m.loading }), node.error && _jsxs("div", { className: "rl-tree__note", children: [_jsx("p", { role: "alert", children: node.error }), (onRetry || onLoadChildren) && _jsx("button", { type: "button", onClick: () => (onRetry ?? onLoadChildren)?.(node), children: m.retry(name) })] }), node.children?.length ? _jsx("ul", { role: "group", children: renderNodes(node.children, depth + 1) }) : null] })] }, node.id);
|
|
126
|
+
});
|
|
127
|
+
return _jsxs("div", { ...rest, ref: rootRef, className: cx('rl-tree', className), onKeyDown: keyDown, children: [_jsx("ul", { role: "tree", "aria-label": label, className: "rl-tree__root", children: renderNodes(nodes) }), nodes.length === 0 && _jsx("p", { children: empty ?? m.empty })] });
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=Tree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Tree.js","sourceRoot":"","sources":["../../src/components/Tree.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,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AA4BjC,MAAM,UAAU,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,QAAQ,EAAE,WAAW,EAAE,kBAAkB,GAAG,EAAE,EAAE,gBAAgB,EAAE,QAAQ,EAAE,cAAc,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,IAAI,EAAa;IACvO,MAAM,CAAC,GAAG,gBAAgB,EAAE,CAAC,IAAI,CAAC;IAClC,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;IAC1B,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAiB,IAAI,CAAC,CAAC;IACnD,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;IAClE,MAAM,CAAC,aAAa,EAAE,WAAW,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAW,CAAC,GAAG,kBAAkB,CAAC,CAAC,CAAC;IACvF,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAqB,UAAU,IAAI,iBAAiB,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAClH,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,GAAG,EAAU,CAAC,CAAC;IAClD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,WAAW,IAAI,aAAa,CAAC,CAAC;IACvD,MAAM,MAAM,GAAG,UAAU,IAAI,QAAQ,CAAC;IACtC,MAAM,IAAI,GAA+C,EAAE,CAAC;IAC5D,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,MAAM,IAAI,GAAG,CAAC,IAAyB,EAAE,MAAe,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QACjF,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAAE,OAAO;QACjC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACrB,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QAC5B,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,QAAQ;YAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;IACH,IAAI,CAAC,KAAK,CAAC,CAAC;IACZ,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,IAAI,CAAC,cAAc;YAAE,OAAO;QAC5B,KAAK,MAAM,EAAE,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC;YAC5B,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;gBAChJ,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAC/B,KAAK,cAAc,CAAC,IAAI,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;IACH,CAAC,EAAE,CAAC,WAAW,EAAE,aAAa,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC;IACxD,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,IAAI,UAAU,KAAK,SAAS;YAAE,UAAU,CAAC,UAAU,CAAC,CAAC;IACvD,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;IACjB,MAAM,KAAK,GAAG,CAAC,EAAsB,EAAE,EAAE;QACvC,IAAI,CAAC,EAAE;YAAE,OAAO;QAChB,UAAU,CAAC,EAAE,CAAC,CAAC;QACf,OAAO,CAAC,OAAO,EAAE,gBAAgB,CAAc,mBAAmB,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,KAAK,EAAE;YAAE,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACrI,CAAC,CAAC;IACF,MAAM,MAAM,GAAG,CAAC,IAAc,EAAE,EAAE;QAChC,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC1B,IAAI,UAAU,KAAK,SAAS;YAAE,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnD,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC,CAAC;IACF,MAAM,MAAM,GAAG,CAAC,IAAc,EAAE,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;QAC/D,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC;YAAE,OAAO;QAC3E,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC;QACzF,IAAI,WAAW,KAAK,SAAS;YAAE,WAAW,CAAC,GAAG,CAAC,CAAC;QAChD,gBAAgB,EAAE,CAAC,GAAG,CAAC,CAAC;QACxB,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACvB,IAAI,IAAI,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;YAC/H,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC/B,KAAK,cAAc,EAAE,CAAC,IAAI,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC,CAAC;IACF,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;IACrD,MAAM,OAAO,GAAG,CAAC,KAA0C,EAAE,EAAE;QAC7D,SAAS,EAAE,CAAC,KAAK,CAAC,CAAC;QACnB,IAAI,KAAK,CAAC,gBAAgB,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO;YAAE,OAAO;QACrF,MAAM,OAAO,GAAG,KAAK,CAAC,MAAqB,CAAC;QAC5C,IAAI,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,UAAU;YAAE,OAAO;QACxD,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC/E,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5B,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;QACjC,IAAI,IAAwB,CAAC;QAC7B,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW;YAAE,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC;aACrF,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS;YAAE,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC;aAC1E,IAAI,KAAK,CAAC,GAAG,KAAK,MAAM;YAAE,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC;aAClD,IAAI,KAAK,CAAC,GAAG,KAAK,KAAK;YAAE,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC;aACrD,IAAI,KAAK,CAAC,GAAG,KAAK,YAAY,EAAE,CAAC;YAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBAAE,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;;gBAAM,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAAC,CAAC;aACtH,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,EAAE,CAAC;YAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBAAE,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;;gBAAM,IAAI,GAAG,MAAM,CAAC;QAAC,CAAC;aACtG,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG;YAAE,MAAM,CAAC,IAAI,CAAC,CAAC;aAC7D,IAAI,KAAK,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC;YAClE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACvB,MAAM,KAAK,GAAG,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC;YACjG,SAAS,CAAC,OAAO,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC;YAC9C,MAAM,SAAS,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;YAC1E,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,QAAQ,IAAI,CAAC,SAAS,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,iBAAiB,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC;QAC7L,CAAC;;YAAM,OAAO;QACd,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,IAAI,IAAI;YAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC,CAAC;IACF,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC;IAC1F,MAAM,WAAW,GAAG,CAAC,IAAyB,EAAE,KAAK,GAAG,CAAC,EAAmB,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QACtG,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnC,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAClE,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClD,MAAM,OAAO,GAAG,GAAG,GAAG,IAAI,IAAI,CAAC,EAAE,QAAQ,CAAC;QAC1C,OAAO,cAAkB,IAAI,EAAC,UAAU,kBAAe,IAAI,CAAC,EAAE,gBAAc,KAAK,mBAAiB,KAAK,GAAG,CAAC,kBAAgB,IAAI,CAAC,MAAM,mBAAiB,MAAM,KAAK,IAAI,CAAC,EAAE,qBAAmB,OAAO,mBAAiB,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,mBAAiB,IAAI,CAAC,QAAQ,IAAI,SAAS,EAAE,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,EAAC,eAAe,EAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,GAAG,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,aAAa;gBAAE,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,aAChb,eAAK,SAAS,EAAC,cAAc,mBAAgB,MAAM,KAAK,IAAI,CAAC,EAAE,IAAI,SAAS,aACzE,MAAM,IAAI,iBAAQ,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAC,iBAAiB,EAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,gBAAc,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,YAAE,KAAC,IAAI,IAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,cAAc,GAAI,GAAS,EAC1Q,iBAAQ,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAC,iBAAiB,EAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,YAAE,eAAM,EAAE,EAAE,OAAO,EAAE,SAAS,EAAC,gBAAgB,YAAE,IAAI,CAAC,KAAK,GAAQ,GAAS,EACpN,aAAa,EAAE,CAAC,IAAI,CAAC,IAClB,EACL,IAAI,IAAI,8BACN,IAAI,CAAC,OAAO,IAAI,YAAG,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAC,eAAe,YAAE,CAAC,CAAC,OAAO,GAAK,EAC1E,IAAI,CAAC,KAAK,IAAI,eAAK,SAAS,EAAC,eAAe,aAAC,YAAG,IAAI,EAAC,OAAO,YAAE,IAAI,CAAC,KAAK,GAAK,EAAC,CAAC,OAAO,IAAI,cAAc,CAAC,IAAI,iBAAQ,IAAI,EAAC,QAAQ,EAAC,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,OAAO,IAAI,cAAc,CAAC,EAAE,CAAC,IAAI,CAAC,YAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAU,IAAO,EACtN,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,aAAI,IAAI,EAAC,OAAO,YAAE,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,GAAG,CAAC,CAAC,GAAM,CAAC,CAAC,CAAC,IAAI,IAC5F,KAVW,IAAI,CAAC,EAAE,CAWlB,CAAC;IACR,CAAC,CAAC,CAAC;IACH,OAAO,kBAAS,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE,SAAS,EAAE,OAAO,aAAE,aAAI,IAAI,EAAC,MAAM,gBAAa,KAAK,EAAE,SAAS,EAAC,eAAe,YAAE,WAAW,CAAC,KAAK,CAAC,GAAM,EAAC,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,sBAAI,KAAK,IAAI,CAAC,CAAC,KAAK,GAAK,IAAO,CAAC;AAC7O,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
export type VisuallyHiddenElement = 'span' | 'div' | 'p' | 'h2' | 'h3' | 'label' | 'legend';
|
|
3
|
+
export type VisuallyHiddenProps = React.HTMLAttributes<HTMLElement> & {
|
|
4
|
+
as?: VisuallyHiddenElement;
|
|
5
|
+
/** Become visible while it or a descendant has focus (skip links). */
|
|
6
|
+
focusable?: boolean;
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Content for assistive tech only: still in the accessibility tree, removed from layout.
|
|
10
|
+
* Not a way to hide focusable controls unless `focusable` makes them reappear on focus.
|
|
11
|
+
*/
|
|
12
|
+
export declare const VisuallyHidden: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLElement> & {
|
|
13
|
+
as?: VisuallyHiddenElement;
|
|
14
|
+
/** Become visible while it or a descendant has focus (skip links). */
|
|
15
|
+
focusable?: boolean;
|
|
16
|
+
} & React.RefAttributes<HTMLElement>>;
|
|
17
|
+
//# sourceMappingURL=VisuallyHidden.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VisuallyHidden.d.ts","sourceRoot":"","sources":["../../src/components/VisuallyHidden.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,MAAM,MAAM,qBAAqB,GAAG,MAAM,GAAG,KAAK,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE5F,MAAM,MAAM,mBAAmB,GAAG,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC,GAAG;IACpE,EAAE,CAAC,EAAE,qBAAqB,CAAC;IAC3B,sEAAsE;IACtE,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,cAAc;SATpB,qBAAqB;IAC1B,sEAAsE;gBAC1D,OAAO;qCAmBnB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
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
|
+
/**
|
|
6
|
+
* Content for assistive tech only: still in the accessibility tree, removed from layout.
|
|
7
|
+
* Not a way to hide focusable controls unless `focusable` makes them reappear on focus.
|
|
8
|
+
*/
|
|
9
|
+
export const VisuallyHidden = React.forwardRef(function VisuallyHidden({ as: Element = 'span', focusable = false, className, ...rest }, ref) {
|
|
10
|
+
return (_jsx(Element, { ...rest, ref: ref, className: cx('rl-visually-hidden', className), "data-focusable": focusable || undefined }));
|
|
11
|
+
});
|
|
12
|
+
//# sourceMappingURL=VisuallyHidden.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VisuallyHidden.js","sourceRoot":"","sources":["../../src/components/VisuallyHidden.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AAUpC;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,CAAC,UAAU,CAAmC,SAAS,cAAc,CACtG,EAAE,EAAE,EAAE,OAAO,GAAG,MAAM,EAAE,SAAS,GAAG,KAAK,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,EAC/D,GAAG;IAEH,OAAO,CACL,KAAC,OAAO,OACF,IAAI,EACR,GAAG,EAAE,GAAuB,EAC5B,SAAS,EAAE,EAAE,CAAC,oBAAoB,EAAE,SAAS,CAAC,oBAC9B,SAAS,IAAI,SAAS,GACtC,CACH,CAAC;AACJ,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
export type WorkbenchProps = Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> & {
|
|
3
|
+
rail?: React.ReactNode;
|
|
4
|
+
indexLabel?: string;
|
|
5
|
+
mainLabel?: string;
|
|
6
|
+
header?: React.ReactNode;
|
|
7
|
+
children?: React.ReactNode;
|
|
8
|
+
indexOpen?: boolean;
|
|
9
|
+
defaultIndexOpen?: boolean;
|
|
10
|
+
onIndexOpenChange?: (open: boolean) => void;
|
|
11
|
+
indexSize?: number;
|
|
12
|
+
defaultIndexSize?: number;
|
|
13
|
+
indexMin?: number;
|
|
14
|
+
indexMax?: number;
|
|
15
|
+
onIndexSizeChange?: (size: number) => void;
|
|
16
|
+
index?: React.ReactNode;
|
|
17
|
+
};
|
|
18
|
+
interface WorkbenchContextValue {
|
|
19
|
+
target: HTMLDivElement | null;
|
|
20
|
+
register: (id: string, present: boolean) => void;
|
|
21
|
+
indexOpen: boolean;
|
|
22
|
+
setIndexOpen: (open: boolean) => void;
|
|
23
|
+
}
|
|
24
|
+
/** Route-owned index content. A portal preserves the route's data/provider context. */
|
|
25
|
+
export declare function WorkbenchIndex({ children }: {
|
|
26
|
+
children?: React.ReactNode;
|
|
27
|
+
}): React.ReactPortal | null;
|
|
28
|
+
export declare function useWorkbench(): WorkbenchContextValue | null;
|
|
29
|
+
export declare function Workbench({ rail, index, header, children, indexLabel, mainLabel, indexOpen, defaultIndexOpen, onIndexOpenChange, indexSize, defaultIndexSize, indexMin, indexMax, onIndexSizeChange, className, style, ...rest }: WorkbenchProps): React.JSX.Element;
|
|
30
|
+
export {};
|
|
31
|
+
//# sourceMappingURL=Workbench.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Workbench.d.ts","sourceRoot":"","sources":["../../src/components/Workbench.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAM/B,MAAM,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,UAAU,CAAC,GAAG;IACpF,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CACzB,CAAC;AAEF,UAAU,qBAAqB;IAC7B,MAAM,EAAE,cAAc,GAAG,IAAI,CAAC;IAC9B,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACjD,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;CACvC;AAGD,uFAAuF;AACvF,wBAAgB,cAAc,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,4BAU1E;AAED,wBAAgB,YAAY,iCAAiD;AAE7E,wBAAgB,SAAS,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,gBAAuB,EAAE,iBAAiB,EAAE,SAAS,EAAE,gBAAsB,EAAE,QAAc,EAAE,QAAc,EAAE,iBAAiB,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,EAAE,cAAc,qBAiDzQ"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { createPortal } from 'react-dom';
|
|
5
|
+
import { cx } from '../utils/cx.js';
|
|
6
|
+
import { useRhineMessages } from '../provider/messages.js';
|
|
7
|
+
import { ResizeHandle } from './ResizeHandle.js';
|
|
8
|
+
const WorkbenchContext = React.createContext(null);
|
|
9
|
+
/** Route-owned index content. A portal preserves the route's data/provider context. */
|
|
10
|
+
export function WorkbenchIndex({ children }) {
|
|
11
|
+
const context = React.useContext(WorkbenchContext);
|
|
12
|
+
const id = React.useId();
|
|
13
|
+
const register = context?.register;
|
|
14
|
+
React.useEffect(() => {
|
|
15
|
+
if (!register)
|
|
16
|
+
return;
|
|
17
|
+
register(id, true);
|
|
18
|
+
return () => register(id, false);
|
|
19
|
+
}, [register, id]);
|
|
20
|
+
return context?.target ? createPortal(children, context.target) : null;
|
|
21
|
+
}
|
|
22
|
+
export function useWorkbench() { return React.useContext(WorkbenchContext); }
|
|
23
|
+
export function Workbench({ rail, index, header, children, indexLabel, mainLabel, indexOpen, defaultIndexOpen = true, onIndexOpenChange, indexSize, defaultIndexSize = 260, indexMin = 200, indexMax = 400, onIndexSizeChange, className, style, ...rest }) {
|
|
24
|
+
const messages = useRhineMessages();
|
|
25
|
+
const [inner, setInner] = React.useState(defaultIndexOpen);
|
|
26
|
+
const [innerSize, setInnerSize] = React.useState(defaultIndexSize);
|
|
27
|
+
const [target, setTarget] = React.useState(null);
|
|
28
|
+
const [registered, setRegistered] = React.useState(new Set());
|
|
29
|
+
const mainRef = React.useRef(null);
|
|
30
|
+
const indexRef = React.useRef(null);
|
|
31
|
+
const focusedIndex = React.useRef(false);
|
|
32
|
+
const previousOpen = React.useRef(indexOpen ?? defaultIndexOpen);
|
|
33
|
+
const open = indexOpen ?? inner;
|
|
34
|
+
const hasIndex = index != null || registered.size > 0;
|
|
35
|
+
const size = Math.max(indexMin, Math.min(indexMax, indexSize ?? innerSize));
|
|
36
|
+
const [dragging, setDragging] = React.useState(false);
|
|
37
|
+
const setOpen = React.useCallback((next) => { if (indexOpen === undefined)
|
|
38
|
+
setInner(next); onIndexOpenChange?.(next); }, [indexOpen, onIndexOpenChange]);
|
|
39
|
+
const register = React.useCallback((id, present) => setRegistered((old) => {
|
|
40
|
+
if (old.has(id) === present)
|
|
41
|
+
return old;
|
|
42
|
+
const next = new Set(old);
|
|
43
|
+
if (present)
|
|
44
|
+
next.add(id);
|
|
45
|
+
else
|
|
46
|
+
next.delete(id);
|
|
47
|
+
return next;
|
|
48
|
+
}), []);
|
|
49
|
+
React.useLayoutEffect(() => {
|
|
50
|
+
if (previousOpen.current && !open && (focusedIndex.current || indexRef.current?.contains(document.activeElement))) {
|
|
51
|
+
const target = mainRef.current;
|
|
52
|
+
if (target) {
|
|
53
|
+
target.focus();
|
|
54
|
+
if (document.activeElement !== target)
|
|
55
|
+
requestAnimationFrame(() => target.focus());
|
|
56
|
+
}
|
|
57
|
+
focusedIndex.current = false;
|
|
58
|
+
}
|
|
59
|
+
previousOpen.current = open;
|
|
60
|
+
}, [open]);
|
|
61
|
+
const value = React.useMemo(() => ({ target, register, indexOpen: open, setIndexOpen: setOpen }), [target, register, open, setOpen]);
|
|
62
|
+
return _jsx(WorkbenchContext.Provider, { value: value, children: _jsxs("div", { ...rest, className: cx('rl-workbench', className), style: { ...style, '--rl-workbench-index-size': `${open && hasIndex ? size : 0}px` }, "data-has-rail": rail != null || undefined, "data-index-open": (open && hasIndex) || undefined, "data-dragging": dragging || undefined, children: [rail && _jsx("div", { className: "rl-workbench__rail", children: rail }), header && _jsx("header", { className: "rl-workbench__header", children: header }), _jsxs("aside", { ref: indexRef, role: "complementary", className: "rl-workbench__index", "aria-label": indexLabel ?? messages.workbench.index, hidden: !open || !hasIndex, onFocusCapture: () => { focusedIndex.current = true; }, onBlurCapture: (event) => {
|
|
63
|
+
if (event.relatedTarget && !event.currentTarget.contains(event.relatedTarget))
|
|
64
|
+
focusedIndex.current = false;
|
|
65
|
+
}, children: [index, _jsx("div", { ref: setTarget })] }), open && hasIndex && _jsx(ResizeHandle, { className: "rl-workbench__resize", pane: "start", size: size, min: indexMin, max: indexMax, onSizeChange: (next) => {
|
|
66
|
+
if (indexSize === undefined)
|
|
67
|
+
setInnerSize(next);
|
|
68
|
+
onIndexSizeChange?.(next);
|
|
69
|
+
}, onDraggingChange: setDragging, label: messages.workbench.resize, getAriaValueText: (width) => messages.workbench.width(String(width)) }), _jsx("main", { ref: mainRef, tabIndex: -1, "aria-label": mainLabel ?? messages.workbench.content, className: "rl-workbench__main", children: children })] }) });
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=Workbench.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Workbench.js","sourceRoot":"","sources":["../../src/components/Workbench.tsx"],"names":[],"mappings":"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"}
|