@sixthshift/design-system 0.6.0 → 0.7.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/components/Badge/Badge.d.ts +10 -2
- package/dist/components/Badge/Badge.d.ts.map +1 -1
- package/dist/components/Badge/Badge.js +6 -4
- package/dist/components/Badge/Badge.js.map +1 -1
- package/dist/components/Button/Button.d.ts +25 -2
- package/dist/components/Button/Button.d.ts.map +1 -1
- package/dist/components/Button/Button.js +13 -4
- package/dist/components/Button/Button.js.map +1 -1
- package/dist/components/DatePicker/DatePicker.d.ts.map +1 -1
- package/dist/components/DatePicker/DatePicker.js +2 -1
- package/dist/components/DatePicker/DatePicker.js.map +1 -1
- package/dist/components/DateTimePicker/DateTimePicker.d.ts.map +1 -1
- package/dist/components/DateTimePicker/DateTimePicker.js +2 -1
- package/dist/components/DateTimePicker/DateTimePicker.js.map +1 -1
- package/dist/components/DateTimeRangePicker/DateTimeRangePicker.d.ts.map +1 -1
- package/dist/components/DateTimeRangePicker/DateTimeRangePicker.js +2 -1
- package/dist/components/DateTimeRangePicker/DateTimeRangePicker.js.map +1 -1
- package/dist/components/HoverCard/HoverCard.d.ts.map +1 -1
- package/dist/components/HoverCard/HoverCard.js +3 -0
- package/dist/components/HoverCard/HoverCard.js.map +1 -1
- package/dist/components/HoverCard/components/HoverCardContent.d.ts +16 -2
- package/dist/components/HoverCard/components/HoverCardContent.d.ts.map +1 -1
- package/dist/components/HoverCard/components/HoverCardContent.js +3 -3
- package/dist/components/HoverCard/components/HoverCardContent.js.map +1 -1
- package/dist/components/HoverCard/components/HoverCardContext.d.ts +2 -0
- package/dist/components/HoverCard/components/HoverCardContext.d.ts.map +1 -1
- package/dist/components/HoverCard/components/HoverCardContext.js.map +1 -1
- package/dist/components/Message/Message.d.ts +4 -0
- package/dist/components/Message/Message.d.ts.map +1 -1
- package/dist/components/Message/Message.js +2 -2
- package/dist/components/Message/Message.js.map +1 -1
- package/dist/components/Modal/Modal.d.ts +12 -0
- package/dist/components/Modal/Modal.d.ts.map +1 -1
- package/dist/components/Modal/Modal.js +5 -2
- package/dist/components/Modal/Modal.js.map +1 -1
- package/dist/components/Popover/Popover.d.ts +3 -1
- package/dist/components/Popover/Popover.d.ts.map +1 -1
- package/dist/components/Popover/Popover.js +3 -0
- package/dist/components/Popover/Popover.js.map +1 -1
- package/dist/components/Popover/components/PopoverBody.d.ts +16 -2
- package/dist/components/Popover/components/PopoverBody.d.ts.map +1 -1
- package/dist/components/Popover/components/PopoverBody.js +3 -3
- package/dist/components/Popover/components/PopoverBody.js.map +1 -1
- package/dist/components/Popover/components/PopoverContext.d.ts +2 -0
- package/dist/components/Popover/components/PopoverContext.d.ts.map +1 -1
- package/dist/components/Popover/components/PopoverContext.js.map +1 -1
- package/dist/components/Select/Select.d.ts.map +1 -1
- package/dist/components/Select/Select.js +3 -2
- package/dist/components/Select/Select.js.map +1 -1
- package/dist/components/Select/SelectDropdown.d.ts +3 -1
- package/dist/components/Select/SelectDropdown.d.ts.map +1 -1
- package/dist/components/Select/SelectDropdown.js +2 -2
- package/dist/components/Select/SelectDropdown.js.map +1 -1
- package/dist/components/Sheet/Sheet.d.ts +12 -0
- package/dist/components/Sheet/Sheet.d.ts.map +1 -1
- package/dist/components/Sheet/Sheet.js +4 -2
- package/dist/components/Sheet/Sheet.js.map +1 -1
- package/dist/components/TimePicker/TimePicker.d.ts.map +1 -1
- package/dist/components/TimePicker/TimePicker.js +2 -1
- package/dist/components/TimePicker/TimePicker.js.map +1 -1
- package/dist/components/Toast/Toast.d.ts.map +1 -1
- package/dist/components/Toast/Toast.js +2 -2
- package/dist/components/Toast/Toast.js.map +1 -1
- package/dist/components/Toggle/Toggle.d.ts +4 -0
- package/dist/components/Toggle/Toggle.d.ts.map +1 -1
- package/dist/components/Toggle/Toggle.js +2 -2
- package/dist/components/Toggle/Toggle.js.map +1 -1
- package/dist/components/ToggleGroup/ToggleGroupMultiple.d.ts +1 -0
- package/dist/components/ToggleGroup/ToggleGroupMultiple.d.ts.map +1 -1
- package/dist/components/ToggleGroup/ToggleGroupMultiple.js +2 -2
- package/dist/components/ToggleGroup/ToggleGroupMultiple.js.map +1 -1
- package/dist/components/ToggleGroup/ToggleGroupSingle.d.ts +1 -0
- package/dist/components/ToggleGroup/ToggleGroupSingle.d.ts.map +1 -1
- package/dist/components/ToggleGroup/ToggleGroupSingle.js +2 -2
- package/dist/components/ToggleGroup/ToggleGroupSingle.js.map +1 -1
- package/dist/components/ToggleGroup/toggleGroup.types.d.ts +6 -0
- package/dist/components/ToggleGroup/toggleGroup.types.d.ts.map +1 -1
- package/dist/components/Tooltip/Tooltip.d.ts +3 -1
- package/dist/components/Tooltip/Tooltip.d.ts.map +1 -1
- package/dist/components/Tooltip/Tooltip.js +3 -0
- package/dist/components/Tooltip/Tooltip.js.map +1 -1
- package/dist/components/Tooltip/components/TooltipBody.d.ts +16 -2
- package/dist/components/Tooltip/components/TooltipBody.d.ts.map +1 -1
- package/dist/components/Tooltip/components/TooltipBody.js +3 -3
- package/dist/components/Tooltip/components/TooltipBody.js.map +1 -1
- package/dist/components/Tooltip/components/TooltipContext.d.ts +2 -0
- package/dist/components/Tooltip/components/TooltipContext.d.ts.map +1 -1
- package/dist/components/Tooltip/components/TooltipContext.js.map +1 -1
- package/dist/internal/brandScope.d.ts +25 -0
- package/dist/internal/brandScope.d.ts.map +1 -0
- package/dist/internal/brandScope.js +37 -0
- package/dist/internal/brandScope.js.map +1 -0
- package/package.json +1 -1
- package/src/components/Badge/Badge.tsx +10 -4
- package/src/components/Button/Button.tsx +24 -4
- package/src/components/DatePicker/DatePicker.tsx +3 -0
- package/src/components/DateTimePicker/DateTimePicker.tsx +3 -0
- package/src/components/DateTimeRangePicker/DateTimeRangePicker.tsx +3 -0
- package/src/components/HoverCard/HoverCard.tsx +3 -0
- package/src/components/HoverCard/components/HoverCardContent.tsx +11 -3
- package/src/components/HoverCard/components/HoverCardContext.tsx +2 -0
- package/src/components/Message/Message.tsx +26 -22
- package/src/components/Modal/Modal.tsx +11 -0
- package/src/components/Popover/Popover.tsx +3 -0
- package/src/components/Popover/components/PopoverBody.tsx +11 -3
- package/src/components/Popover/components/PopoverContext.tsx +2 -0
- package/src/components/Select/Select.tsx +3 -1
- package/src/components/Select/SelectDropdown.tsx +4 -0
- package/src/components/Sheet/Sheet.tsx +10 -0
- package/src/components/TimePicker/TimePicker.tsx +3 -0
- package/src/components/Toast/Toast.tsx +5 -1
- package/src/components/Toggle/Toggle.tsx +17 -2
- package/src/components/ToggleGroup/ToggleGroupMultiple.tsx +2 -1
- package/src/components/ToggleGroup/ToggleGroupSingle.tsx +2 -0
- package/src/components/ToggleGroup/toggleGroup.types.ts +6 -0
- package/src/components/Tooltip/Tooltip.tsx +3 -0
- package/src/components/Tooltip/components/TooltipBody.tsx +11 -3
- package/src/components/Tooltip/components/TooltipContext.tsx +2 -0
- package/src/internal/brandScope.ts +39 -0
|
@@ -19,6 +19,7 @@ const ToggleGroupSingle = React.forwardRef<HTMLDivElement, ToggleGroupSingleProp
|
|
|
19
19
|
orientation = "horizontal",
|
|
20
20
|
variant = "solid",
|
|
21
21
|
intent = "neutral",
|
|
22
|
+
brand,
|
|
22
23
|
size = "md",
|
|
23
24
|
iconOnly = false,
|
|
24
25
|
disabled,
|
|
@@ -76,6 +77,7 @@ const ToggleGroupSingle = React.forwardRef<HTMLDivElement, ToggleGroupSingleProp
|
|
|
76
77
|
<ToggleGroupContainer
|
|
77
78
|
ref={mergedRef}
|
|
78
79
|
role="radiogroup"
|
|
80
|
+
data-brand={brand}
|
|
79
81
|
onKeyDown={handleKeyDown}
|
|
80
82
|
appearance={appearance}
|
|
81
83
|
orientation={orientation}
|
|
@@ -33,6 +33,12 @@ export type ToggleGroupBaseProps = Omit<React.HTMLAttributes<HTMLDivElement>, "o
|
|
|
33
33
|
variant?: Exclude<ButtonVariantName, "link">;
|
|
34
34
|
/** Color intent */
|
|
35
35
|
intent?: ButtonIntentName;
|
|
36
|
+
/**
|
|
37
|
+
* Name of a brand the theme defines. Rendered once, as `data-brand` on the
|
|
38
|
+
* group element, so every item inherits it. Omitted, the group follows the
|
|
39
|
+
* nearest `data-brand` ancestor.
|
|
40
|
+
*/
|
|
41
|
+
brand?: string | undefined;
|
|
36
42
|
/** Button size (xl excluded — too large for grouped toggles) */
|
|
37
43
|
size?: Exclude<ToggleProp<"size">, "xl">;
|
|
38
44
|
/** Square every item at the current size, for icon-only options */
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import { autoUpdate, flip, offset, type Placement, shift, useDismiss, useFloating, useFocus, useHover, useInteractions, useRole } from "@floating-ui/react";
|
|
4
4
|
import { useControllableState } from "@sixthshift/design-system/hooks";
|
|
5
|
+
import { closestBrand } from "../../internal/brandScope";
|
|
5
6
|
import { TooltipBody } from "./components/TooltipBody";
|
|
6
7
|
import { TooltipContext } from "./components/TooltipContext";
|
|
7
8
|
import { TooltipTrigger } from "./components/TooltipTrigger";
|
|
@@ -55,6 +56,8 @@ const TooltipRoot = ({ open: controlledOpen, onOpenChange, placement = "top", de
|
|
|
55
56
|
setFloating: refs.setFloating,
|
|
56
57
|
},
|
|
57
58
|
floatingStyles,
|
|
59
|
+
// Read at render: `domReference` is state, so this updates once the trigger mounts.
|
|
60
|
+
inheritedBrand: closestBrand(context.elements.domReference),
|
|
58
61
|
getReferenceProps,
|
|
59
62
|
getFloatingProps,
|
|
60
63
|
};
|
|
@@ -5,10 +5,17 @@ import { cn } from "@sixthshift/design-system/utils";
|
|
|
5
5
|
import * as React from "react";
|
|
6
6
|
import { useTooltipContext } from "./TooltipContext";
|
|
7
7
|
|
|
8
|
-
export type TooltipBodyProps = React.HTMLAttributes<HTMLDivElement
|
|
8
|
+
export type TooltipBodyProps = React.HTMLAttributes<HTMLDivElement> & {
|
|
9
|
+
/**
|
|
10
|
+
* Name of a brand the theme defines, rendered as `data-brand`. Omitted, the
|
|
11
|
+
* body copies the brand scope of its trigger, which the portal would
|
|
12
|
+
* otherwise leave behind.
|
|
13
|
+
*/
|
|
14
|
+
brand?: string | undefined;
|
|
15
|
+
};
|
|
9
16
|
|
|
10
|
-
export const TooltipBody = React.forwardRef<HTMLDivElement, TooltipBodyProps>(({ className, children, ...props }, forwardedRef) => {
|
|
11
|
-
const { open, refs, floatingStyles, getFloatingProps } = useTooltipContext();
|
|
17
|
+
export const TooltipBody = React.forwardRef<HTMLDivElement, TooltipBodyProps>(({ className, brand, children, ...props }, forwardedRef) => {
|
|
18
|
+
const { open, refs, floatingStyles, inheritedBrand, getFloatingProps } = useTooltipContext();
|
|
12
19
|
|
|
13
20
|
if (!open) return null;
|
|
14
21
|
|
|
@@ -21,6 +28,7 @@ export const TooltipBody = React.forwardRef<HTMLDivElement, TooltipBodyProps>(({
|
|
|
21
28
|
else if (forwardedRef) forwardedRef.current = node;
|
|
22
29
|
}}
|
|
23
30
|
style={floatingStyles}
|
|
31
|
+
data-brand={brand ?? inheritedBrand}
|
|
24
32
|
className={cn("z-popover rounded-lg border border-border-normal bg-bg-normal px-2.5 py-1.5 text-fg-normal text-xs shadow-lg", className)}
|
|
25
33
|
{...getFloatingProps(props)}
|
|
26
34
|
>
|
|
@@ -9,6 +9,8 @@ export type TooltipContextValue = {
|
|
|
9
9
|
setFloating: (node: HTMLElement | null) => void;
|
|
10
10
|
};
|
|
11
11
|
floatingStyles: React.CSSProperties;
|
|
12
|
+
/** The trigger's brand scope, re-stamped on the portalled body. */
|
|
13
|
+
inheritedBrand: string | undefined;
|
|
12
14
|
getReferenceProps: (props?: React.HTMLProps<HTMLElement>) => Record<string, unknown>;
|
|
13
15
|
getFloatingProps: (props?: React.HTMLProps<HTMLElement>) => Record<string, unknown>;
|
|
14
16
|
};
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { useState } from "react";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* The brand an element sits in: the `data-brand` of it or its nearest
|
|
7
|
+
* ancestor, or `undefined` outside any scope.
|
|
8
|
+
*
|
|
9
|
+
* Overlays need this because a portal moves their content out from under the
|
|
10
|
+
* element that set `data-brand`, so CSS inheritance no longer carries it. The
|
|
11
|
+
* overlay reads the brand off its trigger and re-stamps it on its own element.
|
|
12
|
+
* The value is copied verbatim, unknown names included: the theme only gives
|
|
13
|
+
* listed names meaning, so an unknown one resolves exactly as it would have in
|
|
14
|
+
* place.
|
|
15
|
+
*/
|
|
16
|
+
export function closestBrand(element: Element | null | undefined): string | undefined {
|
|
17
|
+
return element?.closest?.("[data-brand]")?.getAttribute("data-brand") ?? undefined;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const focusedBrand = () => (typeof document === "undefined" ? undefined : closestBrand(document.activeElement));
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* The brand of whatever held focus when the calling overlay opened.
|
|
24
|
+
*
|
|
25
|
+
* For Modal and Sheet, which have no reference element: the thing that opened
|
|
26
|
+
* them is almost always the focused control, and it still holds focus during
|
|
27
|
+
* the render that opens them, before the focus manager moves it. Captured on
|
|
28
|
+
* each closed → open transition and kept through the close, so neither focus
|
|
29
|
+
* moving into the dialog nor the exit animation changes it. When nothing useful
|
|
30
|
+
* was focused (Safari does not focus a clicked button) this is `undefined`, and
|
|
31
|
+
* the overlay inherits from wherever its portal landed.
|
|
32
|
+
*/
|
|
33
|
+
export function useOpenerBrand(open: boolean): string | undefined {
|
|
34
|
+
const [captured, setCaptured] = useState(() => ({ open, brand: open ? focusedBrand() : undefined }));
|
|
35
|
+
// Adjusting state during render, React's pattern for deriving from a prop
|
|
36
|
+
// change: an effect would run after the focus manager has already moved focus.
|
|
37
|
+
if (captured.open !== open) setCaptured({ open, brand: open ? focusedBrand() : captured.brand });
|
|
38
|
+
return captured.brand;
|
|
39
|
+
}
|