@dxos/react-ui 0.1.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/LICENSE +21 -0
- package/README.md +68 -0
- package/dist/src/components/Alert/Alert.d.ts +10 -0
- package/dist/src/components/Alert/Alert.d.ts.map +1 -0
- package/dist/src/components/Alert/Alert.js +21 -0
- package/dist/src/components/Alert/Alert.js.map +1 -0
- package/dist/src/components/Alert/Alert.stories.d.ts +9 -0
- package/dist/src/components/Alert/Alert.stories.d.ts.map +1 -0
- package/dist/src/components/Alert/Alert.stories.js +30 -0
- package/dist/src/components/Alert/Alert.stories.js.map +1 -0
- package/dist/src/components/Alert/index.d.ts +2 -0
- package/dist/src/components/Alert/index.d.ts.map +1 -0
- package/dist/src/components/Alert/index.js +21 -0
- package/dist/src/components/Alert/index.js.map +1 -0
- package/dist/src/components/AlertDialog/AlertDialog.d.ts +17 -0
- package/dist/src/components/AlertDialog/AlertDialog.d.ts.map +1 -0
- package/dist/src/components/AlertDialog/AlertDialog.js +65 -0
- package/dist/src/components/AlertDialog/AlertDialog.js.map +1 -0
- package/dist/src/components/AlertDialog/AlertDialog.stories.d.ts +9 -0
- package/dist/src/components/AlertDialog/AlertDialog.stories.d.ts.map +1 -0
- package/dist/src/components/AlertDialog/AlertDialog.stories.js +37 -0
- package/dist/src/components/AlertDialog/AlertDialog.stories.js.map +1 -0
- package/dist/src/components/AlertDialog/index.d.ts +2 -0
- package/dist/src/components/AlertDialog/index.d.ts.map +1 -0
- package/dist/src/components/AlertDialog/index.js +21 -0
- package/dist/src/components/AlertDialog/index.js.map +1 -0
- package/dist/src/components/Avatar/Avatar.d.ts +13 -0
- package/dist/src/components/Avatar/Avatar.d.ts.map +1 -0
- package/dist/src/components/Avatar/Avatar.js +53 -0
- package/dist/src/components/Avatar/Avatar.js.map +1 -0
- package/dist/src/components/Avatar/Avatar.stories.d.ts +10 -0
- package/dist/src/components/Avatar/Avatar.stories.d.ts.map +1 -0
- package/dist/src/components/Avatar/Avatar.stories.js +30 -0
- package/dist/src/components/Avatar/Avatar.stories.js.map +1 -0
- package/dist/src/components/Avatar/index.d.ts +2 -0
- package/dist/src/components/Avatar/index.d.ts.map +1 -0
- package/dist/src/components/Avatar/index.js +21 -0
- package/dist/src/components/Avatar/index.js.map +1 -0
- package/dist/src/components/Button/Button.d.ts +4 -0
- package/dist/src/components/Button/Button.d.ts.map +1 -0
- package/dist/src/components/Button/Button.js +37 -0
- package/dist/src/components/Button/Button.js.map +1 -0
- package/dist/src/components/Button/Button.stories.d.ts +12 -0
- package/dist/src/components/Button/Button.stories.d.ts.map +1 -0
- package/dist/src/components/Button/Button.stories.js +31 -0
- package/dist/src/components/Button/Button.stories.js.map +1 -0
- package/dist/src/components/Button/ButtonProps.d.ts +8 -0
- package/dist/src/components/Button/ButtonProps.d.ts.map +1 -0
- package/dist/src/components/Button/ButtonProps.js +6 -0
- package/dist/src/components/Button/ButtonProps.js.map +1 -0
- package/dist/src/components/Button/buttonStyles.d.ts +5 -0
- package/dist/src/components/Button/buttonStyles.d.ts.map +1 -0
- package/dist/src/components/Button/buttonStyles.js +24 -0
- package/dist/src/components/Button/buttonStyles.js.map +1 -0
- package/dist/src/components/Button/index.d.ts +4 -0
- package/dist/src/components/Button/index.d.ts.map +1 -0
- package/dist/src/components/Button/index.js +23 -0
- package/dist/src/components/Button/index.js.map +1 -0
- package/dist/src/components/CompoundButton/CompoundButton.d.ts +10 -0
- package/dist/src/components/CompoundButton/CompoundButton.d.ts.map +1 -0
- package/dist/src/components/CompoundButton/CompoundButton.js +27 -0
- package/dist/src/components/CompoundButton/CompoundButton.js.map +1 -0
- package/dist/src/components/CompoundButton/CompoundButton.stories.d.ts +10 -0
- package/dist/src/components/CompoundButton/CompoundButton.stories.d.ts.map +1 -0
- package/dist/src/components/CompoundButton/CompoundButton.stories.js +40 -0
- package/dist/src/components/CompoundButton/CompoundButton.stories.js.map +1 -0
- package/dist/src/components/CompoundButton/index.d.ts +2 -0
- package/dist/src/components/CompoundButton/index.d.ts.map +1 -0
- package/dist/src/components/CompoundButton/index.js +21 -0
- package/dist/src/components/CompoundButton/index.js.map +1 -0
- package/dist/src/components/Dialog/Dialog.d.ts +14 -0
- package/dist/src/components/Dialog/Dialog.d.ts.map +1 -0
- package/dist/src/components/Dialog/Dialog.js +59 -0
- package/dist/src/components/Dialog/Dialog.js.map +1 -0
- package/dist/src/components/Dialog/Dialog.stories.d.ts +9 -0
- package/dist/src/components/Dialog/Dialog.stories.d.ts.map +1 -0
- package/dist/src/components/Dialog/Dialog.stories.js +37 -0
- package/dist/src/components/Dialog/Dialog.stories.js.map +1 -0
- package/dist/src/components/Dialog/index.d.ts +2 -0
- package/dist/src/components/Dialog/index.d.ts.map +1 -0
- package/dist/src/components/Dialog/index.js +21 -0
- package/dist/src/components/Dialog/index.js.map +1 -0
- package/dist/src/components/Group/Group.d.ts +10 -0
- package/dist/src/components/Group/Group.d.ts.map +1 -0
- package/dist/src/components/Group/Group.js +22 -0
- package/dist/src/components/Group/Group.js.map +1 -0
- package/dist/src/components/Group/Group.stories.d.ts +9 -0
- package/dist/src/components/Group/Group.stories.d.ts.map +1 -0
- package/dist/src/components/Group/Group.stories.js +27 -0
- package/dist/src/components/Group/Group.stories.js.map +1 -0
- package/dist/src/components/Group/index.d.ts +2 -0
- package/dist/src/components/Group/index.d.ts.map +1 -0
- package/dist/src/components/Group/index.js +21 -0
- package/dist/src/components/Group/index.js.map +1 -0
- package/dist/src/components/Heading/Heading.d.ts +266 -0
- package/dist/src/components/Heading/Heading.d.ts.map +1 -0
- package/dist/src/components/Heading/Heading.js +28 -0
- package/dist/src/components/Heading/Heading.js.map +1 -0
- package/dist/src/components/Heading/Heading.stories.d.ts +274 -0
- package/dist/src/components/Heading/Heading.stories.d.ts.map +1 -0
- package/dist/src/components/Heading/Heading.stories.js +34 -0
- package/dist/src/components/Heading/Heading.stories.js.map +1 -0
- package/dist/src/components/Heading/index.d.ts +2 -0
- package/dist/src/components/Heading/index.d.ts.map +1 -0
- package/dist/src/components/Heading/index.js +21 -0
- package/dist/src/components/Heading/index.js.map +1 -0
- package/dist/src/components/Input/Input.d.ts +17 -0
- package/dist/src/components/Input/Input.d.ts.map +1 -0
- package/dist/src/components/Input/Input.js +70 -0
- package/dist/src/components/Input/Input.js.map +1 -0
- package/dist/src/components/Input/Input.stories.d.ts +23 -0
- package/dist/src/components/Input/Input.stories.d.ts.map +1 -0
- package/dist/src/components/Input/Input.stories.js +73 -0
- package/dist/src/components/Input/Input.stories.js.map +1 -0
- package/dist/src/components/Input/index.d.ts +2 -0
- package/dist/src/components/Input/index.d.ts.map +1 -0
- package/dist/src/components/Input/index.js +21 -0
- package/dist/src/components/Input/index.js.map +1 -0
- package/dist/src/components/Loading/Loading.d.ts +12 -0
- package/dist/src/components/Loading/Loading.d.ts.map +1 -0
- package/dist/src/components/Loading/Loading.js +29 -0
- package/dist/src/components/Loading/Loading.js.map +1 -0
- package/dist/src/components/Loading/Loading.stories.d.ts +25 -0
- package/dist/src/components/Loading/Loading.stories.d.ts.map +1 -0
- package/dist/src/components/Loading/Loading.stories.js +39 -0
- package/dist/src/components/Loading/Loading.stories.js.map +1 -0
- package/dist/src/components/Loading/index.d.ts +2 -0
- package/dist/src/components/Loading/index.d.ts.map +1 -0
- package/dist/src/components/Loading/index.js +21 -0
- package/dist/src/components/Loading/index.js.map +1 -0
- package/dist/src/components/NavMenu/NavMenu.d.ts +31 -0
- package/dist/src/components/NavMenu/NavMenu.d.ts.map +1 -0
- package/dist/src/components/NavMenu/NavMenu.js +71 -0
- package/dist/src/components/NavMenu/NavMenu.js.map +1 -0
- package/dist/src/components/NavMenu/NavMenu.stories.d.ts +9 -0
- package/dist/src/components/NavMenu/NavMenu.stories.d.ts.map +1 -0
- package/dist/src/components/NavMenu/NavMenu.stories.js +50 -0
- package/dist/src/components/NavMenu/NavMenu.stories.js.map +1 -0
- package/dist/src/components/NavMenu/index.d.ts +2 -0
- package/dist/src/components/NavMenu/index.d.ts.map +1 -0
- package/dist/src/components/NavMenu/index.js +21 -0
- package/dist/src/components/NavMenu/index.js.map +1 -0
- package/dist/src/components/Popover/Popover.d.ts +11 -0
- package/dist/src/components/Popover/Popover.d.ts.map +1 -0
- package/dist/src/components/Popover/Popover.js +56 -0
- package/dist/src/components/Popover/Popover.js.map +1 -0
- package/dist/src/components/Popover/Popover.stories.d.ts +10 -0
- package/dist/src/components/Popover/Popover.stories.d.ts.map +1 -0
- package/dist/src/components/Popover/Popover.stories.js +39 -0
- package/dist/src/components/Popover/Popover.stories.js.map +1 -0
- package/dist/src/components/Popover/index.d.ts +2 -0
- package/dist/src/components/Popover/index.d.ts.map +1 -0
- package/dist/src/components/Popover/index.js +21 -0
- package/dist/src/components/Popover/index.js.map +1 -0
- package/dist/src/components/QrCode/QrCode.d.ts +11 -0
- package/dist/src/components/QrCode/QrCode.d.ts.map +1 -0
- package/dist/src/components/QrCode/QrCode.js +51 -0
- package/dist/src/components/QrCode/QrCode.js.map +1 -0
- package/dist/src/components/QrCode/QrCode.stories.d.ts +9 -0
- package/dist/src/components/QrCode/QrCode.stories.d.ts.map +1 -0
- package/dist/src/components/QrCode/QrCode.stories.js +29 -0
- package/dist/src/components/QrCode/QrCode.stories.js.map +1 -0
- package/dist/src/components/QrCode/index.d.ts +2 -0
- package/dist/src/components/QrCode/index.d.ts.map +1 -0
- package/dist/src/components/QrCode/index.js +21 -0
- package/dist/src/components/QrCode/index.js.map +1 -0
- package/dist/src/components/Tag/Tag.d.ts +8 -0
- package/dist/src/components/Tag/Tag.d.ts.map +1 -0
- package/dist/src/components/Tag/Tag.js +23 -0
- package/dist/src/components/Tag/Tag.js.map +1 -0
- package/dist/src/components/Tag/Tag.stories.d.ts +10 -0
- package/dist/src/components/Tag/Tag.stories.d.ts.map +1 -0
- package/dist/src/components/Tag/Tag.stories.js +24 -0
- package/dist/src/components/Tag/Tag.stories.js.map +1 -0
- package/dist/src/components/Tag/index.d.ts +2 -0
- package/dist/src/components/Tag/index.d.ts.map +1 -0
- package/dist/src/components/Tag/index.js +21 -0
- package/dist/src/components/Tag/index.js.map +1 -0
- package/dist/src/components/Toast/Toast.d.ts +16 -0
- package/dist/src/components/Toast/Toast.d.ts.map +1 -0
- package/dist/src/components/Toast/Toast.js +54 -0
- package/dist/src/components/Toast/Toast.js.map +1 -0
- package/dist/src/components/Toast/Toast.stories.d.ts +9 -0
- package/dist/src/components/Toast/Toast.stories.d.ts.map +1 -0
- package/dist/src/components/Toast/Toast.stories.js +32 -0
- package/dist/src/components/Toast/Toast.stories.js.map +1 -0
- package/dist/src/components/Toast/index.d.ts +2 -0
- package/dist/src/components/Toast/index.d.ts.map +1 -0
- package/dist/src/components/Toast/index.js +21 -0
- package/dist/src/components/Toast/index.js.map +1 -0
- package/dist/src/components/Tooltip/Tooltip.d.ts +10 -0
- package/dist/src/components/Tooltip/Tooltip.d.ts.map +1 -0
- package/dist/src/components/Tooltip/Tooltip.js +50 -0
- package/dist/src/components/Tooltip/Tooltip.js.map +1 -0
- package/dist/src/components/Tooltip/Tooltip.stories.d.ts +9 -0
- package/dist/src/components/Tooltip/Tooltip.stories.d.ts.map +1 -0
- package/dist/src/components/Tooltip/Tooltip.stories.js +30 -0
- package/dist/src/components/Tooltip/Tooltip.stories.js.map +1 -0
- package/dist/src/components/Tooltip/index.d.ts +2 -0
- package/dist/src/components/Tooltip/index.d.ts.map +1 -0
- package/dist/src/components/Tooltip/index.js +21 -0
- package/dist/src/components/Tooltip/index.js.map +1 -0
- package/dist/src/components/UiProvider/UiProvider.d.ts +10 -0
- package/dist/src/components/UiProvider/UiProvider.d.ts.map +1 -0
- package/dist/src/components/UiProvider/UiProvider.js +21 -0
- package/dist/src/components/UiProvider/UiProvider.js.map +1 -0
- package/dist/src/components/UiProvider/index.d.ts +2 -0
- package/dist/src/components/UiProvider/index.d.ts.map +1 -0
- package/dist/src/components/UiProvider/index.js +21 -0
- package/dist/src/components/UiProvider/index.js.map +1 -0
- package/dist/src/components/index.d.ts +18 -0
- package/dist/src/components/index.d.ts.map +1 -0
- package/dist/src/components/index.js +37 -0
- package/dist/src/components/index.js.map +1 -0
- package/dist/src/hooks/index.d.ts +2 -0
- package/dist/src/hooks/index.d.ts.map +1 -0
- package/dist/src/hooks/index.js +21 -0
- package/dist/src/hooks/index.js.map +1 -0
- package/dist/src/hooks/useId.d.ts +2 -0
- package/dist/src/hooks/useId.d.ts.map +1 -0
- package/dist/src/hooks/useId.js +19 -0
- package/dist/src/hooks/useId.js.map +1 -0
- package/dist/src/index.d.ts +5 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +24 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/plugin.d.ts +9 -0
- package/dist/src/plugin.d.ts.map +1 -0
- package/dist/src/plugin.js +268 -0
- package/dist/src/plugin.js.map +1 -0
- package/dist/src/props/Elevation.d.ts +2 -0
- package/dist/src/props/Elevation.d.ts.map +1 -0
- package/dist/src/props/Elevation.js +6 -0
- package/dist/src/props/Elevation.js.map +1 -0
- package/dist/src/props/MessageValence.d.ts +2 -0
- package/dist/src/props/MessageValence.d.ts.map +1 -0
- package/dist/src/props/MessageValence.js +6 -0
- package/dist/src/props/MessageValence.js.map +1 -0
- package/dist/src/props/Size.d.ts +2 -0
- package/dist/src/props/Size.d.ts.map +1 -0
- package/dist/src/props/Size.js +6 -0
- package/dist/src/props/Size.js.map +1 -0
- package/dist/src/props/index.d.ts +4 -0
- package/dist/src/props/index.d.ts.map +1 -0
- package/dist/src/props/index.js +23 -0
- package/dist/src/props/index.js.map +1 -0
- package/dist/src/styles/active.d.ts +2 -0
- package/dist/src/styles/active.d.ts.map +1 -0
- package/dist/src/styles/active.js +12 -0
- package/dist/src/styles/active.js.map +1 -0
- package/dist/src/styles/disabled.d.ts +2 -0
- package/dist/src/styles/disabled.d.ts.map +1 -0
- package/dist/src/styles/disabled.js +8 -0
- package/dist/src/styles/disabled.js.map +1 -0
- package/dist/src/styles/focus.d.ts +2 -0
- package/dist/src/styles/focus.d.ts.map +1 -0
- package/dist/src/styles/focus.js +8 -0
- package/dist/src/styles/focus.js.map +1 -0
- package/dist/src/styles/group.d.ts +5 -0
- package/dist/src/styles/group.d.ts.map +1 -0
- package/dist/src/styles/group.js +26 -0
- package/dist/src/styles/group.js.map +1 -0
- package/dist/src/styles/hover.d.ts +4 -0
- package/dist/src/styles/hover.d.ts.map +1 -0
- package/dist/src/styles/hover.js +12 -0
- package/dist/src/styles/hover.js.map +1 -0
- package/dist/src/styles/index.d.ts +10 -0
- package/dist/src/styles/index.d.ts.map +1 -0
- package/dist/src/styles/index.js +29 -0
- package/dist/src/styles/index.js.map +1 -0
- package/dist/src/styles/ornament.d.ts +3 -0
- package/dist/src/styles/ornament.d.ts.map +1 -0
- package/dist/src/styles/ornament.js +9 -0
- package/dist/src/styles/ornament.js.map +1 -0
- package/dist/src/styles/size.d.ts +7 -0
- package/dist/src/styles/size.d.ts.map +1 -0
- package/dist/src/styles/size.js +89 -0
- package/dist/src/styles/size.js.map +1 -0
- package/dist/src/styles/text.d.ts +5 -0
- package/dist/src/styles/text.d.ts.map +1 -0
- package/dist/src/styles/text.js +11 -0
- package/dist/src/styles/text.js.map +1 -0
- package/dist/src/styles/valence.d.ts +19 -0
- package/dist/src/styles/valence.d.ts.map +1 -0
- package/dist/src/styles/valence.js +66 -0
- package/dist/src/styles/valence.js.map +1 -0
- package/dist/src/testing/index.d.ts +2 -0
- package/dist/src/testing/index.d.ts.map +1 -0
- package/dist/src/testing/index.js +21 -0
- package/dist/src/testing/index.js.map +1 -0
- package/dist/src/testing/templateForComponent.d.ts +4 -0
- package/dist/src/testing/templateForComponent.d.ts.map +1 -0
- package/dist/src/testing/templateForComponent.js +18 -0
- package/dist/src/testing/templateForComponent.js.map +1 -0
- package/dist/src/theme.css +62 -0
- package/package.json +55 -0
- package/src/components/Alert/Alert.stories.tsx +31 -0
- package/src/components/Alert/Alert.tsx +34 -0
- package/src/components/Alert/index.ts +5 -0
- package/src/components/Avatar/Avatar.stories.tsx +29 -0
- package/src/components/Avatar/Avatar.tsx +82 -0
- package/src/components/Avatar/index.ts +5 -0
- package/src/components/Button/Button.stories.tsx +43 -0
- package/src/components/Button/Button.tsx +20 -0
- package/src/components/Button/ButtonProps.ts +10 -0
- package/src/components/Button/buttonStyles.ts +32 -0
- package/src/components/Button/index.ts +7 -0
- package/src/components/CompoundButton/CompoundButton.stories.tsx +46 -0
- package/src/components/CompoundButton/CompoundButton.tsx +53 -0
- package/src/components/CompoundButton/index.ts +5 -0
- package/src/components/Dialog/Dialog.stories.tsx +37 -0
- package/src/components/Dialog/Dialog.tsx +124 -0
- package/src/components/Dialog/index.ts +5 -0
- package/src/components/Group/Group.stories.tsx +25 -0
- package/src/components/Group/Group.tsx +48 -0
- package/src/components/Group/index.ts +5 -0
- package/src/components/Heading/Heading.stories.tsx +29 -0
- package/src/components/Heading/Heading.tsx +28 -0
- package/src/components/Heading/index.ts +5 -0
- package/src/components/Input/Input.stories.tsx +91 -0
- package/src/components/Input/Input.tsx +132 -0
- package/src/components/Input/index.ts +5 -0
- package/src/components/Loading/Loading.stories.tsx +34 -0
- package/src/components/Loading/Loading.tsx +59 -0
- package/src/components/Loading/index.ts +5 -0
- package/src/components/Main/Main.tsx +14 -0
- package/src/components/Main/index.ts +5 -0
- package/src/components/NavMenu/NavMenu.stories.tsx +54 -0
- package/src/components/NavMenu/NavMenu.tsx +180 -0
- package/src/components/NavMenu/index.ts +5 -0
- package/src/components/Popover/Popover.stories.tsx +45 -0
- package/src/components/Popover/Popover.tsx +76 -0
- package/src/components/Popover/index.ts +5 -0
- package/src/components/QrCode/QrCode.stories.tsx +27 -0
- package/src/components/QrCode/QrCode.tsx +42 -0
- package/src/components/QrCode/index.ts +5 -0
- package/src/components/Toast/Toast.stories.tsx +31 -0
- package/src/components/Toast/Toast.tsx +84 -0
- package/src/components/Toast/index.ts +5 -0
- package/src/components/Tooltip/Tooltip.stories.tsx +28 -0
- package/src/components/Tooltip/Tooltip.tsx +57 -0
- package/src/components/Tooltip/index.ts +5 -0
- package/src/components/UiProvider/UiProvider.tsx +44 -0
- package/src/components/UiProvider/index.ts +5 -0
- package/src/components/index.ts +20 -0
- package/src/hooks/index.ts +5 -0
- package/src/hooks/useId.ts +21 -0
- package/src/index.ts +8 -0
- package/src/plugin.ts +270 -0
- package/src/props/MessageValence.ts +5 -0
- package/src/props/Size.ts +40 -0
- package/src/props/index.ts +6 -0
- package/src/styles/active.ts +11 -0
- package/src/styles/disabled.ts +5 -0
- package/src/styles/focus.ts +6 -0
- package/src/styles/hover.ts +10 -0
- package/src/styles/index.ts +11 -0
- package/src/styles/size.ts +87 -0
- package/src/styles/text.ts +10 -0
- package/src/styles/valence.ts +71 -0
- package/src/testing/index.ts +5 -0
- package/src/testing/templateForComponent.tsx +16 -0
- package/src/theme.css +62 -0
- package/src/typings.d.ts +7 -0
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2022 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import * as PopoverPrimitive from '@radix-ui/react-popover';
|
|
6
|
+
import cx from 'classnames';
|
|
7
|
+
import { X } from 'phosphor-react';
|
|
8
|
+
import React, { ComponentProps, ReactNode, useCallback, useState } from 'react';
|
|
9
|
+
|
|
10
|
+
import { defaultFocus, defaultHover } from '../../styles';
|
|
11
|
+
|
|
12
|
+
export interface PopoverProps extends Omit<ComponentProps<typeof PopoverPrimitive.Content>, 'children'> {
|
|
13
|
+
openTrigger: ReactNode;
|
|
14
|
+
children: ReactNode;
|
|
15
|
+
closeLabel?: string;
|
|
16
|
+
initiallyOpen?: boolean;
|
|
17
|
+
mountAsSibling?: boolean;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
type KeyUpEvent = Parameters<Exclude<ComponentProps<typeof PopoverPrimitive.Trigger>['onKeyUp'], undefined>>[0];
|
|
21
|
+
|
|
22
|
+
export const Popover = ({
|
|
23
|
+
openTrigger,
|
|
24
|
+
children,
|
|
25
|
+
closeLabel,
|
|
26
|
+
initiallyOpen,
|
|
27
|
+
mountAsSibling,
|
|
28
|
+
...contentProps
|
|
29
|
+
}: PopoverProps) => {
|
|
30
|
+
const [isOpen, setIsOpen] = useState(!!initiallyOpen);
|
|
31
|
+
const onKeyUp = useCallback((e: KeyUpEvent) => {
|
|
32
|
+
const keyUpId = (document.activeElement as HTMLElement).dataset.keyupid;
|
|
33
|
+
if (keyUpId && e.key === ' ') {
|
|
34
|
+
setIsOpen(keyUpId === 'open');
|
|
35
|
+
}
|
|
36
|
+
}, []);
|
|
37
|
+
|
|
38
|
+
const popoverContent = (
|
|
39
|
+
<PopoverPrimitive.Content
|
|
40
|
+
align='center'
|
|
41
|
+
{...contentProps}
|
|
42
|
+
className={cx(
|
|
43
|
+
'radix-side-top:animate-slide-up radix-side-bottom:animate-slide-down',
|
|
44
|
+
'rounded-lg p-4 shadow-xl elevated-buttons',
|
|
45
|
+
'bg-white dark:bg-neutral-800',
|
|
46
|
+
defaultFocus,
|
|
47
|
+
contentProps.className
|
|
48
|
+
)}
|
|
49
|
+
>
|
|
50
|
+
<PopoverPrimitive.Arrow className='fill-current text-white dark:text-neutral-800' />
|
|
51
|
+
{children}
|
|
52
|
+
{closeLabel && (
|
|
53
|
+
<PopoverPrimitive.Close
|
|
54
|
+
className={cx(
|
|
55
|
+
'absolute top-3.5 right-3.5 inline-flex items-center justify-center rounded-sm p-1',
|
|
56
|
+
defaultFocus,
|
|
57
|
+
defaultHover({})
|
|
58
|
+
)}
|
|
59
|
+
aria-label={closeLabel}
|
|
60
|
+
data-keyupid='close'
|
|
61
|
+
>
|
|
62
|
+
<X className='h-4 w-4 text-neutral-500 hover:text-neutral-700 dark:text-neutral-500 dark:hover:text-neutral-400' />
|
|
63
|
+
</PopoverPrimitive.Close>
|
|
64
|
+
)}
|
|
65
|
+
</PopoverPrimitive.Content>
|
|
66
|
+
);
|
|
67
|
+
|
|
68
|
+
return (
|
|
69
|
+
<PopoverPrimitive.Root open={isOpen} onOpenChange={setIsOpen}>
|
|
70
|
+
<PopoverPrimitive.Trigger asChild onKeyUp={onKeyUp} data-keyupid='open'>
|
|
71
|
+
{openTrigger}
|
|
72
|
+
</PopoverPrimitive.Trigger>
|
|
73
|
+
{mountAsSibling ? popoverContent : <PopoverPrimitive.Portal>{popoverContent}</PopoverPrimitive.Portal>}
|
|
74
|
+
</PopoverPrimitive.Root>
|
|
75
|
+
);
|
|
76
|
+
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2022 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import '@dxosTheme';
|
|
6
|
+
import React from 'react';
|
|
7
|
+
|
|
8
|
+
import { templateForComponent } from '../../testing';
|
|
9
|
+
import { QrCode, QrCodeProps } from './QrCode';
|
|
10
|
+
|
|
11
|
+
export default {
|
|
12
|
+
title: 'react-ui/QrCode',
|
|
13
|
+
component: QrCode
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
const Template = (props: QrCodeProps) => {
|
|
17
|
+
return <QrCode {...props} />;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export const Default = templateForComponent(Template)({
|
|
21
|
+
value: '',
|
|
22
|
+
label: ''
|
|
23
|
+
});
|
|
24
|
+
Default.args = {
|
|
25
|
+
label: 'Click to copy this code’s value',
|
|
26
|
+
value: 'https://dxos.org'
|
|
27
|
+
};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2022 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import cx from 'classnames';
|
|
6
|
+
import { QRCodeSVG } from 'qrcode.react';
|
|
7
|
+
import React, { useCallback, ReactHTMLElement } from 'react';
|
|
8
|
+
|
|
9
|
+
import { useId } from '../../hooks';
|
|
10
|
+
import { Size } from '../../props';
|
|
11
|
+
import { getSize } from '../../styles';
|
|
12
|
+
import { Button, ButtonProps } from '../Button';
|
|
13
|
+
import { Tooltip, TooltipProps } from '../Tooltip';
|
|
14
|
+
|
|
15
|
+
export interface QrCodeProps
|
|
16
|
+
extends Omit<ButtonProps, 'onClick' | 'ref'>,
|
|
17
|
+
Pick<TooltipProps, 'side' | 'sideOffset' | 'collisionPadding'> {
|
|
18
|
+
value: string;
|
|
19
|
+
label: string | Omit<ReactHTMLElement<HTMLElement>, 'ref'>;
|
|
20
|
+
size?: Size;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export const QrCode = ({ value, label, size, side, sideOffset, collisionPadding, ...buttonProps }: QrCodeProps) => {
|
|
24
|
+
const labelId = useId('qr-label');
|
|
25
|
+
const copyValue = useCallback(() => {
|
|
26
|
+
void navigator.clipboard.writeText(value);
|
|
27
|
+
}, [value]);
|
|
28
|
+
return (
|
|
29
|
+
<Tooltip content={label} {...{ side, sideOffset, collisionPadding }}>
|
|
30
|
+
<Button
|
|
31
|
+
{...buttonProps}
|
|
32
|
+
className={cx('py-0 px-0 overflow-hidden', getSize(size ?? 32), buttonProps.className)}
|
|
33
|
+
onClick={copyValue}
|
|
34
|
+
>
|
|
35
|
+
<QRCodeSVG value={value} includeMargin role='none' className='w-full h-auto' />
|
|
36
|
+
<div id={labelId} className='sr-only'>
|
|
37
|
+
{label}
|
|
38
|
+
</div>
|
|
39
|
+
</Button>
|
|
40
|
+
</Tooltip>
|
|
41
|
+
);
|
|
42
|
+
};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2022 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import '@dxosTheme';
|
|
6
|
+
import React from 'react';
|
|
7
|
+
|
|
8
|
+
import { templateForComponent } from '../../testing';
|
|
9
|
+
import { Button } from '../Button';
|
|
10
|
+
import { Toast, ToastProps } from './Toast';
|
|
11
|
+
|
|
12
|
+
export default {
|
|
13
|
+
title: 'react-ui/Toast',
|
|
14
|
+
component: Toast
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
const Template = ({ ...props }: ToastProps) => {
|
|
18
|
+
return <Toast {...props} />;
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
export const Default = templateForComponent(Template)({
|
|
22
|
+
title: ''
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
Default.args = {
|
|
26
|
+
openTrigger: 'Open toast',
|
|
27
|
+
title: 'Hi, this is a toast',
|
|
28
|
+
description: 'This goes away on its own with a timer.',
|
|
29
|
+
actionTriggers: [{ altText: 'Press F5 to reload the page', trigger: <Button>Reload</Button> }],
|
|
30
|
+
closeTrigger: <Button>Close</Button>
|
|
31
|
+
};
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2022 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import * as ToastPrimitive from '@radix-ui/react-toast';
|
|
6
|
+
import cx from 'classnames';
|
|
7
|
+
import React, { cloneElement, ComponentProps, ReactHTMLElement, ReactNode, useState } from 'react';
|
|
8
|
+
|
|
9
|
+
import { defaultDescription, defaultFocus } from '../../styles';
|
|
10
|
+
import { Button } from '../Button';
|
|
11
|
+
|
|
12
|
+
export interface ToastProps extends Omit<ComponentProps<typeof ToastPrimitive.Root>, 'title'> {
|
|
13
|
+
title: ReactNode;
|
|
14
|
+
openTrigger?: string | Omit<ReactHTMLElement<HTMLElement>, 'ref'>;
|
|
15
|
+
closeTrigger?: ReactNode;
|
|
16
|
+
actionTriggers?: { altText: string; trigger: ReactNode }[];
|
|
17
|
+
titleVisuallyHidden?: boolean;
|
|
18
|
+
description?: ReactNode;
|
|
19
|
+
initiallyOpen?: boolean;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export const Toast = ({
|
|
23
|
+
title,
|
|
24
|
+
titleVisuallyHidden,
|
|
25
|
+
description,
|
|
26
|
+
openTrigger,
|
|
27
|
+
closeTrigger,
|
|
28
|
+
actionTriggers,
|
|
29
|
+
initiallyOpen,
|
|
30
|
+
...rootProps
|
|
31
|
+
}: ToastProps) => {
|
|
32
|
+
const [isOpen, setIsOpen] = useState(!!initiallyOpen);
|
|
33
|
+
|
|
34
|
+
return (
|
|
35
|
+
<>
|
|
36
|
+
{openTrigger &&
|
|
37
|
+
(typeof openTrigger === 'string' ? (
|
|
38
|
+
<Button onClick={() => setIsOpen(true)}>{openTrigger}</Button>
|
|
39
|
+
) : (
|
|
40
|
+
cloneElement(openTrigger as Omit<ReactHTMLElement<HTMLElement>, 'ref'>, { onClick: () => setIsOpen(true) })
|
|
41
|
+
))}
|
|
42
|
+
<ToastPrimitive.Root
|
|
43
|
+
open={isOpen}
|
|
44
|
+
onOpenChange={setIsOpen}
|
|
45
|
+
{...rootProps}
|
|
46
|
+
className={cx(
|
|
47
|
+
'shadow-lg rounded-lg',
|
|
48
|
+
'bg-white dark:bg-neutral-800',
|
|
49
|
+
'radix-state-open:animate-toast-slide-in-bottom md:radix-state-open:animate-toast-slide-in-right',
|
|
50
|
+
'radix-state-closed:animate-toast-hide',
|
|
51
|
+
'radix-swipe-end:animate-toast-swipe-out',
|
|
52
|
+
'translate-x-radix-toast-swipe-move-x',
|
|
53
|
+
'radix-swipe-cancel:translate-x-0 radix-swipe-cancel:duration-200 radix-swipe-cancel:ease-[ease]',
|
|
54
|
+
'elevated-buttons',
|
|
55
|
+
defaultFocus,
|
|
56
|
+
rootProps.className
|
|
57
|
+
)}
|
|
58
|
+
>
|
|
59
|
+
<div role='none' className='flex'>
|
|
60
|
+
<div role='none' className='w-0 flex-1 flex items-center pl-5 py-4 min-h-full'>
|
|
61
|
+
<div role='none' className='w-full radix flex flex-col justify-center min-h-full gap-1'>
|
|
62
|
+
<ToastPrimitive.Title className={cx('text-md font-medium', titleVisuallyHidden && 'sr-only')}>
|
|
63
|
+
{title}
|
|
64
|
+
</ToastPrimitive.Title>
|
|
65
|
+
{description && (
|
|
66
|
+
<ToastPrimitive.Description className={defaultDescription}>{description}</ToastPrimitive.Description>
|
|
67
|
+
)}
|
|
68
|
+
</div>
|
|
69
|
+
</div>
|
|
70
|
+
<div role='none' className='flex flex-col px-3 py-2 gap-1 items-stretch justify-center min-h-full'>
|
|
71
|
+
{(actionTriggers || []).map(({ altText, trigger }, index) => (
|
|
72
|
+
<ToastPrimitive.Action key={index} altText={altText} asChild={typeof trigger !== 'string'}>
|
|
73
|
+
{trigger}
|
|
74
|
+
</ToastPrimitive.Action>
|
|
75
|
+
))}
|
|
76
|
+
{closeTrigger && (
|
|
77
|
+
<ToastPrimitive.Close asChild={typeof closeTrigger !== 'string'}>{closeTrigger}</ToastPrimitive.Close>
|
|
78
|
+
)}
|
|
79
|
+
</div>
|
|
80
|
+
</div>
|
|
81
|
+
</ToastPrimitive.Root>
|
|
82
|
+
</>
|
|
83
|
+
);
|
|
84
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2022 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import '@dxosTheme';
|
|
6
|
+
import { ChatTeardropText } from 'phosphor-react';
|
|
7
|
+
import React from 'react';
|
|
8
|
+
|
|
9
|
+
import { templateForComponent } from '../../testing';
|
|
10
|
+
import { Tooltip, TooltipProps } from './Tooltip';
|
|
11
|
+
|
|
12
|
+
export default {
|
|
13
|
+
title: 'react-ui/Tooltip',
|
|
14
|
+
component: Tooltip
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
const Template = ({ children, content }: TooltipProps) => {
|
|
18
|
+
return <Tooltip content={content}>{children}</Tooltip>;
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
export const Default = templateForComponent(Template)({
|
|
22
|
+
children: '',
|
|
23
|
+
content: ''
|
|
24
|
+
});
|
|
25
|
+
Default.args = {
|
|
26
|
+
children: <ChatTeardropText className='w-8 h-8' />,
|
|
27
|
+
content: 'Here’s a tooltip for you!'
|
|
28
|
+
};
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2022 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import * as TooltipPrimitive from '@radix-ui/react-tooltip';
|
|
6
|
+
import cx from 'classnames';
|
|
7
|
+
import React, { ComponentProps, ReactNode, useState } from 'react';
|
|
8
|
+
|
|
9
|
+
import { useId } from '../../hooks';
|
|
10
|
+
import { defaultTooltip } from '../../styles';
|
|
11
|
+
|
|
12
|
+
export interface TooltipProps extends Omit<ComponentProps<typeof TooltipPrimitive.Content>, 'children'> {
|
|
13
|
+
content: ReactNode;
|
|
14
|
+
children: ReactNode;
|
|
15
|
+
tooltipLabelsTrigger?: boolean;
|
|
16
|
+
mountAsSibling?: boolean;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export const Tooltip = ({ content, children, tooltipLabelsTrigger, mountAsSibling, ...contentProps }: TooltipProps) => {
|
|
20
|
+
const [isOpen, setIsOpen] = useState(false);
|
|
21
|
+
const labelId = useId('tooltipLabel');
|
|
22
|
+
|
|
23
|
+
const tooltipContent = (
|
|
24
|
+
<TooltipPrimitive.Content
|
|
25
|
+
forceMount
|
|
26
|
+
{...contentProps}
|
|
27
|
+
className={cx(
|
|
28
|
+
'radix-side-top:animate-slide-down-fade',
|
|
29
|
+
'radix-side-right:animate-slide-left-fade',
|
|
30
|
+
'radix-side-bottom:animate-slide-up-fade',
|
|
31
|
+
'radix-side-left:animate-slide-right-fade',
|
|
32
|
+
'inline-flex items-center rounded-md px-4 py-2.5',
|
|
33
|
+
'shadow-lg bg-white dark:bg-neutral-800',
|
|
34
|
+
!isOpen && 'sr-only',
|
|
35
|
+
defaultTooltip,
|
|
36
|
+
contentProps.className
|
|
37
|
+
)}
|
|
38
|
+
>
|
|
39
|
+
<TooltipPrimitive.Arrow className='fill-current text-white dark:text-neutral-800' />
|
|
40
|
+
{content}
|
|
41
|
+
</TooltipPrimitive.Content>
|
|
42
|
+
);
|
|
43
|
+
|
|
44
|
+
return (
|
|
45
|
+
<TooltipPrimitive.Root open={isOpen} onOpenChange={setIsOpen}>
|
|
46
|
+
<TooltipPrimitive.Trigger asChild {...(tooltipLabelsTrigger && { 'aria-labelledby': labelId })}>
|
|
47
|
+
{children}
|
|
48
|
+
</TooltipPrimitive.Trigger>
|
|
49
|
+
{tooltipLabelsTrigger && (
|
|
50
|
+
<span id={labelId} className='sr-only'>
|
|
51
|
+
{content}
|
|
52
|
+
</span>
|
|
53
|
+
)}
|
|
54
|
+
{mountAsSibling ? tooltipContent : <TooltipPrimitive.Portal forceMount>{tooltipContent}</TooltipPrimitive.Portal>}
|
|
55
|
+
</TooltipPrimitive.Root>
|
|
56
|
+
);
|
|
57
|
+
};
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2022 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import {
|
|
6
|
+
Provider as ToastProvider,
|
|
7
|
+
ToastProviderProps,
|
|
8
|
+
Viewport as ToastViewport,
|
|
9
|
+
ToastViewportProps
|
|
10
|
+
} from '@radix-ui/react-toast';
|
|
11
|
+
import { Provider as TooltipProvider, TooltipProviderProps } from '@radix-ui/react-tooltip';
|
|
12
|
+
import cx from 'classnames';
|
|
13
|
+
import React, { PropsWithChildren } from 'react';
|
|
14
|
+
|
|
15
|
+
import { defaultFocus } from '../../styles';
|
|
16
|
+
|
|
17
|
+
export type UiProviderProps = PropsWithChildren<{
|
|
18
|
+
tooltipProviderProps?: TooltipProviderProps;
|
|
19
|
+
toastProviderProps?: ToastProviderProps;
|
|
20
|
+
toastViewportProps?: ToastViewportProps;
|
|
21
|
+
}>;
|
|
22
|
+
|
|
23
|
+
export const UiProvider = ({
|
|
24
|
+
children,
|
|
25
|
+
tooltipProviderProps,
|
|
26
|
+
toastProviderProps,
|
|
27
|
+
toastViewportProps
|
|
28
|
+
}: UiProviderProps) => {
|
|
29
|
+
return (
|
|
30
|
+
<ToastProvider {...toastProviderProps}>
|
|
31
|
+
<TooltipProvider delayDuration={0} {...tooltipProviderProps}>
|
|
32
|
+
{children}
|
|
33
|
+
</TooltipProvider>
|
|
34
|
+
<ToastViewport
|
|
35
|
+
{...toastViewportProps}
|
|
36
|
+
className={cx(
|
|
37
|
+
'z-50 fixed bottom-4 inset-x-4 w-auto md:top-4 md:right-4 md:left-auto md:bottom-auto md:w-full md:max-w-sm rounded-lg',
|
|
38
|
+
defaultFocus,
|
|
39
|
+
toastViewportProps?.className
|
|
40
|
+
)}
|
|
41
|
+
/>
|
|
42
|
+
</ToastProvider>
|
|
43
|
+
);
|
|
44
|
+
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2022 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
export * from './Alert';
|
|
6
|
+
export * from './Avatar';
|
|
7
|
+
export * from './Button';
|
|
8
|
+
export * from './CompoundButton';
|
|
9
|
+
export * from './Dialog';
|
|
10
|
+
export * from './Group';
|
|
11
|
+
export * from './Heading';
|
|
12
|
+
export * from './Loading';
|
|
13
|
+
export * from './Input';
|
|
14
|
+
export * from './Main';
|
|
15
|
+
export * from './NavMenu';
|
|
16
|
+
export * from './Popover';
|
|
17
|
+
export * from './QrCode';
|
|
18
|
+
export * from './Toast';
|
|
19
|
+
export * from './Tooltip';
|
|
20
|
+
export * from './UiProvider';
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2022 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import alea from 'alea';
|
|
6
|
+
import { useMemo } from 'react';
|
|
7
|
+
|
|
8
|
+
interface PrngFactory {
|
|
9
|
+
new (seed?: string): () => number;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
const Alea: PrngFactory = alea as unknown as PrngFactory;
|
|
13
|
+
|
|
14
|
+
const prng = new Alea('@dxos/react-ui');
|
|
15
|
+
|
|
16
|
+
const randomString = (n = 4) =>
|
|
17
|
+
prng()
|
|
18
|
+
.toString(16)
|
|
19
|
+
.slice(2, n + 2);
|
|
20
|
+
|
|
21
|
+
export const useId = (namespace: string, n?: number) => useMemo(() => `${namespace}-${randomString(n)}`, []);
|