@dxos/react-ui-stack 0.7.5-main.9d26e3a → 0.7.5-main.e9bb01b
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/index.mjs +70 -64
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/node/index.cjs +61 -55
- package/dist/lib/node/index.cjs.map +3 -3
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node-esm/index.mjs +70 -64
- package/dist/lib/node-esm/index.mjs.map +3 -3
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/types/src/components/StackItem.d.ts +8 -1
- package/dist/types/src/components/StackItem.d.ts.map +1 -1
- package/dist/types/src/components/StackItemContent.d.ts +35 -2
- package/dist/types/src/components/StackItemContent.d.ts.map +1 -1
- package/dist/types/src/components/StackItemResizeHandle.d.ts.map +1 -1
- package/dist/types/src/components/StackItemSigil.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +27 -27
- package/src/components/StackItem.tsx +19 -9
- package/src/components/StackItemContent.tsx +45 -27
- package/src/components/StackItemHeading.tsx +2 -2
- package/src/components/StackItemResizeHandle.tsx +20 -9
- package/src/components/StackItemSigil.tsx +90 -103
- package/dist/types/src/testing/EditorContent.d.ts +0 -8
- package/dist/types/src/testing/EditorContent.d.ts.map +0 -1
- package/src/testing/EditorContent.tsx +0 -60
|
@@ -6,15 +6,7 @@ import React, { Fragment, type PropsWithChildren, forwardRef, useRef, useState }
|
|
|
6
6
|
|
|
7
7
|
import { type ActionLike } from '@dxos/app-graph';
|
|
8
8
|
import { keySymbols } from '@dxos/keyboard';
|
|
9
|
-
import {
|
|
10
|
-
Button,
|
|
11
|
-
type ButtonProps,
|
|
12
|
-
DropdownMenu,
|
|
13
|
-
Icon,
|
|
14
|
-
toLocalizedString,
|
|
15
|
-
Tooltip,
|
|
16
|
-
useTranslation,
|
|
17
|
-
} from '@dxos/react-ui';
|
|
9
|
+
import { Button, type ButtonProps, DropdownMenu, Icon, toLocalizedString, useTranslation } from '@dxos/react-ui';
|
|
18
10
|
import { type AttendableId, type Related, useAttention } from '@dxos/react-ui-attention';
|
|
19
11
|
import { descriptionText, mx } from '@dxos/react-ui-theme';
|
|
20
12
|
import { getHostPlatform } from '@dxos/util';
|
|
@@ -42,7 +34,7 @@ export const StackItemSigilButton = forwardRef<HTMLButtonElement, StackItemSigil
|
|
|
42
34
|
<Button
|
|
43
35
|
{...props}
|
|
44
36
|
variant={variant}
|
|
45
|
-
classNames={['
|
|
37
|
+
classNames={['shrink-0 pli-0 min-bs-0 is-[--rail-action] bs-[--rail-action] relative app-no-drag', classNames]}
|
|
46
38
|
ref={forwardedRef}
|
|
47
39
|
>
|
|
48
40
|
<MenuSignifierHorizontal />
|
|
@@ -68,103 +60,98 @@ export const StackItemSigil = forwardRef<HTMLButtonElement, StackItemSigilProps>
|
|
|
68
60
|
const suppressNextTooltip = useRef(false);
|
|
69
61
|
|
|
70
62
|
const [optionsMenuOpen, setOptionsMenuOpen] = useState(false);
|
|
71
|
-
|
|
63
|
+
|
|
64
|
+
const hasActions = actionGroups && actionGroups.length > 0;
|
|
65
|
+
|
|
66
|
+
const button = (
|
|
67
|
+
<StackItemSigilButton
|
|
68
|
+
attendableId={attendableId}
|
|
69
|
+
related={related}
|
|
70
|
+
// TODO(wittjosiah): Better disabling of interactive styles when no action are available.
|
|
71
|
+
// Remove underscore icon when no actions are available?
|
|
72
|
+
classNames={!hasActions && 'cursor-default'}
|
|
73
|
+
>
|
|
74
|
+
<span className='sr-only'>{triggerLabel}</span>
|
|
75
|
+
<Icon icon={icon} size={5} />
|
|
76
|
+
</StackItemSigilButton>
|
|
77
|
+
);
|
|
78
|
+
|
|
79
|
+
if (!hasActions) {
|
|
80
|
+
return button;
|
|
81
|
+
}
|
|
72
82
|
|
|
73
83
|
return (
|
|
74
|
-
<
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
}
|
|
84
|
+
<DropdownMenu.Root
|
|
85
|
+
{...{
|
|
86
|
+
open: optionsMenuOpen,
|
|
87
|
+
onOpenChange: (nextOpen: boolean) => {
|
|
88
|
+
if (!nextOpen) {
|
|
89
|
+
suppressNextTooltip.current = true;
|
|
90
|
+
}
|
|
91
|
+
return setOptionsMenuOpen(nextOpen);
|
|
92
|
+
},
|
|
83
93
|
}}
|
|
84
94
|
>
|
|
85
|
-
<DropdownMenu.
|
|
86
|
-
{
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
)}
|
|
146
|
-
{shortcut && (
|
|
147
|
-
<span className={mx('shrink-0', descriptionText)}>{keySymbols(shortcut).join('')}</span>
|
|
148
|
-
)}
|
|
149
|
-
</Root>
|
|
150
|
-
);
|
|
151
|
-
})}
|
|
152
|
-
</Fragment>
|
|
153
|
-
);
|
|
154
|
-
})}
|
|
155
|
-
{children}
|
|
156
|
-
</DropdownMenu.Viewport>
|
|
157
|
-
<DropdownMenu.Arrow />
|
|
158
|
-
</DropdownMenu.Content>
|
|
159
|
-
</DropdownMenu.Portal>
|
|
160
|
-
</DropdownMenu.Root>
|
|
161
|
-
<Tooltip.Portal>
|
|
162
|
-
<Tooltip.Content side='bottom'>
|
|
163
|
-
{triggerLabel}
|
|
164
|
-
<Tooltip.Arrow />
|
|
165
|
-
</Tooltip.Content>
|
|
166
|
-
</Tooltip.Portal>
|
|
167
|
-
</Tooltip.Root>
|
|
95
|
+
<DropdownMenu.Trigger asChild ref={forwardedRef}>
|
|
96
|
+
{button}
|
|
97
|
+
</DropdownMenu.Trigger>
|
|
98
|
+
<DropdownMenu.Portal>
|
|
99
|
+
<DropdownMenu.Content classNames='z-[31]'>
|
|
100
|
+
<DropdownMenu.Viewport>
|
|
101
|
+
{actionGroups?.map((actions, index) => {
|
|
102
|
+
const separator = index > 0 ? <DropdownMenu.Separator /> : null;
|
|
103
|
+
return (
|
|
104
|
+
<Fragment key={index}>
|
|
105
|
+
{separator}
|
|
106
|
+
{actions.map((action) => {
|
|
107
|
+
const shortcut =
|
|
108
|
+
typeof action.properties.keyBinding === 'string'
|
|
109
|
+
? action.properties.keyBinding
|
|
110
|
+
: action.properties.keyBinding?.[getHostPlatform()];
|
|
111
|
+
|
|
112
|
+
const menuItemType = action.properties.menuItemType;
|
|
113
|
+
const Root = menuItemType === 'toggle' ? DropdownMenu.CheckboxItem : DropdownMenu.Item;
|
|
114
|
+
|
|
115
|
+
return (
|
|
116
|
+
<Root
|
|
117
|
+
key={action.id}
|
|
118
|
+
onClick={(event) => {
|
|
119
|
+
if (action.properties.disabled) {
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
event.stopPropagation();
|
|
123
|
+
// TODO(thure): Why does Dialog’s modal-ness cause issues if we don’t explicitly close the menu here?
|
|
124
|
+
suppressNextTooltip.current = true;
|
|
125
|
+
setOptionsMenuOpen(false);
|
|
126
|
+
onAction?.(action);
|
|
127
|
+
}}
|
|
128
|
+
classNames='gap-2'
|
|
129
|
+
disabled={action.properties.disabled}
|
|
130
|
+
checked={menuItemType === 'toggle' ? action.properties.isChecked : undefined}
|
|
131
|
+
{...(action.properties?.testId && { 'data-testid': action.properties.testId })}
|
|
132
|
+
>
|
|
133
|
+
<Icon icon={action.properties.icon ?? 'ph--placeholder--regular'} size={4} />
|
|
134
|
+
<span className='grow truncate'>{toLocalizedString(action.properties.label ?? '', t)}</span>
|
|
135
|
+
{menuItemType === 'toggle' && (
|
|
136
|
+
<DropdownMenu.ItemIndicator asChild>
|
|
137
|
+
<Icon icon='ph--check--regular' size={4} />
|
|
138
|
+
</DropdownMenu.ItemIndicator>
|
|
139
|
+
)}
|
|
140
|
+
{shortcut && (
|
|
141
|
+
<span className={mx('shrink-0', descriptionText)}>{keySymbols(shortcut).join('')}</span>
|
|
142
|
+
)}
|
|
143
|
+
</Root>
|
|
144
|
+
);
|
|
145
|
+
})}
|
|
146
|
+
</Fragment>
|
|
147
|
+
);
|
|
148
|
+
})}
|
|
149
|
+
{children}
|
|
150
|
+
</DropdownMenu.Viewport>
|
|
151
|
+
<DropdownMenu.Arrow />
|
|
152
|
+
</DropdownMenu.Content>
|
|
153
|
+
</DropdownMenu.Portal>
|
|
154
|
+
</DropdownMenu.Root>
|
|
168
155
|
);
|
|
169
156
|
},
|
|
170
157
|
);
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { type StackItemContentProps } from '../components';
|
|
3
|
-
export declare const EditorContent: ({ data: { content } }: {
|
|
4
|
-
data: StackItemContentProps & {
|
|
5
|
-
content?: string;
|
|
6
|
-
};
|
|
7
|
-
}) => React.JSX.Element;
|
|
8
|
-
//# sourceMappingURL=EditorContent.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"EditorContent.d.ts","sourceRoot":"","sources":["../../../../src/testing/EditorContent.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAkBxC,OAAO,EAAa,KAAK,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAEtE,eAAO,MAAM,aAAa,0BAAgC;IAAE,IAAI,EAAE,qBAAqB,GAAG;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,sBAmC/G,CAAC"}
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
//
|
|
2
|
-
// Copyright 2024 DXOS.org
|
|
3
|
-
//
|
|
4
|
-
|
|
5
|
-
import React, { useState } from 'react';
|
|
6
|
-
|
|
7
|
-
import { Expando } from '@dxos/echo-schema';
|
|
8
|
-
import { create } from '@dxos/live-object';
|
|
9
|
-
import { useThemeContext } from '@dxos/react-ui';
|
|
10
|
-
import {
|
|
11
|
-
createBasicExtensions,
|
|
12
|
-
createMarkdownExtensions,
|
|
13
|
-
createThemeExtensions,
|
|
14
|
-
decorateMarkdown,
|
|
15
|
-
formattingKeymap,
|
|
16
|
-
Toolbar,
|
|
17
|
-
useActionHandler,
|
|
18
|
-
useFormattingState,
|
|
19
|
-
useTextEditor,
|
|
20
|
-
} from '@dxos/react-ui-editor';
|
|
21
|
-
import { focusRing, mx, textBlockWidth } from '@dxos/react-ui-theme';
|
|
22
|
-
|
|
23
|
-
import { StackItem, type StackItemContentProps } from '../components';
|
|
24
|
-
|
|
25
|
-
export const EditorContent = ({ data: { content = '' } }: { data: StackItemContentProps & { content?: string } }) => {
|
|
26
|
-
const { themeMode } = useThemeContext();
|
|
27
|
-
const [text] = useState(create(Expando, { content }));
|
|
28
|
-
const id = text.id;
|
|
29
|
-
const [formattingState, formattingObserver] = useFormattingState();
|
|
30
|
-
const { parentRef, view, focusAttributes } = useTextEditor(() => {
|
|
31
|
-
return {
|
|
32
|
-
id,
|
|
33
|
-
initialValue: text.content,
|
|
34
|
-
extensions: [
|
|
35
|
-
formattingObserver,
|
|
36
|
-
createBasicExtensions(),
|
|
37
|
-
createMarkdownExtensions({ themeMode }),
|
|
38
|
-
createThemeExtensions({ themeMode, syntaxHighlighting: true, slots: { editor: { className: 'p-2' } } }),
|
|
39
|
-
decorateMarkdown(),
|
|
40
|
-
formattingKeymap(),
|
|
41
|
-
],
|
|
42
|
-
};
|
|
43
|
-
}, [id, formattingObserver, themeMode]);
|
|
44
|
-
|
|
45
|
-
const handleAction = useActionHandler(view);
|
|
46
|
-
|
|
47
|
-
return (
|
|
48
|
-
<StackItem.Content>
|
|
49
|
-
<div {...focusAttributes} className={mx(textBlockWidth, focusRing, 'rounded-sm order-last')} ref={parentRef} />
|
|
50
|
-
<Toolbar.Root
|
|
51
|
-
onAction={handleAction}
|
|
52
|
-
state={formattingState}
|
|
53
|
-
classNames='sticky block-start-0 bg-[--sticky-bg] z-10'
|
|
54
|
-
>
|
|
55
|
-
<Toolbar.Markdown />
|
|
56
|
-
<Toolbar.Separator />
|
|
57
|
-
</Toolbar.Root>
|
|
58
|
-
</StackItem.Content>
|
|
59
|
-
);
|
|
60
|
-
};
|