cursedbelt 5.32.0 → 5.34.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/dist/react/Toast.d.ts +1 -1
- package/dist/react/Toast.d.ts.map +1 -1
- package/dist/react/Toast.js +19 -4
- package/dist/react/Toast.js.map +1 -1
- package/dist/react/components/Button.d.ts +16 -1
- package/dist/react/components/Button.d.ts.map +1 -1
- package/dist/react/components/Button.js +34 -5
- package/dist/react/components/Button.js.map +1 -1
- package/dist/react/components/ChoiceGroup.d.ts +20 -1
- package/dist/react/components/ChoiceGroup.d.ts.map +1 -1
- package/dist/react/components/ChoiceGroup.js +15 -2
- package/dist/react/components/ChoiceGroup.js.map +1 -1
- package/dist/react/components/CopyButton.d.ts +10 -1
- package/dist/react/components/CopyButton.d.ts.map +1 -1
- package/dist/react/components/CopyButton.js +2 -2
- package/dist/react/components/CopyButton.js.map +1 -1
- package/dist/react/components/DataTable/DataTable.d.ts +27 -2
- package/dist/react/components/DataTable/DataTable.d.ts.map +1 -1
- package/dist/react/components/DataTable/DataTable.js +168 -44
- package/dist/react/components/DataTable/DataTable.js.map +1 -1
- package/dist/react/components/DataTable/RowActions.d.ts +4 -1
- package/dist/react/components/DataTable/RowActions.d.ts.map +1 -1
- package/dist/react/components/DataTable/RowActions.js +2 -2
- package/dist/react/components/DataTable/RowActions.js.map +1 -1
- package/dist/react/components/DataTable/columnPriority.d.ts +30 -0
- package/dist/react/components/DataTable/columnPriority.d.ts.map +1 -0
- package/dist/react/components/DataTable/columnPriority.js +45 -0
- package/dist/react/components/DataTable/columnPriority.js.map +1 -0
- package/dist/react/components/DataTable/types.d.ts +14 -0
- package/dist/react/components/DataTable/types.d.ts.map +1 -1
- package/dist/react/components/DataTable/types.js.map +1 -1
- package/dist/react/components/EmptyState.d.ts.map +1 -1
- package/dist/react/components/EmptyState.js +2 -2
- package/dist/react/components/EmptyState.js.map +1 -1
- package/dist/react/components/ErrorCard.d.ts +13 -1
- package/dist/react/components/ErrorCard.d.ts.map +1 -1
- package/dist/react/components/ErrorCard.js +3 -2
- package/dist/react/components/ErrorCard.js.map +1 -1
- package/dist/react/components/Field.d.ts +37 -12
- package/dist/react/components/Field.d.ts.map +1 -1
- package/dist/react/components/Field.js +19 -8
- package/dist/react/components/Field.js.map +1 -1
- package/dist/react/components/Menu.d.ts +58 -0
- package/dist/react/components/Menu.d.ts.map +1 -0
- package/dist/react/components/Menu.js +86 -0
- package/dist/react/components/Menu.js.map +1 -0
- package/dist/react/components/Modal.d.ts +1 -0
- package/dist/react/components/Modal.d.ts.map +1 -1
- package/dist/react/components/Modal.js +3 -2
- package/dist/react/components/Modal.js.map +1 -1
- package/dist/react/components/SaveIndicator.d.ts +36 -0
- package/dist/react/components/SaveIndicator.d.ts.map +1 -0
- package/dist/react/components/SaveIndicator.js +48 -0
- package/dist/react/components/SaveIndicator.js.map +1 -0
- package/dist/react/components/SelectionBar.d.ts +26 -0
- package/dist/react/components/SelectionBar.d.ts.map +1 -0
- package/dist/react/components/SelectionBar.js +21 -0
- package/dist/react/components/SelectionBar.js.map +1 -0
- package/dist/react/components/Switch.d.ts +16 -2
- package/dist/react/components/Switch.d.ts.map +1 -1
- package/dist/react/components/Switch.js +10 -3
- package/dist/react/components/Switch.js.map +1 -1
- package/dist/react/components/Tooltip.d.ts +1 -1
- package/dist/react/components/Tooltip.d.ts.map +1 -1
- package/dist/react/components/Tooltip.js +14 -1
- package/dist/react/components/Tooltip.js.map +1 -1
- package/dist/react/components/TooltipImpl.d.ts.map +1 -1
- package/dist/react/components/TooltipImpl.js +37 -7
- package/dist/react/components/TooltipImpl.js.map +1 -1
- package/dist/react/components/UnstyledButton.d.ts +37 -0
- package/dist/react/components/UnstyledButton.d.ts.map +1 -0
- package/dist/react/components/UnstyledButton.js +46 -0
- package/dist/react/components/UnstyledButton.js.map +1 -0
- package/dist/react/components/auth/SignInCard.d.ts +15 -1
- package/dist/react/components/auth/SignInCard.d.ts.map +1 -1
- package/dist/react/components/auth/SignInCard.js +6 -2
- package/dist/react/components/auth/SignInCard.js.map +1 -1
- package/dist/react/components/dialog.d.ts.map +1 -1
- package/dist/react/components/dialog.js +35 -3
- package/dist/react/components/dialog.js.map +1 -1
- package/dist/react/hooks/useCopyToClipboard.d.ts +10 -2
- package/dist/react/hooks/useCopyToClipboard.d.ts.map +1 -1
- package/dist/react/hooks/useCopyToClipboard.js +13 -4
- package/dist/react/hooks/useCopyToClipboard.js.map +1 -1
- package/dist/react/icons.d.ts +12 -1
- package/dist/react/icons.d.ts.map +1 -1
- package/dist/react/icons.js +12 -22
- package/dist/react/icons.js.map +1 -1
- package/dist/react/index.d.ts +8 -4
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +7 -3
- package/dist/react/index.js.map +1 -1
- package/dist/react/lib/hoverIntent.d.ts +21 -0
- package/dist/react/lib/hoverIntent.d.ts.map +1 -1
- package/dist/react/lib/hoverIntent.js +24 -0
- package/dist/react/lib/hoverIntent.js.map +1 -1
- package/dist/react/lib/openDialogs.d.ts +5 -0
- package/dist/react/lib/openDialogs.d.ts.map +1 -0
- package/dist/react/lib/openDialogs.js +45 -0
- package/dist/react/lib/openDialogs.js.map +1 -0
- package/dist/styles-areas/analytics.css +16 -16
- package/dist/styles-areas/calendar.css +7 -7
- package/dist/styles-areas/chat.css +9 -10
- package/dist/styles-areas/core.css +69 -62
- package/dist/styles-areas/data-table.css +16 -16
- package/dist/styles-areas/disk-usage.css +7 -7
- package/dist/styles-areas/emoji.css +3 -3
- package/dist/styles-areas/fields.css +10 -10
- package/dist/styles-areas/filter-rail.css +7 -8
- package/dist/styles-areas/layout-engine.css +5 -6
- package/dist/styles-areas/master-detail.css +6 -7
- package/dist/styles-areas/media-gallery.css +2 -2
- package/dist/styles-areas/media.css +2 -2
- package/dist/styles-areas/nav.css +17 -18
- package/dist/styles-areas/notifications.css +5 -5
- package/dist/styles-areas/overlays.css +5 -5
- package/dist/styles-areas/sharing.css +2 -2
- package/dist/styles-areas/stats.css +4 -4
- package/dist/styles-areas/wizard.css +3 -3
- package/dist/styles-areas/workbench.css +18 -19
- package/dist/styles-utilities.css +72 -0
- package/dist/testing/tooltip.d.ts.map +1 -1
- package/dist/testing/tooltip.js +8 -18
- package/dist/testing/tooltip.js.map +1 -1
- package/package.json +81 -3
- package/scripts/guardrails-baseline.json +1 -1
- package/scripts/styleAreas.ts +4 -0
- package/src/react/Toast.spec.tsx +17 -1
- package/src/react/Toast.tsx +20 -3
- package/src/react/components/Button.spec.tsx +49 -1
- package/src/react/components/Button.tsx +63 -6
- package/src/react/components/ChoiceGroup.spec.tsx +32 -0
- package/src/react/components/ChoiceGroup.tsx +78 -23
- package/src/react/components/CopyButton.spec.tsx +35 -0
- package/src/react/components/CopyButton.tsx +11 -2
- package/src/react/components/DataTable/DataTable.spec.tsx +16 -0
- package/src/react/components/DataTable/DataTable.tsx +266 -37
- package/src/react/components/DataTable/RowActions.tsx +5 -2
- package/src/react/components/DataTable/columnPriority.spec.ts +97 -0
- package/src/react/components/DataTable/columnPriority.ts +54 -0
- package/src/react/components/DataTable/types.ts +14 -0
- package/src/react/components/DataTable/virtualize.spec.tsx +47 -2
- package/src/react/components/EmptyState.spec.tsx +7 -0
- package/src/react/components/EmptyState.tsx +3 -0
- package/src/react/components/ErrorCard.spec.tsx +32 -0
- package/src/react/components/ErrorCard.tsx +17 -1
- package/src/react/components/Field.spec.tsx +61 -0
- package/src/react/components/Field.tsx +84 -27
- package/src/react/components/Menu.spec.tsx +90 -0
- package/src/react/components/Menu.tsx +204 -0
- package/src/react/components/Modal.spec.tsx +84 -0
- package/src/react/components/Modal.tsx +4 -1
- package/src/react/components/SaveIndicator.spec.tsx +35 -0
- package/src/react/components/SaveIndicator.tsx +85 -0
- package/src/react/components/SelectionBar.spec.tsx +32 -0
- package/src/react/components/SelectionBar.tsx +49 -0
- package/src/react/components/Switch.spec.tsx +25 -0
- package/src/react/components/Switch.tsx +49 -4
- package/src/react/components/Tooltip.spec.tsx +183 -2
- package/src/react/components/Tooltip.tsx +14 -2
- package/src/react/components/TooltipImpl.tsx +42 -8
- package/src/react/components/UnstyledButton.spec.tsx +61 -0
- package/src/react/components/UnstyledButton.tsx +83 -0
- package/src/react/components/auth/SignInCard.spec.tsx +34 -0
- package/src/react/components/auth/SignInCard.tsx +36 -3
- package/src/react/components/dialog.tsx +49 -9
- package/src/react/hooks/useCopyToClipboard.ts +17 -4
- package/src/react/icons.spec.ts +32 -1
- package/src/react/icons.tsx +59 -0
- package/src/react/index.ts +23 -2
- package/src/react/lib/hoverIntent.ts +28 -0
- package/src/react/lib/openDialogs.ts +48 -0
- package/src/styles-areas/analytics.css +16 -16
- package/src/styles-areas/calendar.css +7 -7
- package/src/styles-areas/chat.css +9 -10
- package/src/styles-areas/core.css +69 -62
- package/src/styles-areas/data-table.css +16 -16
- package/src/styles-areas/disk-usage.css +7 -7
- package/src/styles-areas/emoji.css +3 -3
- package/src/styles-areas/fields.css +10 -10
- package/src/styles-areas/filter-rail.css +7 -8
- package/src/styles-areas/layout-engine.css +5 -6
- package/src/styles-areas/master-detail.css +6 -7
- package/src/styles-areas/media-gallery.css +2 -2
- package/src/styles-areas/media.css +2 -2
- package/src/styles-areas/nav.css +17 -18
- package/src/styles-areas/notifications.css +5 -5
- package/src/styles-areas/overlays.css +5 -5
- package/src/styles-areas/sharing.css +2 -2
- package/src/styles-areas/stats.css +4 -4
- package/src/styles-areas/wizard.css +3 -3
- package/src/styles-areas/workbench.css +18 -19
- package/src/styles-utilities.css +72 -0
- package/src/testing/tooltip.spec.ts +19 -0
- package/src/testing/tooltip.ts +17 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Field.d.ts","sourceRoot":"","sources":["../../../src/react/components/Field.tsx"],"names":[],"mappings":"AACA,OAAO,EAAgC,KAAK,YAAY,EAAE,KAAK,SAAS,
|
|
1
|
+
{"version":3,"file":"Field.d.ts","sourceRoot":"","sources":["../../../src/react/components/Field.tsx"],"names":[],"mappings":"AACA,OAAO,EAAgC,KAAK,YAAY,EAAE,KAAK,SAAS,EAAS,MAAM,OAAO,CAAC;AAG/F,OAAO,EACL,sBAAsB,EAEtB,KAAK,UAAU,EAEhB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAAE,sBAAsB,EAAE,CAAC;AAElC;;uFAEuF;AACvF,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,cAAc,EAAE,IAAI,GAAG,SAAS,CAAC;IACjC,kBAAkB,EAAE,MAAM,GAAG,SAAS,CAAC;CACxC;AAED,UAAU,cAAc;IACtB;;;;;;;OAOG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,sEAAsE;IACtE,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,6DAA6D;IAC7D,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;;;;;;;;OAYG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B;;;;;;;;OAQG;IACH,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB;;;;;OAKG;IACH,mBAAmB,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC;CAClD;AAED,MAAM,MAAM,UAAU,GAAG,cAAc,GACrC,CACI;IACE,KAAK,CAAC,EAAE,KAAK,CAAC;IACd;;;;;OAKG;IACH,QAAQ,EAAE,YAAY,GAAG,CAAC,CAAC,OAAO,EAAE,gBAAgB,KAAK,SAAS,CAAC,CAAC;CACrE,GACD;IACE;;;;;;;;;;OAUG;IACH,KAAK,EAAE,IAAI,CAAC;IACZ,4CAA4C;IAC5C,QAAQ,EAAE,SAAS,CAAC;CACrB,CACJ,CAAC;AAEJ;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,KAAK,CAAC,EACpB,IAAI,EACJ,KAAK,EACL,IAAI,EACJ,WAAW,EACX,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,iBAAyB,EACzB,KAAK,EACL,mBAA4B,EAC5B,KAAa,GACd,EAAE,UAAU,+BAgJZ"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsxs as _jsxs, jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
2
|
import { AlertCircle } from 'lucide-react';
|
|
3
|
-
import { cloneElement, isValidElement } from 'react';
|
|
3
|
+
import { cloneElement, isValidElement, useId } from 'react';
|
|
4
4
|
import { get, useFormContext } from 'react-hook-form';
|
|
5
5
|
import { cn } from '../lib/cn.js';
|
|
6
6
|
import { DESCRIPTION_FOLD_CHARS, FIELD_WIDTH_CLASS, naturalFieldWidth, } from '../lib/field.js';
|
|
@@ -24,11 +24,13 @@ export { DESCRIPTION_FOLD_CHARS };
|
|
|
24
24
|
* Usable outside a `FormProvider` (label + control render; no error) so option-form
|
|
25
25
|
* snippets can reuse it, but the error wiring needs a form context.
|
|
26
26
|
*/
|
|
27
|
-
export function Field({ name, label, hint, description, required, children, className, reserveErrorSpace = false, width, descriptionOnNarrow = 'auto', }) {
|
|
27
|
+
export function Field({ name, label, hint, description, required, children, className, reserveErrorSpace = false, width, descriptionOnNarrow = 'auto', group = false, }) {
|
|
28
28
|
const form = useFormContext();
|
|
29
29
|
const errors = form?.formState.errors;
|
|
30
|
-
const error = (errors ? get(errors, name)?.message : undefined);
|
|
31
|
-
const
|
|
30
|
+
const error = (errors && name ? get(errors, name)?.message : undefined);
|
|
31
|
+
const autoId = useId();
|
|
32
|
+
const id = name ? `cb-f-${name}` : `cb-f${autoId.replace(/[^A-Za-z0-9_-]/g, '')}`;
|
|
33
|
+
const labelId = `${id}-label`;
|
|
32
34
|
const descId = description != null ? `${id}-desc` : undefined;
|
|
33
35
|
const errId = error ? `${id}-err` : undefined;
|
|
34
36
|
const describedBy = [descId, errId].filter(Boolean).join(' ') || undefined;
|
|
@@ -39,7 +41,7 @@ export function Field({ name, label, hint, description, required, children, clas
|
|
|
39
41
|
'aria-describedby': describedBy,
|
|
40
42
|
};
|
|
41
43
|
const resolvedWidth = width ??
|
|
42
|
-
(typeof children !== 'function' && isValidElement(children)
|
|
44
|
+
(!group && typeof children !== 'function' && isValidElement(children)
|
|
43
45
|
? naturalFieldWidth(children.type, (children.props ?? {}))
|
|
44
46
|
: 'full');
|
|
45
47
|
const widthClass = FIELD_WIDTH_CLASS[resolvedWidth];
|
|
@@ -50,13 +52,22 @@ export function Field({ name, label, hint, description, required, children, clas
|
|
|
50
52
|
description.length > DESCRIPTION_FOLD_CHARS));
|
|
51
53
|
const control = typeof children === 'function'
|
|
52
54
|
? children(aria)
|
|
53
|
-
: isValidElement(children)
|
|
55
|
+
: !group && isValidElement(children)
|
|
54
56
|
? cloneElement(children, {
|
|
55
57
|
id,
|
|
56
58
|
'aria-invalid': aria['aria-invalid'],
|
|
57
|
-
|
|
59
|
+
// A control that already points at a note of its own keeps it, beside ours.
|
|
60
|
+
'aria-describedby': [children.props['aria-describedby'], describedBy].filter(Boolean).join(' ') ||
|
|
61
|
+
undefined,
|
|
58
62
|
})
|
|
59
63
|
: children;
|
|
60
|
-
|
|
64
|
+
const asterisk = required ? (_jsxs("span", { className: 'text-field-error', "aria-hidden": true, children: [' ', "*"] })) : null;
|
|
65
|
+
return (_jsxs("div", { className: cn('flex flex-col gap-1.5', className), "data-cb-field": '', "data-cb-field-width": resolvedWidth, ...(group
|
|
66
|
+
? {
|
|
67
|
+
role: 'group',
|
|
68
|
+
'aria-labelledby': label != null ? labelId : undefined,
|
|
69
|
+
'aria-describedby': describedBy,
|
|
70
|
+
}
|
|
71
|
+
: {}), children: [label != null || hint != null || folds ? (_jsxs("div", { className: 'flex items-center gap-1', children: [label != null ? (group ? (_jsxs("span", { id: labelId, className: 'text-sm font-medium text-foreground', "data-cb-field-label": '', children: [label, asterisk] })) : (_jsxs("label", { htmlFor: id, className: 'text-sm font-medium text-foreground', "data-cb-field-label": '', children: [label, asterisk] }))) : null, hint != null && !folds ? (_jsx(InfoHint, { title: typeof label === 'string' ? label : undefined, children: hint })) : null, folds ? (_jsxs(_Fragment, { children: [hint != null ? (_jsx("span", { className: 'inline-flex max-sm:hidden', children: _jsx(InfoHint, { title: typeof label === 'string' ? label : undefined, children: hint }) })) : null, _jsx("span", { className: 'inline-flex sm:hidden', children: _jsxs(InfoHint, { title: typeof label === 'string' ? label : undefined, children: [hint != null ? _jsx("p", { className: 'mb-1', children: hint }) : null, description] }) })] })) : null] })) : null, description != null ? (_jsx("p", { id: descId, "data-cb-field-description": '', className: cn('text-xs font-normal leading-snug text-muted-foreground', folds && 'max-sm:hidden'), children: description })) : null, widthClass ? (_jsx("div", { className: cn('w-full', widthClass), "data-cb-field-control": '', children: control })) : (control), error ? (_jsxs("p", { id: errId, role: 'alert', className: 'flex items-center gap-1.5 text-sm text-field-error', children: [_jsx(AlertCircle, { className: 'size-4 shrink-0', "aria-hidden": true }), error] })) : reserveErrorSpace ? (_jsx("p", { "aria-hidden": true, className: 'min-h-[1lh] text-sm', "data-cc-field-error-reserved": '' })) : null] }));
|
|
61
72
|
}
|
|
62
73
|
//# sourceMappingURL=Field.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Field.js","sourceRoot":"","sources":["../../../src/react/components/Field.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,cAAc,EAAqC,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"Field.js","sourceRoot":"","sources":["../../../src/react/components/Field.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
export interface MenuProps {
|
|
3
|
+
children: ReactNode;
|
|
4
|
+
/** Names the menu for a screen reader when nothing else does. */
|
|
5
|
+
'aria-label'?: string;
|
|
6
|
+
className?: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* The list. Arrow keys, Home and End move between items (refused ones included — a refused
|
|
10
|
+
* item is reachable on purpose); every other key is left to bubble.
|
|
11
|
+
*/
|
|
12
|
+
export declare function Menu({ children, className, ...rest }: MenuProps): import("react").JSX.Element;
|
|
13
|
+
export interface MenuItemProps {
|
|
14
|
+
onSelect?: () => void;
|
|
15
|
+
/** Drawn right-aligned and muted — `⌘D`, `Del`. */
|
|
16
|
+
shortcut?: string;
|
|
17
|
+
/** Destroys something: drawn in the destructive colour. */
|
|
18
|
+
danger?: boolean;
|
|
19
|
+
/** Momentarily inert. Use {@link MenuItemProps.unavailableReason} for "cannot work here". */
|
|
20
|
+
disabled?: boolean;
|
|
21
|
+
/**
|
|
22
|
+
* One of a set of choices, and whether this is the one in force.
|
|
23
|
+
*
|
|
24
|
+
* Present at all makes the item a `menuitemradio` rather than a command, so a screen reader
|
|
25
|
+
* says "checked" and the tick is not the only thing carrying it. A menu of choices that
|
|
26
|
+
* shows none of them as current is one you have to open, read, and then still guess at.
|
|
27
|
+
*/
|
|
28
|
+
selected?: boolean;
|
|
29
|
+
/**
|
|
30
|
+
* Why this item cannot work HERE, and supplying it refuses the press — as {@link Button}'s
|
|
31
|
+
* does: `aria-disabled`, still focusable and hoverable so the reason is reachable by
|
|
32
|
+
* keyboard, turned away on click and Enter/Space. The reason is the hint.
|
|
33
|
+
*/
|
|
34
|
+
unavailableReason?: string;
|
|
35
|
+
/**
|
|
36
|
+
* The item's own words, in full, as a hint — for a label that truncates. A menu item that
|
|
37
|
+
* names a file is as long as the file's name, and for a destructive item the truncated
|
|
38
|
+
* half is the half that says what would go.
|
|
39
|
+
*/
|
|
40
|
+
title?: string;
|
|
41
|
+
/**
|
|
42
|
+
* A second, muted line under the label, for items that make DIFFERENT things ("Markdown
|
|
43
|
+
* note" / "Rich text note"). It is the item's description, never part of its name.
|
|
44
|
+
*/
|
|
45
|
+
hint?: string;
|
|
46
|
+
className?: string;
|
|
47
|
+
children: ReactNode;
|
|
48
|
+
}
|
|
49
|
+
export declare function MenuItem({ onSelect, shortcut, danger, disabled, selected, unavailableReason, title, hint, className, children, }: MenuItemProps): import("react").JSX.Element;
|
|
50
|
+
/** A small uppercase heading over a group of items. */
|
|
51
|
+
export declare function MenuLabel({ children, className }: {
|
|
52
|
+
children: ReactNode;
|
|
53
|
+
className?: string;
|
|
54
|
+
}): import("react").JSX.Element;
|
|
55
|
+
export declare function MenuSeparator({ className }: {
|
|
56
|
+
className?: string;
|
|
57
|
+
}): import("react").JSX.Element;
|
|
58
|
+
//# sourceMappingURL=Menu.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Menu.d.ts","sourceRoot":"","sources":["../../../src/react/components/Menu.tsx"],"names":[],"mappings":"AACA,OAAO,EAAsB,KAAK,SAAS,EAAS,MAAM,OAAO,CAAC;AA6BlE,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,SAAS,CAAC;IACpB,iEAAiE;IACjE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAgB,IAAI,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,SAAS,+BA6B/D;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,mDAAmD;IACnD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,2DAA2D;IAC3D,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,6FAA6F;IAC7F,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,wBAAgB,QAAQ,CAAC,EACvB,QAAQ,EACR,QAAQ,EACR,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,iBAAiB,EACjB,KAAK,EACL,IAAI,EACJ,SAAS,EACT,QAAQ,GACT,EAAE,aAAa,+BAkEf;AAED,uDAAuD;AACvD,wBAAgB,SAAS,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,+BAS7F;AAED,wBAAgB,aAAa,CAAC,EAAE,SAAS,EAAE,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,+BAGlE"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Check } from 'lucide-react';
|
|
3
|
+
import { useId } from 'react';
|
|
4
|
+
import { cn } from '../lib/cn.js';
|
|
5
|
+
import { TAP_TARGET_HEIGHT } from '../lib/tapTarget.js';
|
|
6
|
+
import { Tooltip } from './Tooltip.js';
|
|
7
|
+
/*
|
|
8
|
+
A menu that goes wherever its panel goes.
|
|
9
|
+
|
|
10
|
+
`DropdownMenu` is Radix's, and Radix anchors a menu to its trigger. A context menu at the
|
|
11
|
+
cursor, a menu over a grid cell, a `+` that opens under a row of the sidebar: those are
|
|
12
|
+
anchored at a POINT, which the belt's `Popover` already does (`anchor={{ x, y, trigger }}`).
|
|
13
|
+
So this is only the menu — the list, its items and its keys — and the panel is whichever
|
|
14
|
+
`Popover` (or sheet, or card) the caller puts it in:
|
|
15
|
+
|
|
16
|
+
<Popover anchor={at} onOpenChange={(open) => !open && setAt(null)}>
|
|
17
|
+
<Menu>
|
|
18
|
+
<MenuItem onSelect={rename}>Rename</MenuItem>
|
|
19
|
+
<MenuSeparator />
|
|
20
|
+
<MenuItem danger onSelect={remove}>Delete</MenuItem>
|
|
21
|
+
</Menu>
|
|
22
|
+
</Popover>
|
|
23
|
+
|
|
24
|
+
Came from desk's `Menu`/`MenuItem`/`MenuLabel`/`MenuSeparator` (forge task 2415), with what
|
|
25
|
+
desk had learned: refused items that stay reachable, radio choices that say which is in
|
|
26
|
+
force, a hint line that describes rather than names, and a shortcut column.
|
|
27
|
+
*/
|
|
28
|
+
const ITEMS = '[role="menuitem"],[role="menuitemradio"]';
|
|
29
|
+
/**
|
|
30
|
+
* The list. Arrow keys, Home and End move between items (refused ones included — a refused
|
|
31
|
+
* item is reachable on purpose); every other key is left to bubble.
|
|
32
|
+
*/
|
|
33
|
+
export function Menu({ children, className, ...rest }) {
|
|
34
|
+
const onKeyDown = (event) => {
|
|
35
|
+
const items = [...event.currentTarget.querySelectorAll(ITEMS)].filter((item) => !item.disabled);
|
|
36
|
+
if (items.length === 0)
|
|
37
|
+
return;
|
|
38
|
+
const at = items.indexOf(document.activeElement);
|
|
39
|
+
let next;
|
|
40
|
+
if (event.key === 'ArrowDown')
|
|
41
|
+
next = at < 0 ? 0 : (at + 1) % items.length;
|
|
42
|
+
else if (event.key === 'ArrowUp')
|
|
43
|
+
next = at < 0 ? items.length - 1 : (at - 1 + items.length) % items.length;
|
|
44
|
+
else if (event.key === 'Home')
|
|
45
|
+
next = 0;
|
|
46
|
+
else if (event.key === 'End')
|
|
47
|
+
next = items.length - 1;
|
|
48
|
+
else
|
|
49
|
+
return;
|
|
50
|
+
event.preventDefault();
|
|
51
|
+
event.stopPropagation();
|
|
52
|
+
items[next]?.focus();
|
|
53
|
+
};
|
|
54
|
+
return (_jsx("div", { role: 'menu', tabIndex: -1, "data-cb-menu": '', "aria-label": rest['aria-label'], onKeyDown: onKeyDown, className: cn('flex flex-col gap-px outline-none', className), children: children }));
|
|
55
|
+
}
|
|
56
|
+
export function MenuItem({ onSelect, shortcut, danger, disabled, selected, unavailableReason, title, hint, className, children, }) {
|
|
57
|
+
const hintId = useId();
|
|
58
|
+
const reason = unavailableReason?.trim() || undefined;
|
|
59
|
+
const refused = reason !== undefined && !disabled;
|
|
60
|
+
const choice = selected !== undefined;
|
|
61
|
+
return (_jsx(Tooltip, { content: reason ?? title, side: 'right', multiline: true, children: _jsxs("button", {
|
|
62
|
+
// guardrails-ignore no-raw-action-button: task 2415 — this IS the menu item primitive.
|
|
63
|
+
type: 'button', role: choice ? 'menuitemradio' : 'menuitem', "aria-checked": choice ? selected : undefined, "aria-describedby": hint ? hintId : undefined, disabled: refused ? undefined : disabled, "aria-disabled": refused ? true : undefined, "data-cb-menu-item": '', "data-danger": danger ? '' : undefined, className: cn('flex w-full cursor-pointer items-center gap-2 whitespace-nowrap rounded-sm border-0 bg-transparent px-2 py-1.5 text-left text-sm text-foreground outline-none', TAP_TARGET_HEIGHT, 'hover:bg-muted focus-visible:bg-muted focus-visible:ring-2 focus-visible:ring-accent', danger && 'text-destructive hover:bg-destructive/10 focus-visible:bg-destructive/10',
|
|
64
|
+
// Both spellings, together: a refused item is aria-disabled, not disabled, and without
|
|
65
|
+
// the second half it lights up under the pointer exactly like a live one.
|
|
66
|
+
'disabled:cursor-not-allowed disabled:opacity-50 disabled:hover:bg-transparent', 'aria-disabled:cursor-not-allowed aria-disabled:opacity-50 aria-disabled:hover:bg-transparent', hint && 'items-start py-2', className), onClick: (event) => {
|
|
67
|
+
if (refused) {
|
|
68
|
+
event.preventDefault();
|
|
69
|
+
event.stopPropagation();
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
onSelect?.();
|
|
73
|
+
}, onKeyDown: (event) => {
|
|
74
|
+
if (refused && (event.key === 'Enter' || event.key === ' '))
|
|
75
|
+
event.preventDefault();
|
|
76
|
+
}, children: [choice && (_jsx("span", { className: 'flex w-4 shrink-0 justify-center text-accent', "aria-hidden": true, children: selected ? _jsx(Check, { className: 'size-3.5' }) : null })), _jsxs("span", { className: 'flex min-w-0 flex-1 flex-col gap-0.5', children: [_jsx("span", { className: 'truncate', children: children }), hint && (_jsx("span", { id: hintId, "aria-hidden": true, "data-cb-menu-hint": '', className: 'whitespace-normal text-xs leading-snug text-muted-foreground', children: hint }))] }), shortcut && (_jsx("span", { "data-cb-menu-shortcut": '', className: 'ml-auto pl-4 font-mono text-xs text-muted-foreground', children: shortcut }))] }) }));
|
|
77
|
+
}
|
|
78
|
+
/** A small uppercase heading over a group of items. */
|
|
79
|
+
export function MenuLabel({ children, className }) {
|
|
80
|
+
return (_jsx("div", { "data-cb-menu-label": '', className: cn('px-2 pt-2 pb-1 font-bold text-muted-foreground text-xs uppercase tracking-wider', className), children: children }));
|
|
81
|
+
}
|
|
82
|
+
export function MenuSeparator({ className }) {
|
|
83
|
+
// biome-ignore lint/a11y/useSemanticElements: an <hr> inside role=menu is not a menu separator to AT; role=separator is.
|
|
84
|
+
return _jsx("div", { role: 'separator', className: cn('my-1 h-px bg-border', className) });
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=Menu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Menu.js","sourceRoot":"","sources":["../../../src/react/components/Menu.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Modal.d.ts","sourceRoot":"","sources":["../../../src/react/components/Modal.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAUvC,MAAM,MAAM,SAAS,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,MAAM,CAAC;AAkC3D,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB;;;;;;;;OAQG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,QAAQ,EAAE,SAAS,CAAC;IACpB;;;;;;;;OAQG;IACH,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB;;;;;;;;;;;;;;OAcG;IACH,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,mFAAmF;IACnF,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,6FAA6F;IAC7F,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;;OAKG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;;;;;;;;;;;;;;OAeG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,gFAAgF;IAChF,UAAU,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,KAAK,CAAC,EACpB,IAAI,EACJ,OAAO,EACP,IAAW,EACX,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,MAAM,EACN,OAAO,EACP,OAAO,EACP,MAAM,EACN,UAAiB,EACjB,aAAoB,EACpB,KAAK,EACL,UAAiB,EACjB,SAAS,GACV,EAAE,UAAU,+
|
|
1
|
+
{"version":3,"file":"Modal.d.ts","sourceRoot":"","sources":["../../../src/react/components/Modal.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAUvC,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD,MAAM,MAAM,SAAS,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,MAAM,CAAC;AAkC3D,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB;;;;;;;;OAQG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,QAAQ,EAAE,SAAS,CAAC;IACpB;;;;;;;;OAQG;IACH,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB;;;;;;;;;;;;;;OAcG;IACH,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,mFAAmF;IACnF,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,6FAA6F;IAC7F,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;;OAKG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;;;;;;;;;;;;;;OAeG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,gFAAgF;IAChF,UAAU,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,KAAK,CAAC,EACpB,IAAI,EACJ,OAAO,EACP,IAAW,EACX,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,MAAM,EACN,OAAO,EACP,OAAO,EACP,MAAM,EACN,UAAiB,EACjB,aAAoB,EACpB,KAAK,EACL,UAAiB,EACjB,SAAS,GACV,EAAE,UAAU,+BAgJZ"}
|
|
@@ -8,6 +8,7 @@ import { FooterSlot } from './ActionBar.js';
|
|
|
8
8
|
import { Dialog, DialogContent, DialogTitle, focusPanelOnOpen } from './dialog.js';
|
|
9
9
|
import { IconButton } from './IconButton.js';
|
|
10
10
|
import { ScrollArea } from './ScrollArea.js';
|
|
11
|
+
export { useDialogOpen } from '../lib/openDialogs.js';
|
|
11
12
|
// ONE sizing scale replaces the ad-hoc `max-w-xl`/`max-w-2xl`/`max-h-[80vh]` classNames
|
|
12
13
|
// scattered across the apps' modals. `full` is a near-fullscreen sheet with a 1rem margin
|
|
13
14
|
// on every side; `cn`'s twMerge dedupes its `max-h` against the base below (last wins).
|
|
@@ -60,7 +61,7 @@ export function Modal({ open, onClose, size = 'md', title, subtitle, children, f
|
|
|
60
61
|
return (_jsx(Dialog, { open: open, onOpenChange: (v) => {
|
|
61
62
|
if (!v)
|
|
62
63
|
guardedClose();
|
|
63
|
-
}, children: _jsxs(DialogContent, { className: cn(
|
|
64
|
+
}, children: _jsxs(DialogContent, { "data-cb-modal": '', className: cn(
|
|
64
65
|
// A bottom sheet on a phone, a centred card from `sm` up (see SHEET / CARD). The
|
|
65
66
|
// card keeps a 1rem margin on each side at every size, then caps at the size's
|
|
66
67
|
// max-width.
|
|
@@ -93,6 +94,6 @@ export function Modal({ open, onClose, size = 'md', title, subtitle, children, f
|
|
|
93
94
|
cancelDiscard();
|
|
94
95
|
else
|
|
95
96
|
guardedClose();
|
|
96
|
-
}, children: [_jsxs("div", { ref: swipeRef, "data-cb-modal-handle": '', className: 'relative flex flex-none items-center justify-between gap-3 border-b border-border px-5 py-4 max-sm:touch-none max-sm:pt-6', children: [_jsx("span", { "aria-hidden": true, className: 'pointer-events-none absolute top-2 left-1/2 h-1 w-9 -translate-x-1/2 rounded-full bg-border sm:hidden' }), title ? (_jsxs("div", { className: 'min-w-0 flex-1', children: [_jsx(DialogTitle, { className: 'wrap-break-word text-base font-semibold', children: title }), subtitle ? (_jsx("p", { className: 'mt-1 text-caption leading-relaxed text-muted-foreground', children: subtitle })) : null] })) : (_jsx(DialogTitle, { className: 'sr-only', children: "Dialog" })), _jsx(IconButton, { label: 'Close', onClick: guardedClose, children: _jsx(X, {}) })] }), aside ? (_jsxs("div", { "data-cb-modal-split": '', className: 'flex min-h-0 flex-1 flex-col md:flex-row md:divide-x md:divide-border', children: [_jsx("div", { "data-cb-modal-aside": '', className: cn('flex min-h-0 flex-col md:flex-none', asideWidth === 'md' ? 'md:w-2/5' : 'md:w-1/3'), children: _jsx(ScrollArea, { className: 'px-5 py-4', children: aside }) }), _jsx("div", { className: 'flex min-h-0 flex-1 flex-col', children: scrollBody ? (_jsx(ScrollArea, { className: 'px-5 py-4', children: children })) : (_jsx("div", { className: 'flex min-h-0 flex-1 flex-col', children: children })) })] })) : scrollBody ? (_jsx(ScrollArea, { className: 'px-5 py-4', children: children })) : (_jsx("div", { className: 'flex min-h-0 flex-1 flex-col', children: children })), problem ? (_jsx("div", { className: 'flex-none px-5 pt-3 empty:hidden', children: problem })) : null, _jsx(FooterSlot, { footer: footer }), discardOverlay] }) }));
|
|
97
|
+
}, children: [_jsxs("div", { ref: swipeRef, "data-cb-modal-handle": '', className: 'relative flex flex-none items-center justify-between gap-3 border-b border-border px-5 py-4 max-sm:touch-none max-sm:pt-6', children: [_jsx("span", { "aria-hidden": true, className: 'pointer-events-none absolute top-2 left-1/2 h-1 w-9 -translate-x-1/2 rounded-full bg-border sm:hidden' }), title ? (_jsxs("div", { className: 'min-w-0 flex-1', children: [_jsx(DialogTitle, { className: 'wrap-break-word text-base font-semibold', children: title }), subtitle ? (_jsx("p", { "data-cb-modal-subtitle": '', className: 'mt-1 text-caption leading-relaxed text-muted-foreground', children: subtitle })) : null] })) : (_jsx(DialogTitle, { className: 'sr-only', children: "Dialog" })), _jsx(IconButton, { label: 'Close', onClick: guardedClose, children: _jsx(X, {}) })] }), aside ? (_jsxs("div", { "data-cb-modal-split": '', className: 'flex min-h-0 flex-1 flex-col md:flex-row md:divide-x md:divide-border', children: [_jsx("div", { "data-cb-modal-aside": '', className: cn('flex min-h-0 flex-col md:flex-none', asideWidth === 'md' ? 'md:w-2/5' : 'md:w-1/3'), children: _jsx(ScrollArea, { className: 'px-5 py-4', children: aside }) }), _jsx("div", { className: 'flex min-h-0 flex-1 flex-col', children: scrollBody ? (_jsx(ScrollArea, { className: 'px-5 py-4', children: children })) : (_jsx("div", { className: 'flex min-h-0 flex-1 flex-col', children: children })) })] })) : scrollBody ? (_jsx(ScrollArea, { className: 'px-5 py-4', children: children })) : (_jsx("div", { className: 'flex min-h-0 flex-1 flex-col', children: children })), problem ? (_jsx("div", { className: 'flex-none px-5 pt-3 empty:hidden', children: problem })) : null, _jsx(FooterSlot, { footer: footer }), discardOverlay] }) }));
|
|
97
98
|
}
|
|
98
99
|
//# sourceMappingURL=Modal.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Modal.js","sourceRoot":"","sources":["../../../src/react/components/Modal.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,cAAc,CAAC;AAEjC,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACnF,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"Modal.js","sourceRoot":"","sources":["../../../src/react/components/Modal.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/** Where an editor's writes stand. */
|
|
2
|
+
export type SaveState = 'idle' | 'pending' | 'saving' | 'saved' | 'conflict' | 'error';
|
|
3
|
+
export interface SaveIndicatorProps {
|
|
4
|
+
state: SaveState;
|
|
5
|
+
/** Writes waiting to reach the server — shown with `pending` and `saving`. */
|
|
6
|
+
queued?: number;
|
|
7
|
+
/** The failure in words; replaces the hint while set. */
|
|
8
|
+
error?: string | null;
|
|
9
|
+
/**
|
|
10
|
+
* Writes that have REACHED the server, published as `data-saves`.
|
|
11
|
+
*
|
|
12
|
+
* Nobody looks at it: it is for a test, which cannot infer "did my gesture save?" from
|
|
13
|
+
* `data-state` — an indicator that is `idle` because the gesture has not enqueued anything
|
|
14
|
+
* yet is indistinguishable from one that is idle because everything is written.
|
|
15
|
+
*/
|
|
16
|
+
saves?: number;
|
|
17
|
+
className?: string;
|
|
18
|
+
}
|
|
19
|
+
/** The words for each state; `queued` fills in the count. */
|
|
20
|
+
export declare function saveIndicatorLabel(state: SaveState, queued?: number): string;
|
|
21
|
+
/**
|
|
22
|
+
* The status-bar save state: a dot, and words only when somebody has to act.
|
|
23
|
+
*
|
|
24
|
+
* At rest (`idle`, `saved`) the dot says it on its own and the label is spoken, not drawn —
|
|
25
|
+
* the owner: *"the green circle with a tooltip is fine so it doesn't have to take up space
|
|
26
|
+
* with the word there"*. `Saving…`, `3 unsaved`, `Changed elsewhere` and `Save failed` are
|
|
27
|
+
* each a state somebody has to act on, and a coloured dot is not a sentence, so those are
|
|
28
|
+
* drawn. 🔴 The resting label is `sr-only`, never deleted: whether work is written is
|
|
29
|
+
* exactly what a screen reader user cannot infer from a colour.
|
|
30
|
+
*
|
|
31
|
+
* `data-cb-save-indicator`, `data-state` and `data-saves` are stable test hooks.
|
|
32
|
+
*
|
|
33
|
+
* Came from desk's `SaveIndicator` (forge task 2415).
|
|
34
|
+
*/
|
|
35
|
+
export declare function SaveIndicator({ state, queued, error, saves, className }: SaveIndicatorProps): import("react").JSX.Element;
|
|
36
|
+
//# sourceMappingURL=SaveIndicator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SaveIndicator.d.ts","sourceRoot":"","sources":["../../../src/react/components/SaveIndicator.tsx"],"names":[],"mappings":"AAGA,sCAAsC;AACtC,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,GAAG,UAAU,GAAG,OAAO,CAAC;AAEvF,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,SAAS,CAAC;IACjB,8EAA8E;IAC9E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yDAAyD;IACzD,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB;;;;;;OAMG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,6DAA6D;AAC7D,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,SAAI,GAAG,MAAM,CAevE;AAWD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,aAAa,CAAC,EAAE,KAAK,EAAE,MAAU,EAAE,KAAY,EAAE,KAAS,EAAE,SAAS,EAAE,EAAE,kBAAkB,+BAoB1G"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { cn } from '../lib/cn.js';
|
|
3
|
+
import { Tooltip } from './Tooltip.js';
|
|
4
|
+
/** The words for each state; `queued` fills in the count. */
|
|
5
|
+
export function saveIndicatorLabel(state, queued = 0) {
|
|
6
|
+
switch (state) {
|
|
7
|
+
case 'saving':
|
|
8
|
+
return `Saving${queued > 0 ? ` ${queued}` : ''}…`;
|
|
9
|
+
case 'pending':
|
|
10
|
+
return `${queued} unsaved`;
|
|
11
|
+
case 'saved':
|
|
12
|
+
return 'Saved';
|
|
13
|
+
case 'conflict':
|
|
14
|
+
return 'Changed elsewhere';
|
|
15
|
+
case 'error':
|
|
16
|
+
return 'Save failed';
|
|
17
|
+
default:
|
|
18
|
+
return 'Up to date';
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
const DOT = {
|
|
22
|
+
idle: 'bg-muted-foreground/60',
|
|
23
|
+
pending: 'bg-muted-foreground/60',
|
|
24
|
+
saving: 'bg-warning animate-pulse',
|
|
25
|
+
saved: 'bg-success',
|
|
26
|
+
conflict: 'bg-warning',
|
|
27
|
+
error: 'bg-destructive',
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* The status-bar save state: a dot, and words only when somebody has to act.
|
|
31
|
+
*
|
|
32
|
+
* At rest (`idle`, `saved`) the dot says it on its own and the label is spoken, not drawn —
|
|
33
|
+
* the owner: *"the green circle with a tooltip is fine so it doesn't have to take up space
|
|
34
|
+
* with the word there"*. `Saving…`, `3 unsaved`, `Changed elsewhere` and `Save failed` are
|
|
35
|
+
* each a state somebody has to act on, and a coloured dot is not a sentence, so those are
|
|
36
|
+
* drawn. 🔴 The resting label is `sr-only`, never deleted: whether work is written is
|
|
37
|
+
* exactly what a screen reader user cannot infer from a colour.
|
|
38
|
+
*
|
|
39
|
+
* `data-cb-save-indicator`, `data-state` and `data-saves` are stable test hooks.
|
|
40
|
+
*
|
|
41
|
+
* Came from desk's `SaveIndicator` (forge task 2415).
|
|
42
|
+
*/
|
|
43
|
+
export function SaveIndicator({ state, queued = 0, error = null, saves = 0, className }) {
|
|
44
|
+
const label = saveIndicatorLabel(state, queued);
|
|
45
|
+
const resting = state === 'idle' || state === 'saved';
|
|
46
|
+
return (_jsx(Tooltip, { content: error ?? label, multiline: true, children: _jsxs("span", { "data-cb-save-indicator": '', "data-state": state, "data-saves": saves, className: cn('inline-flex items-center gap-1.5 whitespace-nowrap text-xs text-muted-foreground', state === 'error' && 'font-semibold text-destructive', className), children: [_jsx("span", { "aria-hidden": true, className: cn('size-1.5 shrink-0 rounded-full', DOT[state]) }), resting ? _jsx("span", { className: 'sr-only', children: label }) : label] }) }));
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=SaveIndicator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SaveIndicator.js","sourceRoot":"","sources":["../../../src/react/components/SaveIndicator.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAsBvC,6DAA6D;AAC7D,MAAM,UAAU,kBAAkB,CAAC,KAAgB,EAAE,MAAM,GAAG,CAAC;IAC7D,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,QAAQ;YACX,OAAO,SAAS,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC;QACpD,KAAK,SAAS;YACZ,OAAO,GAAG,MAAM,UAAU,CAAC;QAC7B,KAAK,OAAO;YACV,OAAO,OAAO,CAAC;QACjB,KAAK,UAAU;YACb,OAAO,mBAAmB,CAAC;QAC7B,KAAK,OAAO;YACV,OAAO,aAAa,CAAC;QACvB;YACE,OAAO,YAAY,CAAC;IACxB,CAAC;AACH,CAAC;AAED,MAAM,GAAG,GAA8B;IACrC,IAAI,EAAE,wBAAwB;IAC9B,OAAO,EAAE,wBAAwB;IACjC,MAAM,EAAE,0BAA0B;IAClC,KAAK,EAAE,YAAY;IACnB,QAAQ,EAAE,YAAY;IACtB,KAAK,EAAE,gBAAgB;CACxB,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,aAAa,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE,SAAS,EAAsB;IACzG,MAAM,KAAK,GAAG,kBAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAChD,MAAM,OAAO,GAAG,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,OAAO,CAAC;IACtD,OAAO,CACL,KAAC,OAAO,IAAC,OAAO,EAAE,KAAK,IAAI,KAAK,EAAE,SAAS,kBACzC,0CACyB,EAAE,gBACb,KAAK,gBACL,KAAK,EACjB,SAAS,EAAE,EAAE,CACX,kFAAkF,EAClF,KAAK,KAAK,OAAO,IAAI,gCAAgC,EACrD,SAAS,CACV,aAED,oCAAkB,SAAS,EAAE,EAAE,CAAC,gCAAgC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,GAAI,EAChF,OAAO,CAAC,CAAC,CAAC,eAAM,SAAS,EAAC,SAAS,YAAE,KAAK,GAAQ,CAAC,CAAC,CAAC,KAAK,IACtD,GACC,CACX,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
export interface SelectionBarProps {
|
|
3
|
+
/** How many things are ticked. At 0 the bar is not rendered at all. */
|
|
4
|
+
count: number;
|
|
5
|
+
/** The singular noun ("item", "file"); an `s` is added for any count but one. Default `'item'`. */
|
|
6
|
+
noun?: string;
|
|
7
|
+
/** Overrides the plural when an `s` is wrong ("entries"). */
|
|
8
|
+
plural?: string;
|
|
9
|
+
/** The actions on the selection — the destructive one last, so it sits far right. */
|
|
10
|
+
children?: ReactNode;
|
|
11
|
+
className?: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* The bar that appears when something is ticked.
|
|
15
|
+
*
|
|
16
|
+
* DESIGN.md §2: the count on the left, the actions on the right with the destructive one
|
|
17
|
+
* far right, one line. It is ABSENT rather than disabled when nothing is selected — a
|
|
18
|
+
* permanent bar saying "0 selected" is a row of the screen spent on nothing.
|
|
19
|
+
*
|
|
20
|
+
* A `group` named by its own count, so a screen reader arriving on an action hears what it
|
|
21
|
+
* acts on. `data-cb-selection-bar` is the stable test hook.
|
|
22
|
+
*
|
|
23
|
+
* Came from desk's `SelectionBar` (forge task 2415).
|
|
24
|
+
*/
|
|
25
|
+
export declare function SelectionBar({ count, noun, plural, children, className }: SelectionBarProps): import("react").JSX.Element | null;
|
|
26
|
+
//# sourceMappingURL=SelectionBar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SelectionBar.d.ts","sourceRoot":"","sources":["../../../src/react/components/SelectionBar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,MAAM,WAAW,iBAAiB;IAChC,uEAAuE;IACvE,KAAK,EAAE,MAAM,CAAC;IACd,mGAAmG;IACnG,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,6DAA6D;IAC7D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qFAAqF;IACrF,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAAC,EAAE,KAAK,EAAE,IAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,iBAAiB,sCAqBpG"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { cn } from '../lib/cn.js';
|
|
3
|
+
/**
|
|
4
|
+
* The bar that appears when something is ticked.
|
|
5
|
+
*
|
|
6
|
+
* DESIGN.md §2: the count on the left, the actions on the right with the destructive one
|
|
7
|
+
* far right, one line. It is ABSENT rather than disabled when nothing is selected — a
|
|
8
|
+
* permanent bar saying "0 selected" is a row of the screen spent on nothing.
|
|
9
|
+
*
|
|
10
|
+
* A `group` named by its own count, so a screen reader arriving on an action hears what it
|
|
11
|
+
* acts on. `data-cb-selection-bar` is the stable test hook.
|
|
12
|
+
*
|
|
13
|
+
* Came from desk's `SelectionBar` (forge task 2415).
|
|
14
|
+
*/
|
|
15
|
+
export function SelectionBar({ count, noun = 'item', plural, children, className }) {
|
|
16
|
+
if (count <= 0)
|
|
17
|
+
return null;
|
|
18
|
+
const words = `${count.toLocaleString()} ${count === 1 ? noun : (plural ?? `${noun}s`)} selected`;
|
|
19
|
+
return (_jsxs("div", { role: 'group', "aria-label": words, "data-cb-selection-bar": '', className: cn('mb-3 flex min-h-[var(--control-h-md)] flex-wrap items-center gap-2 rounded-md border border-accent bg-accent/10 px-3 py-2', className), children: [_jsx("span", { "data-cb-selection-count": '', className: 'text-sm font-semibold tabular-nums', children: words }), _jsx("span", { className: 'flex-1', "aria-hidden": true }), children] }));
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=SelectionBar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SelectionBar.js","sourceRoot":"","sources":["../../../src/react/components/SelectionBar.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAclC;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,YAAY,CAAC,EAAE,KAAK,EAAE,IAAI,GAAG,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAqB;IACnG,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5B,MAAM,KAAK,GAAG,GAAG,KAAK,CAAC,cAAc,EAAE,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC;IAClG,OAAO,CAEL,eACE,IAAI,EAAC,OAAO,gBACA,KAAK,2BACK,EAAE,EACxB,SAAS,EAAE,EAAE,CACX,2HAA2H,EAC3H,SAAS,CACV,aAED,0CAA8B,EAAE,EAAC,SAAS,EAAC,oCAAoC,YAC5E,KAAK,GACD,EACP,eAAM,SAAS,EAAC,QAAQ,wBAAe,EACtC,QAAQ,IACL,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -1,6 +1,20 @@
|
|
|
1
1
|
import * as RadixSwitch from '@radix-ui/react-switch';
|
|
2
|
-
import type
|
|
2
|
+
import { type ComponentPropsWithoutRef, type ReactNode } from 'react';
|
|
3
3
|
export interface SwitchProps extends ComponentPropsWithoutRef<typeof RadixSwitch.Root> {
|
|
4
|
+
/**
|
|
5
|
+
* The setting's name, drawn at the START of a full-width row with the track at its
|
|
6
|
+
* end — the settings-row layout (iOS Settings, Linear's preferences). The whole row
|
|
7
|
+
* is the `<label>`, so pressing the words flips the switch. A node, so a caption can
|
|
8
|
+
* carry an ⓘ or a second line of hint.
|
|
9
|
+
*/
|
|
10
|
+
label?: ReactNode;
|
|
11
|
+
/** Typography for the caption; `cn` is tailwind-merge, so it replaces the default. */
|
|
12
|
+
labelClassName?: string;
|
|
13
|
+
/**
|
|
14
|
+
* Say "On" / "Off" beside the track. A track with a dot at one end is not
|
|
15
|
+
* self-evident to everybody, and a word next to it costs nothing.
|
|
16
|
+
*/
|
|
17
|
+
showState?: boolean;
|
|
4
18
|
}
|
|
5
19
|
/**
|
|
6
20
|
* On/off toggle vendored from shadcn (Radix `Switch`). The filled track turns the
|
|
@@ -8,5 +22,5 @@ export interface SwitchProps extends ComponentPropsWithoutRef<typeof RadixSwitch
|
|
|
8
22
|
* focus. Use `checked` + `onCheckedChange` (RHF wires this via `<Controller>` — not
|
|
9
23
|
* `register()`, since the callback is a boolean, not a native change event).
|
|
10
24
|
*/
|
|
11
|
-
export declare function Switch({ className, ...props }: SwitchProps): import("react").JSX.Element;
|
|
25
|
+
export declare function Switch({ className, label, labelClassName, showState, id: idProp, ...props }: SwitchProps): import("react").JSX.Element;
|
|
12
26
|
//# sourceMappingURL=Switch.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Switch.d.ts","sourceRoot":"","sources":["../../../src/react/components/Switch.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,WAAW,MAAM,wBAAwB,CAAC;AACtD,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"Switch.d.ts","sourceRoot":"","sources":["../../../src/react/components/Switch.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,WAAW,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,KAAK,wBAAwB,EAAE,KAAK,SAAS,EAAS,MAAM,OAAO,CAAC;AAI7E,MAAM,WAAW,WAAY,SAAQ,wBAAwB,CAAC,OAAO,WAAW,CAAC,IAAI,CAAC;IACpF;;;;;OAKG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,sFAAsF;IACtF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,KAAK,EAAE,EAAE,WAAW,+BA2DxG"}
|
|
@@ -1,14 +1,18 @@
|
|
|
1
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import * as RadixSwitch from '@radix-ui/react-switch';
|
|
3
|
+
import { useId } from 'react';
|
|
3
4
|
import { cn } from '../lib/cn.js';
|
|
5
|
+
import { TAP_TARGET } from '../lib/tapTarget.js';
|
|
4
6
|
/**
|
|
5
7
|
* On/off toggle vendored from shadcn (Radix `Switch`). The filled track turns the
|
|
6
8
|
* solid accent when checked; a visible `--ring` focus ring appears on keyboard
|
|
7
9
|
* focus. Use `checked` + `onCheckedChange` (RHF wires this via `<Controller>` — not
|
|
8
10
|
* `register()`, since the callback is a boolean, not a native change event).
|
|
9
11
|
*/
|
|
10
|
-
export function Switch({ className, ...props }) {
|
|
11
|
-
|
|
12
|
+
export function Switch({ className, label, labelClassName, showState, id: idProp, ...props }) {
|
|
13
|
+
const reactId = useId();
|
|
14
|
+
const id = idProp ?? reactId;
|
|
15
|
+
const root = (_jsx(RadixSwitch.Root, { id: label == null && showState !== true ? idProp : id, className: cn('peer relative inline-flex h-6 w-10 shrink-0 cursor-pointer items-center rounded-full border border-transparent p-0.5 transition-colors', 'data-[state=checked]:bg-accent-solid data-[state=unchecked]:bg-muted', 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background', 'disabled:cursor-not-allowed disabled:opacity-50',
|
|
12
16
|
// The visual track stays a compact 40×24 on fine-pointer (mouse) surfaces —
|
|
13
17
|
// a 44px track would look oversized next to text labels there. On coarse
|
|
14
18
|
// (touch) pointers the track itself grows to a real ≥44px box instead of an
|
|
@@ -18,5 +22,8 @@ export function Switch({ className, ...props }) {
|
|
|
18
22
|
// kept failing orch-host's task-sources mobile scan (owner teardown,
|
|
19
23
|
// 2026-07-17 — the "cc"/"co"/etc. processing toggles all measured 40×24).
|
|
20
24
|
'pointer-coarse:h-11 pointer-coarse:w-[4.5rem]', className), ...props, children: _jsx(RadixSwitch.Thumb, { className: cn('pointer-events-none block size-5 rounded-full bg-white shadow transition-transform', 'data-[state=checked]:translate-x-4 data-[state=unchecked]:translate-x-0', 'pointer-coarse:size-9 pointer-coarse:data-[state=checked]:translate-x-8') }) }));
|
|
25
|
+
if (label == null && showState !== true)
|
|
26
|
+
return root;
|
|
27
|
+
return (_jsxs("label", { htmlFor: id, "data-cb-tap-target": '', className: cn('flex w-full cursor-pointer items-center justify-between gap-3 py-1.5', props.disabled && 'cursor-not-allowed', TAP_TARGET), children: [label == null ? null : (_jsx("span", { className: cn('min-w-0 text-sm text-foreground', labelClassName), children: label })), _jsxs("span", { className: 'flex shrink-0 items-center gap-2', children: [showState ? (_jsx("span", { className: 'w-7 text-xs text-muted-foreground', children: props.checked ? 'On' : 'Off' })) : null, root] })] }));
|
|
21
28
|
}
|
|
22
29
|
//# sourceMappingURL=Switch.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Switch.js","sourceRoot":"","sources":["../../../src/react/components/Switch.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,WAAW,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"Switch.js","sourceRoot":"","sources":["../../../src/react/components/Switch.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,WAAW,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAiD,KAAK,EAAE,MAAM,OAAO,CAAC;AAC7E,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAmBjD;;;;;GAKG;AACH,MAAM,UAAU,MAAM,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,KAAK,EAAe;IACvG,MAAM,OAAO,GAAG,KAAK,EAAE,CAAC;IACxB,MAAM,EAAE,GAAG,MAAM,IAAI,OAAO,CAAC;IAC7B,MAAM,IAAI,GAAG,CACX,KAAC,WAAW,CAAC,IAAI,IACf,EAAE,EAAE,KAAK,IAAI,IAAI,IAAI,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EACrD,SAAS,EAAE,EAAE,CACX,wIAAwI,EACxI,sEAAsE,EACtE,0IAA0I,EAC1I,iDAAiD;QACjD,4EAA4E;QAC5E,yEAAyE;QACzE,4EAA4E;QAC5E,8EAA8E;QAC9E,0EAA0E;QAC1E,4EAA4E;QAC5E,qEAAqE;QACrE,0EAA0E;QAC1E,+CAA+C,EAC/C,SAAS,CACV,KACG,KAAK,YAET,KAAC,WAAW,CAAC,KAAK,IAChB,SAAS,EAAE,EAAE,CACX,oFAAoF,EACpF,yEAAyE,EACzE,yEAAyE,CAC1E,GACD,GACe,CACpB,CAAC;IACF,IAAI,KAAK,IAAI,IAAI,IAAI,SAAS,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACrD,OAAO,CAGL,iBACE,OAAO,EAAE,EAAE,wBACQ,EAAE,EACrB,SAAS,EAAE,EAAE,CACX,sEAAsE,EACtE,KAAK,CAAC,QAAQ,IAAI,oBAAoB,EACtC,UAAU,CACX,aAEA,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CACtB,eAAM,SAAS,EAAE,EAAE,CAAC,iCAAiC,EAAE,cAAc,CAAC,YAAG,KAAK,GAAQ,CACvF,EACD,gBAAM,SAAS,EAAC,kCAAkC,aAC/C,SAAS,CAAC,CAAC,CAAC,CACX,eAAM,SAAS,EAAC,mCAAmC,YAChD,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,GACxB,CACR,CAAC,CAAC,CAAC,IAAI,EACP,IAAI,IACA,IACD,CACT,CAAC;AACJ,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { type ComponentType, type ReactNode } from 'react';
|
|
2
|
+
export { TooltipDelay } from '../lib/hoverIntent.js';
|
|
2
3
|
export type TooltipPlacement = 'top' | 'right' | 'bottom' | 'left';
|
|
3
4
|
/** Touch-device behavior (hover doesn't exist there). No effect on hover devices.
|
|
4
5
|
* `icon` = a tappable ⓘ disclosure beside the trigger; `tap` = tap the trigger to
|
|
@@ -78,5 +79,4 @@ export declare function preloadTooltip(): Promise<TooltipImplComponent>;
|
|
|
78
79
|
* rather than on the next twitch of the mouse.
|
|
79
80
|
*/
|
|
80
81
|
export declare function Tooltip(props: TooltipProps): import("react").JSX.Element;
|
|
81
|
-
export {};
|
|
82
82
|
//# sourceMappingURL=Tooltip.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Tooltip.d.ts","sourceRoot":"","sources":["../../../src/react/components/Tooltip.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,aAAa,EAGlB,KAAK,SAAS,EAIf,MAAM,OAAO,CAAC;AAGf,MAAM,MAAM,gBAAgB,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;AACnE;;2CAE2C;AAC3C,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,CAAC;AAEnD;qEACqE;AACrE,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC;IAC1B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,SAAS,CAAC;IACpB,OAAO,EAAE,SAAS,CAAC;IACnB,sEAAsE;IACtE,IAAI,CAAC,EAAE,gBAAgB,CAAC;IACxB,6DAA6D;IAC7D,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,6EAA6E;IAC7E,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3B;;;+EAG2E;IAC3E,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,2EAA2E;IAC3E,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,0EAA0E;IAC1E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,KAAK,oBAAoB,GAAG,aAAa,CAAC,YAAY,GAAG;IAAE,GAAG,CAAC,EAAE,UAAU,GAAG,IAAI,CAAA;CAAE,CAAC,CAAC;AAoHtF;;;;GAIG;AACH,wBAAgB,cAAc,IAAI,OAAO,CAAC,oBAAoB,CAAC,CAQ9D;AAeD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,YAAY,+
|
|
1
|
+
{"version":3,"file":"Tooltip.d.ts","sourceRoot":"","sources":["../../../src/react/components/Tooltip.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,aAAa,EAGlB,KAAK,SAAS,EAIf,MAAM,OAAO,CAAC;AAGf,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,MAAM,MAAM,gBAAgB,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;AACnE;;2CAE2C;AAC3C,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,CAAC;AAEnD;qEACqE;AACrE,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC;IAC1B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,SAAS,CAAC;IACpB,OAAO,EAAE,SAAS,CAAC;IACnB,sEAAsE;IACtE,IAAI,CAAC,EAAE,gBAAgB,CAAC;IACxB,6DAA6D;IAC7D,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,6EAA6E;IAC7E,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3B;;;+EAG2E;IAC3E,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,2EAA2E;IAC3E,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,0EAA0E;IAC1E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,KAAK,oBAAoB,GAAG,aAAa,CAAC,YAAY,GAAG;IAAE,GAAG,CAAC,EAAE,UAAU,GAAG,IAAI,CAAA;CAAE,CAAC,CAAC;AAoHtF;;;;GAIG;AACH,wBAAgB,cAAc,IAAI,OAAO,CAAC,oBAAoB,CAAC,CAQ9D;AAeD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,YAAY,+BAsF1C"}
|