@graphprotocol/gds-react 0.1.2 → 0.2.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/GDSProvider.d.ts +12 -10
- package/dist/GDSProvider.d.ts.map +1 -1
- package/dist/GDSProvider.js +10 -8
- package/dist/GDSProvider.js.map +1 -1
- package/dist/components/Address.js +2 -2
- package/dist/components/Address.meta.d.ts +1 -13
- package/dist/components/Address.meta.d.ts.map +1 -1
- package/dist/components/Avatar.d.ts.map +1 -1
- package/dist/components/Avatar.js +2 -10
- package/dist/components/Avatar.js.map +1 -1
- package/dist/components/Avatar.meta.d.ts +0 -2
- package/dist/components/Avatar.meta.d.ts.map +1 -1
- package/dist/components/AvatarGroup.meta.d.ts +8 -2
- package/dist/components/AvatarGroup.meta.d.ts.map +1 -1
- package/dist/components/Breadcrumbs.meta.d.ts +2 -3
- package/dist/components/Breadcrumbs.meta.d.ts.map +1 -1
- package/dist/components/Breadcrumbs.meta.js +3 -1
- package/dist/components/Breadcrumbs.meta.js.map +1 -1
- package/dist/components/Breadcrumbs.parts.d.ts.map +1 -1
- package/dist/components/Breadcrumbs.parts.js +13 -21
- package/dist/components/Breadcrumbs.parts.js.map +1 -1
- package/dist/components/Button.d.ts.map +1 -1
- package/dist/components/Button.js +10 -9
- package/dist/components/Button.js.map +1 -1
- package/dist/components/Button.meta.d.ts +1 -4
- package/dist/components/Button.meta.d.ts.map +1 -1
- package/dist/components/ButtonGroup.d.ts.map +1 -1
- package/dist/components/ButtonGroup.js +1 -5
- package/dist/components/ButtonGroup.js.map +1 -1
- package/dist/components/ButtonGroup.meta.d.ts +1 -5
- package/dist/components/ButtonGroup.meta.d.ts.map +1 -1
- package/dist/components/ButtonGroup.meta.js +8 -0
- package/dist/components/ButtonGroup.meta.js.map +1 -1
- package/dist/components/Card.meta.d.ts +1 -2
- package/dist/components/Card.meta.d.ts.map +1 -1
- package/dist/components/Card.meta.js +1 -0
- package/dist/components/Card.meta.js.map +1 -1
- package/dist/components/Checkbox.meta.d.ts +1 -6
- package/dist/components/Checkbox.meta.d.ts.map +1 -1
- package/dist/components/Checkbox.meta.js +1 -5
- package/dist/components/Checkbox.meta.js.map +1 -1
- package/dist/components/Chip.meta.d.ts +2 -4
- package/dist/components/Chip.meta.d.ts.map +1 -1
- package/dist/components/Chip.parts.d.ts.map +1 -1
- package/dist/components/Chip.parts.js +1 -9
- package/dist/components/Chip.parts.js.map +1 -1
- package/dist/components/Cluster.meta.d.ts +8 -2
- package/dist/components/Cluster.meta.d.ts.map +1 -1
- package/dist/components/CodeBlock.d.ts +1 -1
- package/dist/components/CodeBlock.meta.d.ts +2 -4
- package/dist/components/CodeBlock.meta.d.ts.map +1 -1
- package/dist/components/CodeBlock.parts.d.ts +6 -7
- package/dist/components/CodeBlock.parts.d.ts.map +1 -1
- package/dist/components/CodeBlock.parts.js +28 -10
- package/dist/components/CodeBlock.parts.js.map +1 -1
- package/dist/components/CodeInline.js +3 -3
- package/dist/components/CodeInline.meta.d.ts +1 -1
- package/dist/components/CodeInline.meta.d.ts.map +1 -1
- package/dist/components/CopyButton.d.ts.map +1 -1
- package/dist/components/CopyButton.js +2 -4
- package/dist/components/CopyButton.js.map +1 -1
- package/dist/components/CopyButton.meta.d.ts +1 -12
- package/dist/components/CopyButton.meta.d.ts.map +1 -1
- package/dist/components/CopyButton.meta.js +1 -6
- package/dist/components/CopyButton.meta.js.map +1 -1
- package/dist/components/CurrencyInput.meta.d.ts +1 -6
- package/dist/components/CurrencyInput.meta.d.ts.map +1 -1
- package/dist/components/CurrencyInput.meta.js +1 -5
- package/dist/components/CurrencyInput.meta.js.map +1 -1
- package/dist/components/DescriptionList.meta.d.ts +2 -5
- package/dist/components/DescriptionList.meta.d.ts.map +1 -1
- package/dist/components/DescriptionList.parts.d.ts +3 -0
- package/dist/components/DescriptionList.parts.d.ts.map +1 -1
- package/dist/components/DescriptionList.parts.js +1 -0
- package/dist/components/DescriptionList.parts.js.map +1 -1
- package/dist/components/Divider.meta.d.ts +1 -3
- package/dist/components/Divider.meta.d.ts.map +1 -1
- package/dist/components/Icon.js +4 -4
- package/dist/components/Icon.js.map +1 -1
- package/dist/components/Icon.meta.d.ts +0 -2
- package/dist/components/Icon.meta.d.ts.map +1 -1
- package/dist/components/Icon.meta.js +1 -0
- package/dist/components/Icon.meta.js.map +1 -1
- package/dist/components/Input.d.ts +5 -4
- package/dist/components/Input.d.ts.map +1 -1
- package/dist/components/Input.js +1 -0
- package/dist/components/Input.js.map +1 -1
- package/dist/components/Input.meta.d.ts +1 -6
- package/dist/components/Input.meta.d.ts.map +1 -1
- package/dist/components/Input.meta.js +1 -5
- package/dist/components/Input.meta.js.map +1 -1
- package/dist/components/Keyboard.js +1 -1
- package/dist/components/Keyboard.meta.d.ts +0 -1
- package/dist/components/Keyboard.meta.d.ts.map +1 -1
- package/dist/components/Label.meta.d.ts +1 -3
- package/dist/components/Label.meta.d.ts.map +1 -1
- package/dist/components/Link.d.ts +1 -1
- package/dist/components/Link.d.ts.map +1 -1
- package/dist/components/Link.js +1 -2
- package/dist/components/Link.js.map +1 -1
- package/dist/components/Link.meta.d.ts +1 -2
- package/dist/components/Link.meta.d.ts.map +1 -1
- package/dist/components/Link.meta.js +1 -0
- package/dist/components/Link.meta.js.map +1 -1
- package/dist/components/Menu.meta.d.ts +31 -2
- package/dist/components/Menu.meta.d.ts.map +1 -1
- package/dist/components/Menu.meta.js +39 -1
- package/dist/components/Menu.meta.js.map +1 -1
- package/dist/components/Menu.parts.d.ts +23 -32
- package/dist/components/Menu.parts.d.ts.map +1 -1
- package/dist/components/Menu.parts.js +284 -303
- package/dist/components/Menu.parts.js.map +1 -1
- package/dist/components/Modal.d.ts +1 -1
- package/dist/components/Modal.meta.d.ts +1 -3
- package/dist/components/Modal.meta.d.ts.map +1 -1
- package/dist/components/Modal.meta.js +1 -1
- package/dist/components/Modal.meta.js.map +1 -1
- package/dist/components/Modal.parts.d.ts +14 -15
- package/dist/components/Modal.parts.d.ts.map +1 -1
- package/dist/components/Modal.parts.js +36 -32
- package/dist/components/Modal.parts.js.map +1 -1
- package/dist/components/OTCInput.js +1 -1
- package/dist/components/OTCInput.meta.d.ts +1 -6
- package/dist/components/OTCInput.meta.d.ts.map +1 -1
- package/dist/components/OTCInput.meta.js +1 -5
- package/dist/components/OTCInput.meta.js.map +1 -1
- package/dist/components/Radio.meta.d.ts +1 -6
- package/dist/components/Radio.meta.d.ts.map +1 -1
- package/dist/components/Radio.meta.js +1 -5
- package/dist/components/Radio.meta.js.map +1 -1
- package/dist/components/Search.meta.d.ts +1 -3
- package/dist/components/Search.meta.d.ts.map +1 -1
- package/dist/components/SegmentedControl.meta.d.ts +2 -3
- package/dist/components/SegmentedControl.meta.d.ts.map +1 -1
- package/dist/components/SegmentedControl.meta.js +3 -1
- package/dist/components/SegmentedControl.meta.js.map +1 -1
- package/dist/components/SegmentedControl.parts.d.ts.map +1 -1
- package/dist/components/SegmentedControl.parts.js +4 -9
- package/dist/components/SegmentedControl.parts.js.map +1 -1
- package/dist/components/Status.meta.d.ts +0 -2
- package/dist/components/Status.meta.d.ts.map +1 -1
- package/dist/components/Stepper.meta.d.ts +1 -2
- package/dist/components/Stepper.meta.d.ts.map +1 -1
- package/dist/components/Stepper.meta.js +1 -0
- package/dist/components/Stepper.meta.js.map +1 -1
- package/dist/components/Stepper.parts.d.ts.map +1 -1
- package/dist/components/Stepper.parts.js +1 -1
- package/dist/components/Stepper.parts.js.map +1 -1
- package/dist/components/Switch.meta.d.ts +1 -6
- package/dist/components/Switch.meta.d.ts.map +1 -1
- package/dist/components/Switch.meta.js +1 -5
- package/dist/components/Switch.meta.js.map +1 -1
- package/dist/components/TabSet.meta.d.ts +2 -5
- package/dist/components/TabSet.meta.d.ts.map +1 -1
- package/dist/components/TabSet.meta.js +3 -1
- package/dist/components/TabSet.meta.js.map +1 -1
- package/dist/components/Tag.meta.d.ts +0 -2
- package/dist/components/Tag.meta.d.ts.map +1 -1
- package/dist/components/TextArea.meta.d.ts +1 -6
- package/dist/components/TextArea.meta.d.ts.map +1 -1
- package/dist/components/TextArea.meta.js +1 -5
- package/dist/components/TextArea.meta.js.map +1 -1
- package/dist/components/ToggleButton.js +2 -2
- package/dist/components/ToggleButton.js.map +1 -1
- package/dist/components/ToggleButton.meta.d.ts +1 -12
- package/dist/components/ToggleButton.meta.d.ts.map +1 -1
- package/dist/components/ToggleButton.meta.js +1 -6
- package/dist/components/ToggleButton.meta.js.map +1 -1
- package/dist/components/Tooltip.d.ts +2 -2
- package/dist/components/Tooltip.d.ts.map +1 -1
- package/dist/components/Tooltip.js +2 -2
- package/dist/components/Tooltip.js.map +1 -1
- package/dist/components/Tooltip.meta.d.ts +12 -7
- package/dist/components/Tooltip.meta.d.ts.map +1 -1
- package/dist/components/Tooltip.meta.js +13 -2
- package/dist/components/Tooltip.meta.js.map +1 -1
- package/dist/components/Tooltip.parts.d.ts +20 -20
- package/dist/components/Tooltip.parts.d.ts.map +1 -1
- package/dist/components/Tooltip.parts.js +129 -88
- package/dist/components/Tooltip.parts.js.map +1 -1
- package/dist/components/base/Addon.meta.d.ts +1 -1
- package/dist/components/base/Addon.meta.d.ts.map +1 -1
- package/dist/components/base/Addon.meta.js +3 -1
- package/dist/components/base/Addon.meta.js.map +1 -1
- package/dist/components/base/ButtonOrLink.d.ts +1 -1
- package/dist/components/base/ButtonOrLink.parts.d.ts +6 -5
- package/dist/components/base/ButtonOrLink.parts.d.ts.map +1 -1
- package/dist/components/base/ButtonOrLink.parts.js +28 -31
- package/dist/components/base/ButtonOrLink.parts.js.map +1 -1
- package/dist/components/base/Checkable.meta.d.ts +1 -2
- package/dist/components/base/Checkable.meta.d.ts.map +1 -1
- package/dist/components/base/Checkable.parts.d.ts +6 -6
- package/dist/components/base/Checkable.parts.d.ts.map +1 -1
- package/dist/components/base/Checkable.parts.js +2 -2
- package/dist/components/base/Checkable.parts.js.map +1 -1
- package/dist/components/base/Field.meta.d.ts +1 -2
- package/dist/components/base/Field.meta.d.ts.map +1 -1
- package/dist/components/base/Field.parts.d.ts +5 -4
- package/dist/components/base/Field.parts.d.ts.map +1 -1
- package/dist/components/base/Field.parts.js +1 -1
- package/dist/components/base/Field.parts.js.map +1 -1
- package/dist/components/base/MaybeButtonOrLink.d.ts +1 -1
- package/dist/components/base/MaybeButtonOrLink.d.ts.map +1 -1
- package/dist/components/base/Portal.d.ts +1 -1
- package/dist/components/base/Portal.d.ts.map +1 -1
- package/dist/components/base/Portal.js +3 -6
- package/dist/components/base/Portal.js.map +1 -1
- package/dist/components/base/Render.d.ts +21 -6
- package/dist/components/base/Render.d.ts.map +1 -1
- package/dist/components/base/Render.js +3 -2
- package/dist/components/base/Render.js.map +1 -1
- package/dist/components/base/Transition.js +2 -2
- package/dist/components/base/Transition.meta.d.ts +1 -1
- package/dist/components/base/Transition.meta.d.ts.map +1 -1
- package/dist/components/base/Transition.meta.js +1 -0
- package/dist/components/base/Transition.meta.js.map +1 -1
- package/dist/components/base/index.d.ts +1 -2
- package/dist/components/base/index.d.ts.map +1 -1
- package/dist/components/base/index.js +1 -2
- package/dist/components/base/index.js.map +1 -1
- package/dist/components/index.d.ts +1 -1
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +1 -1
- package/dist/components/index.js.map +1 -1
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +1 -0
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/useCSSProp.d.ts.map +1 -1
- package/dist/hooks/useCSSProp.js +6 -6
- package/dist/hooks/useCSSProp.js.map +1 -1
- package/dist/hooks/useCSSProps.d.ts +11 -13
- package/dist/hooks/useCSSProps.d.ts.map +1 -1
- package/dist/hooks/useCSSProps.js +11 -19
- package/dist/hooks/useCSSProps.js.map +1 -1
- package/dist/hooks/useCSSPropsPolyfill.d.ts +1 -1
- package/dist/hooks/useCSSPropsPolyfill.d.ts.map +1 -1
- package/dist/hooks/useCSSPropsPolyfill.js +12 -20
- package/dist/hooks/useCSSPropsPolyfill.js.map +1 -1
- package/dist/hooks/useCSSState.d.ts.map +1 -1
- package/dist/hooks/useCSSState.js +7 -3
- package/dist/hooks/useCSSState.js.map +1 -1
- package/dist/hooks/useEffectWithRefDeps.d.ts +2 -2
- package/dist/hooks/useEffectWithRefDeps.d.ts.map +1 -1
- package/dist/hooks/useEffectWithRefDeps.js +1 -1
- package/dist/hooks/useEffectWithRefDeps.js.map +1 -1
- package/dist/hooks/useFirstRender.d.ts +14 -0
- package/dist/hooks/useFirstRender.d.ts.map +1 -0
- package/dist/hooks/useFirstRender.js +20 -0
- package/dist/hooks/useFirstRender.js.map +1 -0
- package/dist/hooks/useGDS.d.ts +1 -1
- package/dist/hooks/usePrevious.d.ts +6 -4
- package/dist/hooks/usePrevious.d.ts.map +1 -1
- package/dist/hooks/usePrevious.js +6 -4
- package/dist/hooks/usePrevious.js.map +1 -1
- package/dist/hooks/useRefWithInit.d.ts +2 -2
- package/dist/hooks/useRefWithInit.d.ts.map +1 -1
- package/dist/hooks/useRefWithInit.js.map +1 -1
- package/dist/hooks/useStyleObserver.d.ts +2 -2
- package/dist/hooks/useStyleObserver.d.ts.map +1 -1
- package/dist/hooks/useStyleObserver.js.map +1 -1
- package/dist/icons/CalendarDynamicIcon.d.ts +8 -5
- package/dist/icons/CalendarDynamicIcon.d.ts.map +1 -1
- package/dist/icons/CalendarDynamicIcon.js +5 -2
- package/dist/icons/CalendarDynamicIcon.js.map +1 -1
- package/dist/icons/CopyInteractiveIcon.d.ts +5 -4
- package/dist/icons/CopyInteractiveIcon.d.ts.map +1 -1
- package/dist/icons/CopyInteractiveIcon.js +2 -2
- package/dist/icons/CopyInteractiveIcon.js.map +1 -1
- package/dist/icons/SidebarLeftInteractiveIcon.d.ts +4 -3
- package/dist/icons/SidebarLeftInteractiveIcon.d.ts.map +1 -1
- package/dist/icons/SidebarLeftInteractiveIcon.js +2 -2
- package/dist/icons/SidebarLeftInteractiveIcon.js.map +1 -1
- package/dist/icons/SidebarRightInteractiveIcon.d.ts +4 -3
- package/dist/icons/SidebarRightInteractiveIcon.d.ts.map +1 -1
- package/dist/icons/SidebarRightInteractiveIcon.js +2 -2
- package/dist/icons/SidebarRightInteractiveIcon.js.map +1 -1
- package/dist/tailwind-plugin.js +5 -5
- package/dist/tailwind-plugin.js.map +1 -1
- package/dist/utils/cn.d.ts +3 -1
- package/dist/utils/cn.d.ts.map +1 -1
- package/dist/utils/cn.js +3 -1
- package/dist/utils/cn.js.map +1 -1
- package/dist/utils/getCSSPropsAttributes.d.ts +10 -3
- package/dist/utils/getCSSPropsAttributes.d.ts.map +1 -1
- package/dist/utils/getCSSPropsAttributes.js +4 -5
- package/dist/utils/getCSSPropsAttributes.js.map +1 -1
- package/dist/utils/splitProps.d.ts +1 -4
- package/dist/utils/splitProps.d.ts.map +1 -1
- package/dist/utils/splitProps.js +2 -7
- package/dist/utils/splitProps.js.map +1 -1
- package/dist/utils/trimReactNode.d.ts +10 -8
- package/dist/utils/trimReactNode.d.ts.map +1 -1
- package/dist/utils/trimReactNode.js +10 -8
- package/dist/utils/trimReactNode.js.map +1 -1
- package/package.json +17 -17
- package/src/GDSProvider.tsx +11 -9
- package/src/components/Address.tsx +2 -2
- package/src/components/Avatar.tsx +5 -10
- package/src/components/Breadcrumbs.meta.ts +3 -1
- package/src/components/Breadcrumbs.parts.tsx +16 -28
- package/src/components/Button.tsx +14 -10
- package/src/components/ButtonGroup.meta.ts +8 -0
- package/src/components/ButtonGroup.tsx +1 -5
- package/src/components/Card.meta.ts +1 -0
- package/src/components/Checkbox.meta.ts +1 -5
- package/src/components/Chip.parts.tsx +1 -11
- package/src/components/CodeBlock.parts.tsx +75 -50
- package/src/components/CodeInline.tsx +3 -3
- package/src/components/CopyButton.meta.ts +1 -6
- package/src/components/CopyButton.tsx +3 -4
- package/src/components/CurrencyInput.meta.ts +1 -5
- package/src/components/DescriptionList.parts.tsx +1 -0
- package/src/components/Icon.meta.ts +1 -0
- package/src/components/Icon.tsx +4 -4
- package/src/components/Input.meta.ts +1 -5
- package/src/components/Input.tsx +5 -6
- package/src/components/Keyboard.tsx +1 -1
- package/src/components/Link.meta.ts +1 -0
- package/src/components/Link.tsx +2 -3
- package/src/components/Menu.meta.ts +39 -1
- package/src/components/Menu.parts.tsx +553 -549
- package/src/components/Modal.meta.ts +1 -1
- package/src/components/Modal.parts.tsx +67 -68
- package/src/components/OTCInput.meta.ts +1 -5
- package/src/components/OTCInput.tsx +1 -1
- package/src/components/Radio.meta.ts +1 -5
- package/src/components/SegmentedControl.meta.ts +3 -1
- package/src/components/SegmentedControl.parts.tsx +7 -10
- package/src/components/Stepper.meta.ts +1 -0
- package/src/components/Stepper.parts.tsx +3 -1
- package/src/components/Switch.meta.ts +1 -5
- package/src/components/TabSet.meta.ts +3 -1
- package/src/components/TextArea.meta.ts +1 -5
- package/src/components/ToggleButton.meta.ts +1 -6
- package/src/components/ToggleButton.tsx +1 -1
- package/src/components/Tooltip.meta.ts +13 -2
- package/src/components/Tooltip.parts.tsx +215 -158
- package/src/components/Tooltip.tsx +2 -2
- package/src/components/base/Addon.meta.ts +3 -1
- package/src/components/base/ButtonOrLink.parts.tsx +52 -51
- package/src/components/base/Checkable.parts.tsx +6 -13
- package/src/components/base/Field.parts.tsx +5 -5
- package/src/components/base/Portal.tsx +5 -7
- package/src/components/base/Render.tsx +37 -15
- package/src/components/base/Transition.meta.ts +1 -0
- package/src/components/base/Transition.tsx +2 -2
- package/src/components/base/index.ts +8 -2
- package/src/components/index.ts +1 -2
- package/src/hooks/index.ts +1 -0
- package/src/hooks/useCSSProp.ts +6 -8
- package/src/hooks/useCSSProps.ts +13 -22
- package/src/hooks/useCSSPropsPolyfill.ts +15 -23
- package/src/hooks/useCSSState.ts +11 -6
- package/src/hooks/useEffectWithRefDeps.ts +2 -2
- package/src/hooks/useFirstRender.ts +36 -0
- package/src/hooks/usePrevious.ts +6 -4
- package/src/hooks/useRefWithInit.ts +2 -2
- package/src/hooks/useStyleObserver.ts +5 -1
- package/src/icons/CalendarDynamicIcon.tsx +16 -6
- package/src/icons/CopyInteractiveIcon.tsx +10 -5
- package/src/icons/SidebarLeftInteractiveIcon.tsx +9 -5
- package/src/icons/SidebarRightInteractiveIcon.tsx +9 -5
- package/src/tailwind-plugin.ts +5 -5
- package/src/utils/cn.ts +3 -1
- package/src/utils/getCSSPropsAttributes.ts +13 -8
- package/src/utils/splitProps.ts +9 -9
- package/src/utils/trimReactNode.tsx +10 -8
- package/dist/components/base/ButtonOrLink.meta.d.ts +0 -2
- package/dist/components/base/ButtonOrLink.meta.d.ts.map +0 -1
- package/dist/components/base/ButtonOrLink.meta.js +0 -6
- package/dist/components/base/ButtonOrLink.meta.js.map +0 -1
- package/src/components/base/ButtonOrLink.meta.ts +0 -6
|
@@ -2,10 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
import {
|
|
4
4
|
createContext,
|
|
5
|
-
useCallback,
|
|
6
5
|
useContext,
|
|
7
6
|
useEffect,
|
|
8
|
-
useMemo,
|
|
9
7
|
useRef,
|
|
10
8
|
useState,
|
|
11
9
|
type ComponentProps,
|
|
@@ -13,24 +11,25 @@ import {
|
|
|
13
11
|
type ReactNode,
|
|
14
12
|
} from 'react'
|
|
15
13
|
import { Tooltip } from '@base-ui/react/tooltip'
|
|
14
|
+
import type { SetReturnType } from 'type-fest'
|
|
16
15
|
|
|
17
16
|
import { twToPx, type GDSComponentProps } from '@graphprotocol/gds-css'
|
|
18
17
|
|
|
19
18
|
import { useControlled, useCSSPropsPolyfill, useGDS } from '../hooks/index.ts'
|
|
20
|
-
import { cn, getCSSPropsAttributes } from '../utils/index.ts'
|
|
19
|
+
import { cn, getCSSPropsAttributes, getReactNodeKey } from '../utils/index.ts'
|
|
21
20
|
import { Portal } from './base/Portal.tsx'
|
|
22
|
-
import { Render, type
|
|
21
|
+
import { Render, type RenderProp } from './base/Render.tsx'
|
|
23
22
|
import { TooltipMeta } from './Tooltip.meta.ts'
|
|
24
23
|
|
|
25
|
-
type
|
|
24
|
+
type Content = Exclude<ReactNode, undefined>
|
|
25
|
+
type SetDeferredContentFunction = (content: Content, priority?: number) => void
|
|
26
26
|
|
|
27
27
|
const TooltipContext = createContext<{
|
|
28
|
-
|
|
29
|
-
|
|
28
|
+
collectContent: SetDeferredContentFunction
|
|
29
|
+
inheritContent: SetDeferredContentFunction
|
|
30
|
+
disableDescendants: boolean
|
|
31
|
+
registerDescendantSetOpen: (descendantSetOpen: (newOpen: boolean) => void) => void
|
|
30
32
|
} | null>(null)
|
|
31
|
-
const TooltipCollectorContext = createContext<
|
|
32
|
-
((content: DefinedReactNode, priority?: number) => void) | null
|
|
33
|
-
>(null)
|
|
34
33
|
|
|
35
34
|
const OPEN_DELAY = 300
|
|
36
35
|
|
|
@@ -40,24 +39,26 @@ export interface TooltipProps
|
|
|
40
39
|
* The content to display in the tooltip. If not provided, defaults to any content collected from
|
|
41
40
|
* `Tooltip.Content` or `Tooltip.Collector` descendants.
|
|
42
41
|
*/
|
|
43
|
-
content?:
|
|
42
|
+
content?: Content | undefined
|
|
44
43
|
/** Force the tooltip to be open or closed. */
|
|
45
44
|
open?: boolean | undefined
|
|
46
45
|
/** Called when the tooltip is opened or closed. */
|
|
47
46
|
onOpenChange?: ((open: boolean) => void) | undefined
|
|
48
47
|
/** The element that triggers the tooltip. */
|
|
49
|
-
children: ReactElement
|
|
48
|
+
children: ReactElement
|
|
50
49
|
}
|
|
51
50
|
|
|
52
51
|
export function TooltipRoot({
|
|
53
52
|
ref: passedRef,
|
|
54
53
|
content: passedContent,
|
|
55
|
-
|
|
54
|
+
side,
|
|
56
55
|
gap,
|
|
57
56
|
align,
|
|
57
|
+
alignOffset,
|
|
58
58
|
open: controlledOpen,
|
|
59
59
|
onOpenChange,
|
|
60
60
|
disabled,
|
|
61
|
+
overrideDescendants,
|
|
61
62
|
className,
|
|
62
63
|
style,
|
|
63
64
|
children,
|
|
@@ -65,44 +66,85 @@ export function TooltipRoot({
|
|
|
65
66
|
}: TooltipProps) {
|
|
66
67
|
const { dirProps } = useGDS()
|
|
67
68
|
|
|
69
|
+
const ancestorTooltip = useContext(TooltipContext)
|
|
70
|
+
const triggerRef = useRef<HTMLButtonElement>(null)
|
|
71
|
+
|
|
68
72
|
const [cssPropsPolyfillRef, cssPropsPolyfillAttributes, cssProps] = useCSSPropsPolyfill(
|
|
69
73
|
TooltipMeta,
|
|
70
|
-
{
|
|
71
|
-
{ returnPropValues: {
|
|
74
|
+
{ side, align, disabled, overrideDescendants },
|
|
75
|
+
{ returnPropValues: { side, gap, align, alignOffset, disabled, overrideDescendants } },
|
|
72
76
|
)
|
|
73
77
|
const cssPropsAttributes = getCSSPropsAttributes(
|
|
74
78
|
TooltipMeta,
|
|
75
|
-
{
|
|
79
|
+
{ side, gap, align, alignOffset, disabled, overrideDescendants },
|
|
76
80
|
style,
|
|
77
81
|
)
|
|
78
82
|
|
|
79
|
-
const
|
|
80
|
-
const
|
|
83
|
+
const [setCollectedContent, collectedContent] = useDeferredContent()
|
|
84
|
+
const [setInheritedContent, inheritedContent] = useDeferredContent()
|
|
85
|
+
|
|
86
|
+
const content =
|
|
87
|
+
passedContent !== undefined
|
|
88
|
+
? passedContent
|
|
89
|
+
: collectedContent !== undefined
|
|
90
|
+
? collectedContent
|
|
91
|
+
: inheritedContent
|
|
81
92
|
|
|
82
|
-
const
|
|
83
|
-
|
|
93
|
+
const triggerDisabled =
|
|
94
|
+
'props' in children &&
|
|
95
|
+
children.props &&
|
|
96
|
+
typeof children.props === 'object' &&
|
|
97
|
+
'disabled' in children.props
|
|
98
|
+
? children.props.disabled === true
|
|
99
|
+
: false
|
|
100
|
+
|
|
101
|
+
// Propagate the passed/collected content up for the first tooltip ancestor that needs them
|
|
102
|
+
if (passedContent !== undefined && !cssProps.disabled && !triggerDisabled) {
|
|
103
|
+
ancestorTooltip?.inheritContent(passedContent, 3)
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
const collectContent: SetDeferredContentFunction = (newCollectedContent, priority) => {
|
|
107
|
+
const prioritizedCollectedContent = setCollectedContent(newCollectedContent, priority)
|
|
108
|
+
if (!triggerDisabled) ancestorTooltip?.inheritContent(prioritizedCollectedContent, 2)
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
const inheritContent: SetDeferredContentFunction = (newInheritedContent, priority) => {
|
|
112
|
+
void setInheritedContent(newInheritedContent, priority)
|
|
113
|
+
if (!triggerDisabled) ancestorTooltip?.inheritContent(newInheritedContent, 1)
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
const disabledByAncestor = ancestorTooltip?.disableDescendants ?? false
|
|
117
|
+
const disableDescendants =
|
|
118
|
+
disabledByAncestor ||
|
|
119
|
+
triggerDisabled ||
|
|
120
|
+
(content !== undefined && !cssProps.disabled && cssProps.overrideDescendants)
|
|
121
|
+
const enabled = Boolean(content) && !cssProps.disabled && !triggerDisabled && !disabledByAncestor
|
|
84
122
|
|
|
85
|
-
const enabled = !cssProps.disabled && !hasEnabledTooltipAncestor && Boolean(content)
|
|
86
123
|
const [open, ownSetOpen] = useControlled(controlledOpen, false, onOpenChange)
|
|
87
|
-
const
|
|
88
|
-
const
|
|
89
|
-
|
|
90
|
-
}
|
|
124
|
+
const descendantSetOpen = useRef<(newOpen: boolean) => void>(null)
|
|
125
|
+
const registerDescendantSetOpen = (newDescendantSetOpen: (newOpen: boolean) => void) => {
|
|
126
|
+
descendantSetOpen.current = newDescendantSetOpen
|
|
127
|
+
}
|
|
128
|
+
const justOpenedRef = useRef(false)
|
|
91
129
|
const setOpen = (newOpen: boolean) => {
|
|
92
130
|
ownSetOpen(newOpen)
|
|
93
131
|
/**
|
|
94
|
-
* Notify
|
|
95
|
-
* moving the cursor away from a `CopyButton` while its "Copied!" tooltip is shown closes
|
|
96
|
-
* inner tooltip as well (which doesn't happen automatically because nested
|
|
97
|
-
* disabled to prevent a lot of weirdness).
|
|
132
|
+
* Notify overridden descendant tooltips of the open state change. This ensures, for example,
|
|
133
|
+
* that moving the cursor away from a `CopyButton` while its "Copied!" tooltip is shown closes
|
|
134
|
+
* the inner tooltip as well (which doesn't happen automatically because tooltips nested under
|
|
135
|
+
* an enabled tooltip are disabled to prevent a lot of weirdness).
|
|
98
136
|
*/
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
137
|
+
if (cssProps.overrideDescendants) {
|
|
138
|
+
descendantSetOpen.current?.(newOpen)
|
|
139
|
+
}
|
|
140
|
+
if (newOpen) {
|
|
141
|
+
justOpenedRef.current = true
|
|
142
|
+
window.setTimeout(() => {
|
|
143
|
+
justOpenedRef.current = false
|
|
144
|
+
}, 0)
|
|
145
|
+
}
|
|
105
146
|
}
|
|
147
|
+
ancestorTooltip?.registerDescendantSetOpen(setOpen)
|
|
106
148
|
|
|
107
149
|
const openTimeoutRef = useRef<number>(undefined)
|
|
108
150
|
const clearOpenTimeout = () => {
|
|
@@ -114,147 +156,145 @@ export function TooltipRoot({
|
|
|
114
156
|
clearOpenTimeout()
|
|
115
157
|
}
|
|
116
158
|
|
|
117
|
-
const tooltipContextValue = useMemo(
|
|
118
|
-
() => ({
|
|
119
|
-
enabled,
|
|
120
|
-
registerNestedSetOpen,
|
|
121
|
-
}),
|
|
122
|
-
[enabled, registerNestedSetOpen],
|
|
123
|
-
)
|
|
124
|
-
|
|
125
159
|
return (
|
|
126
|
-
<TooltipContext.Provider
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
160
|
+
<TooltipContext.Provider
|
|
161
|
+
value={{
|
|
162
|
+
collectContent,
|
|
163
|
+
inheritContent,
|
|
164
|
+
disableDescendants,
|
|
165
|
+
registerDescendantSetOpen,
|
|
166
|
+
}}
|
|
167
|
+
>
|
|
168
|
+
<Tooltip.Root
|
|
169
|
+
disabled={!enabled}
|
|
170
|
+
disableHoverablePopup
|
|
171
|
+
open={open}
|
|
172
|
+
onOpenChange={(newOpen, eventDetails) => {
|
|
173
|
+
clearOpenTimeout()
|
|
174
|
+
if (!enabled) return
|
|
175
|
+
// Disable Base UI's default behavior of closing the tooltip when pressing the trigger
|
|
176
|
+
if (!newOpen && eventDetails.reason === 'trigger-press') {
|
|
177
|
+
// Ensure clicking on the trigger before the tooltip has a chance to open doesn't prevent it from opening
|
|
178
|
+
openTimeoutRef.current = window.setTimeout(() => setOpen(true), OPEN_DELAY)
|
|
179
|
+
return
|
|
180
|
+
}
|
|
181
|
+
// Make `overrideDescendants={false}` work as expected (see the `NestedSimultaneous` story)
|
|
182
|
+
if (
|
|
183
|
+
!newOpen &&
|
|
184
|
+
eventDetails.reason === 'none' &&
|
|
185
|
+
(justOpenedRef.current ||
|
|
186
|
+
(!cssProps.overrideDescendants && triggerRef.current?.matches(':hover')))
|
|
187
|
+
) {
|
|
188
|
+
return
|
|
189
|
+
}
|
|
190
|
+
setOpen(newOpen)
|
|
191
|
+
}}
|
|
192
|
+
>
|
|
193
|
+
<Tooltip.Trigger
|
|
194
|
+
ref={triggerRef}
|
|
195
|
+
delay={OPEN_DELAY}
|
|
196
|
+
closeDelay={100}
|
|
197
|
+
render={({ onClick: _onClick, ...renderProps }) => (
|
|
198
|
+
<Render {...(enabled ? renderProps : {})} render={children} />
|
|
199
|
+
)}
|
|
200
|
+
/>
|
|
201
|
+
<Tooltip.Portal>
|
|
202
|
+
<Tooltip.Positioner
|
|
203
|
+
side={
|
|
204
|
+
cssProps.side === 'start'
|
|
205
|
+
? 'inline-start'
|
|
206
|
+
: cssProps.side === 'end'
|
|
207
|
+
? 'inline-end'
|
|
208
|
+
: cssProps.side
|
|
140
209
|
}
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
`gds-tooltip root-block u:max-w-(--available-width) u:rounded-4 u:bg-default u:px-2 u:py-1 u:text-12 u:text-default u:transition
|
|
164
|
-
i:origin-(--transform-origin)
|
|
165
|
-
i:data-ending-style:opacity-0
|
|
166
|
-
i:data-starting-style:opacity-0
|
|
167
|
-
i:data-starting-style:data-[side=bottom]:-translate-y-1
|
|
168
|
-
i:data-starting-style:data-[side=inline-end]:-translate-x-1
|
|
169
|
-
i:data-starting-style:data-[side=inline-start]:translate-x-1
|
|
170
|
-
i:data-starting-style:data-[side=top]:translate-y-1
|
|
171
|
-
i:rtl:data-starting-style:data-[side=inline-end]:translate-x-1
|
|
172
|
-
i:rtl:data-starting-style:data-[side=inline-start]:-translate-x-1`,
|
|
173
|
-
className,
|
|
174
|
-
)}
|
|
175
|
-
{...cssPropsAttributes}
|
|
176
|
-
{...cssPropsPolyfillAttributes}
|
|
177
|
-
{...props}
|
|
178
|
-
>
|
|
179
|
-
{content}
|
|
180
|
-
</Tooltip.Popup>
|
|
181
|
-
</Tooltip.Positioner>
|
|
182
|
-
</Tooltip.Portal>
|
|
183
|
-
{/* Ensure changes to CSS props are detected even when the tooltip is not mounted */}
|
|
184
|
-
<Portal>
|
|
185
|
-
<span
|
|
186
|
-
ref={cssPropsPolyfillRef}
|
|
187
|
-
className={cn('gds-tooltip i:invisible', className)}
|
|
210
|
+
sideOffset={twToPx(cssProps.gap)}
|
|
211
|
+
align={cssProps.align}
|
|
212
|
+
alignOffset={twToPx(cssProps.alignOffset)}
|
|
213
|
+
collisionPadding={8}
|
|
214
|
+
{...dirProps}
|
|
215
|
+
>
|
|
216
|
+
<Tooltip.Popup
|
|
217
|
+
ref={passedRef}
|
|
218
|
+
data-side={cssProps.side}
|
|
219
|
+
className={cn(
|
|
220
|
+
`gds-tooltip root-block u:max-w-(--available-width) u:rounded-4 u:bg-default u:px-2 u:py-1 u:text-12 u:transition
|
|
221
|
+
i:origin-(--transform-origin)
|
|
222
|
+
i:data-ending-style:opacity-0
|
|
223
|
+
i:data-starting-style:opacity-0
|
|
224
|
+
i:data-starting-style:data-[side=bottom]:-translate-y-1
|
|
225
|
+
i:data-starting-style:data-[side=end]:-translate-x-1
|
|
226
|
+
i:data-starting-style:data-[side=start]:translate-x-1
|
|
227
|
+
i:data-starting-style:data-[side=top]:translate-y-1
|
|
228
|
+
i:rtl:data-starting-style:data-[side=end]:translate-x-1
|
|
229
|
+
i:rtl:data-starting-style:data-[side=start]:-translate-x-1`,
|
|
230
|
+
className,
|
|
231
|
+
)}
|
|
188
232
|
{...cssPropsAttributes}
|
|
189
233
|
{...cssPropsPolyfillAttributes}
|
|
190
234
|
{...props}
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
235
|
+
>
|
|
236
|
+
{content}
|
|
237
|
+
</Tooltip.Popup>
|
|
238
|
+
</Tooltip.Positioner>
|
|
239
|
+
</Tooltip.Portal>
|
|
240
|
+
{/* Ensure changes to CSS props are detected even when the tooltip is not mounted */}
|
|
241
|
+
<Portal>
|
|
242
|
+
<span
|
|
243
|
+
ref={cssPropsPolyfillRef}
|
|
244
|
+
className={cn('gds-tooltip i:invisible', className)}
|
|
245
|
+
{...cssPropsAttributes}
|
|
246
|
+
{...cssPropsPolyfillAttributes}
|
|
247
|
+
{...props}
|
|
248
|
+
/>
|
|
249
|
+
</Portal>
|
|
250
|
+
</Tooltip.Root>
|
|
195
251
|
</TooltipContext.Provider>
|
|
196
252
|
)
|
|
197
253
|
}
|
|
198
254
|
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
}
|
|
255
|
+
function useDeferredContent() {
|
|
256
|
+
const [content, setContent] = useState<Content | undefined>(undefined)
|
|
257
|
+
const pendingContentRef = useRef<Content | undefined>(undefined)
|
|
258
|
+
const pendingPriorityRef = useRef<number | undefined>(undefined)
|
|
204
259
|
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
/** Hook for components to collect tooltip content from children. */
|
|
219
|
-
export function useCollectedTooltip() {
|
|
220
|
-
const [collectedContent, setCollectedContent] = useState<DefinedReactNode>(null)
|
|
221
|
-
const pendingContent = useRef<DefinedReactNode>(null)
|
|
222
|
-
const pendingPriority = useRef<number>(0)
|
|
223
|
-
|
|
224
|
-
// Collect tooltip during render phase (store in ref to avoid state update during render)
|
|
225
|
-
const onCollect = (content: DefinedReactNode, priority = 0) => {
|
|
226
|
-
// Only update if this content has higher priority than what we've collected so far
|
|
227
|
-
if (priority >= pendingPriority.current) {
|
|
228
|
-
pendingContent.current = content
|
|
229
|
-
pendingPriority.current = priority
|
|
260
|
+
// Store the content in a ref to avoid updating the state during render
|
|
261
|
+
const setDeferredContent: SetReturnType<SetDeferredContentFunction, Content> = (
|
|
262
|
+
newContent: Content,
|
|
263
|
+
priority = 0,
|
|
264
|
+
) => {
|
|
265
|
+
// If we've already stored content this render, only replace it if the new content has higher priority
|
|
266
|
+
if (
|
|
267
|
+
pendingContentRef.current === undefined ||
|
|
268
|
+
priority >= (pendingPriorityRef.current ?? -Infinity)
|
|
269
|
+
) {
|
|
270
|
+
pendingContentRef.current = newContent
|
|
271
|
+
pendingPriorityRef.current = priority
|
|
230
272
|
}
|
|
273
|
+
return pendingContentRef.current
|
|
231
274
|
}
|
|
232
275
|
|
|
233
|
-
// Commit the
|
|
234
|
-
// oxlint-disable-next-line react-hooks/exhaustive-deps -- Must run after every render to sync
|
|
276
|
+
// Commit the stored content after render
|
|
277
|
+
// oxlint-disable-next-line react-hooks/exhaustive-deps -- Must run after every render to sync
|
|
235
278
|
useEffect(() => {
|
|
236
|
-
if (
|
|
237
|
-
|
|
279
|
+
if (getReactNodeKey(content) !== getReactNodeKey(pendingContentRef.current)) {
|
|
280
|
+
setContent(pendingContentRef.current)
|
|
238
281
|
}
|
|
239
282
|
// Reset for next render
|
|
240
|
-
|
|
241
|
-
|
|
283
|
+
pendingContentRef.current = undefined
|
|
284
|
+
pendingPriorityRef.current = undefined
|
|
242
285
|
})
|
|
243
286
|
|
|
244
|
-
return
|
|
245
|
-
onCollect,
|
|
246
|
-
collectedContent,
|
|
247
|
-
}
|
|
287
|
+
return [setDeferredContent, content] as const
|
|
248
288
|
}
|
|
249
289
|
|
|
250
290
|
export interface TooltipContentProps {
|
|
251
|
-
render?:
|
|
291
|
+
render?: RenderProp | undefined
|
|
252
292
|
children: ReactNode
|
|
253
293
|
}
|
|
254
294
|
|
|
255
295
|
/**
|
|
256
296
|
* Wrap any text or `ReactNode` with this component to use it as the default `content` of the
|
|
257
|
-
*
|
|
297
|
+
* closest `Tooltip`, in addition to rendering it inline. It is meant to be wrapped in a `sr-only`
|
|
258
298
|
* element, so that the content rendered inline is visually hidden but accessible to screen readers,
|
|
259
299
|
* unlike the content rendered in the tooltip itself, which is hidden from the accessibility tree
|
|
260
300
|
* since most tooltips are decorative. This allows a tooltip to be non-decorative, in the rare case
|
|
@@ -262,15 +302,32 @@ export interface TooltipContentProps {
|
|
|
262
302
|
* from the trigger's accessible name).
|
|
263
303
|
*/
|
|
264
304
|
export function TooltipContent({ render, children }: TooltipContentProps) {
|
|
265
|
-
const
|
|
305
|
+
const ancestorTooltip = useContext(TooltipContext)
|
|
266
306
|
|
|
267
|
-
|
|
268
|
-
collectTooltip(children || null, 100)
|
|
269
|
-
}
|
|
307
|
+
ancestorTooltip?.collectContent(children || null)
|
|
270
308
|
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
309
|
+
return render ? <Render render={render}>{children}</Render> : children
|
|
310
|
+
}
|
|
311
|
+
TooltipContent.displayName = 'Tooltip.Content'
|
|
312
|
+
|
|
313
|
+
const TooltipCollectorContext = createContext<SetDeferredContentFunction | null>(null)
|
|
274
314
|
|
|
275
|
-
|
|
315
|
+
export interface TooltipCollectorProps {
|
|
316
|
+
children: ReactNode
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
export function TooltipCollector({ children }: TooltipCollectorProps) {
|
|
320
|
+
const ancestorTooltip = useContext(TooltipContext)
|
|
321
|
+
|
|
322
|
+
return (
|
|
323
|
+
<TooltipCollectorContext.Provider value={ancestorTooltip?.collectContent ?? null}>
|
|
324
|
+
{children}
|
|
325
|
+
</TooltipCollectorContext.Provider>
|
|
326
|
+
)
|
|
327
|
+
}
|
|
328
|
+
TooltipCollector.displayName = 'Tooltip.Collector'
|
|
329
|
+
|
|
330
|
+
/** Hook for components to send tooltip content up to a collector. */
|
|
331
|
+
export function useTooltipCollector() {
|
|
332
|
+
return useContext(TooltipCollectorContext)
|
|
276
333
|
}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { TooltipCollector, TooltipContent, TooltipRoot } from './Tooltip.parts.tsx'
|
|
2
2
|
|
|
3
3
|
export const Tooltip = Object.assign(TooltipRoot, {
|
|
4
|
-
Collector: TooltipCollector,
|
|
5
4
|
Content: TooltipContent,
|
|
5
|
+
Collector: TooltipCollector,
|
|
6
6
|
})
|
|
7
7
|
|
|
8
|
-
export {
|
|
8
|
+
export { useTooltipCollector } from './Tooltip.parts.tsx'
|
|
9
9
|
|
|
10
10
|
export type { TooltipProps, TooltipCollectorProps, TooltipContentProps } from './Tooltip.parts.tsx'
|