@graphprotocol/gds-react 0.1.1 → 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 +7 -11
- 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 +15 -23
- package/dist/components/Breadcrumbs.parts.js.map +1 -1
- package/dist/components/Button.d.ts.map +1 -1
- package/dist/components/Button.js +17 -12
- 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.js +1 -1
- package/dist/components/Card.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.d.ts +6 -0
- package/dist/components/Chip.d.ts.map +1 -0
- package/dist/components/Chip.js +5 -0
- package/dist/components/Chip.js.map +1 -0
- package/dist/components/Chip.meta.d.ts +15 -0
- package/dist/components/Chip.meta.d.ts.map +1 -0
- package/dist/components/Chip.meta.js +22 -0
- package/dist/components/Chip.meta.js.map +1 -0
- package/dist/components/Chip.parts.d.ts +52 -0
- package/dist/components/Chip.parts.d.ts.map +1 -0
- package/dist/components/Chip.parts.js +114 -0
- package/dist/components/Chip.parts.js.map +1 -0
- 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 +2 -1
- 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 +15 -31
- 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/TabSet.parts.js +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.d.ts +0 -2
- package/dist/components/ToggleButton.d.ts.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 +14 -10
- package/dist/components/base/ButtonOrLink.parts.d.ts.map +1 -1
- package/dist/components/base/ButtonOrLink.parts.js +47 -47
- 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 +3 -1
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +3 -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.d.ts.map +1 -1
- package/dist/tailwind-plugin.js +8 -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 +10 -11
- package/src/components/Breadcrumbs.meta.ts +3 -1
- package/src/components/Breadcrumbs.parts.tsx +18 -30
- package/src/components/Button.tsx +27 -13
- 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/Card.tsx +1 -1
- package/src/components/Checkbox.meta.ts +1 -5
- package/src/components/Chip.meta.ts +23 -0
- package/src/components/Chip.parts.tsx +319 -0
- package/src/components/Chip.tsx +7 -0
- 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 +2 -1
- 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 +40 -44
- 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/TabSet.parts.tsx +1 -1
- package/src/components/TextArea.meta.ts +1 -5
- package/src/components/ToggleButton.meta.ts +1 -6
- package/src/components/ToggleButton.tsx +1 -3
- package/src/components/Tooltip.meta.ts +13 -2
- package/src/components/Tooltip.parts.tsx +215 -159
- package/src/components/Tooltip.tsx +2 -2
- package/src/components/base/Addon.meta.ts +3 -1
- package/src/components/base/ButtonOrLink.parts.tsx +91 -73
- 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 +3 -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 +8 -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,26 +62,31 @@ 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
|
|
71
|
-
extends
|
|
70
|
+
extends
|
|
71
|
+
BaseProps,
|
|
72
|
+
DisableableProps,
|
|
73
|
+
Omit<ComponentProps<'button'>, 'defaultValue' | 'disabled'> {
|
|
72
74
|
href?: undefined
|
|
73
75
|
target?: undefined
|
|
74
76
|
checked?: undefined
|
|
77
|
+
defaultChecked?: undefined
|
|
75
78
|
}
|
|
76
|
-
interface ToggleButtonProps extends Omit<ButtonProps, 'checked'> {
|
|
77
|
-
/** Whether the button is in a
|
|
78
|
-
checked?: boolean |
|
|
79
|
+
interface ToggleButtonProps extends Omit<ButtonProps, 'checked' | 'defaultChecked'> {
|
|
80
|
+
/** Whether the button is in a pressed/selected state. */
|
|
81
|
+
checked?: boolean | undefined
|
|
82
|
+
defaultChecked?: boolean | undefined
|
|
79
83
|
}
|
|
80
|
-
interface LinkProps
|
|
84
|
+
interface LinkProps
|
|
85
|
+
extends BaseProps, DisableableProps, Omit<ComponentProps<'a'>, 'defaultValue'> {
|
|
81
86
|
href: string
|
|
82
87
|
type?: undefined
|
|
83
88
|
checked?: undefined
|
|
89
|
+
defaultChecked?: undefined
|
|
84
90
|
}
|
|
85
91
|
}
|
|
86
92
|
|
|
@@ -114,16 +120,19 @@ interface WithButtonOrLinkContextProps {
|
|
|
114
120
|
buttonOrLinkState: ButtonOrLinkState
|
|
115
121
|
}
|
|
116
122
|
|
|
117
|
-
|
|
123
|
+
type WithContextComponent<T extends ElementType> = (
|
|
124
|
+
props: Merge<ComponentProps<T>, WithButtonOrLinkContextProps>,
|
|
125
|
+
) => ReactElement
|
|
118
126
|
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
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> = ({
|
|
124
133
|
buttonOrLinkState,
|
|
125
134
|
...props
|
|
126
|
-
}
|
|
135
|
+
}) => (
|
|
127
136
|
<ButtonOrLinkContext.Provider value={buttonOrLinkState}>
|
|
128
137
|
<Element {...(props as ComponentProps<T>)} />
|
|
129
138
|
</ButtonOrLinkContext.Provider>
|
|
@@ -135,7 +144,7 @@ function withContext<T extends ElementType>(Element: T) {
|
|
|
135
144
|
const ButtonWithContext = withContext('button')
|
|
136
145
|
const SpanButtonWithContext = withContext(SpanButton)
|
|
137
146
|
const AnchorWithContext = withContext('a')
|
|
138
|
-
const RenderWithContext = withContext(Render
|
|
147
|
+
const RenderWithContext = withContext(Render)
|
|
139
148
|
|
|
140
149
|
interface ButtonOrLinkConfigContextValue {
|
|
141
150
|
onClick:
|
|
@@ -180,11 +189,22 @@ export const ButtonOrLinkRoot = (passedProps: InternalButtonOrLinkProps) => {
|
|
|
180
189
|
inline = false,
|
|
181
190
|
linkComponent: passedLinkComponent,
|
|
182
191
|
render,
|
|
183
|
-
onClick,
|
|
184
192
|
className: passedClassName,
|
|
185
193
|
children,
|
|
186
194
|
...nonBaseProps
|
|
187
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
|
+
|
|
188
208
|
const className = cn('gds-button-or-link', passedClassName)
|
|
189
209
|
|
|
190
210
|
if (props.href === undefined) {
|
|
@@ -192,11 +212,19 @@ export const ButtonOrLinkRoot = (passedProps: InternalButtonOrLinkProps) => {
|
|
|
192
212
|
role = 'button',
|
|
193
213
|
type = 'button',
|
|
194
214
|
checked,
|
|
215
|
+
defaultChecked,
|
|
195
216
|
href: _href,
|
|
196
217
|
target: _target,
|
|
197
218
|
...remainingProps
|
|
198
219
|
} = nonBaseProps
|
|
199
220
|
|
|
221
|
+
if (defaultChecked !== undefined) {
|
|
222
|
+
// oxlint-disable-next-line no-console
|
|
223
|
+
console.warn(
|
|
224
|
+
'[ButtonOrLink] `defaultChecked` is not supported; use a controlled `checked` prop instead, or wrap `ButtonOrLink` in a component that manages the uncontrolled state',
|
|
225
|
+
)
|
|
226
|
+
}
|
|
227
|
+
|
|
200
228
|
const Element = inline ? SpanButtonWithContext : ButtonWithContext
|
|
201
229
|
|
|
202
230
|
const state: ButtonOrLinkState = {
|
|
@@ -208,24 +236,25 @@ export const ButtonOrLinkRoot = (passedProps: InternalButtonOrLinkProps) => {
|
|
|
208
236
|
checked,
|
|
209
237
|
}
|
|
210
238
|
|
|
211
|
-
const checkedAttribute =
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
239
|
+
const checkedAttribute =
|
|
240
|
+
checked === undefined
|
|
241
|
+
? {}
|
|
242
|
+
: ((checked: unknown) => {
|
|
243
|
+
if (
|
|
244
|
+
(role === 'option' || role === 'tab' || role === 'row' || role === 'gridcell') &&
|
|
245
|
+
checked !== 'indeterminate'
|
|
246
|
+
) {
|
|
247
|
+
return { 'aria-selected': Boolean(checked) }
|
|
248
|
+
}
|
|
249
|
+
const checkedOrMixed =
|
|
250
|
+
checked === 'indeterminate' ? ('mixed' as const) : Boolean(checked)
|
|
251
|
+
if (role === 'button') {
|
|
252
|
+
return { 'aria-pressed': checkedOrMixed }
|
|
253
|
+
}
|
|
254
|
+
return { 'aria-checked': checkedOrMixed }
|
|
255
|
+
})(checked)
|
|
256
|
+
|
|
257
|
+
const buttonProps: ComponentProps<typeof Element> = {
|
|
229
258
|
role,
|
|
230
259
|
type: disabled === 'focusable' ? 'button' : type,
|
|
231
260
|
disabled: disabled === true,
|
|
@@ -234,11 +263,8 @@ export const ButtonOrLinkRoot = (passedProps: InternalButtonOrLinkProps) => {
|
|
|
234
263
|
className,
|
|
235
264
|
children,
|
|
236
265
|
buttonOrLinkState: state,
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
...buttonProps,
|
|
240
|
-
onClick: !disabled ? (onClick as typeof buttonProps.onClick) : undefined,
|
|
241
|
-
...(remainingProps as typeof buttonProps),
|
|
266
|
+
...(remainingProps as ComponentProps<'button'>),
|
|
267
|
+
...((disabled === 'focusable' || (disabled && inline)) && manuallyDisabledEventProps),
|
|
242
268
|
}
|
|
243
269
|
|
|
244
270
|
return render ? render(buttonProps, state) : <Element {...buttonProps} />
|
|
@@ -251,6 +277,7 @@ export const ButtonOrLinkRoot = (passedProps: InternalButtonOrLinkProps) => {
|
|
|
251
277
|
rel = target === '_blank' ? 'noopener noreferrer' : undefined,
|
|
252
278
|
type: _type,
|
|
253
279
|
checked: _checked,
|
|
280
|
+
defaultChecked: _defaultChecked,
|
|
254
281
|
...remainingProps
|
|
255
282
|
} = nonBaseProps
|
|
256
283
|
|
|
@@ -263,26 +290,16 @@ export const ButtonOrLinkRoot = (passedProps: InternalButtonOrLinkProps) => {
|
|
|
263
290
|
target,
|
|
264
291
|
}
|
|
265
292
|
|
|
266
|
-
let linkProps: ComponentProps<'a'> =
|
|
267
|
-
?
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
href,
|
|
277
|
-
target,
|
|
278
|
-
rel,
|
|
279
|
-
className,
|
|
280
|
-
children,
|
|
281
|
-
}
|
|
282
|
-
linkProps = {
|
|
283
|
-
...linkProps,
|
|
284
|
-
onClick: !disabled ? (onClick as typeof linkProps.onClick) : undefined,
|
|
285
|
-
...(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),
|
|
286
303
|
}
|
|
287
304
|
|
|
288
305
|
let linkComponent: ElementType | ReactElement | null = null
|
|
@@ -408,16 +425,17 @@ function SpanButton({
|
|
|
408
425
|
isDisabled: disabled,
|
|
409
426
|
elementType: 'span',
|
|
410
427
|
onPress: (event) => {
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
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
|
+
)
|
|
421
439
|
},
|
|
422
440
|
onPressStart: (event) => {
|
|
423
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
|
@@ -14,6 +14,8 @@ export { ButtonGroup, type ButtonGroupProps } from './ButtonGroup.tsx'
|
|
|
14
14
|
export { ButtonGroupMeta } from './ButtonGroup.meta.ts'
|
|
15
15
|
export { Card, type CardProps } from './Card.tsx'
|
|
16
16
|
export { CardMeta } from './Card.meta.ts'
|
|
17
|
+
export { Chip, type ChipProps, type ChipGroupProps } from './Chip.tsx'
|
|
18
|
+
export { ChipMeta, ChipGroupMeta } from './Chip.meta.ts'
|
|
17
19
|
export { Cluster, type ClusterProps } from './Cluster.tsx'
|
|
18
20
|
export { ClusterMeta } from './Cluster.meta.ts'
|
|
19
21
|
export { CodeBlock, type CodeBlockProps, type CodeBlockTabsProps } from './CodeBlock.tsx'
|
|
@@ -95,8 +97,7 @@ export { ToggleButton, type ToggleButtonProps } from './ToggleButton.tsx'
|
|
|
95
97
|
export { ToggleButtonMeta } from './ToggleButton.meta.ts'
|
|
96
98
|
export {
|
|
97
99
|
Tooltip,
|
|
98
|
-
|
|
99
|
-
useCollectedTooltip,
|
|
100
|
+
useTooltipCollector,
|
|
100
101
|
type TooltipProps,
|
|
101
102
|
type TooltipCollectorProps,
|
|
102
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
|
}
|