@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.
Files changed (119) hide show
  1. package/dist/components/Badge/Badge.d.ts +10 -2
  2. package/dist/components/Badge/Badge.d.ts.map +1 -1
  3. package/dist/components/Badge/Badge.js +6 -4
  4. package/dist/components/Badge/Badge.js.map +1 -1
  5. package/dist/components/Button/Button.d.ts +25 -2
  6. package/dist/components/Button/Button.d.ts.map +1 -1
  7. package/dist/components/Button/Button.js +13 -4
  8. package/dist/components/Button/Button.js.map +1 -1
  9. package/dist/components/DatePicker/DatePicker.d.ts.map +1 -1
  10. package/dist/components/DatePicker/DatePicker.js +2 -1
  11. package/dist/components/DatePicker/DatePicker.js.map +1 -1
  12. package/dist/components/DateTimePicker/DateTimePicker.d.ts.map +1 -1
  13. package/dist/components/DateTimePicker/DateTimePicker.js +2 -1
  14. package/dist/components/DateTimePicker/DateTimePicker.js.map +1 -1
  15. package/dist/components/DateTimeRangePicker/DateTimeRangePicker.d.ts.map +1 -1
  16. package/dist/components/DateTimeRangePicker/DateTimeRangePicker.js +2 -1
  17. package/dist/components/DateTimeRangePicker/DateTimeRangePicker.js.map +1 -1
  18. package/dist/components/HoverCard/HoverCard.d.ts.map +1 -1
  19. package/dist/components/HoverCard/HoverCard.js +3 -0
  20. package/dist/components/HoverCard/HoverCard.js.map +1 -1
  21. package/dist/components/HoverCard/components/HoverCardContent.d.ts +16 -2
  22. package/dist/components/HoverCard/components/HoverCardContent.d.ts.map +1 -1
  23. package/dist/components/HoverCard/components/HoverCardContent.js +3 -3
  24. package/dist/components/HoverCard/components/HoverCardContent.js.map +1 -1
  25. package/dist/components/HoverCard/components/HoverCardContext.d.ts +2 -0
  26. package/dist/components/HoverCard/components/HoverCardContext.d.ts.map +1 -1
  27. package/dist/components/HoverCard/components/HoverCardContext.js.map +1 -1
  28. package/dist/components/Message/Message.d.ts +4 -0
  29. package/dist/components/Message/Message.d.ts.map +1 -1
  30. package/dist/components/Message/Message.js +2 -2
  31. package/dist/components/Message/Message.js.map +1 -1
  32. package/dist/components/Modal/Modal.d.ts +12 -0
  33. package/dist/components/Modal/Modal.d.ts.map +1 -1
  34. package/dist/components/Modal/Modal.js +5 -2
  35. package/dist/components/Modal/Modal.js.map +1 -1
  36. package/dist/components/Popover/Popover.d.ts +3 -1
  37. package/dist/components/Popover/Popover.d.ts.map +1 -1
  38. package/dist/components/Popover/Popover.js +3 -0
  39. package/dist/components/Popover/Popover.js.map +1 -1
  40. package/dist/components/Popover/components/PopoverBody.d.ts +16 -2
  41. package/dist/components/Popover/components/PopoverBody.d.ts.map +1 -1
  42. package/dist/components/Popover/components/PopoverBody.js +3 -3
  43. package/dist/components/Popover/components/PopoverBody.js.map +1 -1
  44. package/dist/components/Popover/components/PopoverContext.d.ts +2 -0
  45. package/dist/components/Popover/components/PopoverContext.d.ts.map +1 -1
  46. package/dist/components/Popover/components/PopoverContext.js.map +1 -1
  47. package/dist/components/Select/Select.d.ts.map +1 -1
  48. package/dist/components/Select/Select.js +3 -2
  49. package/dist/components/Select/Select.js.map +1 -1
  50. package/dist/components/Select/SelectDropdown.d.ts +3 -1
  51. package/dist/components/Select/SelectDropdown.d.ts.map +1 -1
  52. package/dist/components/Select/SelectDropdown.js +2 -2
  53. package/dist/components/Select/SelectDropdown.js.map +1 -1
  54. package/dist/components/Sheet/Sheet.d.ts +12 -0
  55. package/dist/components/Sheet/Sheet.d.ts.map +1 -1
  56. package/dist/components/Sheet/Sheet.js +4 -2
  57. package/dist/components/Sheet/Sheet.js.map +1 -1
  58. package/dist/components/TimePicker/TimePicker.d.ts.map +1 -1
  59. package/dist/components/TimePicker/TimePicker.js +2 -1
  60. package/dist/components/TimePicker/TimePicker.js.map +1 -1
  61. package/dist/components/Toast/Toast.d.ts.map +1 -1
  62. package/dist/components/Toast/Toast.js +2 -2
  63. package/dist/components/Toast/Toast.js.map +1 -1
  64. package/dist/components/Toggle/Toggle.d.ts +4 -0
  65. package/dist/components/Toggle/Toggle.d.ts.map +1 -1
  66. package/dist/components/Toggle/Toggle.js +2 -2
  67. package/dist/components/Toggle/Toggle.js.map +1 -1
  68. package/dist/components/ToggleGroup/ToggleGroupMultiple.d.ts +1 -0
  69. package/dist/components/ToggleGroup/ToggleGroupMultiple.d.ts.map +1 -1
  70. package/dist/components/ToggleGroup/ToggleGroupMultiple.js +2 -2
  71. package/dist/components/ToggleGroup/ToggleGroupMultiple.js.map +1 -1
  72. package/dist/components/ToggleGroup/ToggleGroupSingle.d.ts +1 -0
  73. package/dist/components/ToggleGroup/ToggleGroupSingle.d.ts.map +1 -1
  74. package/dist/components/ToggleGroup/ToggleGroupSingle.js +2 -2
  75. package/dist/components/ToggleGroup/ToggleGroupSingle.js.map +1 -1
  76. package/dist/components/ToggleGroup/toggleGroup.types.d.ts +6 -0
  77. package/dist/components/ToggleGroup/toggleGroup.types.d.ts.map +1 -1
  78. package/dist/components/Tooltip/Tooltip.d.ts +3 -1
  79. package/dist/components/Tooltip/Tooltip.d.ts.map +1 -1
  80. package/dist/components/Tooltip/Tooltip.js +3 -0
  81. package/dist/components/Tooltip/Tooltip.js.map +1 -1
  82. package/dist/components/Tooltip/components/TooltipBody.d.ts +16 -2
  83. package/dist/components/Tooltip/components/TooltipBody.d.ts.map +1 -1
  84. package/dist/components/Tooltip/components/TooltipBody.js +3 -3
  85. package/dist/components/Tooltip/components/TooltipBody.js.map +1 -1
  86. package/dist/components/Tooltip/components/TooltipContext.d.ts +2 -0
  87. package/dist/components/Tooltip/components/TooltipContext.d.ts.map +1 -1
  88. package/dist/components/Tooltip/components/TooltipContext.js.map +1 -1
  89. package/dist/internal/brandScope.d.ts +25 -0
  90. package/dist/internal/brandScope.d.ts.map +1 -0
  91. package/dist/internal/brandScope.js +37 -0
  92. package/dist/internal/brandScope.js.map +1 -0
  93. package/package.json +1 -1
  94. package/src/components/Badge/Badge.tsx +10 -4
  95. package/src/components/Button/Button.tsx +24 -4
  96. package/src/components/DatePicker/DatePicker.tsx +3 -0
  97. package/src/components/DateTimePicker/DateTimePicker.tsx +3 -0
  98. package/src/components/DateTimeRangePicker/DateTimeRangePicker.tsx +3 -0
  99. package/src/components/HoverCard/HoverCard.tsx +3 -0
  100. package/src/components/HoverCard/components/HoverCardContent.tsx +11 -3
  101. package/src/components/HoverCard/components/HoverCardContext.tsx +2 -0
  102. package/src/components/Message/Message.tsx +26 -22
  103. package/src/components/Modal/Modal.tsx +11 -0
  104. package/src/components/Popover/Popover.tsx +3 -0
  105. package/src/components/Popover/components/PopoverBody.tsx +11 -3
  106. package/src/components/Popover/components/PopoverContext.tsx +2 -0
  107. package/src/components/Select/Select.tsx +3 -1
  108. package/src/components/Select/SelectDropdown.tsx +4 -0
  109. package/src/components/Sheet/Sheet.tsx +10 -0
  110. package/src/components/TimePicker/TimePicker.tsx +3 -0
  111. package/src/components/Toast/Toast.tsx +5 -1
  112. package/src/components/Toggle/Toggle.tsx +17 -2
  113. package/src/components/ToggleGroup/ToggleGroupMultiple.tsx +2 -1
  114. package/src/components/ToggleGroup/ToggleGroupSingle.tsx +2 -0
  115. package/src/components/ToggleGroup/toggleGroup.types.ts +6 -0
  116. package/src/components/Tooltip/Tooltip.tsx +3 -0
  117. package/src/components/Tooltip/components/TooltipBody.tsx +11 -3
  118. package/src/components/Tooltip/components/TooltipContext.tsx +2 -0
  119. 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
+ }