@zvk/ui 0.1.5 → 0.1.6
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 +41 -0
- package/README.md +5 -5
- package/dist/components/accordion/accordion.js +4 -4
- package/dist/components/alert/alert.d.ts +5 -0
- package/dist/components/alert/alert.js +8 -4
- package/dist/components/alert/index.d.ts +1 -1
- package/dist/components/alert-dialog/alert-dialog.js +9 -9
- package/dist/components/avatar/avatar.js +1 -1
- package/dist/components/badge/badge.js +1 -1
- package/dist/components/breadcrumbs/breadcrumbs.js +3 -3
- package/dist/components/button/button.js +46 -2
- package/dist/components/calendar/calendar.js +3 -3
- package/dist/components/card/card.d.ts +5 -0
- package/dist/components/card/card.js +11 -7
- package/dist/components/card/index.d.ts +1 -1
- package/dist/components/carousel/carousel.js +7 -7
- package/dist/components/checkbox/checkbox.js +4 -4
- package/dist/components/code-block/code-block.js +2 -2
- package/dist/components/collapsible/collapsible.js +4 -4
- package/dist/components/combobox/combobox.js +6 -5
- package/dist/components/command/command-filter.d.ts +0 -1
- package/dist/components/command/command-filter.js +0 -3
- package/dist/components/command/command.js +9 -9
- package/dist/components/context-menu/context-menu.js +10 -10
- package/dist/components/conversation/conversation.js +11 -11
- package/dist/components/copy-button/copy-button.js +2 -2
- package/dist/components/date-picker/date-picker.js +1 -1
- package/dist/components/dialog/dialog.js +11 -11
- package/dist/components/dropdown-menu/dropdown-menu.d.ts +1 -1
- package/dist/components/dropdown-menu/dropdown-menu.js +20 -16
- package/dist/components/empty-state/empty-state.js +1 -1
- package/dist/components/error-boundary/error-boundary.js +1 -1
- package/dist/components/field/field.js +4 -4
- package/dist/components/file-upload-input/file-upload-input.js +2 -2
- package/dist/components/form/form.js +6 -6
- package/dist/components/hover-card/hover-card.d.ts +1 -1
- package/dist/components/hover-card/hover-card.js +7 -4
- package/dist/components/icon-button/icon-button.js +19 -1
- package/dist/components/index.d.ts +3 -3
- package/dist/components/input/input.js +1 -1
- package/dist/components/label/label.js +1 -1
- package/dist/components/menubar/menubar.js +12 -12
- package/dist/components/pagination/pagination.js +12 -12
- package/dist/components/popover/popover.d.ts +1 -1
- package/dist/components/popover/popover.js +30 -7
- package/dist/components/progress/progress.js +3 -3
- package/dist/components/radio-group/radio-group.js +3 -3
- package/dist/components/responsive-container/responsive-container.js +1 -1
- package/dist/components/scroll-area/scroll-area.js +4 -4
- package/dist/components/sectioned-sidebar-nav/sectioned-sidebar-nav.js +7 -7
- package/dist/components/select/select.js +66 -13
- package/dist/components/separator/separator.js +1 -1
- package/dist/components/sheet/sheet.js +12 -12
- package/dist/components/sidebar-shell/sidebar-shell.js +6 -6
- package/dist/components/skeleton/skeleton.js +1 -1
- package/dist/components/slider/slider.js +1 -1
- package/dist/components/spinner/spinner.js +1 -1
- package/dist/components/stat/stat.js +1 -1
- package/dist/components/switch/switch.js +3 -3
- package/dist/components/table/index.d.ts +1 -1
- package/dist/components/table/table.d.ts +5 -0
- package/dist/components/table/table.js +12 -8
- package/dist/components/tabs/tabs.js +4 -4
- package/dist/components/tabs-with-sidebar/tabs-with-sidebar.js +3 -3
- package/dist/components/textarea/textarea.js +1 -1
- package/dist/components/toast/toast.js +8 -8
- package/dist/components/toggle/toggle.js +1 -1
- package/dist/components/toggle-group/toggle-group.js +1 -1
- package/dist/components/tooltip/tooltip.d.ts +1 -1
- package/dist/components/tooltip/tooltip.js +6 -3
- package/dist/hooks/index.d.ts +2 -2
- package/dist/hooks/use-composed-refs.d.ts +2 -2
- package/dist/hooks/use-controllable-state.d.ts +2 -2
- package/dist/internal/floating/compute-position.js +13 -8
- package/dist/internal/floating/floating-types.d.ts +1 -0
- package/dist/internal/floating/index.d.ts +1 -0
- package/dist/internal/floating/use-floating-position.js +6 -4
- package/dist/internal/overlay-stack/overlay-stack.js +4 -1
- package/dist/styles.css +2066 -2022
- package/dist/tokens/index.d.ts +2 -2
- package/dist/tokens/index.js +1 -1
- package/dist/tokens/token-types.d.ts +5 -5
- package/dist/tokens/tokens.d.ts +16 -10
- package/dist/tokens/tokens.js +16 -10
- package/dist/utils/cn.d.ts +2 -2
- package/dist/utils/index.d.ts +1 -1
- package/package.json +12 -11
|
@@ -9,6 +9,7 @@ import { composeEventHandlers } from "../../utils/compose-event-handlers.js";
|
|
|
9
9
|
import { cn } from "../../utils/cn.js";
|
|
10
10
|
const defaultContentPositioning = {
|
|
11
11
|
sideOffset: 8,
|
|
12
|
+
alignOffset: 0,
|
|
12
13
|
collisionPadding: 0
|
|
13
14
|
};
|
|
14
15
|
const TooltipProviderContext = React.createContext({
|
|
@@ -62,6 +63,7 @@ function TooltipRoot({ children, defaultOpen = false, delay, disabled = false, o
|
|
|
62
63
|
open,
|
|
63
64
|
placement: contentPositioning.placement ?? placement,
|
|
64
65
|
offset: contentPositioning.sideOffset,
|
|
66
|
+
alignmentOffset: contentPositioning.alignOffset,
|
|
65
67
|
collisionPadding: contentPositioning.collisionPadding,
|
|
66
68
|
flip: true,
|
|
67
69
|
shift: true
|
|
@@ -165,22 +167,23 @@ function TooltipTrigger({ children, asChild: _asChild = false }) {
|
|
|
165
167
|
}, { checkDefaultPrevented: false })
|
|
166
168
|
});
|
|
167
169
|
}
|
|
168
|
-
function TooltipContent({ align, alignOffset
|
|
170
|
+
function TooltipContent({ align, alignOffset = defaultContentPositioning.alignOffset, children, className, collisionPadding = defaultContentPositioning.collisionPadding, container, forceMount = false, placement, ref, side, sideOffset = defaultContentPositioning.sideOffset, style, ...props }) {
|
|
169
171
|
const context = useTooltipRootContext("Tooltip.Content");
|
|
170
172
|
React.useEffect(() => {
|
|
171
173
|
const resolvedPlacement = side === undefined ? placement : placementFromSideAlign(side, align, placement ?? "bottom");
|
|
172
174
|
context.setContentPositioning({
|
|
173
175
|
...(resolvedPlacement === undefined ? {} : { placement: resolvedPlacement }),
|
|
174
176
|
sideOffset,
|
|
177
|
+
alignOffset,
|
|
175
178
|
collisionPadding
|
|
176
179
|
});
|
|
177
180
|
return () => context.setContentPositioning(defaultContentPositioning);
|
|
178
|
-
}, [align, collisionPadding, context, placement, side, sideOffset]);
|
|
181
|
+
}, [align, alignOffset, collisionPadding, context, placement, side, sideOffset]);
|
|
179
182
|
if (!context.open && !forceMount) {
|
|
180
183
|
return null;
|
|
181
184
|
}
|
|
182
185
|
const placementParts = getPlacementParts(context.resolvedPlacement);
|
|
183
|
-
const content = (_jsx("span", { ...props, ref: composeRefs(ref, context.floatingRef), id: context.contentId, className: cn("
|
|
186
|
+
const content = (_jsx("span", { ...props, ref: composeRefs(ref, context.floatingRef), id: context.contentId, className: cn("zvk-ui-tooltip", className), "data-align": placementParts.align, "data-side": placementParts.side, hidden: context.open ? undefined : true, role: "tooltip", style: { ...context.floatingStyle, ...style }, children: children }));
|
|
184
187
|
return (_jsx(Portal, { ...(container === undefined ? {} : { container }), children: content }));
|
|
185
188
|
}
|
|
186
189
|
function TooltipWrapper({ children, content, delay = 0, disabled = false, placement = "bottom" }) {
|
package/dist/hooks/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export { useComposedRefs } from "./use-composed-refs.js";
|
|
2
|
-
export type {
|
|
2
|
+
export type { ZvkUiPossibleRef } from "./use-composed-refs.js";
|
|
3
3
|
export { useControllableState } from "./use-controllable-state.js";
|
|
4
|
-
export type {
|
|
4
|
+
export type { ZvkUiSetStateAction, UseControllableStateOptions } from "./use-controllable-state.js";
|
|
5
5
|
export { useDisclosure } from "./use-disclosure.js";
|
|
6
6
|
export type { UseDisclosureOptions, UseDisclosureReturn } from "./use-disclosure.js";
|
|
7
7
|
export { useEvent } from "./use-event.js";
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
|
-
export type
|
|
3
|
-
export declare function useComposedRefs<Value>(...refs:
|
|
2
|
+
export type ZvkUiPossibleRef<Value> = React.Ref<Value> | undefined;
|
|
3
|
+
export declare function useComposedRefs<Value>(...refs: ZvkUiPossibleRef<Value>[]): React.RefCallback<Value>;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
export type
|
|
1
|
+
export type ZvkUiSetStateAction<Value> = Value | ((previous: Value) => Value);
|
|
2
2
|
export interface UseControllableStateOptions<Value> {
|
|
3
3
|
value?: Value;
|
|
4
4
|
defaultValue: Value;
|
|
5
5
|
onChange?: (value: Value) => void;
|
|
6
6
|
}
|
|
7
|
-
export declare function useControllableState<Value>({ value, defaultValue, onChange }: UseControllableStateOptions<Value>): readonly [Value, (next:
|
|
7
|
+
export declare function useControllableState<Value>({ value, defaultValue, onChange }: UseControllableStateOptions<Value>): readonly [Value, (next: ZvkUiSetStateAction<Value>) => void];
|
|
@@ -3,7 +3,10 @@ import { detectOverflow } from "./detect-overflow.js";
|
|
|
3
3
|
function getCenteredOffset(referenceSize, floatingSize) {
|
|
4
4
|
return (referenceSize - floatingSize) / 2;
|
|
5
5
|
}
|
|
6
|
-
function
|
|
6
|
+
function applyAlignmentOffset(value, align, offset) {
|
|
7
|
+
return align === "end" ? value - offset : value + offset;
|
|
8
|
+
}
|
|
9
|
+
function getPlacementCoords(placement, reference, floating, offset, alignmentOffset) {
|
|
7
10
|
const { side, align } = parsePlacement(placement);
|
|
8
11
|
if (side === "top" || side === "bottom") {
|
|
9
12
|
const baseY = side === "top" ? reference.y - floating.height - offset : reference.y + reference.height + offset;
|
|
@@ -17,6 +20,7 @@ function getPlacementCoords(placement, reference, floating, offset) {
|
|
|
17
20
|
else {
|
|
18
21
|
x = reference.x + getCenteredOffset(reference.width, floating.width);
|
|
19
22
|
}
|
|
23
|
+
x = applyAlignmentOffset(x, align, alignmentOffset);
|
|
20
24
|
return { x, y: baseY };
|
|
21
25
|
}
|
|
22
26
|
const baseX = side === "left" ? reference.x - floating.width - offset : reference.x + reference.width + offset;
|
|
@@ -30,10 +34,11 @@ function getPlacementCoords(placement, reference, floating, offset) {
|
|
|
30
34
|
else {
|
|
31
35
|
y = reference.y + getCenteredOffset(reference.height, floating.height);
|
|
32
36
|
}
|
|
37
|
+
y = applyAlignmentOffset(y, align, alignmentOffset);
|
|
33
38
|
return { x: baseX, y };
|
|
34
39
|
}
|
|
35
|
-
function getOverflowForPlacement(placement, reference, floating, boundary, offset, collisionPadding) {
|
|
36
|
-
const { x, y } = getPlacementCoords(placement, reference, floating, offset);
|
|
40
|
+
function getOverflowForPlacement(placement, reference, floating, boundary, offset, alignmentOffset, collisionPadding) {
|
|
41
|
+
const { x, y } = getPlacementCoords(placement, reference, floating, offset, alignmentOffset);
|
|
37
42
|
return detectOverflow({
|
|
38
43
|
boundary,
|
|
39
44
|
collisionPadding,
|
|
@@ -46,22 +51,22 @@ function getOverflowForPlacement(placement, reference, floating, boundary, offse
|
|
|
46
51
|
});
|
|
47
52
|
}
|
|
48
53
|
export function computeFloatingPosition(options) {
|
|
49
|
-
const { reference, floating, boundary, placement: rawPlacement = "bottom", strategy = "absolute", offset = 0, collisionPadding = 0, matchReferenceWidth = false, maxHeight, flip = true, shift = true } = options;
|
|
54
|
+
const { reference, floating, boundary, placement: rawPlacement = "bottom", strategy = "absolute", offset = 0, alignmentOffset = 0, collisionPadding = 0, matchReferenceWidth = false, maxHeight, flip = true, shift = true } = options;
|
|
50
55
|
const parsed = parsePlacement(rawPlacement);
|
|
51
56
|
const defaultPlacement = buildPlacement(parsed.side, parsed.align);
|
|
52
57
|
let currentPlacement = defaultPlacement;
|
|
53
|
-
let basePlacement = getPlacementCoords(currentPlacement, reference, floating, offset);
|
|
58
|
+
let basePlacement = getPlacementCoords(currentPlacement, reference, floating, offset, alignmentOffset);
|
|
54
59
|
if (flip) {
|
|
55
|
-
const overflow = getOverflowForPlacement(currentPlacement, reference, floating, boundary, offset, collisionPadding);
|
|
60
|
+
const overflow = getOverflowForPlacement(currentPlacement, reference, floating, boundary, offset, alignmentOffset, collisionPadding);
|
|
56
61
|
const { side: currentSide } = parsePlacement(currentPlacement);
|
|
57
62
|
const overflowSide = overflow[currentSide];
|
|
58
63
|
if (overflowSide > 0) {
|
|
59
64
|
const oppositeSide = getOppositeSide(currentSide);
|
|
60
65
|
const oppositePlacement = buildPlacement(oppositeSide, parsed.align);
|
|
61
|
-
const oppositeOverflow = getOverflowForPlacement(oppositePlacement, reference, floating, boundary, offset, collisionPadding);
|
|
66
|
+
const oppositeOverflow = getOverflowForPlacement(oppositePlacement, reference, floating, boundary, offset, alignmentOffset, collisionPadding);
|
|
62
67
|
if (oppositeOverflow[oppositeSide] < overflowSide) {
|
|
63
68
|
currentPlacement = oppositePlacement;
|
|
64
|
-
basePlacement = getPlacementCoords(currentPlacement, reference, floating, offset);
|
|
69
|
+
basePlacement = getPlacementCoords(currentPlacement, reference, floating, offset, alignmentOffset);
|
|
65
70
|
}
|
|
66
71
|
}
|
|
67
72
|
}
|
|
@@ -6,6 +6,7 @@ export type UseFloatingPositionOptions = {
|
|
|
6
6
|
placement?: import("./floating-types.js").FloatingPlacement;
|
|
7
7
|
strategy?: import("./floating-types.js").FloatingStrategy;
|
|
8
8
|
offset?: number;
|
|
9
|
+
alignmentOffset?: number;
|
|
9
10
|
collisionPadding?: number;
|
|
10
11
|
matchReferenceWidth?: boolean;
|
|
11
12
|
maxHeight?: number;
|
|
@@ -3,7 +3,7 @@ import * as React from "react";
|
|
|
3
3
|
import { computeFloatingPosition } from "./compute-position.js";
|
|
4
4
|
import { autoUpdateFloating } from "./auto-update.js";
|
|
5
5
|
export function useFloatingPosition(options) {
|
|
6
|
-
const { open, placement = "bottom", strategy = "absolute", offset = 0, collisionPadding = 0, matchReferenceWidth = false, maxHeight, flip = true, shift = true, boundary } = options;
|
|
6
|
+
const { open, placement = "bottom", strategy = "absolute", offset = 0, alignmentOffset = 0, collisionPadding = 0, matchReferenceWidth = false, maxHeight, flip = true, shift = true, boundary } = options;
|
|
7
7
|
const [referenceEl, setReferenceEl] = React.useState(null);
|
|
8
8
|
const [floatingEl, setFloatingEl] = React.useState(null);
|
|
9
9
|
const [style, setStyle] = React.useState({
|
|
@@ -62,6 +62,7 @@ export function useFloatingPosition(options) {
|
|
|
62
62
|
placement: placement,
|
|
63
63
|
strategy: strategy,
|
|
64
64
|
offset,
|
|
65
|
+
alignmentOffset,
|
|
65
66
|
collisionPadding,
|
|
66
67
|
matchReferenceWidth,
|
|
67
68
|
...(maxHeight === undefined ? {} : { maxHeight }),
|
|
@@ -73,9 +74,9 @@ export function useFloatingPosition(options) {
|
|
|
73
74
|
left: `${computed.x}px`,
|
|
74
75
|
top: `${computed.y}px`,
|
|
75
76
|
width: matchReferenceWidth ? `${referenceEl?.offsetWidth ?? computed.referenceWidth}px` : "auto",
|
|
76
|
-
"--
|
|
77
|
-
"--
|
|
78
|
-
"--
|
|
77
|
+
"--zvk-ui-floating-reference-width": `${computed.referenceWidth}px`,
|
|
78
|
+
"--zvk-ui-floating-available-width": `${computed.availableWidth}px`,
|
|
79
|
+
"--zvk-ui-floating-available-height": `${computed.availableHeight}px`
|
|
79
80
|
});
|
|
80
81
|
setResolvedPlacement(computed.placement);
|
|
81
82
|
}, [
|
|
@@ -83,6 +84,7 @@ export function useFloatingPosition(options) {
|
|
|
83
84
|
placement,
|
|
84
85
|
strategy,
|
|
85
86
|
offset,
|
|
87
|
+
alignmentOffset,
|
|
86
88
|
collisionPadding,
|
|
87
89
|
matchReferenceWidth,
|
|
88
90
|
maxHeight,
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
const overlayStack = [];
|
|
2
|
+
let nextOverlayId = 1;
|
|
2
3
|
export function pushOverlay(node) {
|
|
3
|
-
const id = `
|
|
4
|
+
const id = `zvk-ui-overlay-${nextOverlayId}`;
|
|
5
|
+
nextOverlayId += 1;
|
|
4
6
|
overlayStack.push({ id, node });
|
|
5
7
|
return id;
|
|
6
8
|
}
|
|
@@ -35,6 +37,7 @@ export function isInOverlayStack(node) {
|
|
|
35
37
|
}
|
|
36
38
|
export function resetOverlayStackForTests() {
|
|
37
39
|
overlayStack.length = 0;
|
|
40
|
+
nextOverlayId = 1;
|
|
38
41
|
}
|
|
39
42
|
export function getOverlayStackLength() {
|
|
40
43
|
return overlayStack.length;
|