@dxos/react-ui 0.7.5-main.9cb18ac → 0.7.5-main.9d2a38b

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.
Files changed (52) hide show
  1. package/dist/lib/browser/index.mjs +213 -140
  2. package/dist/lib/browser/index.mjs.map +4 -4
  3. package/dist/lib/browser/meta.json +1 -1
  4. package/dist/lib/node/index.cjs +589 -520
  5. package/dist/lib/node/index.cjs.map +4 -4
  6. package/dist/lib/node/meta.json +1 -1
  7. package/dist/lib/node-esm/index.mjs +213 -140
  8. package/dist/lib/node-esm/index.mjs.map +4 -4
  9. package/dist/lib/node-esm/meta.json +1 -1
  10. package/dist/types/src/components/Buttons/IconButton.d.ts +4 -2
  11. package/dist/types/src/components/Buttons/IconButton.d.ts.map +1 -1
  12. package/dist/types/src/components/Dialogs/Dialog.d.ts.map +1 -1
  13. package/dist/types/src/components/Main/Main.d.ts +0 -2
  14. package/dist/types/src/components/Main/Main.d.ts.map +1 -1
  15. package/dist/types/src/components/Menus/ContextMenu.d.ts.map +1 -1
  16. package/dist/types/src/components/Menus/DropdownMenu.d.ts.map +1 -1
  17. package/dist/types/src/components/Popover/Popover.d.ts.map +1 -1
  18. package/dist/types/src/components/Select/Select.d.ts.map +1 -1
  19. package/dist/types/src/components/Separator/Separator.d.ts +3 -1
  20. package/dist/types/src/components/Separator/Separator.d.ts.map +1 -1
  21. package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts +3 -1
  22. package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts.map +1 -1
  23. package/dist/types/src/components/Toolbar/Toolbar.d.ts +15 -5
  24. package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -1
  25. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts +7 -2
  26. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts.map +1 -1
  27. package/dist/types/src/components/Tooltip/Tooltip.d.ts.map +1 -1
  28. package/dist/types/src/hooks/index.d.ts +1 -0
  29. package/dist/types/src/hooks/index.d.ts.map +1 -1
  30. package/dist/types/src/hooks/useSafeArea.d.ts +9 -0
  31. package/dist/types/src/hooks/useSafeArea.d.ts.map +1 -0
  32. package/dist/types/src/hooks/useSafeCollisionPadding.d.ts +10 -0
  33. package/dist/types/src/hooks/useSafeCollisionPadding.d.ts.map +1 -0
  34. package/dist/types/src/hooks/useVisualViewport.d.ts +1 -1
  35. package/dist/types/src/hooks/useVisualViewport.d.ts.map +1 -1
  36. package/dist/types/tsconfig.tsbuildinfo +1 -1
  37. package/package.json +12 -12
  38. package/src/components/Buttons/IconButton.tsx +22 -5
  39. package/src/components/Dialogs/Dialog.tsx +1 -9
  40. package/src/components/Main/Main.tsx +0 -36
  41. package/src/components/Menus/ContextMenu.tsx +4 -2
  42. package/src/components/Menus/DropdownMenu.tsx +4 -2
  43. package/src/components/Popover/Popover.tsx +4 -0
  44. package/src/components/Select/Select.tsx +4 -1
  45. package/src/components/Separator/Separator.tsx +14 -11
  46. package/src/components/ThemeProvider/ThemeProvider.tsx +12 -3
  47. package/src/components/Toolbar/Toolbar.tsx +40 -10
  48. package/src/components/Tooltip/Tooltip.tsx +17 -13
  49. package/src/hooks/index.ts +1 -0
  50. package/src/hooks/useSafeArea.ts +25 -0
  51. package/src/hooks/useSafeCollisionPadding.ts +39 -0
  52. package/src/hooks/useVisualViewport.ts +11 -12
