@columenlabs/lumen-ui 0.1.279 → 0.1.280
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/ui/tooltip.d.ts +8 -3
- package/dist/ui/tooltip.js +40 -4
- package/package.json +2 -2
package/dist/ui/tooltip.d.ts
CHANGED
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
import { Tooltip as TooltipPrimitive } from 'radix-ui';
|
|
2
|
-
import
|
|
2
|
+
import * as React from 'react';
|
|
3
3
|
declare function TooltipProvider({ delayDuration, ...props }: React.ComponentProps<typeof TooltipPrimitive.Provider>): React.JSX.Element;
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
/**
|
|
5
|
+
* A tooltip. A touch screen has no hover, so a tap on a trigger that does nothing else (a value, a
|
|
6
|
+
* name, a chip: not a button, link or field) opens it, and a tap anywhere else closes it. That way
|
|
7
|
+
* every hover detail (a table cell's tokens, a chart point's note) reaches a phone too.
|
|
8
|
+
*/
|
|
9
|
+
declare function Tooltip({ open: openProp, defaultOpen, onOpenChange, ...props }: React.ComponentProps<typeof TooltipPrimitive.Root>): React.JSX.Element;
|
|
10
|
+
declare function TooltipTrigger({ onPointerDown, onClick, ...props }: React.ComponentProps<typeof TooltipPrimitive.Trigger>): React.JSX.Element;
|
|
6
11
|
declare function TooltipContent({ className, sideOffset, children, ...props }: React.ComponentProps<typeof TooltipPrimitive.Content>): React.JSX.Element;
|
|
7
12
|
export { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger };
|
package/dist/ui/tooltip.js
CHANGED
|
@@ -1,14 +1,50 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { cn } from '../lib/utils.js';
|
|
3
3
|
import { Tooltip as TooltipPrimitive } from 'radix-ui';
|
|
4
|
+
import * as React from 'react';
|
|
4
5
|
function TooltipProvider({ delayDuration = 0, ...props }) {
|
|
5
6
|
return (_jsx(TooltipPrimitive.Provider, { "data-slot": "tooltip-provider", delayDuration: delayDuration, ...props }));
|
|
6
7
|
}
|
|
7
|
-
|
|
8
|
-
|
|
8
|
+
/** Opens or closes the tooltip it is inside (a tap on touch, `TooltipTrigger`). */
|
|
9
|
+
const TapContext = React.createContext(null);
|
|
10
|
+
/**
|
|
11
|
+
* A tooltip. A touch screen has no hover, so a tap on a trigger that does nothing else (a value, a
|
|
12
|
+
* name, a chip: not a button, link or field) opens it, and a tap anywhere else closes it. That way
|
|
13
|
+
* every hover detail (a table cell's tokens, a chart point's note) reaches a phone too.
|
|
14
|
+
*/
|
|
15
|
+
function Tooltip({ open: openProp, defaultOpen = false, onOpenChange, ...props }) {
|
|
16
|
+
const [own, setOwn] = React.useState(defaultOpen);
|
|
17
|
+
const open = openProp ?? own;
|
|
18
|
+
const latest = React.useRef({ open, onOpenChange });
|
|
19
|
+
latest.current = { open, onOpenChange };
|
|
20
|
+
const setOpen = React.useCallback((next) => {
|
|
21
|
+
const v = typeof next === 'function' ? next(latest.current.open) : next;
|
|
22
|
+
setOwn(v);
|
|
23
|
+
latest.current.onOpenChange?.(v);
|
|
24
|
+
}, []);
|
|
25
|
+
return (_jsx(TapContext.Provider, { value: setOpen, children: _jsx(TooltipPrimitive.Root, { "data-slot": "tooltip", open: open, onOpenChange: setOpen, ...props }) }));
|
|
9
26
|
}
|
|
10
|
-
|
|
11
|
-
|
|
27
|
+
/** A trigger that has its own action on a tap: its tooltip stays a hover (and focus) help. */
|
|
28
|
+
const ACTS = 'button, a[href], input, select, textarea, summary, [role="button"], [role="link"]';
|
|
29
|
+
function TooltipTrigger({ onPointerDown, onClick, ...props }) {
|
|
30
|
+
const setOpen = React.useContext(TapContext);
|
|
31
|
+
const touch = React.useRef(false);
|
|
32
|
+
// The trigger itself, or the element it renders (asChild), may act on a tap; then it keeps it.
|
|
33
|
+
const acts = (el) => el.matches(ACTS) || !!el.closest(ACTS);
|
|
34
|
+
return (_jsx(TooltipPrimitive.Trigger, { "data-slot": "tooltip-trigger", onPointerDown: (e) => {
|
|
35
|
+
onPointerDown?.(e);
|
|
36
|
+
touch.current = e.pointerType === 'touch' && !acts(e.currentTarget);
|
|
37
|
+
// Radix closes a tooltip on a press; a tap on touch toggles it instead (onClick).
|
|
38
|
+
if (touch.current && setOpen)
|
|
39
|
+
e.preventDefault();
|
|
40
|
+
}, onClick: (e) => {
|
|
41
|
+
onClick?.(e);
|
|
42
|
+
if (!touch.current || !setOpen)
|
|
43
|
+
return;
|
|
44
|
+
touch.current = false;
|
|
45
|
+
e.preventDefault();
|
|
46
|
+
setOpen((o) => !o);
|
|
47
|
+
}, ...props }));
|
|
12
48
|
}
|
|
13
49
|
function TooltipContent({ className, sideOffset = 0, children, ...props }) {
|
|
14
50
|
return (_jsx(TooltipPrimitive.Portal, { children: _jsxs(TooltipPrimitive.Content, { "data-slot": "tooltip-content", sideOffset: sideOffset, className: cn('data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-[state=delayed-open]:animate-in data-[state=delayed-open]:fade-in-0 data-[state=delayed-open]:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 inline-flex items-center gap-1.5 rounded-md px-3 py-1.5 text-xs has-data-[slot=kbd]:pr-1.5 **:data-[slot=kbd]:relative **:data-[slot=kbd]:isolate **:data-[slot=kbd]:z-50 **:data-[slot=kbd]:rounded-sm z-50 w-fit max-w-xs origin-(--radix-tooltip-content-transform-origin) border bg-popover text-popover-foreground shadow-md', className), ...props, children: [children, _jsx(TooltipPrimitive.Arrow, { className: "size-2.5 rotate-45 rounded-[2px] z-50 translate-y-[calc(-50%_-_2px)] border-r border-b bg-popover fill-popover" })] }) }));
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@columenlabs/lumen-ui",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.280",
|
|
4
4
|
"description": "Lumen: shared React components (frame, views, widgets, charts, drawers).",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -49,7 +49,7 @@
|
|
|
49
49
|
"@codemirror/lang-javascript": "6.2.5",
|
|
50
50
|
"@codemirror/lang-json": "6.0.2",
|
|
51
51
|
"@codemirror/lang-sql": "6.10.0",
|
|
52
|
-
"@columenlabs/lumen-ui-types": "0.1.
|
|
52
|
+
"@columenlabs/lumen-ui-types": "0.1.280",
|
|
53
53
|
"@dnd-kit/core": "6.3.1",
|
|
54
54
|
"@dnd-kit/sortable": "10.0.0",
|
|
55
55
|
"@dnd-kit/utilities": "3.2.2",
|