Skip to content

Commit eed8957

Browse files
committed
perf(json-crdt-peritext-ui): ⚡️ separate caret overlays into their own components
1 parent 6cc09af commit eed8957

File tree

4 files changed

+46
-18
lines changed

4 files changed

+46
-18
lines changed

src/json-crdt-peritext-ui/plugins/toolbar/ToolbarPlugin.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import {RenderInline} from './inline/RenderInline';
33
import {RenderPeritext, type RenderPeritextProps} from './RenderPeritext';
44
import {text} from '../minimal/text';
55
import {RenderBlock} from './block/RenderBlock';
6-
import {RenderCaret} from './cursor/RenderCaret';
6+
import {RenderCaret} from './cursor/caret/RenderCaret';
77
import {RenderFocus} from './cursor/RenderFocus';
88
import type {PeritextPlugin} from '../../web/react/types';
99
import type {DebugState} from '../debug/state';
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import * as React from 'react';
2+
import type {CaretViewProps} from '../../../../web/react/cursor/CaretView';
3+
4+
export interface CaretBottomOverlayProps extends CaretViewProps {
5+
children: React.ReactNode;
6+
}
7+
8+
export const CaretBottomOverlay: React.FC<CaretBottomOverlayProps> = (props) => {
9+
const {fwd, bwd} = props;
10+
const inline = fwd || bwd;
11+
12+
console.log('attr', inline?.attr());
13+
14+
return null;
15+
};
Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,18 @@
11
import * as React from 'react';
22
import {CaretToolbar} from 'nice-ui/lib/4-card/Toolbar/ToolbarMenu/CaretToolbar';
3-
import {useToolbarPlugin} from '../context';
4-
import {useSyncStore, useSyncStoreOpt, useTimeout} from '../../../web/react/hooks';
5-
import {AfterTimeout} from '../../../web/react/util/AfterTimeout';
6-
import {CaretFrame} from './CaretFrame';
7-
import type {CaretViewProps} from '../../../web/react/cursor/CaretView';
3+
import {useToolbarPlugin} from '../../context';
4+
import {useSyncStore, useTimeout} from '../../../../web/react/hooks';
5+
import {AfterTimeout} from '../../../../web/react/util/AfterTimeout';
6+
import type {CaretViewProps} from '../../../../web/react/cursor/CaretView';
87

9-
export interface RenderCaretProps extends CaretViewProps {
8+
export interface CaretTopOverlayProps extends CaretViewProps {
109
children: React.ReactNode;
1110
}
1211

13-
export const RenderCaret: React.FC<RenderCaretProps> = ({children}) => {
12+
export const CaretTopOverlay: React.FC<CaretTopOverlayProps> = () => {
1413
const {toolbar} = useToolbarPlugin()!;
1514
const showInlineToolbar = toolbar.showInlineToolbar;
16-
const [showCaretToolbarValue, toolbarVisibilityChangeTime] = useSyncStore(showInlineToolbar);
17-
const focus = useSyncStoreOpt(toolbar.surface.dom?.cursor.focus) || false;
15+
const [, toolbarVisibilityChangeTime] = useSyncStore(showInlineToolbar);
1816
const doHideForCoolDown = toolbarVisibilityChangeTime + 500 > Date.now();
1917
const enableAfterCoolDown = useTimeout(500, [doHideForCoolDown]);
2018

@@ -25,19 +23,15 @@ export const RenderCaret: React.FC<RenderCaretProps> = ({children}) => {
2523
}, 5);
2624
}, []);
2725

28-
let over: React.ReactNode | undefined = (
26+
let element: React.ReactNode | undefined = (
2927
<CaretToolbar disabled={!enableAfterCoolDown} menu={toolbar.getCaretMenu()} onPopupClose={handleClose} />
3028
);
3129

3230
if (doHideForCoolDown) {
33-
over = <AfterTimeout ms={500}>{over}</AfterTimeout>;
31+
element = <AfterTimeout ms={500}>{element}</AfterTimeout>;
3432
}
3533

36-
over = null;
34+
element = null;
3735

38-
return (
39-
<CaretFrame over={over}>
40-
{children}
41-
</CaretFrame>
42-
);
36+
return element;
4337
};
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import * as React from 'react';
2+
import {CaretFrame} from '../CaretFrame';
3+
import {CaretTopOverlay} from './CaretTopOverlay';
4+
import {CaretBottomOverlay} from './CaretBottomOverlay';
5+
import type {CaretViewProps} from '../../../../web/react/cursor/CaretView';
6+
7+
export interface RenderCaretProps extends CaretViewProps {
8+
children: React.ReactNode;
9+
}
10+
11+
export const RenderCaret: React.FC<RenderCaretProps> = (props) => {
12+
const {children} = props;
13+
14+
return (
15+
<CaretFrame over={<CaretTopOverlay {...props} />} under={<CaretBottomOverlay {...props} />}>
16+
{children}
17+
</CaretFrame>
18+
);
19+
};

0 commit comments

Comments
 (0)