@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
|
@@ -17,9 +17,10 @@ import {
|
|
|
17
17
|
import { useMergedRefs } from '@base-ui/utils/useMergedRefs'
|
|
18
18
|
import { mergeProps } from '@react-aria/utils'
|
|
19
19
|
import { useButton } from 'react-aria'
|
|
20
|
+
import type { Merge } from 'type-fest'
|
|
20
21
|
|
|
21
22
|
import { cn } from '../../utils/index.ts'
|
|
22
|
-
import { Render, type
|
|
23
|
+
import { Render, type RenderFn } from './Render.tsx'
|
|
23
24
|
|
|
24
25
|
interface LinkComponentObject {
|
|
25
26
|
component: ElementType
|
|
@@ -35,7 +36,7 @@ type LinkComponent =
|
|
|
35
36
|
| LinkComponentObject
|
|
36
37
|
| null
|
|
37
38
|
|
|
38
|
-
export
|
|
39
|
+
export type ButtonOrLinkState = {
|
|
39
40
|
Element: ElementType
|
|
40
41
|
category: 'button' | 'link' | 'other'
|
|
41
42
|
role: NonNullable<InternalButtonOrLinkProps['role']>
|
|
@@ -61,10 +62,8 @@ export declare namespace InternalButtonOrLinkProps {
|
|
|
61
62
|
*/
|
|
62
63
|
inline?: boolean | undefined
|
|
63
64
|
/** Custom render function to control the rendered element. */
|
|
64
|
-
render?:
|
|
65
|
-
|
|
66
|
-
| undefined
|
|
67
|
-
/** Custom component to use for rendering links (e.g., Next.js Link) */
|
|
65
|
+
render?: RenderFn<ButtonOrLinkState> | undefined
|
|
66
|
+
/** Custom component to use for rendering links (e.g. Next.js Link) */
|
|
68
67
|
linkComponent?: LinkComponent | undefined
|
|
69
68
|
}
|
|
70
69
|
interface ButtonProps
|
|
@@ -121,16 +120,19 @@ interface WithButtonOrLinkContextProps {
|
|
|
121
120
|
buttonOrLinkState: ButtonOrLinkState
|
|
122
121
|
}
|
|
123
122
|
|
|
124
|
-
|
|
123
|
+
type WithContextComponent<T extends ElementType> = (
|
|
124
|
+
props: Merge<ComponentProps<T>, WithButtonOrLinkContextProps>,
|
|
125
|
+
) => ReactElement
|
|
125
126
|
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
127
|
+
const memoizedWithContextComponents = new Map<ElementType, WithContextComponent<ElementType>>()
|
|
128
|
+
|
|
129
|
+
function withContext<T extends ElementType>(Element: T): WithContextComponent<T> {
|
|
130
|
+
const cached = memoizedWithContextComponents.get(Element)
|
|
131
|
+
if (cached) return cached
|
|
132
|
+
const newWithContextComponent: WithContextComponent<ElementType> = ({
|
|
131
133
|
buttonOrLinkState,
|
|
132
134
|
...props
|
|
133
|
-
}
|
|
135
|
+
}) => (
|
|
134
136
|
<ButtonOrLinkContext.Provider value={buttonOrLinkState}>
|
|
135
137
|
<Element {...(props as ComponentProps<T>)} />
|
|
136
138
|
</ButtonOrLinkContext.Provider>
|
|
@@ -142,7 +144,7 @@ function withContext<T extends ElementType>(Element: T) {
|
|
|
142
144
|
const ButtonWithContext = withContext('button')
|
|
143
145
|
const SpanButtonWithContext = withContext(SpanButton)
|
|
144
146
|
const AnchorWithContext = withContext('a')
|
|
145
|
-
const RenderWithContext = withContext(Render
|
|
147
|
+
const RenderWithContext = withContext(Render)
|
|
146
148
|
|
|
147
149
|
interface ButtonOrLinkConfigContextValue {
|
|
148
150
|
onClick:
|
|
@@ -187,11 +189,22 @@ export const ButtonOrLinkRoot = (passedProps: InternalButtonOrLinkProps) => {
|
|
|
187
189
|
inline = false,
|
|
188
190
|
linkComponent: passedLinkComponent,
|
|
189
191
|
render,
|
|
190
|
-
onClick,
|
|
191
192
|
className: passedClassName,
|
|
192
193
|
children,
|
|
193
194
|
...nonBaseProps
|
|
194
195
|
} = props
|
|
196
|
+
const manuallyDisabledEventProps = {
|
|
197
|
+
onClick: undefined,
|
|
198
|
+
onMouseDown: undefined,
|
|
199
|
+
onMouseUp: undefined,
|
|
200
|
+
onPointerDown: undefined,
|
|
201
|
+
onPointerUp: undefined,
|
|
202
|
+
onTouchStart: undefined,
|
|
203
|
+
onTouchEnd: undefined,
|
|
204
|
+
onKeyDown: undefined,
|
|
205
|
+
onKeyUp: undefined,
|
|
206
|
+
}
|
|
207
|
+
|
|
195
208
|
const className = cn('gds-button-or-link', passedClassName)
|
|
196
209
|
|
|
197
210
|
if (props.href === undefined) {
|
|
@@ -241,7 +254,7 @@ export const ButtonOrLinkRoot = (passedProps: InternalButtonOrLinkProps) => {
|
|
|
241
254
|
return { 'aria-checked': checkedOrMixed }
|
|
242
255
|
})(checked)
|
|
243
256
|
|
|
244
|
-
|
|
257
|
+
const buttonProps: ComponentProps<typeof Element> = {
|
|
245
258
|
role,
|
|
246
259
|
type: disabled === 'focusable' ? 'button' : type,
|
|
247
260
|
disabled: disabled === true,
|
|
@@ -250,11 +263,8 @@ export const ButtonOrLinkRoot = (passedProps: InternalButtonOrLinkProps) => {
|
|
|
250
263
|
className,
|
|
251
264
|
children,
|
|
252
265
|
buttonOrLinkState: state,
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
...buttonProps,
|
|
256
|
-
onClick: !disabled ? (onClick as typeof buttonProps.onClick) : undefined,
|
|
257
|
-
...(remainingProps as typeof buttonProps),
|
|
266
|
+
...(remainingProps as ComponentProps<'button'>),
|
|
267
|
+
...((disabled === 'focusable' || (disabled && inline)) && manuallyDisabledEventProps),
|
|
258
268
|
}
|
|
259
269
|
|
|
260
270
|
return render ? render(buttonProps, state) : <Element {...buttonProps} />
|
|
@@ -280,26 +290,16 @@ export const ButtonOrLinkRoot = (passedProps: InternalButtonOrLinkProps) => {
|
|
|
280
290
|
target,
|
|
281
291
|
}
|
|
282
292
|
|
|
283
|
-
let linkProps: ComponentProps<'a'> =
|
|
284
|
-
?
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
href,
|
|
294
|
-
target,
|
|
295
|
-
rel,
|
|
296
|
-
className,
|
|
297
|
-
children,
|
|
298
|
-
}
|
|
299
|
-
linkProps = {
|
|
300
|
-
...linkProps,
|
|
301
|
-
onClick: !disabled ? (onClick as typeof linkProps.onClick) : undefined,
|
|
302
|
-
...(remainingProps as typeof linkProps),
|
|
293
|
+
let linkProps: ComponentProps<'a'> = {
|
|
294
|
+
role: disabled || role !== 'link' ? role : undefined,
|
|
295
|
+
href: !disabled ? href : undefined,
|
|
296
|
+
target: !disabled ? target : undefined,
|
|
297
|
+
rel: !disabled ? rel : undefined,
|
|
298
|
+
'aria-disabled': Boolean(disabled) || undefined,
|
|
299
|
+
className,
|
|
300
|
+
children,
|
|
301
|
+
...(remainingProps as ComponentProps<'a'>),
|
|
302
|
+
...(disabled && manuallyDisabledEventProps),
|
|
303
303
|
}
|
|
304
304
|
|
|
305
305
|
let linkComponent: ElementType | ReactElement | null = null
|
|
@@ -425,16 +425,17 @@ function SpanButton({
|
|
|
425
425
|
isDisabled: disabled,
|
|
426
426
|
elementType: 'span',
|
|
427
427
|
onPress: (event) => {
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
428
|
+
event.target.dispatchEvent(
|
|
429
|
+
new MouseEvent('click', {
|
|
430
|
+
altKey: event.altKey,
|
|
431
|
+
ctrlKey: event.ctrlKey,
|
|
432
|
+
metaKey: event.metaKey,
|
|
433
|
+
shiftKey: event.shiftKey,
|
|
434
|
+
relatedTarget: event.target,
|
|
435
|
+
bubbles: true,
|
|
436
|
+
cancelable: true,
|
|
437
|
+
}),
|
|
438
|
+
)
|
|
438
439
|
},
|
|
439
440
|
onPressStart: (event) => {
|
|
440
441
|
if (event.pointerType === 'keyboard') setActive(true)
|
|
@@ -1,22 +1,15 @@
|
|
|
1
1
|
'use client'
|
|
2
2
|
|
|
3
|
-
import {
|
|
4
|
-
createContext,
|
|
5
|
-
useContext,
|
|
6
|
-
useId,
|
|
7
|
-
type ComponentProps,
|
|
8
|
-
type ReactElement,
|
|
9
|
-
type ReactNode,
|
|
10
|
-
} from 'react'
|
|
3
|
+
import { createContext, useContext, useId, type ComponentProps, type ReactNode } from 'react'
|
|
11
4
|
|
|
12
5
|
import type { GDSComponentProps } from '@graphprotocol/gds-css'
|
|
13
6
|
|
|
14
7
|
import { useCSSPropsPolyfill, useCSSState } from '../../hooks/index.ts'
|
|
15
8
|
import { cn, getCSSPropsAttributes } from '../../utils/index.ts'
|
|
16
9
|
import { CheckableMeta } from './Checkable.meta.ts'
|
|
17
|
-
import { Render, type
|
|
10
|
+
import { Render, type RenderProp } from './Render.tsx'
|
|
18
11
|
|
|
19
|
-
export
|
|
12
|
+
export type CheckableState = {
|
|
20
13
|
inputProps: {
|
|
21
14
|
name: string | undefined
|
|
22
15
|
value: string | undefined
|
|
@@ -36,7 +29,7 @@ export interface CheckableProps
|
|
|
36
29
|
value: string | undefined
|
|
37
30
|
checked: boolean | 'indeterminate' | undefined
|
|
38
31
|
disabled: boolean | undefined
|
|
39
|
-
renderInput:
|
|
32
|
+
renderInput: RenderProp<CheckableState>
|
|
40
33
|
}
|
|
41
34
|
|
|
42
35
|
export function CheckableRoot({
|
|
@@ -185,7 +178,7 @@ export interface CheckableLabelProps extends ComponentProps<'span'> {
|
|
|
185
178
|
* `<Card as="label" />`). Defaults to `<label />`, unless there is an ancestor `CheckableLabel`,
|
|
186
179
|
* in which case it defaults to `<span />`.
|
|
187
180
|
*/
|
|
188
|
-
render?:
|
|
181
|
+
render?: RenderProp | undefined
|
|
189
182
|
}
|
|
190
183
|
|
|
191
184
|
export function CheckableLabel({
|
|
@@ -209,8 +202,8 @@ export function CheckableLabel({
|
|
|
209
202
|
<CheckableLabelContext.Provider value={true}>
|
|
210
203
|
<Render
|
|
211
204
|
ref={statePassedRef}
|
|
212
|
-
data-focus-ring={focusRing || undefined}
|
|
213
205
|
render={render ?? (renderLabel ? <label /> : <span />)}
|
|
206
|
+
data-focus-ring={focusRing || undefined}
|
|
214
207
|
className={cn(
|
|
215
208
|
renderLabel ? 'group/label gds-checkable-label' : null,
|
|
216
209
|
`uu:data-focus-ring:focus-visible:outline
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use client'
|
|
2
2
|
|
|
3
|
-
import { useId, type ComponentProps, type
|
|
3
|
+
import { useId, type ComponentProps, type ReactNode } from 'react'
|
|
4
4
|
|
|
5
5
|
import type { GDSComponentProps } from '@graphprotocol/gds-css'
|
|
6
6
|
|
|
@@ -9,9 +9,9 @@ import { CheckCircleIcon, WarningDiamondIcon, WarningIcon } from '../../icons/in
|
|
|
9
9
|
import { cn, getCSSPropsAttributes, type OptionValue } from '../../utils/index.ts'
|
|
10
10
|
import { Label, type LabelProps } from '../Label.tsx'
|
|
11
11
|
import { FieldMeta } from './Field.meta.ts'
|
|
12
|
-
import { Render } from './Render.tsx'
|
|
12
|
+
import { Render, type RenderProp } from './Render.tsx'
|
|
13
13
|
|
|
14
|
-
export
|
|
14
|
+
export type FieldState = {
|
|
15
15
|
inputProps: {
|
|
16
16
|
placeholder: string // Ensure there's always a `placeholder` attribute for `@state-blank` to work
|
|
17
17
|
name: string | undefined
|
|
@@ -47,7 +47,7 @@ export interface FieldProps
|
|
|
47
47
|
/** @default 'info' */
|
|
48
48
|
status?: 'info' | 'warning' | 'error' | 'success' | undefined
|
|
49
49
|
message?: ReactNode | undefined
|
|
50
|
-
renderInput:
|
|
50
|
+
renderInput: RenderProp<FieldState>
|
|
51
51
|
}
|
|
52
52
|
|
|
53
53
|
export const FieldRoot = ({
|
|
@@ -234,7 +234,7 @@ export const FieldRoot = ({
|
|
|
234
234
|
`)}
|
|
235
235
|
/>
|
|
236
236
|
<div
|
|
237
|
-
data-visible={message
|
|
237
|
+
data-visible={Boolean(message) || undefined}
|
|
238
238
|
className={`
|
|
239
239
|
mt-2 flex gap-1 text-12 text-form-helper
|
|
240
240
|
not-data-visible:sr-only
|
|
@@ -1,17 +1,15 @@
|
|
|
1
1
|
'use client'
|
|
2
2
|
|
|
3
|
-
import {
|
|
3
|
+
import type { ReactNode } from 'react'
|
|
4
4
|
import { createPortal } from 'react-dom'
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
const [mounted, setMounted] = useState(false)
|
|
6
|
+
import { useFirstRender } from '../../hooks/index.ts'
|
|
8
7
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
}, [])
|
|
8
|
+
export function Portal({ children }: { children: ReactNode }) {
|
|
9
|
+
const firstRender = useFirstRender({ immediatelyRerender: true })
|
|
12
10
|
|
|
13
11
|
// Don't render until after hydration
|
|
14
|
-
if (
|
|
12
|
+
if (firstRender) {
|
|
15
13
|
return null
|
|
16
14
|
}
|
|
17
15
|
|
|
@@ -1,31 +1,53 @@
|
|
|
1
1
|
'use client'
|
|
2
2
|
|
|
3
|
-
import type {
|
|
4
|
-
import { useRender } from '@base-ui/react/use-render'
|
|
3
|
+
import type { ReactElement } from 'react'
|
|
4
|
+
import { useRender, type HTMLProps } from '@base-ui/react/use-render'
|
|
5
|
+
import { objectFromEntries } from 'ts-extras'
|
|
5
6
|
|
|
6
|
-
export type
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
7
|
+
export type RenderFnProps = HTMLProps
|
|
8
|
+
export type RenderFnState = Record<string, unknown> | undefined
|
|
9
|
+
|
|
10
|
+
export type RenderFn<State extends RenderFnState = undefined, ElementProps = unknown> = (
|
|
11
|
+
renderProps: RenderFnProps,
|
|
12
|
+
state: State,
|
|
13
|
+
) => ReactElement<ElementProps>
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Type for a `render` prop that accepts either a React element or a render function.
|
|
17
|
+
*
|
|
18
|
+
* - **Element form**: Pass a React element to replace the default tag (e.g., `<strong />`).
|
|
19
|
+
* - **Function form**: Pass a callback `(props, state) => ReactElement` for full control.
|
|
20
|
+
*
|
|
21
|
+
* @template State - The state object passed to the render function.
|
|
22
|
+
* @template ElementProps - Optional constraint on the returned element's props (e.g., `{ disabled?:
|
|
23
|
+
* boolean }`).
|
|
24
|
+
*/
|
|
25
|
+
export type RenderProp<State extends RenderFnState = undefined, ElementProps = unknown> =
|
|
26
|
+
| ReactElement<ElementProps>
|
|
27
|
+
| RenderFn<State, ElementProps>
|
|
28
|
+
|
|
29
|
+
export interface RenderProps<State extends RenderFnState = undefined> {
|
|
30
|
+
render: RenderProp<State>
|
|
11
31
|
state?: State | undefined
|
|
32
|
+
[key: string]: unknown
|
|
12
33
|
}
|
|
13
34
|
|
|
14
35
|
/**
|
|
15
36
|
* A utility component that provides polymorphic rendering capabilities. It can render as any HTML
|
|
16
37
|
* element or React component.
|
|
17
38
|
*/
|
|
18
|
-
export function Render<
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
39
|
+
export function Render<State extends RenderFnState>({
|
|
40
|
+
render,
|
|
41
|
+
state,
|
|
42
|
+
...props
|
|
43
|
+
}: RenderProps<State>) {
|
|
22
44
|
return useRender({
|
|
23
45
|
render,
|
|
24
|
-
state,
|
|
46
|
+
state: state !== undefined ? state : (undefined as never),
|
|
25
47
|
props,
|
|
26
48
|
// Do not automatically add data attributes for state properties
|
|
27
|
-
stateAttributesMapping:
|
|
28
|
-
Object.keys(state ?? {}).map((stateProperty) => [stateProperty, (
|
|
29
|
-
)
|
|
49
|
+
stateAttributesMapping: objectFromEntries(
|
|
50
|
+
Object.keys(state ?? {}).map((stateProperty) => [stateProperty, () => null] as const),
|
|
51
|
+
),
|
|
30
52
|
})
|
|
31
53
|
}
|
|
@@ -108,7 +108,7 @@ export function Transition({
|
|
|
108
108
|
ref={statePassedRef}
|
|
109
109
|
data-layout={layout}
|
|
110
110
|
className={cn(
|
|
111
|
-
`gds-transition
|
|
111
|
+
`gds-transition
|
|
112
112
|
u:state-[transition=idle]
|
|
113
113
|
u:data-[layout=block]:block
|
|
114
114
|
u:data-[layout=flex-col]:flex
|
|
@@ -130,7 +130,7 @@ export function Transition({
|
|
|
130
130
|
data-layout={layout}
|
|
131
131
|
data-animate-size={animateSize || undefined}
|
|
132
132
|
className={cn(
|
|
133
|
-
`gds-transition
|
|
133
|
+
`gds-transition
|
|
134
134
|
u:state-[transition=idle]
|
|
135
135
|
u:has-[>*>*>[inert]]:state-[transition=running]
|
|
136
136
|
u:has-[>*>*>[inert]]:data-[animate-size=clip]:overflow-clip
|
|
@@ -7,7 +7,6 @@ export {
|
|
|
7
7
|
type ButtonOrLinkProps,
|
|
8
8
|
type ButtonOrLinkState,
|
|
9
9
|
} from './ButtonOrLink.tsx'
|
|
10
|
-
export { ButtonOrLinkMeta } from './ButtonOrLink.meta.ts'
|
|
11
10
|
export {
|
|
12
11
|
Checkable,
|
|
13
12
|
type CheckableLabelProps,
|
|
@@ -19,6 +18,13 @@ export { Field, type FieldProps, type FieldState } from './Field.tsx'
|
|
|
19
18
|
export { FieldMeta } from './Field.meta.ts'
|
|
20
19
|
export { MaybeButtonOrLink, type MaybeButtonOrLinkProps } from './MaybeButtonOrLink.tsx'
|
|
21
20
|
export { Portal } from './Portal.tsx'
|
|
22
|
-
export {
|
|
21
|
+
export {
|
|
22
|
+
Render,
|
|
23
|
+
type RenderFnProps,
|
|
24
|
+
type RenderFnState,
|
|
25
|
+
type RenderFn,
|
|
26
|
+
type RenderProp,
|
|
27
|
+
type RenderProps,
|
|
28
|
+
} from './Render.tsx'
|
|
23
29
|
export { Transition, type TransitionProps } from './Transition.tsx'
|
|
24
30
|
export { TransitionMeta } from './Transition.meta.ts'
|
package/src/components/index.ts
CHANGED
|
@@ -97,8 +97,7 @@ export { ToggleButton, type ToggleButtonProps } from './ToggleButton.tsx'
|
|
|
97
97
|
export { ToggleButtonMeta } from './ToggleButton.meta.ts'
|
|
98
98
|
export {
|
|
99
99
|
Tooltip,
|
|
100
|
-
|
|
101
|
-
useCollectedTooltip,
|
|
100
|
+
useTooltipCollector,
|
|
102
101
|
type TooltipProps,
|
|
103
102
|
type TooltipCollectorProps,
|
|
104
103
|
type TooltipContentProps,
|
package/src/hooks/index.ts
CHANGED
|
@@ -12,6 +12,7 @@ export { useCSSProps } from './useCSSProps.ts'
|
|
|
12
12
|
export { useCSSPropsPolyfill } from './useCSSPropsPolyfill.ts'
|
|
13
13
|
export { useCSSState } from './useCSSState.ts'
|
|
14
14
|
export { useEffectWithRefDeps } from './useEffectWithRefDeps.ts'
|
|
15
|
+
export { useFirstRender } from './useFirstRender.ts'
|
|
15
16
|
export { useForceRerender } from './useForceRerender.ts'
|
|
16
17
|
export { useMapWithInit } from './useMapWithInit.ts'
|
|
17
18
|
export {
|
package/src/hooks/useCSSProp.ts
CHANGED
|
@@ -21,17 +21,15 @@ export function useCSSProp<
|
|
|
21
21
|
const { ref: passedRef } = options
|
|
22
22
|
const elementRef = useRef<HTMLElement>(null)
|
|
23
23
|
const callbackRef: RefCallback<HTMLElement> | null = useMergedRefs(elementRef, passedRef)
|
|
24
|
-
const
|
|
24
|
+
const cssProp = component.getCSSPropByName(propName)
|
|
25
25
|
|
|
26
|
-
const
|
|
26
|
+
const getCSSPropValue = useCallback(async () => {
|
|
27
27
|
if (typeof window === 'undefined' || !elementRef.current) return null
|
|
28
28
|
const element = elementRef.current
|
|
29
29
|
const computedStyle = await styleScheduler.getComputedStyle(element)
|
|
30
|
-
const rawValue = computedStyle.getPropertyValue(
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
return parseCSSPropValue(prop, rawValue) as CSSPropType<ComponentCSSPropsConfig<C>[P]>
|
|
34
|
-
}, [component, prop])
|
|
30
|
+
const rawValue = computedStyle.getPropertyValue(cssProp.cssProperty)
|
|
31
|
+
return parseCSSPropValue(cssProp, rawValue) as CSSPropType<ComponentCSSPropsConfig<C>[P]>
|
|
32
|
+
}, [cssProp])
|
|
35
33
|
|
|
36
|
-
return [callbackRef,
|
|
34
|
+
return [callbackRef, getCSSPropValue] as const
|
|
37
35
|
}
|
package/src/hooks/useCSSProps.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Ref } from 'react'
|
|
2
|
-
import {
|
|
2
|
+
import { objectKeys } from 'ts-extras'
|
|
3
3
|
|
|
4
4
|
import {
|
|
5
5
|
parseCSSPropValue,
|
|
@@ -22,48 +22,39 @@ export type PropValues<P extends PassedValues<GDSComponent>> = {
|
|
|
22
22
|
|
|
23
23
|
/**
|
|
24
24
|
* Hook to observe and track CSS prop values from the DOM. Returns a callback ref, a map of prop
|
|
25
|
-
* values that updates when CSS properties change, and
|
|
25
|
+
* values that updates when CSS properties change, and the array of CSS props.
|
|
26
26
|
*/
|
|
27
27
|
export function useCSSProps<C extends GDSComponent, P extends PassedValues<C>>(
|
|
28
28
|
component: C,
|
|
29
29
|
passedValues: P,
|
|
30
30
|
options: {
|
|
31
31
|
ref?: Ref<HTMLElement> | undefined
|
|
32
|
-
disabled?: boolean
|
|
32
|
+
disabled?: boolean | undefined
|
|
33
33
|
} = {},
|
|
34
34
|
) {
|
|
35
35
|
const { ref, disabled = false } = options
|
|
36
36
|
|
|
37
|
-
const
|
|
38
|
-
|
|
39
|
-
const cssProp = component.getCSSPropByName(propName)
|
|
40
|
-
return {
|
|
41
|
-
name: propName,
|
|
42
|
-
passedValue,
|
|
43
|
-
cssProp,
|
|
44
|
-
cssProperty: `--gds-${component.kebabName}-${cssProp.kebabName}`,
|
|
45
|
-
polyfillAttribute: `data-gds-prop-polyfill-${cssProp.kebabName}`,
|
|
46
|
-
}
|
|
47
|
-
}),
|
|
37
|
+
const cssProps = useRefWithInit(() =>
|
|
38
|
+
objectKeys(passedValues).map((propName) => component.getCSSPropByName(propName)),
|
|
48
39
|
).current
|
|
49
40
|
|
|
50
41
|
const propValues = useMapWithInit(() =>
|
|
51
|
-
|
|
42
|
+
cssProps.map((cssProp) => {
|
|
52
43
|
// Using the initial value for missing passed values could be wrong because it can be overridden in CSS, but it's just for the first render
|
|
53
|
-
const
|
|
54
|
-
|
|
55
|
-
return [
|
|
44
|
+
const passedValue = passedValues[cssProp.name]
|
|
45
|
+
const initialValue = passedValue !== undefined ? passedValue : cssProp.initialValue
|
|
46
|
+
return [cssProp.name, initialValue]
|
|
56
47
|
}),
|
|
57
48
|
)
|
|
58
49
|
|
|
59
|
-
const cssProperties = useRefWithInit(() =>
|
|
50
|
+
const cssProperties = useRefWithInit(() => cssProps.map((cssProp) => cssProp.cssProperty)).current
|
|
60
51
|
|
|
61
52
|
const callbackRef = useStyleObserver(
|
|
62
53
|
cssProperties,
|
|
63
54
|
(records) => {
|
|
64
55
|
for (const record of records) {
|
|
65
|
-
const prop =
|
|
66
|
-
const value = parseCSSPropValue(prop
|
|
56
|
+
const prop = cssProps.find((prop) => prop.cssProperty === record.property)!
|
|
57
|
+
const value = parseCSSPropValue(prop, record.value)
|
|
67
58
|
if (propValues.get(prop.name) !== value) {
|
|
68
59
|
propValues.set(prop.name, value)
|
|
69
60
|
}
|
|
@@ -73,5 +64,5 @@ export function useCSSProps<C extends GDSComponent, P extends PassedValues<C>>(
|
|
|
73
64
|
{ ...(ref !== undefined && { ref }), immediate: true, disabled },
|
|
74
65
|
)
|
|
75
66
|
|
|
76
|
-
return [callbackRef, Object.fromEntries(propValues) as PropValues<P>,
|
|
67
|
+
return [callbackRef, Object.fromEntries(propValues) as PropValues<P>, cssProps] as const
|
|
77
68
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { Ref, RefCallback } from 'react'
|
|
2
2
|
|
|
3
3
|
import {
|
|
4
4
|
getCSSPropRawValue,
|
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
} from '@graphprotocol/gds-css'
|
|
10
10
|
|
|
11
11
|
import { useCSSProps, type PassedValues, type PropValues } from './useCSSProps.ts'
|
|
12
|
-
import {
|
|
12
|
+
import { useFirstRender } from './useFirstRender.ts'
|
|
13
13
|
|
|
14
14
|
type ExtractPolyfillValues<P extends CSSPropsConfig> = {
|
|
15
15
|
[K in keyof P as P[K]['type'] extends 'values' ? K : never]: CSSPropType<P[K]> | undefined
|
|
@@ -68,19 +68,21 @@ export function useCSSPropsPolyfill<
|
|
|
68
68
|
const allPassedValues = (() => {
|
|
69
69
|
if (!returnPropValues) return passedValues
|
|
70
70
|
if (returnPropValues === true) return passedValues
|
|
71
|
-
const
|
|
72
|
-
|
|
73
|
-
|
|
71
|
+
const passed = passedValues as Record<string, unknown>
|
|
72
|
+
const merged = { ...passed }
|
|
73
|
+
for (const key of Object.keys(returnPropValues)) {
|
|
74
|
+
const value = returnPropValues[key]
|
|
75
|
+
if (key in passedValues && passed[key] !== value) {
|
|
74
76
|
throw new Error(
|
|
75
|
-
`[useCSSPropsPolyfill] Conflicting values for prop \`${key}\`: ${
|
|
77
|
+
`[useCSSPropsPolyfill] Conflicting values for prop \`${key}\`: ${String(passed[key])} vs ${value}`,
|
|
76
78
|
)
|
|
77
79
|
}
|
|
78
|
-
merged[key
|
|
80
|
+
merged[key] = value
|
|
79
81
|
}
|
|
80
|
-
return merged
|
|
82
|
+
return merged as typeof passedValues
|
|
81
83
|
})()
|
|
82
84
|
|
|
83
|
-
const [callbackRef, propValues,
|
|
85
|
+
const [callbackRef, propValues, cssProps] = useCSSProps(component, allPassedValues, {
|
|
84
86
|
ref,
|
|
85
87
|
disabled: !polyfillEnabled && !returnPropValues,
|
|
86
88
|
})
|
|
@@ -92,30 +94,20 @@ export function useCSSPropsPolyfill<
|
|
|
92
94
|
* to immediately rerender in browsers that support style queries); unfortunately, that would
|
|
93
95
|
* cause a flash of missing styles in browsers that need the polyfill.
|
|
94
96
|
*/
|
|
95
|
-
const firstRender =
|
|
97
|
+
const firstRender = useFirstRender({ immediatelyRerender: !polyfillEnabled })
|
|
96
98
|
const polyfillAttributes =
|
|
97
|
-
polyfillEnabled || firstRender
|
|
99
|
+
polyfillEnabled || firstRender
|
|
98
100
|
? Object.fromEntries(
|
|
99
|
-
|
|
101
|
+
cssProps
|
|
100
102
|
.filter((prop) => prop.name in passedValues)
|
|
101
103
|
.map((prop) => {
|
|
102
104
|
const value = propValues[prop.name as keyof typeof propValues]
|
|
103
|
-
const rawValue = getCSSPropRawValue(prop
|
|
105
|
+
const rawValue = getCSSPropRawValue(prop, value)
|
|
104
106
|
return [prop.polyfillAttribute, rawValue]
|
|
105
107
|
}),
|
|
106
108
|
)
|
|
107
109
|
: {}
|
|
108
110
|
|
|
109
|
-
// If the polyfill is not needed, rerender to remove the polyfill attributes
|
|
110
|
-
const [rerender] = useForceRerender()
|
|
111
|
-
useLayoutEffect(() => {
|
|
112
|
-
firstRender.current = false
|
|
113
|
-
if (!polyfillEnabled) {
|
|
114
|
-
rerender()
|
|
115
|
-
}
|
|
116
|
-
// oxlint-disable-next-line exhaustive-deps
|
|
117
|
-
}, [])
|
|
118
|
-
|
|
119
111
|
if (!returnPropValues) {
|
|
120
112
|
return [callbackRef, polyfillAttributes] as const
|
|
121
113
|
}
|
package/src/hooks/useCSSState.ts
CHANGED
|
@@ -56,15 +56,17 @@ export function useCSSState<
|
|
|
56
56
|
|
|
57
57
|
const variables = useRefWithInit(() =>
|
|
58
58
|
Object.keys(variableInitialValues).map((variableName) => {
|
|
59
|
-
const
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
59
|
+
const isArbitrary = !(variableName in cssStateVariables)
|
|
60
|
+
const defaultValue = !isArbitrary
|
|
61
|
+
? cssStateVariables[variableName as CSSStateVariableName].defaultValue
|
|
62
|
+
: undefined
|
|
63
63
|
return {
|
|
64
64
|
name: variableName,
|
|
65
65
|
defaultValue,
|
|
66
66
|
initialValue: variableInitialValues[variableName as keyof T] ?? defaultValue,
|
|
67
|
-
observedProperty:
|
|
67
|
+
observedProperty: isArbitrary
|
|
68
|
+
? `--gds-state-${variableName}`
|
|
69
|
+
: `--gds-observed-${variableName}`,
|
|
68
70
|
exposedProperty: `--gds-exposed-${variableName}`,
|
|
69
71
|
exposedAttribute: `data-gds-exposed-${variableName}`,
|
|
70
72
|
polyfillAttribute: `data-gds-state-polyfill-${variableName}`,
|
|
@@ -105,7 +107,10 @@ export function useCSSState<
|
|
|
105
107
|
for (const record of records) {
|
|
106
108
|
if (propertyValues.get(record.property) !== record.value) {
|
|
107
109
|
propertyValues.set(record.property, record.value)
|
|
108
|
-
if (
|
|
110
|
+
if (
|
|
111
|
+
record.property.startsWith('--gds-state-') ||
|
|
112
|
+
record.property.startsWith('--gds-observed-')
|
|
113
|
+
) {
|
|
109
114
|
statePropertiesChanged = true
|
|
110
115
|
}
|
|
111
116
|
}
|