@@ -19,6 +19,7 @@ import {
19
19
  import React, { forwardRef, type FunctionComponent } from 'react';
20
20
 
21
21
  import { useElevationContext, useThemeContext } from '../../hooks';
22
+ import { useSafeCollisionPadding } from '../../hooks/useSafeCollisionPadding';
22
23
  import { type ThemedClassName } from '../../util';
23
24
 
24
25
  type TooltipProviderProps = TooltipProviderPrimitiveProps;
@@ -52,19 +53,22 @@ const TooltipArrow = forwardRef<SVGSVGElement, TooltipArrowProps>(({ classNames,
52
53
 
53
54
  type TooltipContentProps = ThemedClassName<TooltipContentPrimitiveProps>;
54
55
 
55
- const TooltipContent = forwardRef<HTMLDivElement, TooltipContentProps>(({ classNames, ...props }, forwardedRef) => {
56
- const { tx } = useThemeContext();
57
- const elevation = useElevationContext();
58
- return (
59
- <TooltipContentPrimitive
60
- sideOffset={4}
61
- collisionPadding={8}
62
- {...props}
63
- className={tx('tooltip.content', 'tooltip', { elevation }, classNames)}
64
- ref={forwardedRef}
65
- />
66
- );
67
- });
56
+ const TooltipContent = forwardRef<HTMLDivElement, TooltipContentProps>(
57
+ ({ classNames, collisionPadding = 8, ...props }, forwardedRef) => {
58
+ const { tx } = useThemeContext();
59
+ const elevation = useElevationContext();
60
+ const safeCollisionPadding = useSafeCollisionPadding(collisionPadding);
61
+ return (
62
+ <TooltipContentPrimitive
63
+ sideOffset={4}
64
+ {...props}
65
+ collisionPadding={safeCollisionPadding}
66
+ className={tx('tooltip.content', 'tooltip', { elevation }, classNames)}
67
+ ref={forwardedRef}
68
+ />
69
+ );
70
+ },
71
+ );
68
72
 
69
73
  export const Tooltip = {
70
74
  Provider: TooltipProvider,
@@ -4,6 +4,7 @@
4
4
 
5
5
  export * from './useDensityContext';
6
6
  export * from './useElevationContext';
7
+ export * from './useSafeArea';
7
8
  export * from './useTranslationsContext';
8
9
  export * from './useThemeContext';
9
10
  export * from './useVisualViewport';
@@ -0,0 +1,25 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { useCallback, useState } from 'react';
6
+
7
+ import { useResize } from '@dxos/react-hooks';
8
+
9
+ export type SafeAreaPadding = Record<'top' | 'right' | 'bottom' | 'left', number>;
10
+
11
+ export const initialSafeArea = { top: NaN, right: NaN, bottom: NaN, left: NaN };
12
+
13
+ export const useSafeArea = (): SafeAreaPadding => {
14
+ const [padding, setPadding] = useState<SafeAreaPadding>(initialSafeArea);
15
+ const handleResize = useCallback(() => {
16
+ setPadding({
17
+ top: parseFloat(getComputedStyle(document.documentElement).getPropertyValue('--safe-area-top')),
18
+ right: parseFloat(getComputedStyle(document.documentElement).getPropertyValue('--safe-area-right')),
19
+ bottom: parseFloat(getComputedStyle(document.documentElement).getPropertyValue('--safe-area-bottom')),
20
+ left: parseFloat(getComputedStyle(document.documentElement).getPropertyValue('--safe-area-left')),
21
+ });
22
+ }, []);
23
+ useResize(handleResize);
24
+ return padding;
25
+ };
@@ -0,0 +1,39 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { type TooltipContentProps } from '@radix-ui/react-tooltip';
6
+ import { useMemo } from 'react';
7
+
8
+ import { type SafeAreaPadding } from './useSafeArea';
9
+ import { useThemeContext } from './useThemeContext';
10
+
11
+ type PaddingProp = TooltipContentProps['collisionPadding'];
12
+ type PaddingRecord = Exclude<PaddingProp, number | undefined>;
13
+
14
+ const propIsNumber = (prop: PaddingProp): prop is number => Number.isFinite(prop);
15
+ const propsIsRecord = (prop: PaddingProp): prop is PaddingRecord => !!(prop && typeof prop === 'object');
16
+
17
+ const safePadding = (
18
+ propsPadding: TooltipContentProps['collisionPadding'],
19
+ safePadding: SafeAreaPadding,
20
+ side: keyof SafeAreaPadding,
21
+ ) => {
22
+ return (
23
+ (propIsNumber(safePadding[side]) ? safePadding[side] : 0) +
24
+ (propIsNumber(propsPadding) ? propsPadding : propsIsRecord(propsPadding) ? propsPadding[side] ?? 0 : 0)
25
+ );
26
+ };
27
+
28
+ export const useSafeCollisionPadding = (collisionPadding?: PaddingProp) => {
29
+ const { safeAreaPadding } = useThemeContext();
30
+ return useMemo(
31
+ () => ({
32
+ top: safePadding(collisionPadding, safeAreaPadding!, 'top'),
33
+ right: safePadding(collisionPadding, safeAreaPadding!, 'right'),
34
+ bottom: safePadding(collisionPadding, safeAreaPadding!, 'bottom'),
35
+ left: safePadding(collisionPadding, safeAreaPadding!, 'left'),
36
+ }),
37
+ [collisionPadding, safeAreaPadding],
38
+ );
39
+ };
@@ -2,23 +2,22 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import { useEffect, useState } from 'react';
5
+ import { useCallback, type useEffect, useState } from 'react';
6
+
7
+ import { useResize } from '@dxos/react-hooks';
6
8
 
7
9
  export const useVisualViewport = (deps?: Parameters<typeof useEffect>[1]) => {
8
10
  const [width, setWidth] = useState<number | null>(null);
9
11
  const [height, setHeight] = useState<number | null>(null);
10
12
 
11
- useEffect(() => {
12
- const handleResize = () => {
13
- if (window.visualViewport) {
14
- setWidth(window.visualViewport.width);
15
- setHeight(window.visualViewport.height);
16
- }
17
- };
18
- window.visualViewport?.addEventListener('resize', handleResize);
19
- handleResize();
20
- return () => window.visualViewport?.removeEventListener('resize', handleResize);
21
- }, deps ?? []);
13
+ const handleResize = useCallback(() => {
14
+ if (window.visualViewport) {
15
+ setWidth(window.visualViewport.width);
16
+ setHeight(window.visualViewport.height);
17
+ }
18
+ }, []);
19
+
20
+ useResize(handleResize);
22
21
 
23
22
  return { width, height };
24
23
  };