@dxos/react-ui 0.8.4-main.cb12b3f963 → 0.8.4-main.d05539e30a
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 +102 -5
- package/README.md +1 -1
- package/dist/lib/browser/chunk-A5QCIG5R.mjs +24 -0
- package/dist/lib/browser/chunk-A5QCIG5R.mjs.map +7 -0
- package/dist/lib/browser/{chunk-BDBC6H6V.mjs → chunk-LY5XDQR5.mjs} +6 -8
- package/dist/lib/browser/chunk-LY5XDQR5.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +601 -287
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/testing/index.mjs +1 -7
- package/dist/lib/browser/testing/index.mjs.map +3 -3
- package/dist/lib/browser/translations.mjs +4 -13
- package/dist/lib/browser/translations.mjs.map +4 -4
- package/dist/lib/node-esm/{chunk-3JSJK2ZY.mjs → chunk-NGKLIKP3.mjs} +6 -8
- package/dist/lib/node-esm/chunk-NGKLIKP3.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-XCFLA74M.mjs +26 -0
- package/dist/lib/node-esm/chunk-XCFLA74M.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +601 -287
- 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 +1 -7
- package/dist/lib/node-esm/testing/index.mjs.map +3 -3
- package/dist/lib/node-esm/translations.mjs +4 -14
- package/dist/lib/node-esm/translations.mjs.map +4 -4
- package/dist/types/src/components/Card/Card.d.ts +2 -5
- package/dist/types/src/components/Card/Card.d.ts.map +1 -1
- package/dist/types/src/components/Carousel/Carousel.d.ts +106 -0
- package/dist/types/src/components/Carousel/Carousel.d.ts.map +1 -0
- package/dist/types/src/components/Carousel/index.d.ts +2 -0
- package/dist/types/src/components/Carousel/index.d.ts.map +1 -0
- package/dist/types/src/components/Icon/Icon.d.ts +1 -0
- package/dist/types/src/components/Icon/Icon.d.ts.map +1 -1
- package/dist/types/src/components/Link/Link.d.ts.map +1 -1
- package/dist/types/src/components/List/ListDropIndicator.d.ts.map +1 -1
- package/dist/types/src/components/MediaPlayer/MediaPlayer.d.ts +46 -0
- package/dist/types/src/components/MediaPlayer/MediaPlayer.d.ts.map +1 -0
- package/dist/types/src/components/MediaPlayer/MediaPlayer.stories.d.ts +16 -0
- package/dist/types/src/components/MediaPlayer/MediaPlayer.stories.d.ts.map +1 -0
- package/dist/types/src/components/MediaPlayer/index.d.ts +2 -0
- package/dist/types/src/components/MediaPlayer/index.d.ts.map +1 -0
- package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts.map +1 -1
- package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts.map +1 -1
- package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -1
- package/dist/types/src/components/Tooltip/Tooltip.d.ts +6 -6
- package/dist/types/src/components/Tooltip/Tooltip.d.ts.map +1 -1
- package/dist/types/src/components/index.d.ts +2 -0
- package/dist/types/src/components/index.d.ts.map +1 -1
- package/dist/types/src/exemplars/slot.stories.d.ts.map +1 -1
- package/dist/types/src/exemplars/virtualizer.stories.d.ts.map +1 -1
- package/dist/types/src/translations.d.ts +5 -0
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +18 -18
- package/src/components/Breadcrumb/Breadcrumb.stories.tsx +1 -1
- package/src/components/Button/IconButton.stories.tsx +1 -1
- package/src/components/Card/Card.stories.tsx +3 -3
- package/src/components/Card/Card.tsx +24 -17
- package/src/components/Carousel/Carousel.tsx +379 -0
- package/src/components/Carousel/index.ts +5 -0
- package/src/components/Clipboard/CopyButton.tsx +2 -2
- package/src/components/Icon/Icon.tsx +10 -3
- package/src/components/Link/Link.tsx +10 -2
- package/src/components/List/List.stories.tsx +1 -1
- package/src/components/List/List.tsx +1 -1
- package/src/components/List/ListDropIndicator.tsx +0 -1
- package/src/components/List/Tree.stories.tsx +1 -1
- package/src/components/MediaPlayer/MediaPlayer.stories.tsx +50 -0
- package/src/components/MediaPlayer/MediaPlayer.tsx +153 -0
- package/src/components/MediaPlayer/index.ts +5 -0
- package/src/components/Message/Message.tsx +2 -2
- package/src/components/ScrollArea/ScrollArea.stories.tsx +1 -5
- package/src/components/ScrollContainer/ScrollContainer.tsx +1 -3
- package/src/components/Toolbar/Toolbar.tsx +2 -1
- package/src/components/Tooltip/Tooltip.stories.tsx +1 -1
- package/src/components/Tooltip/Tooltip.tsx +14 -13
- package/src/components/index.ts +2 -0
- package/src/exemplars/slot.stories.tsx +2 -4
- package/src/exemplars/virtualizer.stories.tsx +0 -1
- package/src/testing/decorators/withLayout.tsx +6 -16
- package/src/translations.ts +5 -0
- package/dist/lib/browser/chunk-BDBC6H6V.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-3JSJK2ZY.mjs.map +0 -7
|
@@ -32,7 +32,7 @@ const StorybookTreeItem = ({ data, prefix }: StorybookTreeItemProps) => {
|
|
|
32
32
|
|
|
33
33
|
return (
|
|
34
34
|
<TreeItem.Root key={id} id={id} collapsible={!valueIsScalar} defaultOpen>
|
|
35
|
-
<div
|
|
35
|
+
<div className='grow flex'>
|
|
36
36
|
{valueIsScalar ? <TreeItem.MockOpenTrigger /> : <TreeItem.OpenTrigger />}
|
|
37
37
|
<TreeItem.Heading classNames='grow pt-1'>{valueIsScalar ? String(value) : key}</TreeItem.Heading>
|
|
38
38
|
</div>
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2026 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { type Meta, type StoryObj } from '@storybook/react-vite';
|
|
6
|
+
|
|
7
|
+
import { withTheme } from '@dxos/react-ui/testing';
|
|
8
|
+
|
|
9
|
+
import { MediaPlayer } from './MediaPlayer';
|
|
10
|
+
|
|
11
|
+
const meta = {
|
|
12
|
+
title: 'ui/react-ui-core/components/MediaPlayer',
|
|
13
|
+
component: MediaPlayer,
|
|
14
|
+
decorators: [withTheme()],
|
|
15
|
+
parameters: { layout: 'centered' },
|
|
16
|
+
} satisfies Meta<typeof MediaPlayer>;
|
|
17
|
+
|
|
18
|
+
export default meta;
|
|
19
|
+
|
|
20
|
+
type Story = StoryObj<typeof meta>;
|
|
21
|
+
|
|
22
|
+
export const Video: Story = {
|
|
23
|
+
args: {
|
|
24
|
+
// TODO(burdon): CORS issue.
|
|
25
|
+
src: 'https://customer-5rxcjpyab08avpmn.cloudflarestream.com/f58459bcdf3a6f3e93644a4e0f39b22a/downloads/default.mp4',
|
|
26
|
+
classNames: 'max-w-[640px]',
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
export const Audio: Story = {
|
|
31
|
+
args: {
|
|
32
|
+
src: 'https://commondatastorage.googleapis.com/codeskulptor-demos/DDR_assets/Kangaroo_MusiQue_-_The_Neverwritten_Role_Playing_Game.mp3',
|
|
33
|
+
classNames: 'min-w-[480px]',
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
export const ExplicitKind: Story = {
|
|
38
|
+
args: {
|
|
39
|
+
src: 'https://commondatastorage.googleapis.com/codeskulptor-demos/DDR_assets/Kangaroo_MusiQue_-_The_Neverwritten_Role_Playing_Game.mp3',
|
|
40
|
+
kind: 'audio',
|
|
41
|
+
classNames: 'min-w-[480px]',
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
export const Streaming: Story = {
|
|
46
|
+
args: {
|
|
47
|
+
src: 'https://customer-5rxcjpyab08avpmn.cloudflarestream.com/f58459bcdf3a6f3e93644a4e0f39b22a/iframe?poster=https%3A%2F%2Fcustomer-5rxcjpyab08avpmn.cloudflarestream.com%2Ff58459bcdf3a6f3e93644a4e0f39b22a%2Fthumbnails%2Fthumbnail.jpg%3Ftime%3D%26height%3D600',
|
|
48
|
+
classNames: 'min-w-[480px]',
|
|
49
|
+
},
|
|
50
|
+
};
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2026 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import React from 'react';
|
|
6
|
+
|
|
7
|
+
import { mx } from '@dxos/ui-theme';
|
|
8
|
+
|
|
9
|
+
import { type ThemedClassName } from '../../util';
|
|
10
|
+
|
|
11
|
+
export type MediaKind = 'video' | 'audio';
|
|
12
|
+
|
|
13
|
+
const VIDEO_EXTENSIONS = ['.mp4', '.webm', '.ogv', '.mov', '.m4v'];
|
|
14
|
+
const AUDIO_EXTENSIONS = ['.mp3', '.wav', '.ogg', '.m4a', '.aac', '.flac'];
|
|
15
|
+
|
|
16
|
+
/** iframe sandbox flags compatible with typical oEmbed-style players. */
|
|
17
|
+
const DEFAULT_IFRAME_SANDBOX = 'allow-scripts allow-same-origin allow-presentation';
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Best-effort detection of `video` vs `audio` from a media URL.
|
|
21
|
+
* Inspects the pathname's extension (ignoring query/hash). Returns `undefined`
|
|
22
|
+
* when the URL doesn't look like a recognised media file — callers should
|
|
23
|
+
* default to 'video' or render a fallback (e.g. iframe / img).
|
|
24
|
+
*/
|
|
25
|
+
export const detectMediaKind = (src: string): MediaKind | undefined => {
|
|
26
|
+
// Strip query and hash, then take the last path segment's extension.
|
|
27
|
+
const pathname = src.split(/[?#]/, 1)[0]!;
|
|
28
|
+
const lower = pathname.toLowerCase();
|
|
29
|
+
if (VIDEO_EXTENSIONS.some((extension) => lower.endsWith(extension))) {
|
|
30
|
+
return 'video';
|
|
31
|
+
}
|
|
32
|
+
if (AUDIO_EXTENSIONS.some((extension) => lower.endsWith(extension))) {
|
|
33
|
+
return 'audio';
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
return undefined;
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Heuristic match for URLs that should render as native `<video>` / `<audio>`
|
|
41
|
+
* (i.e. URLs ending in a recognised media extension).
|
|
42
|
+
*
|
|
43
|
+
* NB: legacy embed URLs (Cloudflare Stream etc. — paths containing `iframe`)
|
|
44
|
+
* serve an HTML player page, **not** a media stream, so they cannot be loaded
|
|
45
|
+
* via `<video>`. Those are detected by {@link isLegacyIframeUrl} and rendered
|
|
46
|
+
* via `<iframe>` instead.
|
|
47
|
+
*/
|
|
48
|
+
export const isEmbedUrl = (src: string): boolean => detectMediaKind(src) !== undefined;
|
|
49
|
+
|
|
50
|
+
/** Match URLs whose pathname has an `/iframe` segment (e.g. Cloudflare Stream embeds). */
|
|
51
|
+
const LEGACY_IFRAME_PATH_PATTERN = /\/iframe(?:[/?#]|$)/i;
|
|
52
|
+
|
|
53
|
+
const isLegacyIframeUrl = (src: string): boolean => {
|
|
54
|
+
const pathAndQuery = src.split('#', 1)[0]!;
|
|
55
|
+
return LEGACY_IFRAME_PATH_PATTERN.test(pathAndQuery);
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
export type MediaPlayerProps = ThemedClassName<{
|
|
59
|
+
src: string;
|
|
60
|
+
/** Override auto-detection. When omitted, `detectMediaKind(src)` is used and falls back to 'video'. */
|
|
61
|
+
kind?: MediaKind;
|
|
62
|
+
controls?: boolean;
|
|
63
|
+
autoPlay?: boolean;
|
|
64
|
+
loop?: boolean;
|
|
65
|
+
muted?: boolean;
|
|
66
|
+
/** Accessible label for the `<video>` / `<audio>` element. */
|
|
67
|
+
alt?: string;
|
|
68
|
+
/** Defaults to 'anonymous' for cross-origin sources (e.g. signed S3 URLs). */
|
|
69
|
+
crossOrigin?: 'anonymous' | 'use-credentials' | '';
|
|
70
|
+
/** Additional classes applied only when rendering `<img>`. */
|
|
71
|
+
imgClassNames?: string;
|
|
72
|
+
/** Additional classes applied only when rendering native media or `<iframe>`. */
|
|
73
|
+
mediaClassNames?: string;
|
|
74
|
+
}>;
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Renders a media URL using the appropriate element:
|
|
78
|
+
* - Direct media URLs (mp4, mp3, …) → native `<video>` / `<audio>`.
|
|
79
|
+
* - Legacy `iframe`-style embed URLs (Cloudflare Stream, oEmbed players) → `<iframe>`.
|
|
80
|
+
* - Everything else → `<img>` that hides itself on load failure (broken images
|
|
81
|
+
* are common in feeds and the placeholder is uglier than nothing).
|
|
82
|
+
*/
|
|
83
|
+
export const MediaPlayer = ({
|
|
84
|
+
classNames,
|
|
85
|
+
src,
|
|
86
|
+
kind,
|
|
87
|
+
controls = true,
|
|
88
|
+
autoPlay = false,
|
|
89
|
+
loop = false,
|
|
90
|
+
muted = false,
|
|
91
|
+
alt,
|
|
92
|
+
crossOrigin = 'anonymous',
|
|
93
|
+
imgClassNames,
|
|
94
|
+
mediaClassNames,
|
|
95
|
+
}: MediaPlayerProps) => {
|
|
96
|
+
if (isEmbedUrl(src)) {
|
|
97
|
+
const resolved = kind ?? detectMediaKind(src) ?? 'video';
|
|
98
|
+
if (resolved === 'audio') {
|
|
99
|
+
return (
|
|
100
|
+
<audio
|
|
101
|
+
className={mx('w-full', classNames, mediaClassNames)}
|
|
102
|
+
src={src}
|
|
103
|
+
controls={controls}
|
|
104
|
+
autoPlay={autoPlay}
|
|
105
|
+
loop={loop}
|
|
106
|
+
muted={muted}
|
|
107
|
+
crossOrigin={crossOrigin}
|
|
108
|
+
aria-label={alt}
|
|
109
|
+
/>
|
|
110
|
+
);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
return (
|
|
114
|
+
<video
|
|
115
|
+
className={mx('aspect-video max-w-full max-h-full', classNames, mediaClassNames)}
|
|
116
|
+
src={src}
|
|
117
|
+
controls={controls}
|
|
118
|
+
autoPlay={autoPlay}
|
|
119
|
+
loop={loop}
|
|
120
|
+
muted={muted}
|
|
121
|
+
crossOrigin={crossOrigin}
|
|
122
|
+
aria-label={alt}
|
|
123
|
+
/>
|
|
124
|
+
);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
if (isLegacyIframeUrl(src)) {
|
|
128
|
+
return (
|
|
129
|
+
<iframe
|
|
130
|
+
src={src}
|
|
131
|
+
title={alt ?? 'Embedded media'}
|
|
132
|
+
loading='lazy'
|
|
133
|
+
className={mx('border-none', classNames, mediaClassNames)}
|
|
134
|
+
sandbox={DEFAULT_IFRAME_SANDBOX}
|
|
135
|
+
referrerPolicy='no-referrer'
|
|
136
|
+
allow='accelerometer; gyroscope; autoplay; encrypted-media; picture-in-picture;'
|
|
137
|
+
allowFullScreen
|
|
138
|
+
/>
|
|
139
|
+
);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
return (
|
|
143
|
+
<img
|
|
144
|
+
src={src}
|
|
145
|
+
alt={alt ?? ''}
|
|
146
|
+
loading='lazy'
|
|
147
|
+
className={mx(classNames, imgClassNames)}
|
|
148
|
+
onError={(event) => {
|
|
149
|
+
event.currentTarget.style.display = 'none';
|
|
150
|
+
}}
|
|
151
|
+
/>
|
|
152
|
+
);
|
|
153
|
+
};
|
|
@@ -101,9 +101,9 @@ const MessageTitle = forwardRef<HTMLHeadingElement, MessageTitleProps>(
|
|
|
101
101
|
const { titleId, valence } = useMessageContext(MESSAGE_TITLE_NAME);
|
|
102
102
|
const icon = iconProp ?? messageIcons[valence];
|
|
103
103
|
return (
|
|
104
|
-
<div
|
|
104
|
+
<div className={tx('message.header', {}, classNames)} id={titleId} ref={forwardedRef}>
|
|
105
105
|
{icon && (
|
|
106
|
-
<div
|
|
106
|
+
<div className={tx('message.icon', { valence })}>
|
|
107
107
|
<Icon icon={icon} />
|
|
108
108
|
</div>
|
|
109
109
|
)}
|
|
@@ -48,11 +48,7 @@ const Row = ({ items = 50 }: { items?: number }) => (
|
|
|
48
48
|
);
|
|
49
49
|
|
|
50
50
|
const Container = ({ classNames, children }: ThemedClassName<PropsWithChildren>) => {
|
|
51
|
-
return (
|
|
52
|
-
<div role='none' className={mx('border border-separator rounded-md overflow-hidden', classNames)}>
|
|
53
|
-
{children}
|
|
54
|
-
</div>
|
|
55
|
-
);
|
|
51
|
+
return <div className={mx('border border-separator rounded-md overflow-hidden', classNames)}>{children}</div>;
|
|
56
52
|
};
|
|
57
53
|
|
|
58
54
|
export const Vertical = {
|
|
@@ -276,13 +276,12 @@ const Fade = () => {
|
|
|
276
276
|
|
|
277
277
|
return (
|
|
278
278
|
<div
|
|
279
|
-
role='none'
|
|
280
279
|
data-visible={overflow}
|
|
281
280
|
className={mx(
|
|
282
281
|
// NOTE: Gradients may not be visible with dark reader extensions.
|
|
283
282
|
'z-10 absolute top-0 inset-x-0 h-24 w-full',
|
|
284
283
|
'opacity-0 duration-200 transition-opacity data-[visible="true"]:opacity-100',
|
|
285
|
-
'bg-gradient-to-b from-(--surface
|
|
284
|
+
'bg-gradient-to-b from-(--color-base-surface) to-transparent pointer-events-none',
|
|
286
285
|
)}
|
|
287
286
|
/>
|
|
288
287
|
);
|
|
@@ -303,7 +302,6 @@ const ScrollDownButton = ({ classNames }: ScrollDownButtonProps) => {
|
|
|
303
302
|
|
|
304
303
|
return (
|
|
305
304
|
<div
|
|
306
|
-
role='none'
|
|
307
305
|
className={mx(
|
|
308
306
|
'absolute bottom-2 right-4 opacity-100 transition-opacity duration-300',
|
|
309
307
|
pinned && 'opacity-0',
|
|
@@ -161,7 +161,7 @@ const ToolbarToggleGroupItem = forwardRef<HTMLButtonElement, ToolbarToggleGroupI
|
|
|
161
161
|
type ToolbarToggleGroupIconItemProps = Omit<ToggleGroupItemPrimitiveProps, 'className'> & IconButtonProps;
|
|
162
162
|
|
|
163
163
|
const ToolbarToggleGroupIconItem = forwardRef<HTMLButtonElement, ToolbarToggleGroupIconItemProps>(
|
|
164
|
-
({ variant, density, elevation, classNames, icon, label, iconOnly, ...props }, forwardedRef) => {
|
|
164
|
+
({ variant, density, elevation, classNames, icon, label, iconOnly, iconClassNames, ...props }, forwardedRef) => {
|
|
165
165
|
return (
|
|
166
166
|
<ToolbarPrimitive.ToolbarToggleItem {...props} asChild>
|
|
167
167
|
<IconButton
|
|
@@ -173,6 +173,7 @@ const ToolbarToggleGroupIconItem = forwardRef<HTMLButtonElement, ToolbarToggleGr
|
|
|
173
173
|
icon,
|
|
174
174
|
label,
|
|
175
175
|
iconOnly,
|
|
176
|
+
iconClassNames,
|
|
176
177
|
}}
|
|
177
178
|
ref={forwardedRef}
|
|
178
179
|
/>
|
|
@@ -19,7 +19,7 @@ type DefaultStoryProps = {
|
|
|
19
19
|
const DefaultStory = ({ tooltips, defaultOpen }: DefaultStoryProps) => {
|
|
20
20
|
return (
|
|
21
21
|
<Tooltip.Provider defaultOpen={defaultOpen}>
|
|
22
|
-
<div
|
|
22
|
+
<div className='w-32'>
|
|
23
23
|
{tooltips.map(({ label, content }, i) => (
|
|
24
24
|
<Tooltip.Trigger asChild key={i} content={content} side='right'>
|
|
25
25
|
<Button classNames='block w-full'>{label}</Button>
|
|
@@ -54,7 +54,7 @@ type TooltipContextValue = {
|
|
|
54
54
|
open: boolean;
|
|
55
55
|
stateAttribute: 'closed' | 'delayed-open' | 'instant-open';
|
|
56
56
|
trigger: TooltipTriggerElement | null;
|
|
57
|
-
onTriggerChange(trigger: TooltipTriggerElement | null): void;
|
|
57
|
+
onTriggerChange(trigger: TooltipTriggerElement | null, content?: ReactNode, side?: TooltipSide): void;
|
|
58
58
|
onTriggerEnter(): void;
|
|
59
59
|
onTriggerLeave(): void;
|
|
60
60
|
onOpen(): void;
|
|
@@ -111,15 +111,18 @@ const TooltipProvider: FC<TooltipProviderProps> = (props: TooltipScopedProps<Too
|
|
|
111
111
|
|
|
112
112
|
const popperScope = usePopperScope(__scopeTooltip);
|
|
113
113
|
const [trigger, setTrigger] = useState<HTMLButtonElement | null>(null);
|
|
114
|
-
const [content, setContent] = useState<
|
|
114
|
+
const [content, setContent] = useState<ReactNode>(null);
|
|
115
115
|
const [side, setSide] = useState<TooltipSide | undefined>(undefined);
|
|
116
116
|
const triggerRef = useRef<HTMLButtonElement | null>(trigger);
|
|
117
|
-
const handleTriggerChange = useCallback(
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
117
|
+
const handleTriggerChange = useCallback(
|
|
118
|
+
(nextTrigger: HTMLButtonElement | null, nextContent?: ReactNode, nextSide?: TooltipSide) => {
|
|
119
|
+
setTrigger(nextTrigger);
|
|
120
|
+
triggerRef.current = nextTrigger;
|
|
121
|
+
setContent(nextContent ?? null);
|
|
122
|
+
setSide(nextSide);
|
|
123
|
+
},
|
|
124
|
+
[],
|
|
125
|
+
);
|
|
123
126
|
const contentId = useId();
|
|
124
127
|
const openTimerRef = useRef(0);
|
|
125
128
|
const wasOpenDelayedRef = useRef(false);
|
|
@@ -248,9 +251,9 @@ const TRIGGER_NAME = 'TooltipTrigger';
|
|
|
248
251
|
|
|
249
252
|
type TooltipTriggerElement = ComponentRef<typeof Primitive.button>;
|
|
250
253
|
type PrimitiveButtonProps = ComponentPropsWithoutRef<typeof Primitive.button>;
|
|
251
|
-
type TooltipTriggerProps = PrimitiveButtonProps &
|
|
254
|
+
type TooltipTriggerProps = Omit<PrimitiveButtonProps, 'content'> &
|
|
252
255
|
Pick<TooltipProps, 'delayDuration'> & {
|
|
253
|
-
content?:
|
|
256
|
+
content?: ReactNode;
|
|
254
257
|
side?: TooltipSide;
|
|
255
258
|
onInteract?: (event: SyntheticEvent) => void;
|
|
256
259
|
};
|
|
@@ -283,8 +286,6 @@ const TooltipTrigger = forwardRef<TooltipTriggerElement, TooltipTriggerProps>(
|
|
|
283
286
|
// commonly anchors and the anchor `type` attribute signifies MIME type.
|
|
284
287
|
aria-describedby={context.open ? context.contentId : undefined}
|
|
285
288
|
data-state={context.stateAttribute}
|
|
286
|
-
data-tooltip-content={content}
|
|
287
|
-
data-tooltip-side={side}
|
|
288
289
|
{...triggerProps}
|
|
289
290
|
ref={composedRefs}
|
|
290
291
|
onPointerMove={composeEventHandlers(props.onPointerMove, (event) => {
|
|
@@ -296,7 +297,7 @@ const TooltipTrigger = forwardRef<TooltipTriggerElement, TooltipTriggerProps>(
|
|
|
296
297
|
if (event.defaultPrevented) {
|
|
297
298
|
return;
|
|
298
299
|
}
|
|
299
|
-
context.onTriggerChange(ref.current);
|
|
300
|
+
context.onTriggerChange(ref.current, content, side);
|
|
300
301
|
context.onTriggerEnter();
|
|
301
302
|
hasPointerMoveOpenedRef.current = true;
|
|
302
303
|
}
|
package/src/components/index.ts
CHANGED
|
@@ -10,6 +10,7 @@ export * from './Avatars';
|
|
|
10
10
|
export * from './Breadcrumb';
|
|
11
11
|
export * from './Button';
|
|
12
12
|
export * from './Card';
|
|
13
|
+
export * from './Carousel';
|
|
13
14
|
export * from './Clipboard';
|
|
14
15
|
export * from './Dialog';
|
|
15
16
|
export * from './ErrorFallback';
|
|
@@ -20,6 +21,7 @@ export * from './Input';
|
|
|
20
21
|
export * from './Link';
|
|
21
22
|
export * from './List';
|
|
22
23
|
export * from './Main';
|
|
24
|
+
export * from './MediaPlayer';
|
|
23
25
|
export * from './Menu';
|
|
24
26
|
export * from './Message';
|
|
25
27
|
export * from './Popover';
|
|
@@ -59,9 +59,7 @@ const Leaf = composable<HTMLButtonElement>(({ children, ...props }, forwardedRef
|
|
|
59
59
|
|
|
60
60
|
/** This isn't a valid child for a `slottable` component. */
|
|
61
61
|
const Simple = ({ children, classNames }: ThemedClassName<PropsWithChildren>) => (
|
|
62
|
-
<div
|
|
63
|
-
{children}
|
|
64
|
-
</div>
|
|
62
|
+
<div className={mx(classNames)}>{children}</div>
|
|
65
63
|
);
|
|
66
64
|
|
|
67
65
|
const meta = {
|
|
@@ -99,7 +97,7 @@ export const Inner: Story = {
|
|
|
99
97
|
<Outer asChild role='article' classNames='border-orange-500'>
|
|
100
98
|
<Middle asChild>
|
|
101
99
|
<Leaf>
|
|
102
|
-
<div
|
|
100
|
+
<div>Leaf</div>
|
|
103
101
|
</Leaf>
|
|
104
102
|
</Middle>
|
|
105
103
|
</Outer>
|
|
@@ -47,31 +47,21 @@ export const withLayout =
|
|
|
47
47
|
};
|
|
48
48
|
|
|
49
49
|
const layouts: Record<ContainerType, FC<ContainerProps>> = {
|
|
50
|
-
default: ({ classNames, children }: ContainerProps) => (
|
|
51
|
-
<div role='none' className={mx('p-4', classNames)}>
|
|
52
|
-
{children}
|
|
53
|
-
</div>
|
|
54
|
-
),
|
|
50
|
+
default: ({ classNames, children }: ContainerProps) => <div className={mx('p-4', classNames)}>{children}</div>,
|
|
55
51
|
|
|
56
52
|
fullscreen: ({ classNames, children }: ContainerProps) => (
|
|
57
|
-
<div
|
|
58
|
-
{children}
|
|
59
|
-
</div>
|
|
53
|
+
<div className={mx('fixed inset-0 flex overflow-hidden bg-black', classNames)}>{children}</div>
|
|
60
54
|
),
|
|
61
55
|
|
|
62
56
|
centered: ({ classNames, children }: ContainerProps) => (
|
|
63
|
-
<div
|
|
64
|
-
<div
|
|
65
|
-
{children}
|
|
66
|
-
</div>
|
|
57
|
+
<div className={mx('fixed inset-0 grid overflow-hidden place-items-center bg-black')}>
|
|
58
|
+
<div className={mx('flex flex-col bg-base-surface', classNames)}>{children}</div>
|
|
67
59
|
</div>
|
|
68
60
|
),
|
|
69
61
|
|
|
70
62
|
column: ({ classNames, children }: ContainerProps) => (
|
|
71
|
-
<div
|
|
72
|
-
<div
|
|
73
|
-
{children}
|
|
74
|
-
</div>
|
|
63
|
+
<div className='fixed inset-0 flex overflow-hidden justify-center bg-black'>
|
|
64
|
+
<div className={mx('flex flex-col w-[40rem] bg-base-surface', classNames)}>{children}</div>
|
|
75
65
|
</div>
|
|
76
66
|
),
|
|
77
67
|
};
|
package/src/translations.ts
CHANGED
|
@@ -13,6 +13,11 @@ export const translations = [
|
|
|
13
13
|
'toolbar-menu.label': 'Action menu',
|
|
14
14
|
'toolbar-drag-handle.label': 'Drag to rearrange',
|
|
15
15
|
'toolbar-close.label': 'Close',
|
|
16
|
+
'carousel-viewport.label': 'Carousel',
|
|
17
|
+
'carousel-prev.label': 'Previous slide',
|
|
18
|
+
'carousel-next.label': 'Next slide',
|
|
19
|
+
'carousel-indicators.label': 'Carousel slides',
|
|
20
|
+
'carousel-go-to.label': 'Go to slide {{index}}',
|
|
16
21
|
},
|
|
17
22
|
},
|
|
18
23
|
},
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/components/DensityProvider/DensityProvider.tsx", "../../../src/components/ElevationProvider/ElevationProvider.tsx", "../../../src/hooks/useElevationContext.ts", "../../../src/components/ThemeProvider/ThemeProvider.tsx", "../../../src/hooks/useThemeContext.ts", "../../../src/hooks/useSafeArea.ts", "../../../src/components/ThemeProvider/TranslationsProvider.tsx", "../../../src/util/hasIosKeyboard.ts", "../../../src/components/Tooltip/Tooltip.tsx", "../../../src/components/ErrorFallback/ErrorStack.tsx"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { type PropsWithChildren, createContext } from 'react';\n\nimport { type Density } from '@dxos/ui-types';\n\nexport interface DensityContextValue {\n density?: Density;\n}\n\nexport type DensityProviderProps = PropsWithChildren<{\n density?: Density;\n}>;\n\nexport const DensityContext = createContext<DensityContextValue>({ density: 'fine' });\n\nexport const DensityProvider = ({ density, children }: DensityProviderProps) => (\n <DensityContext.Provider value={{ density }}>{children}</DensityContext.Provider>\n);\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { type PropsWithChildren, createContext } from 'react';\n\nimport { type Elevation } from '@dxos/ui-types';\n\nexport interface ElevationContextValue {\n elevation?: Elevation;\n}\n\nexport type ElevationProviderProps = PropsWithChildren<{\n elevation?: Elevation;\n}>;\n\nexport const ElevationContext = createContext<ElevationContextValue>({ elevation: 'base' });\n\nexport const ElevationProvider = ({ elevation, children }: ElevationProviderProps) => (\n <ElevationContext.Provider value={{ elevation }}>{children}</ElevationContext.Provider>\n);\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { useContext } from 'react';\n\nimport { type Elevation } from '@dxos/ui-types';\n\nimport { ElevationContext } from '../components';\n\nexport const useElevationContext = (propsElevation?: Elevation) => {\n const { elevation } = useContext(ElevationContext);\n return propsElevation ?? elevation;\n};\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { createKeyborg } from 'keyborg';\nimport React, { type PropsWithChildren, createContext, useEffect, useMemo } from 'react';\n\nimport { type Density, type Elevation, type ThemeFunction, type ThemeMode } from '@dxos/ui-types';\n\nimport { type SafeAreaPadding, useSafeArea } from '../../hooks';\nimport { hasIosKeyboard } from '../../util';\nimport { DensityProvider } from '../DensityProvider';\nimport { ElevationProvider } from '../ElevationProvider';\nimport { TranslationsProvider, type TranslationsProviderProps } from './TranslationsProvider';\n\nexport type ThemeContextValue = {\n tx: ThemeFunction<any>;\n themeMode: ThemeMode;\n hasIosKeyboard: boolean;\n safeAreaPadding?: SafeAreaPadding;\n noCache?: boolean;\n platform?: 'mobile' | 'desktop';\n};\n\n/**\n * @internal\n */\nexport const ThemeContext = createContext<ThemeContextValue | undefined>(undefined);\n\nexport type ThemeProviderProps = Omit<TranslationsProviderProps, 'children'> &\n Partial<Omit<ThemeContextValue, 'safeAreaPadding'>> &\n PropsWithChildren<{\n rootDensity?: Density;\n rootElevation?: Elevation;\n }>;\n\nexport const ThemeProvider = ({\n children,\n fallback = null,\n resourceExtensions,\n appNs,\n tx = (_path, _styleProps, ..._options) => undefined,\n themeMode = 'dark',\n rootDensity = 'fine',\n noCache,\n platform,\n}: ThemeProviderProps) => {\n useEffect(() => {\n if (document.defaultView) {\n const kb = createKeyborg(document.defaultView);\n kb.subscribe(handleInputModalityChange);\n return () => kb.unsubscribe(handleInputModalityChange);\n }\n }, []);\n\n const safeAreaPadding = useSafeArea();\n // Destructure all props explicitly so useMemo deps are stable primitives, not a new `rest` object every render.\n const contextValue = useMemo(\n () => ({ tx, themeMode, hasIosKeyboard: hasIosKeyboard(), safeAreaPadding, noCache, platform }),\n [tx, themeMode, safeAreaPadding, noCache, platform],\n );\n\n return (\n <ThemeContext.Provider value={contextValue}>\n <TranslationsProvider\n {...{\n fallback,\n resourceExtensions,\n appNs,\n }}\n >\n <ElevationProvider elevation='base'>\n <DensityProvider density={rootDensity}>{children}</DensityProvider>\n </ElevationProvider>\n </TranslationsProvider>\n </ThemeContext.Provider>\n );\n};\n\nconst handleInputModalityChange = (isUsingKeyboard: boolean) => {\n if (isUsingKeyboard) {\n document.body.setAttribute('data-w-keyboard', 'true');\n } else {\n document.body.removeAttribute('data-w-keyboard');\n }\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { useContext } from 'react';\n\nimport { raise } from '@dxos/debug';\n\nimport { ThemeContext } from '../components';\n\nexport const useThemeContext = () => useContext(ThemeContext) ?? raise(new Error('Missing ThemeContext'));\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useCallback, useState } from 'react';\n\nimport { useViewportResize } from '@dxos/react-hooks';\n\nexport type SafeAreaPadding = Record<'top' | 'right' | 'bottom' | 'left', number>;\n\nexport const initialSafeArea = { top: NaN, right: NaN, bottom: NaN, left: NaN };\n\nexport const useSafeArea = (): SafeAreaPadding => {\n const [padding, setPadding] = useState<SafeAreaPadding>(initialSafeArea);\n const handleResize = useCallback(() => {\n setPadding({\n top: parseFloat(getComputedStyle(document.documentElement).getPropertyValue('--safe-area-top')),\n right: parseFloat(getComputedStyle(document.documentElement).getPropertyValue('--safe-area-right')),\n bottom: parseFloat(getComputedStyle(document.documentElement).getPropertyValue('--safe-area-bottom')),\n left: parseFloat(getComputedStyle(document.documentElement).getPropertyValue('--safe-area-left')),\n });\n }, []);\n\n useViewportResize(handleResize);\n return padding;\n};\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { type Locale, enUS as dtLocaleEnUs } from 'date-fns/locale';\nimport i18Next, { type Resource } from 'i18next';\nimport React, { type ReactNode, Suspense, createContext, useContext, useEffect, useState } from 'react';\nimport { initReactI18next, useTranslation as useI18NextTranslation } from 'react-i18next';\n\nconst initialLng = 'en-US';\nconst initialNs = 'dxos-common';\nconst initialDtLocale = dtLocaleEnUs;\n\nexport const resources = {\n [initialLng]: {\n [initialNs]: {\n 'loading translations': 'Loading translations…',\n },\n },\n} as const satisfies Resource;\n\nvoid i18Next.use(initReactI18next).init({\n resources,\n lng: initialLng,\n defaultNS: initialNs,\n interpolation: {\n escapeValue: false,\n },\n});\n\nexport interface TranslationsProviderProps {\n children?: ReactNode;\n // TODO(wittjosiah): Rename to `placeholder` to match ClientProvider?\n // Placeholder => loading, fallback => error.\n fallback?: ReactNode;\n resourceExtensions?: Resource[];\n appNs?: string;\n dtLocale?: Locale;\n}\n\nexport const TranslationsContext = createContext({\n appNs: initialNs,\n dtLocale: initialDtLocale,\n});\n\nexport const useTranslation = (...args: Parameters<typeof useI18NextTranslation>) => {\n const result = useI18NextTranslation(...args);\n const { dtLocale } = useContext(TranslationsContext);\n return { ...result, dtLocale };\n};\n\nexport const TranslationsProvider = ({\n fallback,\n resourceExtensions,\n children,\n appNs,\n dtLocale,\n}: TranslationsProviderProps) => {\n const [loaded, setLoaded] = useState(false);\n useEffect(() => {\n setLoaded(false);\n if (resourceExtensions && resourceExtensions.length) {\n resourceExtensions.forEach((resource) => {\n Object.keys(resource).forEach((language) => {\n Object.keys(resource[language]).forEach((ns) => {\n i18Next.addResourceBundle(language, ns, resource[language][ns]);\n });\n });\n });\n }\n\n setLoaded(true);\n }, [resourceExtensions]);\n\n // TODO(thure): This is not ideal, but i18next was causing `Suspense` to not render the fallback even when the child was asking for namespaces yet to be added.\n // TODO(burdon): Fallbacks should only appear after a short delay, and if the displayed then be visible for 500mx to avoid startup flickering.\n return (\n <TranslationsContext.Provider value={{ appNs: appNs ?? initialNs, dtLocale: dtLocale ?? initialDtLocale }}>\n <Suspense fallback={fallback}>{loaded ? children : fallback}</Suspense>\n </TranslationsContext.Provider>\n );\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nexport const hasIosKeyboard = () => {\n // TODO(thure): UA sniffing is never good, however I haven’t found a better way to query for whether the on-screen keyboard will appear on `focus` outside of a click handler.\n return !!navigator.userAgent.match(/iP(ad|od|hone).+Safari/);\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\n// This is based upon `@radix-ui/react-tooltip` fetched 17 March 2025 at https://github.com/radix-ui/primitives at commit 6e75e11.\n// TODO(burdon): Replace with https://ui.shadcn.com/docs/components/radix/tooltip\n\nimport { composeEventHandlers } from '@radix-ui/primitive';\nimport { useComposedRefs } from '@radix-ui/react-compose-refs';\nimport { createContextScope } from '@radix-ui/react-context';\nimport type { Scope } from '@radix-ui/react-context';\nimport { DismissableLayer } from '@radix-ui/react-dismissable-layer';\nimport { useId } from '@radix-ui/react-id';\nimport * as PopperPrimitive from '@radix-ui/react-popper';\nimport { type PopperAnchorProps, createPopperScope } from '@radix-ui/react-popper';\nimport { Portal as PortalPrimitive } from '@radix-ui/react-portal';\nimport { Presence } from '@radix-ui/react-presence';\nimport { Primitive } from '@radix-ui/react-primitive';\nimport { Slottable } from '@radix-ui/react-slot';\nimport { type TooltipProps } from '@radix-ui/react-tooltip';\nimport { useControllableState } from '@radix-ui/react-use-controllable-state';\nimport * as VisuallyHiddenPrimitive from '@radix-ui/react-visually-hidden';\nimport React, {\n type ComponentPropsWithoutRef,\n type ComponentRef,\n type FC,\n type ReactNode,\n type RefObject,\n type SyntheticEvent,\n forwardRef,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nimport { useElevationContext, useThemeContext } from '../../hooks';\n\ntype TooltipScopedProps<P = {}> = P & { __scopeTooltip?: Scope };\nconst [createTooltipContext, createTooltipScope] = createContextScope('Tooltip', [createPopperScope]);\nconst usePopperScope = createPopperScope();\n\n//\n// Tooltip\n//\n\nconst DEFAULT_DELAY_DURATION = 700;\nconst TOOLTIP_OPEN = 'tooltip.open';\nconst TOOLTIP_NAME = 'Tooltip';\n\ntype TooltipContextValue = {\n contentId: string;\n open: boolean;\n stateAttribute: 'closed' | 'delayed-open' | 'instant-open';\n trigger: TooltipTriggerElement | null;\n onTriggerChange(trigger: TooltipTriggerElement | null): void;\n onTriggerEnter(): void;\n onTriggerLeave(): void;\n onOpen(): void;\n onClose(): void;\n onPointerInTransitChange(inTransit: boolean): void;\n isPointerInTransitRef: RefObject<boolean>;\n disableHoverableContent: boolean;\n};\n\nconst [TooltipContextProvider, useTooltipContext] = createTooltipContext<TooltipContextValue>(TOOLTIP_NAME);\n\ntype TooltipProviderProps = {\n children?: ReactNode;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n /**\n * The duration from when the pointer enters the trigger until the tooltip gets opened. This will\n * override the prop with the same name passed to Provider.\n * @defaultValue 700\n */\n delayDuration?: number;\n /**\n * When `true`, trying to hover the content will result in the tooltip closing as the pointer leaves the trigger.\n * @defaultValue false\n */\n disableHoverableContent?: boolean;\n /**\n * How much time a user has to enter another trigger without incurring a delay again.\n * @defaultValue 300\n */\n skipDelayDuration?: number;\n};\n\nconst TooltipProvider: FC<TooltipProviderProps> = (props: TooltipScopedProps<TooltipProviderProps>) => {\n const {\n __scopeTooltip,\n children,\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n disableHoverableContent = false,\n delayDuration = DEFAULT_DELAY_DURATION,\n skipDelayDuration = 300,\n } = props;\n const isOpenDelayedRef = useRef(true);\n const isPointerInTransitRef = useRef(false);\n const skipDelayTimerRef = useRef(0);\n\n useEffect(() => {\n const skipDelayTimer = skipDelayTimerRef.current;\n return () => window.clearTimeout(skipDelayTimer);\n }, []);\n\n const popperScope = usePopperScope(__scopeTooltip);\n const [trigger, setTrigger] = useState<HTMLButtonElement | null>(null);\n const [content, setContent] = useState<string>('');\n const [side, setSide] = useState<TooltipSide | undefined>(undefined);\n const triggerRef = useRef<HTMLButtonElement | null>(trigger);\n const handleTriggerChange = useCallback((nextTrigger: HTMLButtonElement | null) => {\n setTrigger(nextTrigger);\n triggerRef.current = nextTrigger;\n setContent(nextTrigger?.getAttribute('data-tooltip-content') ?? '');\n setSide((nextTrigger?.getAttribute('data-tooltip-side') as TooltipSide | null) ?? undefined);\n }, []);\n const contentId = useId();\n const openTimerRef = useRef(0);\n const wasOpenDelayedRef = useRef(false);\n const handleOpenChange = useCallback(\n (open: boolean) => {\n if (open) {\n window.clearTimeout(skipDelayTimerRef.current);\n isOpenDelayedRef.current = false;\n // as `onChange` is called within a lifecycle method we\n // avoid dispatching via `dispatchDiscreteCustomEvent`.\n document.dispatchEvent(new CustomEvent(TOOLTIP_OPEN));\n } else {\n window.clearTimeout(skipDelayTimerRef.current);\n skipDelayTimerRef.current = window.setTimeout(() => (isOpenDelayedRef.current = true), skipDelayDuration);\n }\n onOpenChange?.(open);\n },\n [skipDelayDuration, onOpenChange],\n );\n const [open = false, setOpen] = useControllableState({\n prop: openProp,\n defaultProp: defaultOpen,\n onChange: handleOpenChange,\n });\n const stateAttribute = useMemo(() => {\n return open ? (wasOpenDelayedRef.current ? 'delayed-open' : 'instant-open') : 'closed';\n }, [open]);\n\n const handleOpen = useCallback(() => {\n window.clearTimeout(openTimerRef.current);\n openTimerRef.current = 0;\n wasOpenDelayedRef.current = false;\n setOpen(true);\n }, [setOpen]);\n\n const handleClose = useCallback(() => {\n window.clearTimeout(openTimerRef.current);\n openTimerRef.current = 0;\n setOpen(false);\n }, [setOpen]);\n\n const handleDelayedOpen = useCallback(() => {\n window.clearTimeout(openTimerRef.current);\n openTimerRef.current = window.setTimeout(() => {\n wasOpenDelayedRef.current = true;\n setOpen(true);\n openTimerRef.current = 0;\n }, delayDuration);\n }, [delayDuration, setOpen]);\n\n useEffect(() => {\n return () => {\n if (openTimerRef.current) {\n window.clearTimeout(openTimerRef.current);\n openTimerRef.current = 0;\n }\n };\n }, []);\n\n const { tx } = useThemeContext();\n const elevation = useElevationContext();\n\n return (\n <PopperPrimitive.Root {...popperScope}>\n <TooltipContextProvider\n scope={__scopeTooltip}\n contentId={contentId}\n open={open}\n stateAttribute={stateAttribute}\n trigger={trigger}\n onTriggerChange={handleTriggerChange}\n onTriggerEnter={useCallback(() => {\n if (isOpenDelayedRef.current) {\n handleDelayedOpen();\n } else {\n handleOpen();\n }\n }, [isOpenDelayedRef, handleDelayedOpen, handleOpen])}\n onTriggerLeave={useCallback(() => {\n if (disableHoverableContent) {\n handleClose();\n } else {\n // Clear the timer in case the pointer leaves the trigger before the tooltip is opened.\n window.clearTimeout(openTimerRef.current);\n openTimerRef.current = 0;\n }\n }, [handleClose, disableHoverableContent])}\n onOpen={handleOpen}\n onClose={handleClose}\n disableHoverableContent={disableHoverableContent}\n isPointerInTransitRef={isPointerInTransitRef}\n onPointerInTransitChange={useCallback((inTransit: boolean) => {\n isPointerInTransitRef.current = inTransit;\n }, [])}\n >\n <TooltipContent side={side} className={tx('tooltip.content', { elevation })}>\n {content}\n <TooltipArrow className={tx('tooltip.arrow')} />\n </TooltipContent>\n <TooltipVirtualTrigger virtualRef={triggerRef as RefObject<HTMLButtonElement>} />\n {children}\n </TooltipContextProvider>\n </PopperPrimitive.Root>\n );\n};\n\nTooltipProvider.displayName = TOOLTIP_NAME;\n\n//\n// TooltipVirtualTrigger\n//\n\nconst TooltipVirtualTrigger = ({\n virtualRef,\n __scopeTooltip,\n}: TooltipScopedProps<Pick<PopperAnchorProps, 'virtualRef'>>) => {\n const popperScope = usePopperScope(__scopeTooltip);\n return <PopperPrimitive.Anchor asChild {...popperScope} virtualRef={virtualRef} />;\n};\n\n//\n// TooltipTrigger\n//\n\nconst TRIGGER_NAME = 'TooltipTrigger';\n\ntype TooltipTriggerElement = ComponentRef<typeof Primitive.button>;\ntype PrimitiveButtonProps = ComponentPropsWithoutRef<typeof Primitive.button>;\ntype TooltipTriggerProps = PrimitiveButtonProps &\n Pick<TooltipProps, 'delayDuration'> & {\n content?: string;\n side?: TooltipSide;\n onInteract?: (event: SyntheticEvent) => void;\n };\n\nconst TooltipTrigger = forwardRef<TooltipTriggerElement, TooltipTriggerProps>(\n (props: TooltipScopedProps<TooltipTriggerProps>, forwardedRef) => {\n const {\n __scopeTooltip,\n onInteract,\n // TODO(thure): Pass `delayDuration` into the context.\n delayDuration: _delayDuration,\n side,\n content,\n ...triggerProps\n } = props;\n const context = useTooltipContext(TRIGGER_NAME, __scopeTooltip);\n const ref = useRef<TooltipTriggerElement>(null);\n const composedRefs = useComposedRefs(forwardedRef, ref);\n const isPointerDownRef = useRef(false);\n const hasPointerMoveOpenedRef = useRef(false);\n const handlePointerUp = useCallback(() => (isPointerDownRef.current = false), []);\n\n useEffect(() => {\n return () => document.removeEventListener('pointerup', handlePointerUp);\n }, [handlePointerUp]);\n\n return (\n <Primitive.button\n // We purposefully avoid adding `type=button` here because tooltip triggers are also\n // commonly anchors and the anchor `type` attribute signifies MIME type.\n aria-describedby={context.open ? context.contentId : undefined}\n data-state={context.stateAttribute}\n data-tooltip-content={content}\n data-tooltip-side={side}\n {...triggerProps}\n ref={composedRefs}\n onPointerMove={composeEventHandlers(props.onPointerMove, (event) => {\n if (event.pointerType === 'touch') {\n return;\n }\n if (!hasPointerMoveOpenedRef.current && !context.isPointerInTransitRef.current) {\n onInteract?.(event);\n if (event.defaultPrevented) {\n return;\n }\n context.onTriggerChange(ref.current);\n context.onTriggerEnter();\n hasPointerMoveOpenedRef.current = true;\n }\n })}\n onPointerLeave={composeEventHandlers(props.onPointerLeave, () => {\n context.onTriggerLeave();\n hasPointerMoveOpenedRef.current = false;\n })}\n onPointerDown={composeEventHandlers(props.onPointerDown, () => {\n if (context.open) {\n context.onClose();\n }\n isPointerDownRef.current = true;\n document.addEventListener('pointerup', handlePointerUp, { once: true });\n })}\n onFocus={props.onFocus}\n onBlur={composeEventHandlers(props.onBlur, context.onClose)}\n onClick={composeEventHandlers(props.onClick, context.onClose)}\n />\n );\n },\n);\n\nTooltipTrigger.displayName = TRIGGER_NAME;\n\n//\n// TooltipPortal\n//\n\nconst PORTAL_NAME = 'TooltipPortal';\n\ntype PortalContextValue = { forceMount?: true };\nconst [PortalProvider, usePortalContext] = createTooltipContext<PortalContextValue>(PORTAL_NAME, {\n forceMount: undefined,\n});\n\ntype PortalProps = ComponentPropsWithoutRef<typeof PortalPrimitive>;\ntype TooltipPortalProps = {\n children?: ReactNode;\n /**\n * Specify a container element to portal the content into.\n */\n container?: PortalProps['container'];\n /**\n * Used to force mounting when more control is needed. Useful when\n * controlling animation with React animation libraries.\n */\n forceMount?: true;\n};\n\nconst TooltipPortal: FC<TooltipPortalProps> = (props: TooltipScopedProps<TooltipPortalProps>) => {\n const { __scopeTooltip, forceMount, children, container } = props;\n const context = useTooltipContext(PORTAL_NAME, __scopeTooltip);\n return (\n <PortalProvider scope={__scopeTooltip} forceMount={forceMount}>\n <Presence present={forceMount || context.open}>\n <PortalPrimitive asChild container={container}>\n {children}\n </PortalPrimitive>\n </Presence>\n </PortalProvider>\n );\n};\n\nTooltipPortal.displayName = PORTAL_NAME;\n\n//\n// TooltipContent\n//\n\nconst CONTENT_NAME = 'TooltipContent';\n\ntype TooltipContentElement = TooltipContentImplElement;\ntype TooltipContentProps = TooltipContentImplProps & {\n /**\n * Used to force mounting when more control is needed. Useful when\n * controlling animation with React animation libraries.\n */\n forceMount?: true;\n};\n\nconst TooltipContent = forwardRef<TooltipContentElement, TooltipContentProps>(\n (props: TooltipScopedProps<TooltipContentProps>, forwardedRef) => {\n const portalContext = usePortalContext(CONTENT_NAME, props.__scopeTooltip);\n const { forceMount = portalContext.forceMount, side = 'top', ...contentProps } = props;\n const context = useTooltipContext(CONTENT_NAME, props.__scopeTooltip);\n\n return (\n <Presence present={forceMount || context.open}>\n {context.disableHoverableContent ? (\n <TooltipContentImpl side={side} {...contentProps} ref={forwardedRef} />\n ) : (\n <TooltipContentHoverable side={side} {...contentProps} ref={forwardedRef} />\n )}\n </Presence>\n );\n },\n);\n\ntype Point = { x: number; y: number };\ntype Polygon = Point[];\n\ntype TooltipContentHoverableElement = TooltipContentImplElement;\ntype TooltipContentHoverableProps = TooltipContentImplProps;\n\nconst TooltipContentHoverable = forwardRef<TooltipContentHoverableElement, TooltipContentHoverableProps>(\n (props: TooltipScopedProps<TooltipContentHoverableProps>, forwardedRef) => {\n const context = useTooltipContext(CONTENT_NAME, props.__scopeTooltip);\n const ref = useRef<TooltipContentHoverableElement>(null);\n const composedRefs = useComposedRefs(forwardedRef, ref);\n const [pointerGraceArea, setPointerGraceArea] = useState<Polygon | null>(null);\n\n const { trigger, onClose } = context;\n const content = ref.current;\n\n const { onPointerInTransitChange } = context;\n\n const handleRemoveGraceArea = useCallback(() => {\n setPointerGraceArea(null);\n onPointerInTransitChange(false);\n }, [onPointerInTransitChange]);\n\n const handleCreateGraceArea = useCallback(\n (event: PointerEvent, hoverTarget: HTMLElement) => {\n const currentTarget = event.currentTarget as HTMLElement;\n const exitPoint = { x: event.clientX, y: event.clientY };\n const exitSide = getExitSideFromRect(exitPoint, currentTarget.getBoundingClientRect());\n const paddedExitPoints = getPaddedExitPoints(exitPoint, exitSide);\n const hoverTargetPoints = getPointsFromRect(hoverTarget.getBoundingClientRect());\n const graceArea = getHull([...paddedExitPoints, ...hoverTargetPoints]);\n setPointerGraceArea(graceArea);\n onPointerInTransitChange(true);\n },\n [onPointerInTransitChange],\n );\n\n useEffect(() => {\n return () => handleRemoveGraceArea();\n }, [handleRemoveGraceArea]);\n\n useEffect(() => {\n if (trigger && content) {\n const handleTriggerLeave = (event: PointerEvent) => handleCreateGraceArea(event, content);\n const handleContentLeave = (event: PointerEvent) => handleCreateGraceArea(event, trigger);\n\n trigger.addEventListener('pointerleave', handleTriggerLeave);\n content.addEventListener('pointerleave', handleContentLeave);\n return () => {\n trigger.removeEventListener('pointerleave', handleTriggerLeave);\n content.removeEventListener('pointerleave', handleContentLeave);\n };\n }\n }, [trigger, content, handleCreateGraceArea, handleRemoveGraceArea]);\n\n useEffect(() => {\n if (pointerGraceArea) {\n const handleTrackPointerGrace = (event: PointerEvent) => {\n const target = event.target as HTMLElement;\n const pointerPosition = { x: event.clientX, y: event.clientY };\n const hasEnteredTarget = trigger?.contains(target) || content?.contains(target);\n const isPointerOutsideGraceArea = !isPointInPolygon(pointerPosition, pointerGraceArea);\n\n if (hasEnteredTarget) {\n handleRemoveGraceArea();\n } else if (isPointerOutsideGraceArea) {\n handleRemoveGraceArea();\n onClose();\n }\n };\n document.addEventListener('pointermove', handleTrackPointerGrace);\n return () => document.removeEventListener('pointermove', handleTrackPointerGrace);\n }\n }, [trigger, content, pointerGraceArea, onClose, handleRemoveGraceArea]);\n\n return <TooltipContentImpl {...props} ref={composedRefs} />;\n },\n);\n\nconst [VisuallyHiddenContentContextProvider, useVisuallyHiddenContentContext] = createTooltipContext(TOOLTIP_NAME, {\n isInside: false,\n});\n\ntype TooltipContentImplElement = ComponentRef<typeof PopperPrimitive.Content>;\ntype DismissableLayerProps = ComponentPropsWithoutRef<typeof DismissableLayer>;\ntype PopperContentProps = ComponentPropsWithoutRef<typeof PopperPrimitive.Content>;\ntype TooltipContentImplProps = Omit<PopperContentProps, 'onPlaced'> & {\n /**\n * A more descriptive label for accessibility purpose\n */\n 'aria-label'?: string;\n\n /**\n * Event handler called when the escape key is down.\n * Can be prevented.\n */\n onEscapeKeyDown?: DismissableLayerProps['onEscapeKeyDown'];\n /**\n * Event handler called when the a `pointerdown` event happens outside of the `Tooltip`.\n * Can be prevented.\n */\n onPointerDownOutside?: DismissableLayerProps['onPointerDownOutside'];\n};\n\nconst TooltipContentImpl = forwardRef<TooltipContentImplElement, TooltipContentImplProps>(\n (props: TooltipScopedProps<TooltipContentImplProps>, forwardedRef) => {\n const {\n __scopeTooltip,\n children,\n 'aria-label': ariaLabel,\n onEscapeKeyDown,\n onPointerDownOutside,\n ...contentProps\n } = props;\n const context = useTooltipContext(CONTENT_NAME, __scopeTooltip);\n const popperScope = usePopperScope(__scopeTooltip);\n const { onClose } = context;\n\n // Close this tooltip if another one opens\n useEffect(() => {\n document.addEventListener(TOOLTIP_OPEN, onClose);\n return () => document.removeEventListener(TOOLTIP_OPEN, onClose);\n }, [onClose]);\n\n // Close the tooltip if the trigger is scrolled\n useEffect(() => {\n if (context.trigger) {\n const handleScroll = (event: Event) => {\n const target = event.target as HTMLElement;\n if (target?.contains(context.trigger)) {\n onClose();\n }\n };\n window.addEventListener('scroll', handleScroll, { capture: true });\n return () => window.removeEventListener('scroll', handleScroll, { capture: true });\n }\n }, [context.trigger, onClose]);\n\n return (\n <DismissableLayer\n asChild\n disableOutsidePointerEvents={false}\n onEscapeKeyDown={onEscapeKeyDown}\n onPointerDownOutside={onPointerDownOutside}\n onFocusOutside={(event) => event.preventDefault()}\n onDismiss={onClose}\n >\n <PopperPrimitive.Content\n data-state={context.stateAttribute}\n {...popperScope}\n {...contentProps}\n ref={forwardedRef}\n style={{\n ...contentProps.style,\n // re-namespace exposed content custom properties\n ...{\n '--radix-tooltip-content-transform-origin': 'var(--radix-popper-transform-origin)',\n '--radix-tooltip-content-available-width': 'var(--radix-popper-available-width)',\n '--radix-tooltip-content-available-height': 'var(--radix-popper-available-height)',\n '--radix-tooltip-trigger-width': 'var(--radix-popper-anchor-width)',\n '--radix-tooltip-trigger-height': 'var(--radix-popper-anchor-height)',\n },\n }}\n >\n <Slottable>{children}</Slottable>\n <VisuallyHiddenContentContextProvider scope={__scopeTooltip} isInside={true}>\n <VisuallyHiddenPrimitive.Root id={context.contentId} role='tooltip'>\n {ariaLabel || children}\n </VisuallyHiddenPrimitive.Root>\n </VisuallyHiddenContentContextProvider>\n </PopperPrimitive.Content>\n </DismissableLayer>\n );\n },\n);\n\nTooltipContent.displayName = CONTENT_NAME;\n\n//\n// TooltipArrow\n//\n\nconst ARROW_NAME = 'TooltipArrow';\n\ntype TooltipArrowElement = ComponentRef<typeof PopperPrimitive.Arrow>;\ntype PopperArrowProps = ComponentPropsWithoutRef<typeof PopperPrimitive.Arrow>;\ntype TooltipArrowProps = PopperArrowProps;\n\nconst TooltipArrow = forwardRef<TooltipArrowElement, TooltipArrowProps>(\n (props: TooltipScopedProps<TooltipArrowProps>, forwardedRef) => {\n const { __scopeTooltip, ...arrowProps } = props;\n const popperScope = usePopperScope(__scopeTooltip);\n const visuallyHiddenContentContext = useVisuallyHiddenContentContext(ARROW_NAME, __scopeTooltip);\n // if the arrow is inside the `VisuallyHidden`, we don't want to render it all to\n // prevent issues in positioning the arrow due to the duplicate\n return visuallyHiddenContentContext.isInside ? null : (\n <PopperPrimitive.Arrow {...popperScope} {...arrowProps} ref={forwardedRef} />\n );\n },\n);\n\nTooltipArrow.displayName = ARROW_NAME;\n\ntype TooltipSide = NonNullable<TooltipContentProps['side']>;\n\nconst getExitSideFromRect = (point: Point, rect: DOMRect): TooltipSide => {\n const top = Math.abs(rect.top - point.y);\n const bottom = Math.abs(rect.bottom - point.y);\n const right = Math.abs(rect.right - point.x);\n const left = Math.abs(rect.left - point.x);\n\n switch (Math.min(top, bottom, right, left)) {\n case left:\n return 'left';\n case right:\n return 'right';\n case top:\n return 'top';\n case bottom:\n return 'bottom';\n default:\n throw new Error('unreachable');\n }\n};\n\nconst getPaddedExitPoints = (exitPoint: Point, exitSide: TooltipSide, padding = 5) => {\n const paddedExitPoints: Point[] = [];\n switch (exitSide) {\n case 'top':\n paddedExitPoints.push(\n { x: exitPoint.x - padding, y: exitPoint.y + padding },\n { x: exitPoint.x + padding, y: exitPoint.y + padding },\n );\n break;\n case 'bottom':\n paddedExitPoints.push(\n { x: exitPoint.x - padding, y: exitPoint.y - padding },\n { x: exitPoint.x + padding, y: exitPoint.y - padding },\n );\n break;\n case 'left':\n paddedExitPoints.push(\n { x: exitPoint.x + padding, y: exitPoint.y - padding },\n { x: exitPoint.x + padding, y: exitPoint.y + padding },\n );\n break;\n case 'right':\n paddedExitPoints.push(\n { x: exitPoint.x - padding, y: exitPoint.y - padding },\n { x: exitPoint.x - padding, y: exitPoint.y + padding },\n );\n break;\n }\n return paddedExitPoints;\n};\n\nconst getPointsFromRect = (rect: DOMRect) => {\n const { top, right, bottom, left } = rect;\n return [\n { x: left, y: top },\n { x: right, y: top },\n { x: right, y: bottom },\n { x: left, y: bottom },\n ];\n};\n\n// Determine if a point is inside of a polygon.\n// Based on https://github.com/substack/point-in-polygon\nconst isPointInPolygon = (point: Point, polygon: Polygon) => {\n const { x, y } = point;\n let inside = false;\n for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {\n const xi = polygon[i].x;\n const yi = polygon[i].y;\n const xj = polygon[j].x;\n const yj = polygon[j].y;\n\n // prettier-ignore\n const intersect = ((yi > y) !== (yj > y)) && (x < (xj - xi) * (y - yi) / (yj - yi) + xi);\n if (intersect) {\n inside = !inside;\n }\n }\n\n return inside;\n};\n\n// Returns a new array of points representing the convex hull of the given set of points.\n// https://www.nayuki.io/page/convex-hull-algorithm\nconst getHull = <P extends Point>(points: Readonly<Array<P>>): Array<P> => {\n const newPoints: Array<P> = points.slice();\n newPoints.sort((a: Point, b: Point) => {\n if (a.x < b.x) {\n return -1;\n } else if (a.x > b.x) {\n return +1;\n } else if (a.y < b.y) {\n return -1;\n } else if (a.y > b.y) {\n return +1;\n } else {\n return 0;\n }\n });\n return getHullPresorted(newPoints);\n};\n\n// Returns the convex hull, assuming that each points[i] <= points[i + 1]. Runs in O(n) time.\nconst getHullPresorted = <P extends Point>(points: Readonly<Array<P>>): Array<P> => {\n if (points.length <= 1) {\n return points.slice();\n }\n\n const upperHull: Array<P> = [];\n for (let i = 0; i < points.length; i++) {\n const p = points[i];\n while (upperHull.length >= 2) {\n const q = upperHull[upperHull.length - 1];\n const r = upperHull[upperHull.length - 2];\n if ((q.x - r.x) * (p.y - r.y) >= (q.y - r.y) * (p.x - r.x)) {\n upperHull.pop();\n } else {\n break;\n }\n }\n upperHull.push(p);\n }\n upperHull.pop();\n\n const lowerHull: Array<P> = [];\n for (let i = points.length - 1; i >= 0; i--) {\n const p = points[i];\n while (lowerHull.length >= 2) {\n const q = lowerHull[lowerHull.length - 1];\n const r = lowerHull[lowerHull.length - 2];\n if ((q.x - r.x) * (p.y - r.y) >= (q.y - r.y) * (p.x - r.x)) {\n lowerHull.pop();\n } else {\n break;\n }\n }\n lowerHull.push(p);\n }\n lowerHull.pop();\n\n if (\n upperHull.length === 1 &&\n lowerHull.length === 1 &&\n upperHull[0].x === lowerHull[0].x &&\n upperHull[0].y === lowerHull[0].y\n ) {\n return upperHull;\n } else {\n return upperHull.concat(lowerHull);\n }\n};\n\n//\n// Tooltip\n//\n\nexport const Tooltip = {\n Provider: TooltipProvider,\n Trigger: TooltipTrigger,\n};\n\nexport { createTooltipScope, useTooltipContext };\n\nexport type { TooltipProviderProps, TooltipTriggerProps, TooltipScopedProps, TooltipSide };\n", "//\n// Copyright 2026 DXOS.org\n//\n\nimport ErrorStackParser from 'error-stack-parser';\nimport React from 'react';\n\nimport { mx } from '@dxos/ui-theme';\n\ntype LocalFrame = { href: string; fileName: string };\n\nexport type ParsedStackFrame = ReturnType<typeof ErrorStackParser.parse>[number];\n\nexport type ErrorStackProps = {\n /** When set, these frames are shown instead of parsing `error`. */\n frames?: ParsedStackFrame[];\n /** Used when `frames` is omitted. */\n error?: Error;\n};\n\n/**\n * Parses `captureOwnerStack()` output (React dev) into frames for {@link ErrorStack}.\n * Prefixes a synthetic Error line when needed so `error-stack-parser` can read V8-style stacks.\n */\nexport const parseCaptureOwnerStack = (stack: string | null): ParsedStackFrame[] | null => {\n if (stack == null || stack.length === 0) {\n return null;\n }\n const err = new Error();\n err.stack = stack;\n try {\n return ErrorStackParser.parse(err);\n } catch {\n err.stack = `Error\\n${stack}`;\n try {\n return ErrorStackParser.parse(err);\n } catch {\n return null;\n }\n }\n};\n\n/**\n * Renders a parsed error stack trace with tree connector symbols and clickable vscode:// links for local frames.\n */\nexport const ErrorStack = ({ error, frames: framesProp }: ErrorStackProps) => {\n const frames = framesProp ?? (error ? ErrorStackParser.parse(error) : []);\n if (frames.length === 0) {\n return null;\n }\n\n return (\n <div className='font-mono text-sm'>\n {frames.map((frame, i) => {\n const isLast = i === frames.length - 1;\n const local = frame.fileName\n ? parseLocalFrame(frame.fileName, frame.lineNumber, frame.columnNumber)\n : undefined;\n const name = frame.functionName ?? '<anonymous>';\n return (\n <div\n key={i}\n className={mx(\n 'grid grid-cols-[16px_1fr_auto_auto] items-stretch gap-x-2',\n local && 'cursor-pointer hover:bg-hover-surface',\n )}\n >\n {/* Tree connector: vertical line full-height + horizontal branch at midpoint */}\n <div className='relative'>\n <div\n className={mx(\n 'absolute left-1/2 -translate-x-1/2 w-px bg-neutral-500',\n isLast ? 'top-0 h-1/2' : 'inset-y-0',\n )}\n />\n <div className='absolute top-1/2 -translate-y-1/2 left-1/2 right-0 h-px bg-neutral-500' />\n </div>\n {local ? (\n <a href={local.href} className='truncate self-center'>\n {name}\n </a>\n ) : (\n <span className='text-subdued truncate self-center'>{name}</span>\n )}\n <span className='text-xs text-subdued truncate self-center'>{local?.fileName ?? ''}</span>\n <span className='text-xs text-subdued text-right self-center'>\n {local ? `${frame.lineNumber}:${frame.columnNumber}` : ''}\n </span>\n </div>\n );\n })}\n </div>\n );\n};\n\n/**\n * Parses a Vite `/@fs/` URL into a `vscode://` deep link and short filename.\n * Returns undefined if the URL cannot be resolved to a local file.\n */\nconst parseLocalFrame = (fileUrl: string, line?: number, col?: number): LocalFrame | undefined => {\n try {\n const { pathname } = new URL(fileUrl);\n if (!pathname.startsWith('/@fs/')) {\n return undefined;\n }\n const localPath = pathname.slice(4); // /@fs/Users/... → /Users/...\n return {\n href: `vscode://file/${localPath}:${line ?? 1}:${col ?? 1}`,\n fileName: pathname.split('/').pop() ?? localPath,\n };\n } catch {\n return undefined;\n }\n};\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["React", "createContext", "DensityContext", "density", "DensityProvider", "children", "Provider", "value", "React", "createContext", "ElevationContext", "elevation", "ElevationProvider", "children", "Provider", "value", "useContext", "createKeyborg", "React", "createContext", "useEffect", "useMemo", "useContext", "raise", "useThemeContext", "useContext", "ThemeContext", "raise", "Error", "useCallback", "useState", "useViewportResize", "initialSafeArea", "top", "NaN", "right", "bottom", "left", "useSafeArea", "padding", "setPadding", "handleResize", "parseFloat", "getComputedStyle", "document", "documentElement", "getPropertyValue", "enUS", "dtLocaleEnUs", "i18Next", "React", "Suspense", "createContext", "useContext", "useEffect", "useState", "initReactI18next", "useTranslation", "useI18NextTranslation", "initialLng", "initialNs", "initialDtLocale", "resources", "use", "init", "lng", "defaultNS", "interpolation", "escapeValue", "TranslationsContext", "appNs", "dtLocale", "args", "result", "TranslationsProvider", "fallback", "resourceExtensions", "children", "loaded", "setLoaded", "length", "forEach", "resource", "Object", "keys", "language", "ns", "addResourceBundle", "Provider", "value", "hasIosKeyboard", "navigator", "userAgent", "match", "ThemeContext", "createContext", "undefined", "ThemeProvider", "children", "fallback", "resourceExtensions", "appNs", "tx", "_path", "_styleProps", "_options", "themeMode", "rootDensity", "noCache", "platform", "useEffect", "document", "defaultView", "kb", "createKeyborg", "subscribe", "handleInputModalityChange", "unsubscribe", "safeAreaPadding", "useSafeArea", "contextValue", "useMemo", "hasIosKeyboard", "React", "Provider", "value", "TranslationsProvider", "ElevationProvider", "elevation", "DensityProvider", "density", "isUsingKeyboard", "body", "setAttribute", "removeAttribute", "composeEventHandlers", "useComposedRefs", "createContextScope", "DismissableLayer", "useId", "PopperPrimitive", "createPopperScope", "Portal", "PortalPrimitive", "Presence", "Primitive", "Slottable", "useControllableState", "VisuallyHiddenPrimitive", "React", "forwardRef", "useCallback", "useEffect", "useMemo", "useRef", "useState", "createTooltipContext", "createTooltipScope", "createContextScope", "createPopperScope", "usePopperScope", "DEFAULT_DELAY_DURATION", "TOOLTIP_OPEN", "TOOLTIP_NAME", "TooltipContextProvider", "useTooltipContext", "TooltipProvider", "props", "__scopeTooltip", "children", "open", "openProp", "defaultOpen", "onOpenChange", "disableHoverableContent", "delayDuration", "skipDelayDuration", "isOpenDelayedRef", "useRef", "isPointerInTransitRef", "skipDelayTimerRef", "useEffect", "skipDelayTimer", "current", "window", "clearTimeout", "popperScope", "trigger", "setTrigger", "useState", "content", "setContent", "side", "setSide", "undefined", "triggerRef", "handleTriggerChange", "useCallback", "nextTrigger", "getAttribute", "contentId", "useId", "openTimerRef", "wasOpenDelayedRef", "handleOpenChange", "document", "dispatchEvent", "CustomEvent", "setTimeout", "setOpen", "useControllableState", "prop", "defaultProp", "onChange", "stateAttribute", "useMemo", "handleOpen", "handleClose", "handleDelayedOpen", "tx", "useThemeContext", "elevation", "useElevationContext", "React", "Root", "scope", "onTriggerChange", "onTriggerEnter", "onTriggerLeave", "onOpen", "onClose", "onPointerInTransitChange", "inTransit", "TooltipContent", "className", "TooltipArrow", "TooltipVirtualTrigger", "virtualRef", "displayName", "Anchor", "asChild", "TRIGGER_NAME", "TooltipTrigger", "forwardRef", "forwardedRef", "onInteract", "_delayDuration", "triggerProps", "context", "ref", "composedRefs", "useComposedRefs", "isPointerDownRef", "hasPointerMoveOpenedRef", "handlePointerUp", "removeEventListener", "Primitive", "button", "aria-describedby", "data-state", "data-tooltip-content", "data-tooltip-side", "onPointerMove", "composeEventHandlers", "event", "pointerType", "defaultPrevented", "onPointerLeave", "onPointerDown", "addEventListener", "once", "onFocus", "onBlur", "onClick", "PORTAL_NAME", "PortalProvider", "usePortalContext", "forceMount", "TooltipPortal", "container", "Presence", "present", "PortalPrimitive", "CONTENT_NAME", "portalContext", "contentProps", "TooltipContentImpl", "TooltipContentHoverable", "pointerGraceArea", "setPointerGraceArea", "handleRemoveGraceArea", "handleCreateGraceArea", "hoverTarget", "currentTarget", "exitPoint", "x", "clientX", "y", "clientY", "exitSide", "getExitSideFromRect", "getBoundingClientRect", "paddedExitPoints", "getPaddedExitPoints", "hoverTargetPoints", "getPointsFromRect", "graceArea", "getHull", "handleTriggerLeave", "handleContentLeave", "handleTrackPointerGrace", "target", "pointerPosition", "hasEnteredTarget", "contains", "isPointerOutsideGraceArea", "isPointInPolygon", "VisuallyHiddenContentContextProvider", "useVisuallyHiddenContentContext", "isInside", "ariaLabel", "onEscapeKeyDown", "onPointerDownOutside", "handleScroll", "capture", "DismissableLayer", "disableOutsidePointerEvents", "onFocusOutside", "preventDefault", "onDismiss", "Content", "style", "Slottable", "id", "role", "ARROW_NAME", "arrowProps", "visuallyHiddenContentContext", "Arrow", "point", "rect", "top", "Math", "abs", "bottom", "right", "left", "min", "Error", "padding", "push", "polygon", "inside", "i", "j", "length", "xi", "yi", "xj", "yj", "intersect", "points", "newPoints", "slice", "sort", "a", "b", "getHullPresorted", "upperHull", "p", "q", "r", "pop", "lowerHull", "concat", "Tooltip", "Provider", "Trigger", "ErrorStackParser", "React", "mx", "parseCaptureOwnerStack", "stack", "length", "err", "Error", "parse", "ErrorStack", "error", "frames", "framesProp", "div", "className", "map", "frame", "i", "isLast", "local", "fileName", "parseLocalFrame", "lineNumber", "columnNumber", "undefined", "name", "functionName", "key", "a", "href", "span", "fileUrl", "line", "col", "pathname", "URL", "startsWith", "localPath", "slice", "split", "pop", "useElevationContext", "propsElevation", "elevation", "useContext", "ElevationContext"]
|
|
7
|
-
}
|