@dxos/react-ui 0.8.4-main.b97322e → 0.8.4-main.bc674ce
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/lib/browser/chunk-CEKVHJ27.mjs +774 -0
- package/dist/lib/browser/chunk-CEKVHJ27.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +3165 -59
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/testing/index.mjs +65 -49
- package/dist/lib/browser/testing/index.mjs.map +4 -4
- package/dist/lib/node-esm/chunk-2NHEX4AD.mjs +776 -0
- package/dist/lib/node-esm/chunk-2NHEX4AD.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +3165 -59
- package/dist/lib/node-esm/index.mjs.map +4 -4
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/testing/index.mjs +65 -49
- package/dist/lib/node-esm/testing/index.mjs.map +4 -4
- package/dist/types/src/components/Avatars/Avatar.d.ts +1 -1
- package/dist/types/src/components/Avatars/Avatar.d.ts.map +1 -1
- package/dist/types/src/components/Avatars/Avatar.stories.d.ts +5 -31
- package/dist/types/src/components/Avatars/Avatar.stories.d.ts.map +1 -1
- package/dist/types/src/components/Avatars/AvatarGroup.stories.d.ts +5 -11
- package/dist/types/src/components/Avatars/AvatarGroup.stories.d.ts.map +1 -1
- package/dist/types/src/components/Breadcrumb/Breadcrumb.d.ts +1 -1
- package/dist/types/src/components/Breadcrumb/Breadcrumb.d.ts.map +1 -1
- package/dist/types/src/components/Breadcrumb/Breadcrumb.stories.d.ts +8 -20
- package/dist/types/src/components/Breadcrumb/Breadcrumb.stories.d.ts.map +1 -1
- package/dist/types/src/components/{Buttons → Button}/Button.d.ts +2 -2
- package/dist/types/src/components/Button/Button.d.ts.map +1 -0
- package/dist/types/src/components/Button/Button.stories.d.ts +17 -0
- package/dist/types/src/components/Button/Button.stories.d.ts.map +1 -0
- package/dist/types/src/components/{Buttons → Button}/IconButton.d.ts +4 -4
- package/dist/types/src/components/Button/IconButton.d.ts.map +1 -0
- package/dist/types/src/components/Button/IconButton.stories.d.ts +13 -0
- package/dist/types/src/components/Button/IconButton.stories.d.ts.map +1 -0
- package/dist/types/src/components/Button/Toggle.d.ts.map +1 -0
- package/dist/types/src/components/Button/Toggle.stories.d.ts +16 -0
- package/dist/types/src/components/Button/Toggle.stories.d.ts.map +1 -0
- package/dist/types/src/components/Button/ToggleGroup.d.ts +27 -0
- package/dist/types/src/components/Button/ToggleGroup.d.ts.map +1 -0
- package/dist/types/src/components/Button/ToggleGroup.stories.d.ts +27 -0
- package/dist/types/src/components/Button/ToggleGroup.stories.d.ts.map +1 -0
- package/dist/types/src/components/Button/index.d.ts.map +1 -0
- package/dist/types/src/components/Clipboard/ClipboardProvider.d.ts.map +1 -1
- package/dist/types/src/components/Clipboard/CopyButton.d.ts +1 -1
- package/dist/types/src/components/Clipboard/CopyButton.d.ts.map +1 -1
- package/dist/types/src/components/DensityProvider/DensityProvider.d.ts +1 -1
- package/dist/types/src/components/DensityProvider/DensityProvider.d.ts.map +1 -1
- package/dist/types/src/components/{Dialogs → Dialog}/AlertDialog.d.ts +1 -1
- package/dist/types/src/components/Dialog/AlertDialog.d.ts.map +1 -0
- package/dist/types/src/components/Dialog/AlertDialog.stories.d.ts +11 -0
- package/dist/types/src/components/Dialog/AlertDialog.stories.d.ts.map +1 -0
- package/dist/types/src/components/Dialog/Dialog.d.ts +40 -0
- package/dist/types/src/components/Dialog/Dialog.d.ts.map +1 -0
- package/dist/types/src/components/Dialog/Dialog.stories.d.ts +27 -0
- package/dist/types/src/components/Dialog/Dialog.stories.d.ts.map +1 -0
- package/dist/types/src/components/Dialog/index.d.ts.map +1 -0
- package/dist/types/src/components/ElevationProvider/ElevationProvider.d.ts +1 -1
- package/dist/types/src/components/ElevationProvider/ElevationProvider.d.ts.map +1 -1
- package/dist/types/src/components/Icon/Icon.d.ts +2 -2
- package/dist/types/src/components/Icon/Icon.d.ts.map +1 -1
- package/dist/types/src/components/Icon/Icon.stories.d.ts +17 -0
- package/dist/types/src/components/Icon/Icon.stories.d.ts.map +1 -0
- package/dist/types/src/components/Input/Input.d.ts +6 -5
- package/dist/types/src/components/Input/Input.d.ts.map +1 -1
- package/dist/types/src/components/Input/Input.stories.d.ts +11 -12
- package/dist/types/src/components/Input/Input.stories.d.ts.map +1 -1
- package/dist/types/src/components/Link/Link.stories.d.ts +8 -8
- package/dist/types/src/components/Link/Link.stories.d.ts.map +1 -1
- package/dist/types/src/components/{Lists → List}/List.d.ts +3 -3
- package/dist/types/src/components/List/List.d.ts.map +1 -0
- package/dist/types/src/components/List/List.stories.d.ts +14 -0
- package/dist/types/src/components/List/List.stories.d.ts.map +1 -0
- package/dist/types/src/components/List/ListDropIndicator.d.ts.map +1 -0
- package/dist/types/src/components/{Lists → List}/Tree.d.ts +1 -1
- package/dist/types/src/components/List/Tree.d.ts.map +1 -0
- package/dist/types/src/components/List/Tree.stories.d.ts +15 -0
- package/dist/types/src/components/List/Tree.stories.d.ts.map +1 -0
- package/dist/types/src/components/List/TreeDropIndicator.d.ts.map +1 -0
- package/dist/types/src/components/{Lists → List}/Treegrid.d.ts +1 -1
- package/dist/types/src/components/{Lists → List}/Treegrid.d.ts.map +1 -1
- package/dist/types/src/components/List/Treegrid.stories.d.ts +12 -0
- package/dist/types/src/components/List/Treegrid.stories.d.ts.map +1 -0
- package/dist/types/src/components/List/index.d.ts.map +1 -0
- package/dist/types/src/components/Main/Main.d.ts +45 -29
- package/dist/types/src/components/Main/Main.d.ts.map +1 -1
- package/dist/types/src/components/Main/Main.stories.d.ts +8 -8
- package/dist/types/src/components/Main/Main.stories.d.ts.map +1 -1
- package/dist/types/src/components/{Menus → Menu}/ContextMenu.d.ts +6 -6
- package/dist/types/src/components/Menu/ContextMenu.d.ts.map +1 -0
- package/dist/types/src/components/Menu/ContextMenu.stories.d.ts +12 -0
- package/dist/types/src/components/Menu/ContextMenu.stories.d.ts.map +1 -0
- package/dist/types/src/components/{Menus → Menu}/DropdownMenu.d.ts +8 -8
- package/dist/types/src/components/Menu/DropdownMenu.d.ts.map +1 -0
- package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts +15 -0
- package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts.map +1 -0
- package/dist/types/src/components/Menu/index.d.ts.map +1 -0
- package/dist/types/src/components/Message/Message.d.ts +1 -1
- package/dist/types/src/components/Message/Message.d.ts.map +1 -1
- package/dist/types/src/components/Message/Message.stories.d.ts +8 -17
- package/dist/types/src/components/Message/Message.stories.d.ts.map +1 -1
- package/dist/types/src/components/Popover/Popover.d.ts +3 -3
- package/dist/types/src/components/Popover/Popover.d.ts.map +1 -1
- package/dist/types/src/components/Popover/Popover.stories.d.ts +6 -34
- package/dist/types/src/components/Popover/Popover.stories.d.ts.map +1 -1
- package/dist/types/src/components/ScrollArea/ScrollArea.d.ts +10 -8
- package/dist/types/src/components/ScrollArea/ScrollArea.d.ts.map +1 -1
- package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts +8 -30
- package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts.map +1 -1
- package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts +39 -0
- package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts.map +1 -0
- package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts +19 -0
- package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts.map +1 -0
- package/dist/types/src/components/ScrollContainer/index.d.ts +2 -0
- package/dist/types/src/components/ScrollContainer/index.d.ts.map +1 -0
- package/dist/types/src/components/Select/Select.d.ts +10 -10
- package/dist/types/src/components/Select/Select.d.ts.map +1 -1
- package/dist/types/src/components/Select/Select.stories.d.ts +4 -9
- package/dist/types/src/components/Select/Select.stories.d.ts.map +1 -1
- package/dist/types/src/components/Separator/Separator.d.ts +1 -1
- package/dist/types/src/components/Status/Status.stories.d.ts +2 -8
- package/dist/types/src/components/Status/Status.stories.d.ts.map +1 -1
- package/dist/types/src/components/Tag/Tag.d.ts +1 -1
- package/dist/types/src/components/Tag/Tag.d.ts.map +1 -1
- package/dist/types/src/components/Tag/Tag.stories.d.ts +12 -12
- package/dist/types/src/components/Tag/Tag.stories.d.ts.map +1 -1
- package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts +2 -3
- package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts.map +1 -1
- package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts +1 -8
- package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts.map +1 -1
- package/dist/types/src/components/ThemeProvider/index.d.ts +2 -1
- package/dist/types/src/components/ThemeProvider/index.d.ts.map +1 -1
- package/dist/types/src/components/Toast/Toast.d.ts +5 -5
- package/dist/types/src/components/Toast/Toast.d.ts.map +1 -1
- package/dist/types/src/components/Toast/Toast.stories.d.ts +6 -44
- package/dist/types/src/components/Toast/Toast.stories.d.ts.map +1 -1
- package/dist/types/src/components/Toolbar/Toolbar.d.ts +17 -17
- package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -1
- package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts +6 -50
- package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts.map +1 -1
- package/dist/types/src/components/Tooltip/Tooltip.d.ts +2 -4
- package/dist/types/src/components/Tooltip/Tooltip.d.ts.map +1 -1
- package/dist/types/src/components/Tooltip/Tooltip.stories.d.ts +8 -61
- package/dist/types/src/components/Tooltip/Tooltip.stories.d.ts.map +1 -1
- package/dist/types/src/components/index.d.ts +5 -4
- package/dist/types/src/components/index.d.ts.map +1 -1
- package/dist/types/src/hooks/useDensityContext.d.ts +1 -1
- package/dist/types/src/hooks/useDensityContext.d.ts.map +1 -1
- package/dist/types/src/hooks/useElevationContext.d.ts +1 -1
- package/dist/types/src/hooks/useElevationContext.d.ts.map +1 -1
- package/dist/types/src/hooks/useSafeArea.d.ts.map +1 -1
- package/dist/types/src/hooks/useVisualViewport.d.ts +2 -2
- package/dist/types/src/hooks/useVisualViewport.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +1 -1
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/playground/Controls.stories.d.ts +5 -9
- package/dist/types/src/playground/Controls.stories.d.ts.map +1 -1
- package/dist/types/src/playground/Custom.stories.d.ts +12 -4
- package/dist/types/src/playground/Custom.stories.d.ts.map +1 -1
- package/dist/types/src/playground/Typography.stories.d.ts +5 -11
- package/dist/types/src/playground/Typography.stories.d.ts.map +1 -1
- package/dist/types/src/testing/decorators/index.d.ts +2 -1
- package/dist/types/src/testing/decorators/index.d.ts.map +1 -1
- package/dist/types/src/testing/decorators/withLayout.d.ts +15 -0
- package/dist/types/src/testing/decorators/withLayout.d.ts.map +1 -0
- package/dist/types/src/testing/decorators/withLayoutVariants.d.ts +12 -0
- package/dist/types/src/testing/decorators/withLayoutVariants.d.ts.map +1 -0
- package/dist/types/src/testing/decorators/withTheme.d.ts +3 -0
- package/dist/types/src/testing/decorators/withTheme.d.ts.map +1 -1
- package/dist/types/src/util/index.d.ts +2 -1
- package/dist/types/src/util/index.d.ts.map +1 -1
- package/dist/types/src/util/usePx.d.ts +8 -0
- package/dist/types/src/util/usePx.d.ts.map +1 -0
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +35 -27
- package/src/components/Avatars/Avatar.stories.tsx +21 -12
- package/src/components/Avatars/Avatar.tsx +4 -4
- package/src/components/Avatars/AvatarGroup.stories.tsx +10 -6
- package/src/components/Breadcrumb/Breadcrumb.stories.tsx +17 -12
- package/src/components/Breadcrumb/Breadcrumb.tsx +1 -1
- package/src/components/{Buttons → Button}/Button.stories.tsx +8 -9
- package/src/components/{Buttons → Button}/Button.tsx +1 -1
- package/src/components/{Buttons → Button}/IconButton.stories.tsx +11 -8
- package/src/components/{Buttons → Button}/IconButton.tsx +22 -15
- package/src/components/{Buttons → Button}/Toggle.stories.tsx +13 -9
- package/src/components/{Buttons → Button}/ToggleGroup.stories.tsx +10 -7
- package/src/components/{Buttons → Button}/ToggleGroup.tsx +17 -4
- package/src/components/Clipboard/ClipboardProvider.tsx +1 -1
- package/src/components/Clipboard/CopyButton.tsx +6 -5
- package/src/components/DensityProvider/DensityProvider.tsx +2 -2
- package/src/components/{Dialogs → Dialog}/AlertDialog.stories.tsx +15 -12
- package/src/components/{Dialogs → Dialog}/AlertDialog.tsx +13 -13
- package/src/components/Dialog/Dialog.stories.tsx +97 -0
- package/src/components/{Dialogs → Dialog}/Dialog.tsx +151 -51
- package/src/components/ElevationProvider/ElevationProvider.tsx +2 -2
- package/src/components/Icon/Icon.stories.tsx +113 -0
- package/src/components/Icon/Icon.tsx +2 -2
- package/src/components/Input/Input.stories.tsx +13 -15
- package/src/components/Input/Input.tsx +28 -19
- package/src/components/Link/Link.stories.tsx +10 -6
- package/src/components/{Lists → List}/List.stories.tsx +32 -26
- package/src/components/{Lists → List}/List.tsx +17 -13
- package/src/components/{Lists → List}/ListDropIndicator.tsx +1 -1
- package/src/components/{Lists → List}/Tree.stories.tsx +11 -8
- package/src/components/{Lists → List}/Tree.tsx +4 -3
- package/src/components/{Lists → List}/TreeDropIndicator.tsx +1 -1
- package/src/components/{Lists → List}/Treegrid.stories.tsx +12 -6
- package/src/components/{Lists → List}/Treegrid.tsx +58 -17
- package/src/components/Main/Main.stories.tsx +141 -26
- package/src/components/Main/Main.tsx +292 -70
- package/src/components/{Menus → Menu}/ContextMenu.stories.tsx +11 -8
- package/src/components/{Menus → Menu}/ContextMenu.tsx +1 -0
- package/src/components/{Menus → Menu}/DropdownMenu.stories.tsx +12 -9
- package/src/components/{Menus → Menu}/DropdownMenu.tsx +102 -71
- package/src/components/Message/Message.stories.tsx +12 -8
- package/src/components/Message/Message.tsx +30 -5
- package/src/components/Popover/Popover.stories.tsx +12 -9
- package/src/components/Popover/Popover.tsx +64 -45
- package/src/components/ScrollArea/ScrollArea.stories.tsx +64 -11
- package/src/components/ScrollArea/ScrollArea.tsx +54 -8
- package/src/components/ScrollContainer/ScrollContainer.stories.tsx +70 -0
- package/src/components/ScrollContainer/ScrollContainer.tsx +233 -0
- package/src/components/ScrollContainer/index.ts +5 -0
- package/src/components/Select/Select.stories.tsx +15 -12
- package/src/components/Select/Select.tsx +9 -8
- package/src/components/Status/Status.stories.tsx +9 -6
- package/src/components/Tag/Tag.stories.tsx +20 -11
- package/src/components/Tag/Tag.tsx +1 -1
- package/src/components/ThemeProvider/ThemeProvider.tsx +3 -4
- package/src/components/ThemeProvider/TranslationsProvider.tsx +3 -18
- package/src/components/ThemeProvider/index.ts +3 -3
- package/src/components/Toast/Toast.stories.tsx +12 -9
- package/src/components/Toast/Toast.tsx +9 -9
- package/src/components/Toolbar/Toolbar.stories.tsx +14 -12
- package/src/components/Toolbar/Toolbar.tsx +37 -10
- package/src/components/Tooltip/Tooltip.stories.tsx +16 -12
- package/src/components/Tooltip/Tooltip.tsx +27 -24
- package/src/components/index.ts +5 -4
- package/src/hooks/useDensityContext.ts +1 -1
- package/src/hooks/useElevationContext.ts +1 -1
- package/src/hooks/useSafeArea.ts +3 -2
- package/src/hooks/useVisualViewport.ts +4 -4
- package/src/index.ts +1 -1
- package/src/playground/Controls.stories.tsx +12 -8
- package/src/playground/Custom.stories.tsx +13 -24
- package/src/playground/Typography.stories.tsx +8 -6
- package/src/testing/decorators/index.ts +2 -1
- package/src/testing/decorators/withLayout.tsx +63 -0
- package/src/testing/decorators/{withSurfaceVariantsLayout.tsx → withLayoutVariants.tsx} +5 -5
- package/src/testing/decorators/withTheme.tsx +32 -0
- package/src/util/index.ts +3 -1
- package/src/util/usePx.ts +61 -0
- package/dist/lib/browser/chunk-2COVUP44.mjs +0 -4373
- package/dist/lib/browser/chunk-2COVUP44.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-GHXHND5V.mjs +0 -4375
- package/dist/lib/node-esm/chunk-GHXHND5V.mjs.map +0 -7
- package/dist/types/src/components/Buttons/Button.d.ts.map +0 -1
- package/dist/types/src/components/Buttons/Button.stories.d.ts +0 -12
- package/dist/types/src/components/Buttons/Button.stories.d.ts.map +0 -1
- package/dist/types/src/components/Buttons/IconButton.d.ts.map +0 -1
- package/dist/types/src/components/Buttons/IconButton.stories.d.ts +0 -22
- package/dist/types/src/components/Buttons/IconButton.stories.d.ts.map +0 -1
- package/dist/types/src/components/Buttons/Toggle.d.ts.map +0 -1
- package/dist/types/src/components/Buttons/Toggle.stories.d.ts +0 -19
- package/dist/types/src/components/Buttons/Toggle.stories.d.ts.map +0 -1
- package/dist/types/src/components/Buttons/ToggleGroup.d.ts +0 -28
- package/dist/types/src/components/Buttons/ToggleGroup.d.ts.map +0 -1
- package/dist/types/src/components/Buttons/ToggleGroup.stories.d.ts +0 -39
- package/dist/types/src/components/Buttons/ToggleGroup.stories.d.ts.map +0 -1
- package/dist/types/src/components/Buttons/index.d.ts.map +0 -1
- package/dist/types/src/components/Dialogs/AlertDialog.d.ts.map +0 -1
- package/dist/types/src/components/Dialogs/AlertDialog.stories.d.ts +0 -43
- package/dist/types/src/components/Dialogs/AlertDialog.stories.d.ts.map +0 -1
- package/dist/types/src/components/Dialogs/Dialog.d.ts +0 -31
- package/dist/types/src/components/Dialogs/Dialog.d.ts.map +0 -1
- package/dist/types/src/components/Dialogs/Dialog.stories.d.ts +0 -48
- package/dist/types/src/components/Dialogs/Dialog.stories.d.ts.map +0 -1
- package/dist/types/src/components/Dialogs/index.d.ts.map +0 -1
- package/dist/types/src/components/Lists/List.d.ts.map +0 -1
- package/dist/types/src/components/Lists/List.stories.d.ts +0 -37
- package/dist/types/src/components/Lists/List.stories.d.ts.map +0 -1
- package/dist/types/src/components/Lists/ListDropIndicator.d.ts.map +0 -1
- package/dist/types/src/components/Lists/Tree.d.ts.map +0 -1
- package/dist/types/src/components/Lists/Tree.stories.d.ts +0 -41
- package/dist/types/src/components/Lists/Tree.stories.d.ts.map +0 -1
- package/dist/types/src/components/Lists/TreeDropIndicator.d.ts.map +0 -1
- package/dist/types/src/components/Lists/Treegrid.stories.d.ts +0 -10
- package/dist/types/src/components/Lists/Treegrid.stories.d.ts.map +0 -1
- package/dist/types/src/components/Lists/index.d.ts.map +0 -1
- package/dist/types/src/components/Menus/ContextMenu.d.ts.map +0 -1
- package/dist/types/src/components/Menus/ContextMenu.stories.d.ts +0 -50
- package/dist/types/src/components/Menus/ContextMenu.stories.d.ts.map +0 -1
- package/dist/types/src/components/Menus/DropdownMenu.d.ts.map +0 -1
- package/dist/types/src/components/Menus/DropdownMenu.stories.d.ts +0 -50
- package/dist/types/src/components/Menus/DropdownMenu.stories.d.ts.map +0 -1
- package/dist/types/src/components/Menus/index.d.ts.map +0 -1
- package/dist/types/src/testing/decorators/withSurfaceVariantsLayout.d.ts +0 -12
- package/dist/types/src/testing/decorators/withSurfaceVariantsLayout.d.ts.map +0 -1
- package/dist/types/src/util/ThemedClassName.d.ts +0 -5
- package/dist/types/src/util/ThemedClassName.d.ts.map +0 -1
- package/src/components/Dialogs/Dialog.stories.tsx +0 -65
- package/src/testing/decorators/withTheme.ts +0 -25
- package/src/util/ThemedClassName.ts +0 -7
- /package/dist/types/src/components/{Buttons → Button}/Toggle.d.ts +0 -0
- /package/dist/types/src/components/{Buttons → Button}/index.d.ts +0 -0
- /package/dist/types/src/components/{Dialogs → Dialog}/index.d.ts +0 -0
- /package/dist/types/src/components/{Lists → List}/ListDropIndicator.d.ts +0 -0
- /package/dist/types/src/components/{Lists → List}/TreeDropIndicator.d.ts +0 -0
- /package/dist/types/src/components/{Lists → List}/index.d.ts +0 -0
- /package/dist/types/src/components/{Menus → Menu}/index.d.ts +0 -0
- /package/src/components/{Buttons → Button}/Toggle.tsx +0 -0
- /package/src/components/{Buttons → Button}/index.ts +0 -0
- /package/src/components/{Dialogs → Dialog}/index.ts +0 -0
- /package/src/components/{Lists → List}/index.ts +0 -0
- /package/src/components/{Menus → Menu}/index.ts +0 -0
|
@@ -2,49 +2,51 @@
|
|
|
2
2
|
// Copyright 2023 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
+
import { useFocusableGroup } from '@fluentui/react-tabster';
|
|
5
6
|
import { createContext } from '@radix-ui/react-context';
|
|
6
|
-
import { Root as DialogRoot,
|
|
7
|
+
import { DialogContent, Root as DialogRoot, DialogTitle } from '@radix-ui/react-dialog';
|
|
7
8
|
import { Primitive } from '@radix-ui/react-primitive';
|
|
8
9
|
import { Slot } from '@radix-ui/react-slot';
|
|
9
10
|
import { useControllableState } from '@radix-ui/react-use-controllable-state';
|
|
10
11
|
import React, {
|
|
11
12
|
type ComponentPropsWithRef,
|
|
13
|
+
type ComponentPropsWithoutRef,
|
|
12
14
|
type Dispatch,
|
|
13
|
-
|
|
15
|
+
type KeyboardEvent,
|
|
14
16
|
type PropsWithChildren,
|
|
15
17
|
type SetStateAction,
|
|
18
|
+
forwardRef,
|
|
16
19
|
useCallback,
|
|
17
20
|
useEffect,
|
|
18
21
|
useRef,
|
|
19
22
|
useState,
|
|
20
|
-
type KeyboardEvent,
|
|
21
|
-
type ComponentPropsWithoutRef,
|
|
22
23
|
} from 'react';
|
|
23
24
|
|
|
25
|
+
import { addEventListener } from '@dxos/async';
|
|
24
26
|
import { log } from '@dxos/log';
|
|
25
|
-
import {
|
|
27
|
+
import { useDynamicRef, useForwardedRef, useMediaQuery, useViewportResize } from '@dxos/react-hooks';
|
|
28
|
+
import { type MainStyleProps } from '@dxos/ui-theme';
|
|
26
29
|
|
|
27
|
-
import { useSwipeToDismiss } from './useSwipeToDismiss';
|
|
28
30
|
import { useThemeContext } from '../../hooks';
|
|
29
31
|
import { type ThemedClassName } from '../../util';
|
|
30
32
|
import { type Label, toLocalizedString, useTranslation } from '../ThemeProvider';
|
|
31
33
|
|
|
34
|
+
import { useSwipeToDismiss } from './useSwipeToDismiss';
|
|
35
|
+
|
|
36
|
+
const MAIN_NAME = 'Main';
|
|
32
37
|
const MAIN_ROOT_NAME = 'MainRoot';
|
|
33
38
|
const NAVIGATION_SIDEBAR_NAME = 'NavigationSidebar';
|
|
34
39
|
const COMPLEMENTARY_SIDEBAR_NAME = 'ComplementarySidebar';
|
|
35
|
-
const
|
|
36
|
-
const GENERIC_CONSUMER_NAME = 'GenericConsumer';
|
|
37
|
-
|
|
38
|
-
type SidebarState = 'expanded' | 'collapsed' | 'closed';
|
|
40
|
+
const DRAWER_NAME = 'Drawer';
|
|
39
41
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
navigationSidebarState: SidebarState;
|
|
43
|
-
setNavigationSidebarState: Dispatch<SetStateAction<SidebarState | undefined>>;
|
|
44
|
-
complementarySidebarState: SidebarState;
|
|
45
|
-
setComplementarySidebarState: Dispatch<SetStateAction<SidebarState | undefined>>;
|
|
42
|
+
const handleOpenAutoFocus = (event: Event) => {
|
|
43
|
+
!document.body.hasAttribute('data-is-keyboard') && event.preventDefault();
|
|
46
44
|
};
|
|
47
45
|
|
|
46
|
+
//
|
|
47
|
+
// Landmark
|
|
48
|
+
//
|
|
49
|
+
|
|
48
50
|
const landmarkAttr = 'data-main-landmark';
|
|
49
51
|
|
|
50
52
|
/**
|
|
@@ -69,28 +71,105 @@ const useLandmarkMover = (propsOnKeyDown: ComponentPropsWithoutRef<'div'>['onKey
|
|
|
69
71
|
},
|
|
70
72
|
[propsOnKeyDown],
|
|
71
73
|
);
|
|
72
|
-
const focusableGroupAttrs = window ? {} : { tabBehavior: 'limited', ignoreDefaultKeydown: { Tab: true } };
|
|
73
74
|
|
|
74
|
-
|
|
75
|
+
// TODO(thure): This was disconnected once before in #8818;
|
|
76
|
+
// if this should change again to support the browser extension, please ensure the change doesn’t break web, desktop and mobile.
|
|
77
|
+
const focusableGroupAttrs = useFocusableGroup({ tabBehavior: 'limited', ignoreDefaultKeydown: { Tab: true } });
|
|
78
|
+
|
|
79
|
+
return {
|
|
80
|
+
[landmarkAttr]: landmark,
|
|
81
|
+
tabIndex: 0,
|
|
82
|
+
onKeyDown: handleKeyDown,
|
|
83
|
+
...focusableGroupAttrs,
|
|
84
|
+
};
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
// TODO(burdon): Better way to detect software keyboard on mobile?
|
|
88
|
+
const isFullscreen = () => {
|
|
89
|
+
const isMobile = window.innerHeight <= 1000;
|
|
90
|
+
return window.visualViewport && isMobile ? window.visualViewport.height < 700 : false;
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Detects if drawer should be in full mode based on:
|
|
95
|
+
* - Device is mobile (width)
|
|
96
|
+
* - Visual viewport is constrained (keyboard visible)
|
|
97
|
+
*/
|
|
98
|
+
const useDynamicDrawer = (consumerName: string) => {
|
|
99
|
+
const { drawerState, setDrawerState } = useSidebars(consumerName);
|
|
100
|
+
const drawersStateRef = useDynamicRef(drawerState);
|
|
101
|
+
|
|
102
|
+
const checkViewport = useCallback(() => {
|
|
103
|
+
if (window.visualViewport) {
|
|
104
|
+
document.documentElement.style.setProperty('--visual-viewport-height', `${window.visualViewport.height}px`);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
if (drawersStateRef.current !== 'closed') {
|
|
108
|
+
setDrawerState(isFullscreen() ? 'full' : 'expanded');
|
|
109
|
+
}
|
|
110
|
+
}, [setDrawerState]);
|
|
111
|
+
|
|
112
|
+
// Check resize.
|
|
113
|
+
useViewportResize(checkViewport, [], 100);
|
|
114
|
+
|
|
115
|
+
// Check on window resize (for device orientation changes).
|
|
116
|
+
useEffect(() => addEventListener(window, 'resize', checkViewport), [checkViewport]);
|
|
117
|
+
|
|
118
|
+
return drawerState;
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
//
|
|
122
|
+
// Context
|
|
123
|
+
//
|
|
124
|
+
|
|
125
|
+
// TODO(burdon): Define collapsed state.
|
|
126
|
+
type SidebarState = 'expanded' | 'collapsed' | 'closed';
|
|
127
|
+
type DrawerState = 'expanded' | 'full' | 'closed';
|
|
128
|
+
|
|
129
|
+
type MainContextValue = {
|
|
130
|
+
resizing: boolean;
|
|
131
|
+
|
|
132
|
+
// Navigation
|
|
133
|
+
navigationSidebarState: SidebarState;
|
|
134
|
+
setNavigationSidebarState: Dispatch<SetStateAction<SidebarState | undefined>>;
|
|
135
|
+
|
|
136
|
+
// Complementary
|
|
137
|
+
complementarySidebarState: SidebarState;
|
|
138
|
+
setComplementarySidebarState: Dispatch<SetStateAction<SidebarState | undefined>>;
|
|
139
|
+
|
|
140
|
+
// Drawer
|
|
141
|
+
drawerState: DrawerState;
|
|
142
|
+
setDrawerState: Dispatch<SetStateAction<DrawerState | undefined>>;
|
|
75
143
|
};
|
|
76
144
|
|
|
77
145
|
const [MainProvider, useMainContext] = createContext<MainContextValue>(MAIN_NAME, {
|
|
78
146
|
resizing: false,
|
|
147
|
+
|
|
79
148
|
navigationSidebarState: 'closed',
|
|
80
|
-
setNavigationSidebarState: (
|
|
81
|
-
|
|
82
|
-
log.warn('Attempt to set sidebar state without initializing `MainRoot`');
|
|
149
|
+
setNavigationSidebarState: (_nextState) => {
|
|
150
|
+
log.warn('Not initialized');
|
|
83
151
|
},
|
|
152
|
+
|
|
84
153
|
complementarySidebarState: 'closed',
|
|
85
|
-
setComplementarySidebarState: (
|
|
86
|
-
|
|
87
|
-
|
|
154
|
+
setComplementarySidebarState: (_nextState) => {
|
|
155
|
+
log.warn('Not initialized');
|
|
156
|
+
},
|
|
157
|
+
|
|
158
|
+
drawerState: 'closed',
|
|
159
|
+
setDrawerState: (_nextState) => {
|
|
160
|
+
log.warn('Not initialized');
|
|
88
161
|
},
|
|
89
162
|
});
|
|
90
163
|
|
|
91
|
-
const useSidebars = (consumerName
|
|
92
|
-
const {
|
|
93
|
-
|
|
164
|
+
const useSidebars = (consumerName: string) => {
|
|
165
|
+
const {
|
|
166
|
+
navigationSidebarState,
|
|
167
|
+
setNavigationSidebarState,
|
|
168
|
+
complementarySidebarState,
|
|
169
|
+
setComplementarySidebarState,
|
|
170
|
+
drawerState,
|
|
171
|
+
setDrawerState,
|
|
172
|
+
} = useMainContext(consumerName);
|
|
94
173
|
|
|
95
174
|
return {
|
|
96
175
|
navigationSidebarState,
|
|
@@ -102,6 +181,7 @@ const useSidebars = (consumerName = GENERIC_CONSUMER_NAME) => {
|
|
|
102
181
|
openNavigationSidebar: useCallback(() => setNavigationSidebarState('expanded'), []),
|
|
103
182
|
collapseNavigationSidebar: useCallback(() => setNavigationSidebarState('collapsed'), []),
|
|
104
183
|
closeNavigationSidebar: useCallback(() => setNavigationSidebarState('closed'), []),
|
|
184
|
+
|
|
105
185
|
complementarySidebarState,
|
|
106
186
|
setComplementarySidebarState,
|
|
107
187
|
toggleComplementarySidebar: useCallback(
|
|
@@ -111,31 +191,53 @@ const useSidebars = (consumerName = GENERIC_CONSUMER_NAME) => {
|
|
|
111
191
|
openComplementarySidebar: useCallback(() => setComplementarySidebarState('expanded'), []),
|
|
112
192
|
collapseComplementarySidebar: useCallback(() => setComplementarySidebarState('collapsed'), []),
|
|
113
193
|
closeComplementarySidebar: useCallback(() => setComplementarySidebarState('closed'), []),
|
|
194
|
+
|
|
195
|
+
drawerState,
|
|
196
|
+
setDrawerState,
|
|
197
|
+
toggleDrawer: useCallback(
|
|
198
|
+
() => setDrawerState(drawerState === 'closed' ? (isFullscreen() ? 'full' : 'expanded') : 'closed'),
|
|
199
|
+
[drawerState, setDrawerState],
|
|
200
|
+
),
|
|
201
|
+
openDrawer: useCallback(() => setDrawerState('expanded'), []),
|
|
202
|
+
closeDrawer: useCallback(() => setDrawerState('closed'), []),
|
|
114
203
|
};
|
|
115
204
|
};
|
|
116
205
|
|
|
206
|
+
//
|
|
207
|
+
// Root
|
|
208
|
+
//
|
|
209
|
+
|
|
117
210
|
type MainRootProps = PropsWithChildren<{
|
|
118
211
|
navigationSidebarState?: SidebarState;
|
|
119
212
|
defaultNavigationSidebarState?: SidebarState;
|
|
120
213
|
onNavigationSidebarStateChange?: (nextState: SidebarState) => void;
|
|
214
|
+
|
|
121
215
|
complementarySidebarState?: SidebarState;
|
|
122
216
|
defaultComplementarySidebarState?: SidebarState;
|
|
123
217
|
onComplementarySidebarStateChange?: (nextState: SidebarState) => void;
|
|
124
|
-
}>;
|
|
125
218
|
|
|
126
|
-
|
|
219
|
+
drawerState?: DrawerState;
|
|
220
|
+
defaultDrawerState?: DrawerState;
|
|
221
|
+
onDrawerStateChange?: (nextState: DrawerState) => void;
|
|
222
|
+
}>;
|
|
127
223
|
|
|
128
224
|
const MainRoot = ({
|
|
129
225
|
navigationSidebarState: propsNavigationSidebarState,
|
|
130
|
-
defaultNavigationSidebarState,
|
|
226
|
+
defaultNavigationSidebarState = 'closed',
|
|
131
227
|
onNavigationSidebarStateChange,
|
|
228
|
+
|
|
132
229
|
complementarySidebarState: propsComplementarySidebarState,
|
|
133
|
-
defaultComplementarySidebarState,
|
|
230
|
+
defaultComplementarySidebarState = 'closed',
|
|
134
231
|
onComplementarySidebarStateChange,
|
|
232
|
+
|
|
233
|
+
drawerState: propsDrawerState,
|
|
234
|
+
defaultDrawerState = 'closed',
|
|
235
|
+
onDrawerStateChange,
|
|
236
|
+
|
|
135
237
|
children,
|
|
136
238
|
...props
|
|
137
239
|
}: MainRootProps) => {
|
|
138
|
-
const [isLg] = useMediaQuery('lg'
|
|
240
|
+
const [isLg] = useMediaQuery('lg');
|
|
139
241
|
const [navigationSidebarState = isLg ? 'expanded' : 'collapsed', setNavigationSidebarState] =
|
|
140
242
|
useControllableState<SidebarState>({
|
|
141
243
|
prop: propsNavigationSidebarState,
|
|
@@ -148,25 +250,29 @@ const MainRoot = ({
|
|
|
148
250
|
defaultProp: defaultComplementarySidebarState,
|
|
149
251
|
onChange: onComplementarySidebarStateChange,
|
|
150
252
|
});
|
|
253
|
+
const [drawerState = 'closed', setDrawerState] = useControllableState<DrawerState>({
|
|
254
|
+
prop: propsDrawerState,
|
|
255
|
+
defaultProp: defaultDrawerState,
|
|
256
|
+
onChange: onDrawerStateChange,
|
|
257
|
+
});
|
|
151
258
|
|
|
152
259
|
const [resizing, setResizing] = useState(false);
|
|
153
260
|
const resizeInterval = useRef<ReturnType<typeof setTimeout> | null>(null);
|
|
261
|
+
useEffect(
|
|
262
|
+
() =>
|
|
263
|
+
addEventListener(window, 'resize', () => {
|
|
264
|
+
setResizing(true);
|
|
265
|
+
if (resizeInterval.current) {
|
|
266
|
+
clearTimeout(resizeInterval.current);
|
|
267
|
+
}
|
|
154
268
|
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
resizeInterval.current = null;
|
|
163
|
-
}, resizeDebounce);
|
|
164
|
-
}, []);
|
|
165
|
-
|
|
166
|
-
useEffect(() => {
|
|
167
|
-
window.addEventListener('resize', handleResize);
|
|
168
|
-
return () => window.removeEventListener('resize', handleResize);
|
|
169
|
-
}, [handleResize]);
|
|
269
|
+
resizeInterval.current = setTimeout(() => {
|
|
270
|
+
setResizing(false);
|
|
271
|
+
resizeInterval.current = null;
|
|
272
|
+
}, 3_000);
|
|
273
|
+
}),
|
|
274
|
+
[],
|
|
275
|
+
);
|
|
170
276
|
|
|
171
277
|
return (
|
|
172
278
|
<MainProvider
|
|
@@ -176,6 +282,8 @@ const MainRoot = ({
|
|
|
176
282
|
setNavigationSidebarState,
|
|
177
283
|
complementarySidebarState,
|
|
178
284
|
setComplementarySidebarState,
|
|
285
|
+
drawerState,
|
|
286
|
+
setDrawerState,
|
|
179
287
|
}}
|
|
180
288
|
resizing={resizing}
|
|
181
289
|
>
|
|
@@ -186,9 +294,9 @@ const MainRoot = ({
|
|
|
186
294
|
|
|
187
295
|
MainRoot.displayName = MAIN_ROOT_NAME;
|
|
188
296
|
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
297
|
+
//
|
|
298
|
+
// Sidebar
|
|
299
|
+
//
|
|
192
300
|
|
|
193
301
|
type MainSidebarProps = ThemedClassName<ComponentPropsWithRef<typeof DialogContent>> & {
|
|
194
302
|
swipeToDismiss?: boolean;
|
|
@@ -204,23 +312,31 @@ const MainSidebar = forwardRef<HTMLDivElement, MainSidebarProps>(
|
|
|
204
312
|
{ classNames, children, swipeToDismiss, onOpenAutoFocus, state, resizing, onStateChange, side, label, ...props },
|
|
205
313
|
forwardedRef,
|
|
206
314
|
) => {
|
|
207
|
-
const [isLg] = useMediaQuery('lg'
|
|
315
|
+
const [isLg] = useMediaQuery('lg');
|
|
208
316
|
const { tx } = useThemeContext();
|
|
209
317
|
const { t } = useTranslation();
|
|
210
318
|
const ref = useForwardedRef(forwardedRef);
|
|
211
319
|
const noopRef = useRef(null);
|
|
320
|
+
|
|
212
321
|
useSwipeToDismiss(swipeToDismiss ? ref : noopRef, {
|
|
213
322
|
onDismiss: () => onStateChange?.('closed'),
|
|
214
323
|
});
|
|
324
|
+
|
|
325
|
+
// NOTE(thure): This is a workaround for something further down the tree grabbing focus on Escape. Adding this
|
|
326
|
+
// intervention to `Tabs.Root` or `Tabs.Tabpenel` instances is somehow ineffectual.
|
|
215
327
|
const handleKeyDown = useCallback(
|
|
216
328
|
(event: KeyboardEvent<HTMLDivElement>) => {
|
|
217
|
-
|
|
218
|
-
|
|
329
|
+
const focusGroupParent = (event.target as HTMLElement).closest('[data-tabster]');
|
|
330
|
+
if (event.key === 'Escape' && focusGroupParent) {
|
|
331
|
+
event.preventDefault();
|
|
332
|
+
event.stopPropagation();
|
|
333
|
+
(focusGroupParent as HTMLElement).focus();
|
|
219
334
|
}
|
|
220
335
|
props.onKeyDown?.(event);
|
|
221
336
|
},
|
|
222
337
|
[props.onKeyDown],
|
|
223
338
|
);
|
|
339
|
+
|
|
224
340
|
const Root = isLg ? Primitive.div : DialogContent;
|
|
225
341
|
|
|
226
342
|
return (
|
|
@@ -228,13 +344,13 @@ const MainSidebar = forwardRef<HTMLDivElement, MainSidebarProps>(
|
|
|
228
344
|
{!isLg && <DialogTitle className='sr-only'>{toLocalizedString(label, t)}</DialogTitle>}
|
|
229
345
|
<Root
|
|
230
346
|
{...(!isLg && { forceMount: true, tabIndex: -1, onOpenAutoFocus: onOpenAutoFocus ?? handleOpenAutoFocus })}
|
|
347
|
+
{...(state === 'closed' && { inert: true })}
|
|
231
348
|
{...props}
|
|
232
349
|
data-side={side === 'inline-end' ? 'ie' : 'is'}
|
|
233
350
|
data-state={state}
|
|
234
351
|
data-resizing={resizing ? 'true' : 'false'}
|
|
235
352
|
className={tx('main.sidebar', 'main__sidebar', {}, classNames)}
|
|
236
|
-
|
|
237
|
-
{...(state === 'closed' && { inert: 'true' })}
|
|
353
|
+
onKeyDownCapture={handleKeyDown}
|
|
238
354
|
ref={ref}
|
|
239
355
|
>
|
|
240
356
|
{children}
|
|
@@ -244,6 +360,10 @@ const MainSidebar = forwardRef<HTMLDivElement, MainSidebarProps>(
|
|
|
244
360
|
},
|
|
245
361
|
);
|
|
246
362
|
|
|
363
|
+
//
|
|
364
|
+
// Navigation Sidebar
|
|
365
|
+
//
|
|
366
|
+
|
|
247
367
|
type MainNavigationSidebarProps = Omit<MainSidebarProps, 'expanded' | 'side'>;
|
|
248
368
|
|
|
249
369
|
const MainNavigationSidebar = forwardRef<HTMLDivElement, MainNavigationSidebarProps>((props, forwardedRef) => {
|
|
@@ -265,6 +385,10 @@ const MainNavigationSidebar = forwardRef<HTMLDivElement, MainNavigationSidebarPr
|
|
|
265
385
|
|
|
266
386
|
MainNavigationSidebar.displayName = NAVIGATION_SIDEBAR_NAME;
|
|
267
387
|
|
|
388
|
+
//
|
|
389
|
+
// Complementary Sidebar
|
|
390
|
+
//
|
|
391
|
+
|
|
268
392
|
type MainComplementarySidebarProps = Omit<MainSidebarProps, 'expanded' | 'side'>;
|
|
269
393
|
|
|
270
394
|
const MainComplementarySidebar = forwardRef<HTMLDivElement, MainComplementarySidebarProps>((props, forwardedRef) => {
|
|
@@ -285,20 +409,104 @@ const MainComplementarySidebar = forwardRef<HTMLDivElement, MainComplementarySid
|
|
|
285
409
|
);
|
|
286
410
|
});
|
|
287
411
|
|
|
288
|
-
|
|
412
|
+
MainComplementarySidebar.displayName = COMPLEMENTARY_SIDEBAR_NAME;
|
|
289
413
|
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
414
|
+
//
|
|
415
|
+
// Drawer
|
|
416
|
+
//
|
|
417
|
+
|
|
418
|
+
type MainDrawerProps = ThemedClassName<ComponentPropsWithRef<typeof DialogContent>> & {
|
|
419
|
+
swipeToDismiss?: boolean;
|
|
420
|
+
state?: DrawerState;
|
|
421
|
+
resizing?: boolean;
|
|
422
|
+
onStateChange?: (nextState: DrawerState) => void;
|
|
423
|
+
label: Label;
|
|
294
424
|
};
|
|
295
425
|
|
|
296
|
-
const
|
|
297
|
-
(
|
|
298
|
-
|
|
426
|
+
const MainDrawer = forwardRef<HTMLDivElement, MainDrawerProps>(
|
|
427
|
+
(
|
|
428
|
+
{ classNames, children, swipeToDismiss, onOpenAutoFocus, state, resizing, onStateChange, label, ...props },
|
|
429
|
+
forwardedRef,
|
|
430
|
+
) => {
|
|
431
|
+
const [isLg] = useMediaQuery('lg');
|
|
299
432
|
const { tx } = useThemeContext();
|
|
300
|
-
const
|
|
433
|
+
const { t } = useTranslation();
|
|
434
|
+
const ref = useForwardedRef(forwardedRef);
|
|
435
|
+
const noopRef = useRef(null);
|
|
301
436
|
|
|
437
|
+
// TODO(burdon): Implement vertical swipe-to-dismiss for drawer.
|
|
438
|
+
useSwipeToDismiss(swipeToDismiss ? ref : noopRef, {
|
|
439
|
+
onDismiss: () => onStateChange?.('closed'),
|
|
440
|
+
});
|
|
441
|
+
|
|
442
|
+
const handleKeyDown = useCallback(
|
|
443
|
+
(event: KeyboardEvent<HTMLDivElement>) => {
|
|
444
|
+
const focusGroupParent = (event.target as HTMLElement).closest('[data-tabster]');
|
|
445
|
+
if (event.key === 'Escape' && focusGroupParent) {
|
|
446
|
+
event.preventDefault();
|
|
447
|
+
event.stopPropagation();
|
|
448
|
+
(focusGroupParent as HTMLElement).focus();
|
|
449
|
+
}
|
|
450
|
+
props.onKeyDown?.(event);
|
|
451
|
+
},
|
|
452
|
+
[props.onKeyDown],
|
|
453
|
+
);
|
|
454
|
+
|
|
455
|
+
return (
|
|
456
|
+
<Primitive.div
|
|
457
|
+
{...(state === 'closed' && { inert: true })}
|
|
458
|
+
{...(!isLg && { forceMount: true, tabIndex: -1, onOpenAutoFocus: onOpenAutoFocus ?? handleOpenAutoFocus })}
|
|
459
|
+
{...props}
|
|
460
|
+
role='region'
|
|
461
|
+
aria-label={toLocalizedString(label, t)}
|
|
462
|
+
data-state={state}
|
|
463
|
+
data-resizing={resizing ? 'true' : 'false'}
|
|
464
|
+
className={tx('main.drawer', 'main__drawer', {}, classNames)}
|
|
465
|
+
onKeyDownCapture={handleKeyDown}
|
|
466
|
+
ref={ref}
|
|
467
|
+
>
|
|
468
|
+
{children}
|
|
469
|
+
</Primitive.div>
|
|
470
|
+
);
|
|
471
|
+
},
|
|
472
|
+
);
|
|
473
|
+
|
|
474
|
+
type MainDrawerRootProps = Omit<MainDrawerProps, 'state' | 'resizing' | 'onStateChange'>;
|
|
475
|
+
|
|
476
|
+
const MainDrawerRoot = forwardRef<HTMLDivElement, MainDrawerRootProps>((props, forwardedRef) => {
|
|
477
|
+
const { drawerState, setDrawerState, resizing } = useMainContext(DRAWER_NAME);
|
|
478
|
+
const mover = useLandmarkMover(props.onKeyDown, '3');
|
|
479
|
+
|
|
480
|
+
return (
|
|
481
|
+
<MainDrawer
|
|
482
|
+
{...mover}
|
|
483
|
+
{...props}
|
|
484
|
+
resizing={resizing}
|
|
485
|
+
state={drawerState}
|
|
486
|
+
onStateChange={setDrawerState}
|
|
487
|
+
ref={forwardedRef}
|
|
488
|
+
/>
|
|
489
|
+
);
|
|
490
|
+
});
|
|
491
|
+
|
|
492
|
+
MainDrawerRoot.displayName = DRAWER_NAME;
|
|
493
|
+
|
|
494
|
+
//
|
|
495
|
+
// Content
|
|
496
|
+
//
|
|
497
|
+
|
|
498
|
+
type MainContentProps = ThemedClassName<
|
|
499
|
+
ComponentPropsWithRef<typeof Primitive.div> &
|
|
500
|
+
MainStyleProps & {
|
|
501
|
+
asChild?: boolean;
|
|
502
|
+
}
|
|
503
|
+
>;
|
|
504
|
+
|
|
505
|
+
const MainContent = forwardRef<HTMLDivElement, MainContentProps>(
|
|
506
|
+
({ asChild, classNames, bounce, handlesFocus, children, role, ...props }: MainContentProps, forwardedRef) => {
|
|
507
|
+
const { navigationSidebarState, complementarySidebarState, drawerState } = useMainContext(MAIN_NAME);
|
|
508
|
+
const { tx } = useThemeContext();
|
|
509
|
+
const Root = asChild ? Slot : role ? 'div' : 'main';
|
|
302
510
|
const mover = useLandmarkMover(props.onKeyDown, '1');
|
|
303
511
|
|
|
304
512
|
return (
|
|
@@ -308,6 +516,7 @@ const MainContent = forwardRef<HTMLDivElement, MainProps>(
|
|
|
308
516
|
{...props}
|
|
309
517
|
data-sidebar-inline-start-state={navigationSidebarState}
|
|
310
518
|
data-sidebar-inline-end-state={complementarySidebarState}
|
|
519
|
+
data-drawer-state={drawerState}
|
|
311
520
|
data-handles-focus={handlesFocus}
|
|
312
521
|
className={tx('main.content', 'main', { bounce, handlesFocus }, classNames)}
|
|
313
522
|
ref={forwardedRef}
|
|
@@ -320,24 +529,28 @@ const MainContent = forwardRef<HTMLDivElement, MainProps>(
|
|
|
320
529
|
|
|
321
530
|
MainContent.displayName = MAIN_NAME;
|
|
322
531
|
|
|
323
|
-
type MainOverlayProps = ThemedClassName<Omit<ComponentPropsWithRef<typeof Primitive.div>, 'children'>>;
|
|
532
|
+
type MainOverlayProps = ThemedClassName<Omit<ComponentPropsWithRef<typeof Primitive.div>, 'children' | 'onClick'>>;
|
|
324
533
|
|
|
325
534
|
const MainOverlay = forwardRef<HTMLDivElement, MainOverlayProps>(({ classNames, ...props }, forwardedRef) => {
|
|
326
|
-
const [isLg] = useMediaQuery('lg'
|
|
535
|
+
const [isLg] = useMediaQuery('lg');
|
|
327
536
|
const { navigationSidebarState, setNavigationSidebarState, complementarySidebarState, setComplementarySidebarState } =
|
|
328
537
|
useMainContext(MAIN_NAME);
|
|
329
538
|
const { tx } = useThemeContext();
|
|
330
539
|
return (
|
|
331
540
|
<div
|
|
541
|
+
{...props}
|
|
332
542
|
onClick={() => {
|
|
333
543
|
setNavigationSidebarState('collapsed');
|
|
334
544
|
setComplementarySidebarState('collapsed');
|
|
335
545
|
}}
|
|
336
|
-
{...props}
|
|
337
546
|
className={tx(
|
|
338
547
|
'main.overlay',
|
|
339
548
|
'main__overlay',
|
|
340
|
-
{
|
|
549
|
+
{
|
|
550
|
+
isLg,
|
|
551
|
+
inlineStartSidebarOpen: navigationSidebarState,
|
|
552
|
+
inlineEndSidebarOpen: complementarySidebarState,
|
|
553
|
+
},
|
|
341
554
|
classNames,
|
|
342
555
|
)}
|
|
343
556
|
data-state={navigationSidebarState === 'expanded' || complementarySidebarState === 'expanded' ? 'open' : 'closed'}
|
|
@@ -353,8 +566,17 @@ export const Main = {
|
|
|
353
566
|
Overlay: MainOverlay,
|
|
354
567
|
NavigationSidebar: MainNavigationSidebar,
|
|
355
568
|
ComplementarySidebar: MainComplementarySidebar,
|
|
569
|
+
Drawer: MainDrawerRoot,
|
|
356
570
|
};
|
|
357
571
|
|
|
358
|
-
export { useMainContext, useSidebars, useLandmarkMover };
|
|
572
|
+
export { useMainContext, useSidebars, useLandmarkMover, useDynamicDrawer };
|
|
359
573
|
|
|
360
|
-
export type {
|
|
574
|
+
export type {
|
|
575
|
+
MainRootProps,
|
|
576
|
+
MainContentProps,
|
|
577
|
+
MainOverlayProps,
|
|
578
|
+
MainNavigationSidebarProps,
|
|
579
|
+
MainDrawerRootProps,
|
|
580
|
+
SidebarState,
|
|
581
|
+
DrawerState,
|
|
582
|
+
};
|
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
// Copyright 2022 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import '@
|
|
6
|
-
|
|
5
|
+
import { type Meta, type StoryObj } from '@storybook/react-vite';
|
|
7
6
|
import React from 'react';
|
|
8
7
|
|
|
9
|
-
import { ContextMenu } from './ContextMenu';
|
|
10
8
|
import { withTheme } from '../../testing';
|
|
11
9
|
|
|
10
|
+
import { ContextMenu } from './ContextMenu';
|
|
11
|
+
|
|
12
12
|
const DefaultStory = () => {
|
|
13
13
|
// NOTE(thure): Since long-tap will select text in some OSs, apply `select-none` to `ContextMenu.Trigger` where possible.
|
|
14
14
|
return (
|
|
@@ -91,15 +91,18 @@ const DefaultStory = () => {
|
|
|
91
91
|
);
|
|
92
92
|
};
|
|
93
93
|
|
|
94
|
-
|
|
94
|
+
const meta = {
|
|
95
95
|
title: 'ui/react-ui-core/ContextMenu',
|
|
96
|
-
component: ContextMenu,
|
|
96
|
+
component: ContextMenu.Root as any,
|
|
97
97
|
render: DefaultStory,
|
|
98
98
|
decorators: [withTheme],
|
|
99
|
-
|
|
100
|
-
|
|
99
|
+
} satisfies Meta<typeof DefaultStory>;
|
|
100
|
+
|
|
101
|
+
export default meta;
|
|
102
|
+
|
|
103
|
+
type Story = StoryObj<typeof meta>;
|
|
101
104
|
|
|
102
|
-
export const Default = {
|
|
105
|
+
export const Default: Story = {
|
|
103
106
|
args: {},
|
|
104
107
|
parameters: {
|
|
105
108
|
chromatic: { delay: 1600 },
|
|
@@ -34,6 +34,7 @@ const ContextMenuContent = forwardRef<HTMLDivElement, ContextMenuContentProps>(
|
|
|
34
34
|
return (
|
|
35
35
|
<ContextMenuPrimitive.Content
|
|
36
36
|
{...props}
|
|
37
|
+
data-arrow-keys='up down'
|
|
37
38
|
collisionPadding={safeCollisionPadding}
|
|
38
39
|
className={tx('menu.content', 'menu', { elevation }, classNames)}
|
|
39
40
|
ref={forwardedRef}
|
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
// Copyright 2022 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import '@
|
|
6
|
-
|
|
5
|
+
import { type Meta, type StoryObj } from '@storybook/react-vite';
|
|
7
6
|
import React, { useRef, useState } from 'react';
|
|
8
7
|
|
|
9
|
-
import { DropdownMenu } from './DropdownMenu';
|
|
10
8
|
import { withTheme } from '../../testing';
|
|
11
|
-
import { Button } from '../
|
|
9
|
+
import { Button } from '../Button';
|
|
10
|
+
|
|
11
|
+
import { DropdownMenu } from './DropdownMenu';
|
|
12
12
|
|
|
13
13
|
const DefaultStory = () => {
|
|
14
14
|
return (
|
|
@@ -91,15 +91,18 @@ const DefaultStory = () => {
|
|
|
91
91
|
);
|
|
92
92
|
};
|
|
93
93
|
|
|
94
|
-
|
|
94
|
+
const meta = {
|
|
95
95
|
title: 'ui/react-ui-core/DropdownMenu',
|
|
96
|
-
component: DropdownMenu,
|
|
96
|
+
component: DropdownMenu.Root,
|
|
97
97
|
render: DefaultStory,
|
|
98
98
|
decorators: [withTheme],
|
|
99
|
-
|
|
100
|
-
|
|
99
|
+
} satisfies Meta<typeof DefaultStory>;
|
|
100
|
+
|
|
101
|
+
export default meta;
|
|
102
|
+
|
|
103
|
+
type Story = StoryObj<typeof meta>;
|
|
101
104
|
|
|
102
|
-
export const Default = {
|
|
105
|
+
export const Default: Story = {
|
|
103
106
|
args: {},
|
|
104
107
|
parameters: {
|
|
105
108
|
chromatic: { delay: 1600 },
|