@teambit/react.ui.component-highlighter 0.0.511 → 0.0.514
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/children-highlighter/use-children-highlighter.tsx +5 -3
- package/component-highlighter.docs.md +3 -14
- package/dist/children-highlighter/use-children-highlighter.d.ts +7 -2
- package/dist/children-highlighter/use-children-highlighter.js.map +1 -1
- package/dist/component-highlighter.docs.md +3 -14
- package/dist/element-highlighter/element-highlighter.compositions.d.ts +2 -0
- package/dist/element-highlighter/element-highlighter.compositions.js +33 -17
- package/dist/element-highlighter/element-highlighter.compositions.js.map +1 -1
- package/dist/element-highlighter/element-highlighter.d.ts +6 -10
- package/dist/element-highlighter/element-highlighter.js +4 -4
- package/dist/element-highlighter/element-highlighter.js.map +1 -1
- package/dist/element-highlighter/index.d.ts +1 -1
- package/dist/frame/frame.d.ts +8 -4
- package/dist/frame/frame.js +69 -31
- package/dist/frame/frame.js.map +1 -1
- package/dist/frame/frame.module.scss +8 -1
- package/dist/hover-highlighter/bubble-to-component.d.ts +19 -0
- package/dist/hover-highlighter/bubble-to-component.js +43 -0
- package/dist/hover-highlighter/bubble-to-component.js.map +1 -0
- package/dist/hover-highlighter/bubble-to-component.spec.d.ts +1 -0
- package/dist/hover-highlighter/bubble-to-component.spec.js +38 -0
- package/dist/hover-highlighter/bubble-to-component.spec.js.map +1 -0
- package/dist/hover-highlighter/use-hover-highlighter.d.ts +6 -1
- package/dist/hover-highlighter/use-hover-highlighter.js +2 -23
- package/dist/hover-highlighter/use-hover-highlighter.js.map +1 -1
- package/dist/hybrid-highlighter/hybrid-highlighter.js +1 -1
- package/dist/hybrid-highlighter/hybrid-highlighter.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/label/component-strip.d.ts +1 -1
- package/dist/label/component-strip.js +7 -1
- package/dist/label/component-strip.js.map +1 -1
- package/dist/label/label-container.d.ts +4 -5
- package/dist/label/label-container.js +29 -13
- package/dist/label/label-container.js.map +1 -1
- package/dist/label/label.d.ts +1 -1
- package/dist/label/label.module.scss +8 -0
- package/dist/label/other-components.d.ts +1 -1
- package/dist/mock-component.d.ts +2 -0
- package/dist/mock-component.js +30 -0
- package/dist/mock-component.js.map +1 -0
- package/element-highlighter/element-highlighter.compositions.tsx +53 -19
- package/element-highlighter/element-highlighter.tsx +13 -25
- package/element-highlighter/index.ts +1 -1
- package/frame/frame.module.scss +8 -1
- package/frame/frame.tsx +92 -44
- package/hover-highlighter/bubble-to-component.spec.tsx +57 -0
- package/hover-highlighter/bubble-to-component.tsx +69 -0
- package/hover-highlighter/use-hover-highlighter.tsx +5 -36
- package/hybrid-highlighter/hybrid-highlighter.tsx +7 -2
- package/index.ts +1 -1
- package/label/component-strip.tsx +11 -2
- package/label/label-container.tsx +42 -20
- package/label/label.module.scss +8 -0
- package/label/label.tsx +1 -1
- package/label/other-components.tsx +1 -1
- package/mock-component.tsx +9 -0
- package/package-tar/teambit-react.ui.component-highlighter-0.0.514.tgz +0 -0
- package/package.json +9 -10
- package/{preview-1647509820722.js → preview-1649066106369.js} +2 -2
- package/dist/use-animation-frame.d.ts +0 -1
- package/dist/use-animation-frame.js +0 -23
- package/dist/use-animation-frame.js.map +0 -1
- package/package-tar/teambit-react.ui.component-highlighter-0.0.511.tgz +0 -0
- package/use-animation-frame.tsx +0 -20
|
@@ -3,15 +3,17 @@ import getXPath from 'get-xpath';
|
|
|
3
3
|
import { domToReacts, toRootElement } from '@teambit/react.modules.dom-to-react';
|
|
4
4
|
import {
|
|
5
5
|
componentMetaField,
|
|
6
|
+
ComponentMetaHolder,
|
|
6
7
|
hasComponentMeta,
|
|
7
8
|
ReactComponentMetaHolder,
|
|
8
9
|
} from '@teambit/react.ui.highlighter.component-metadata.bit-component-meta';
|
|
9
|
-
import { HighlightTarget } from '../element-highlighter';
|
|
10
10
|
import { excludeHighlighterSelector } from '../ignore-highlighter';
|
|
11
11
|
import { ruleMatcher, MatchRule, ComponentMatchRule, componentRuleMatcher } from '../rule-matcher';
|
|
12
12
|
|
|
13
|
+
type HighlighterTarget = Record<string, { element: HTMLElement; components: ComponentMetaHolder[] }>;
|
|
14
|
+
|
|
13
15
|
export type ChildrenHighlighterOptions = {
|
|
14
|
-
onChange: (highlighterTargets:
|
|
16
|
+
onChange: (highlighterTargets: HighlighterTarget) => void;
|
|
15
17
|
disabled?: boolean;
|
|
16
18
|
scopeRef: RefObject<HTMLElement>;
|
|
17
19
|
scopeClass?: string;
|
|
@@ -32,7 +34,7 @@ export function useChildrenHighlighter({
|
|
|
32
34
|
componentRule,
|
|
33
35
|
}: ChildrenHighlighterOptions) {
|
|
34
36
|
useEffect(() => {
|
|
35
|
-
const nextTargets:
|
|
37
|
+
const nextTargets: HighlighterTarget = {};
|
|
36
38
|
const scopeElement = scopeRef.current;
|
|
37
39
|
if (!scopeElement || disabled) return;
|
|
38
40
|
|
|
@@ -34,23 +34,12 @@ You can also use it manually, to have more control:
|
|
|
34
34
|
import { ElementHighlighter } from '@teambit/react.ui.component-highlighter';
|
|
35
35
|
|
|
36
36
|
function ManualHighlight() {
|
|
37
|
-
const
|
|
38
|
-
|
|
39
|
-
useEffect(() => setElement(document.getElementById('to-highlight')), [targetRef.current]);
|
|
40
|
-
|
|
41
|
-
const target = targetElement && {
|
|
42
|
-
element: targetElement,
|
|
43
|
-
id: 'teambit.design/ui/icon-button',
|
|
44
|
-
|
|
45
|
-
// explicit overrides:
|
|
46
|
-
link: 'https://bit.dev/teambit/design/ui/icon-button',
|
|
47
|
-
scopeLink: 'https://bit.dev/teambit/design',
|
|
48
|
-
};
|
|
37
|
+
const targetRef = createRef<HTMLElement | undefined>(null);
|
|
49
38
|
|
|
50
39
|
return (
|
|
51
40
|
<div>
|
|
52
|
-
<div
|
|
53
|
-
|
|
41
|
+
<div ref={targetRef}>highlight target</div>
|
|
42
|
+
<ElementHighlighter targetRef={targetRef} components={['teambit.design/ui/icon-button']} />
|
|
54
43
|
</div>
|
|
55
44
|
);
|
|
56
45
|
}
|
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
import { RefObject } from 'react';
|
|
2
|
-
import {
|
|
2
|
+
import { ComponentMetaHolder } from '@teambit/react.ui.highlighter.component-metadata.bit-component-meta';
|
|
3
3
|
import { MatchRule, ComponentMatchRule } from '../rule-matcher';
|
|
4
|
+
declare type HighlighterTarget = Record<string, {
|
|
5
|
+
element: HTMLElement;
|
|
6
|
+
components: ComponentMetaHolder[];
|
|
7
|
+
}>;
|
|
4
8
|
export declare type ChildrenHighlighterOptions = {
|
|
5
|
-
onChange: (highlighterTargets:
|
|
9
|
+
onChange: (highlighterTargets: HighlighterTarget) => void;
|
|
6
10
|
disabled?: boolean;
|
|
7
11
|
scopeRef: RefObject<HTMLElement>;
|
|
8
12
|
scopeClass?: string;
|
|
@@ -11,3 +15,4 @@ export declare type ChildrenHighlighterOptions = {
|
|
|
11
15
|
componentRule?: ComponentMatchRule;
|
|
12
16
|
};
|
|
13
17
|
export declare function useChildrenHighlighter({ onChange, disabled, scopeRef, scopeClass: scopeSelector, rule, componentRule, }: ChildrenHighlighterOptions): void;
|
|
18
|
+
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-children-highlighter.js","sourceRoot":"","sources":["../../children-highlighter/use-children-highlighter.tsx"],"names":[],"mappings":";;;;;;AAAA,iCAA6C;AAC7C,0DAAiC;AACjC,oFAAiF;AACjF,
|
|
1
|
+
{"version":3,"file":"use-children-highlighter.js","sourceRoot":"","sources":["../../children-highlighter/use-children-highlighter.tsx"],"names":[],"mappings":";;;;;;AAAA,iCAA6C;AAC7C,0DAAiC;AACjC,oFAAiF;AACjF,oJAK6E;AAC7E,8DAAmE;AACnE,kDAAmG;AAiBnG,SAAgB,sBAAsB,CAAC,EACrC,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,UAAU,EAAE,aAAa,GAAG,EAAE,EAC9B,IAAI,EACJ,aAAa,GACc;IAC3B,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,MAAM,WAAW,GAAsB,EAAE,CAAC;QAC1C,MAAM,YAAY,GAAG,QAAQ,CAAC,OAAO,CAAC;QACtC,IAAI,CAAC,YAAY,IAAI,QAAQ;YAAE,OAAO;QAEtC,wCAAwC;QACxC,IAAI,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAc,eAAe,CAAC,IAAI,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/G,uBAAuB;QACvB,IAAI,IAAI;YAAE,WAAW,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAA,0BAAW,EAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QAC9E,yBAAyB;QACzB,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,CAAC,0CAAa,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACvE,cAAc;QACd,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC;QAE1C,WAAW,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC9B,IAAI,CAAC,OAAO;gBAAE,OAAO;YACrB,MAAM,KAAK,GAAG,IAAA,wCAAW,EAAC,OAAO,CAAC,CAAC;YACnC,MAAM,kBAAkB,GAAG,KAAK,CAAC,MAAM,CACrC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAA,6EAAgB,EAAC,CAAC,CAAC,IAAI,IAAA,mCAAoB,EAAC,EAAE,IAAI,EAAE,CAAC,CAAC,+EAAkB,CAAC,EAAE,EAAE,aAAa,CAAC,CACrE,CAAC;YAEhC,IAAI,kBAAkB,CAAC,MAAM,GAAG,CAAC;gBAAE,OAAO;YAE1C,MAAM,GAAG,GAAG,IAAA,mBAAQ,EAAC,OAAO,CAAC,CAAC;YAE9B,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,CAAC;QACjE,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,WAAW,CAAC,CAAC;IACxB,CAAC,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC;AAChC,CAAC;AAtCD,wDAsCC;AAED,SAAS,eAAe;AACtB;;;GAGG;AACH,aAAa,GAAG,QAAQ;IAExB,OAAO,QAAQ,aAAa,IAAI,+CAA0B,KAAK,aAAa,IAAI,+CAA0B,KAAK,CAAC;AAClH,CAAC"}
|
|
@@ -34,23 +34,12 @@ You can also use it manually, to have more control:
|
|
|
34
34
|
import { ElementHighlighter } from '@teambit/react.ui.component-highlighter';
|
|
35
35
|
|
|
36
36
|
function ManualHighlight() {
|
|
37
|
-
const
|
|
38
|
-
|
|
39
|
-
useEffect(() => setElement(document.getElementById('to-highlight')), [targetRef.current]);
|
|
40
|
-
|
|
41
|
-
const target = targetElement && {
|
|
42
|
-
element: targetElement,
|
|
43
|
-
id: 'teambit.design/ui/icon-button',
|
|
44
|
-
|
|
45
|
-
// explicit overrides:
|
|
46
|
-
link: 'https://bit.dev/teambit/design/ui/icon-button',
|
|
47
|
-
scopeLink: 'https://bit.dev/teambit/design',
|
|
48
|
-
};
|
|
37
|
+
const targetRef = createRef<HTMLElement | undefined>(null);
|
|
49
38
|
|
|
50
39
|
return (
|
|
51
40
|
<div>
|
|
52
|
-
<div
|
|
53
|
-
|
|
41
|
+
<div ref={targetRef}>highlight target</div>
|
|
42
|
+
<ElementHighlighter targetRef={targetRef} components={['teambit.design/ui/icon-button']} />
|
|
54
43
|
</div>
|
|
55
44
|
);
|
|
56
45
|
}
|
|
@@ -9,4 +9,6 @@ export declare const HighlightedElement: ({ style, targetStyle, watchMotion, cla
|
|
|
9
9
|
export declare const Customized: () => JSX.Element;
|
|
10
10
|
export declare const Sizes: () => JSX.Element;
|
|
11
11
|
export declare const MovingElement: () => JSX.Element;
|
|
12
|
+
export declare const ElementOnTheEdge: () => JSX.Element;
|
|
13
|
+
export declare const FullscreenElement: () => JSX.Element;
|
|
12
14
|
export {};
|
|
@@ -19,27 +19,15 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
19
19
|
return result;
|
|
20
20
|
};
|
|
21
21
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
-
exports.MovingElement = exports.Sizes = exports.Customized = exports.HighlightedElement = void 0;
|
|
23
|
-
const react_ui_highlighter_component_metadata_bit_component_meta_1 = require("@teambit/react.ui.highlighter.component-metadata.bit-component-meta");
|
|
22
|
+
exports.FullscreenElement = exports.ElementOnTheEdge = exports.MovingElement = exports.Sizes = exports.Customized = exports.HighlightedElement = void 0;
|
|
24
23
|
const react_1 = __importStar(require("react"));
|
|
25
24
|
const element_highlighter_1 = require("./element-highlighter");
|
|
26
|
-
const
|
|
27
|
-
components: [
|
|
28
|
-
{
|
|
29
|
-
[react_ui_highlighter_component_metadata_bit_component_meta_1.componentMetaField]: {
|
|
30
|
-
id: 'teambit.design/ui/icon-button@1.6.2',
|
|
31
|
-
},
|
|
32
|
-
},
|
|
33
|
-
],
|
|
34
|
-
};
|
|
25
|
+
const mock_component_1 = require("../mock-component");
|
|
35
26
|
const HighlightedElement = ({ style, targetStyle, watchMotion, className }) => {
|
|
36
|
-
const [targetElement, setTargetElement] = (0, react_1.useState)(undefined);
|
|
37
27
|
const targetRef = (0, react_1.createRef)();
|
|
38
|
-
(0, react_1.useEffect)(() => setTargetElement(targetRef.current || undefined), [targetRef.current]);
|
|
39
|
-
const target = targetElement && Object.assign(Object.assign({}, mockTarget), { element: targetElement });
|
|
40
28
|
return (react_1.default.createElement("div", { className: className, style: { padding: '16px 16px 40px 16px', width: 300, fontFamily: 'sans-serif' } },
|
|
41
29
|
react_1.default.createElement("div", { ref: targetRef, style: Object.assign({ width: 100 }, targetStyle) }, "highlight target"),
|
|
42
|
-
|
|
30
|
+
react_1.default.createElement(element_highlighter_1.ElementHighlighter, { targetRef: targetRef, components: [mock_component_1.MockTarget], style: style, watchMotion: watchMotion, placement: "bottom" })));
|
|
43
31
|
};
|
|
44
32
|
exports.HighlightedElement = HighlightedElement;
|
|
45
33
|
const Customized = () => {
|
|
@@ -57,13 +45,41 @@ const Sizes = () => {
|
|
|
57
45
|
react_1.default.createElement(exports.HighlightedElement, { style: { fontSize: 18 } })));
|
|
58
46
|
};
|
|
59
47
|
exports.Sizes = Sizes;
|
|
48
|
+
const fps = 30;
|
|
49
|
+
const frameInterval = 1000 / fps;
|
|
60
50
|
const MovingElement = () => {
|
|
61
51
|
const [margin, setMargin] = (0, react_1.useState)(0);
|
|
62
52
|
(0, react_1.useEffect)(() => {
|
|
63
|
-
const intervalId = setInterval(() => setMargin((x) => (x + 1) % 100),
|
|
53
|
+
const intervalId = setInterval(() => setMargin((x) => (x + 1) % 100), frameInterval);
|
|
64
54
|
return () => clearInterval(intervalId);
|
|
65
55
|
}, []);
|
|
66
|
-
return react_1.default.createElement(exports.HighlightedElement, { targetStyle: { marginLeft: margin } });
|
|
56
|
+
return react_1.default.createElement(exports.HighlightedElement, { targetStyle: { marginLeft: margin }, watchMotion: true });
|
|
67
57
|
};
|
|
68
58
|
exports.MovingElement = MovingElement;
|
|
59
|
+
const ElementOnTheEdge = () => {
|
|
60
|
+
const targetRef = (0, react_1.createRef)();
|
|
61
|
+
return (react_1.default.createElement("div", { style: { fontFamily: 'sans-serif' } },
|
|
62
|
+
react_1.default.createElement("div", { ref: targetRef, style: { width: '100%', border: '1px solid black', boxSizing: 'border-box' } },
|
|
63
|
+
"This element is on the edge of the document, making the highlighter overflow. ",
|
|
64
|
+
react_1.default.createElement("br", null),
|
|
65
|
+
"It should instead shrink to fit inside the document."),
|
|
66
|
+
react_1.default.createElement(element_highlighter_1.ElementHighlighter, { targetRef: targetRef, components: [mock_component_1.MockTarget], watchMotion: true })));
|
|
67
|
+
};
|
|
68
|
+
exports.ElementOnTheEdge = ElementOnTheEdge;
|
|
69
|
+
const FullscreenElement = () => {
|
|
70
|
+
const targetRef = (0, react_1.createRef)();
|
|
71
|
+
return (react_1.default.createElement("div", { style: { fontFamily: 'sans-serif' } },
|
|
72
|
+
react_1.default.createElement("div", { ref: targetRef, style: {
|
|
73
|
+
height: '100vh',
|
|
74
|
+
width: '100%',
|
|
75
|
+
background: '#bceed4',
|
|
76
|
+
} },
|
|
77
|
+
"This element will cover the entire document,",
|
|
78
|
+
react_1.default.createElement("br", null),
|
|
79
|
+
"pushing the highlighter to the edge of the window.",
|
|
80
|
+
react_1.default.createElement("br", null),
|
|
81
|
+
"The highlighter should remain inside and expand no further than the document."),
|
|
82
|
+
react_1.default.createElement(element_highlighter_1.ElementHighlighter, { targetRef: targetRef, components: [mock_component_1.MockTarget], watchMotion: true })));
|
|
83
|
+
};
|
|
84
|
+
exports.FullscreenElement = FullscreenElement;
|
|
69
85
|
//# sourceMappingURL=element-highlighter.compositions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"element-highlighter.compositions.js","sourceRoot":"","sources":["../../element-highlighter/element-highlighter.compositions.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA
|
|
1
|
+
{"version":3,"file":"element-highlighter.compositions.js","sourceRoot":"","sources":["../../element-highlighter/element-highlighter.compositions.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
import React from 'react';
|
|
1
|
+
import React, { RefObject } from 'react';
|
|
2
2
|
import { ComponentMetaHolder } from '@teambit/react.ui.highlighter.component-metadata.bit-component-meta';
|
|
3
3
|
import { Placement } from '../label';
|
|
4
4
|
export interface ElementHighlighterProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
5
|
-
/**
|
|
6
|
-
|
|
5
|
+
/** highlight this element */
|
|
6
|
+
targetRef: RefObject<HTMLElement | null>;
|
|
7
|
+
/** components with metadata to show in the label */
|
|
8
|
+
components?: (ComponentMetaHolder | string)[];
|
|
7
9
|
/** default location of the label */
|
|
8
10
|
placement?: Placement;
|
|
9
11
|
/** customize styles */
|
|
@@ -12,15 +14,9 @@ export interface ElementHighlighterProps extends React.HTMLAttributes<HTMLDivEle
|
|
|
12
14
|
watchMotion?: boolean;
|
|
13
15
|
}
|
|
14
16
|
export { Placement };
|
|
15
|
-
export declare type HighlightTarget = {
|
|
16
|
-
/** element to show the highlight at */
|
|
17
|
-
element: HTMLElement;
|
|
18
|
-
/** components with metadata to show in the label */
|
|
19
|
-
components?: ComponentMetaHolder[];
|
|
20
|
-
};
|
|
21
17
|
export declare type HighlightClasses = {
|
|
22
18
|
container?: string;
|
|
23
19
|
frame?: string;
|
|
24
20
|
label?: string;
|
|
25
21
|
};
|
|
26
|
-
export declare function ElementHighlighter({
|
|
22
|
+
export declare function ElementHighlighter({ targetRef, components, placement, watchMotion, className, classes, ...props }: ElementHighlighterProps): JSX.Element;
|
|
@@ -22,11 +22,11 @@ const label_1 = require("../label");
|
|
|
22
22
|
const ignore_highlighter_1 = require("../ignore-highlighter");
|
|
23
23
|
const element_highlighter_module_scss_1 = __importDefault(require("./element-highlighter.module.scss"));
|
|
24
24
|
function ElementHighlighter(_a) {
|
|
25
|
-
var {
|
|
25
|
+
var { targetRef, components, placement = 'top', watchMotion, className, classes } = _a, props = __rest(_a, ["targetRef", "components", "placement", "watchMotion", "className", "classes"]);
|
|
26
26
|
return (react_1.default.createElement("div", Object.assign({}, props, ignore_highlighter_1.excludeHighlighterAtt, { className: (0, classnames_1.default)(classes === null || classes === void 0 ? void 0 : classes.container, element_highlighter_module_scss_1.default.container, className) }),
|
|
27
|
-
react_1.default.createElement(frame_1.Frame, { targetRef:
|
|
28
|
-
|
|
29
|
-
react_1.default.createElement(label_1.Label, { components:
|
|
27
|
+
react_1.default.createElement(frame_1.Frame, { targetRef: targetRef, className: (0, classnames_1.default)(element_highlighter_module_scss_1.default.frame, classes === null || classes === void 0 ? void 0 : classes.frame), watchMotion: watchMotion }),
|
|
28
|
+
components && (react_1.default.createElement(label_1.LabelContainer, { targetRef: targetRef, className: element_highlighter_module_scss_1.default.label, placement: placement, watchMotion: watchMotion },
|
|
29
|
+
react_1.default.createElement(label_1.Label, { components: components, className: classes === null || classes === void 0 ? void 0 : classes.label })))));
|
|
30
30
|
}
|
|
31
31
|
exports.ElementHighlighter = ElementHighlighter;
|
|
32
32
|
//# sourceMappingURL=element-highlighter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"element-highlighter.js","sourceRoot":"","sources":["../../element-highlighter/element-highlighter.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"element-highlighter.js","sourceRoot":"","sources":["../../element-highlighter/element-highlighter.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,kDAAyC;AACzC,4DAAoC;AAEpC,oCAAiC;AACjC,oCAA4D;AAC5D,8DAA8D;AAC9D,wGAAuD;AAwBvD,SAAgB,kBAAkB,CAAC,EAQT;QARS,EACjC,SAAS,EACT,UAAU,EACV,SAAS,GAAG,KAAK,EACjB,WAAW,EACX,SAAS,EACT,OAAO,OAEiB,EADrB,KAAK,cAPyB,+EAQlC,CADS;IAER,OAAO,CACL,uDAAS,KAAK,EAAM,0CAAqB,IAAE,SAAS,EAAE,IAAA,oBAAU,EAAC,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,SAAS,EAAE,yCAAM,CAAC,SAAS,EAAE,SAAS,CAAC;QAC/G,8BAAC,aAAK,IAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,IAAA,oBAAU,EAAC,yCAAM,CAAC,KAAK,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,KAAK,CAAC,EAAE,WAAW,EAAE,WAAW,GAAI;QAE7G,UAAU,IAAI,CACb,8BAAC,sBAAc,IAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,yCAAM,CAAC,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW;YAC3G,8BAAC,aAAK,IAAC,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,KAAK,GAAI,CAC7C,CAClB,CACG,CACP,CAAC;AACJ,CAAC;AApBD,gDAoBC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export { ElementHighlighter } from './element-highlighter';
|
|
2
|
-
export type { ElementHighlighterProps,
|
|
2
|
+
export type { ElementHighlighterProps, Placement, HighlightClasses } from './element-highlighter';
|
package/dist/frame/frame.d.ts
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import '@popperjs/core';
|
|
1
|
+
import React, { RefObject } from 'react';
|
|
3
2
|
export interface FrameProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
4
|
-
|
|
3
|
+
/** apply the frame to this element */
|
|
4
|
+
targetRef: RefObject<HTMLElement | null>;
|
|
5
|
+
/**
|
|
6
|
+
* the specific flavor of the frame.
|
|
7
|
+
* @default "redBorderClass"
|
|
8
|
+
*/
|
|
5
9
|
stylesClass?: string;
|
|
6
10
|
/** continually update frame position to match moving elements */
|
|
7
11
|
watchMotion?: boolean;
|
|
8
12
|
}
|
|
9
|
-
export declare function Frame({ targetRef, watchMotion, className, stylesClass, style
|
|
13
|
+
export declare function Frame({ targetRef, watchMotion, className, stylesClass, style }: FrameProps): JSX.Element;
|
package/dist/frame/frame.js
CHANGED
|
@@ -24,40 +24,78 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
24
24
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
25
|
exports.Frame = void 0;
|
|
26
26
|
const react_1 = __importStar(require("react"));
|
|
27
|
-
const react_popper_1 = require("react-popper");
|
|
28
27
|
const classnames_1 = __importDefault(require("classnames"));
|
|
29
|
-
require("@
|
|
30
|
-
const base_ui_utils_popper_js_ignore_popper_size_1 = require("@teambit/base-ui.utils.popper-js.ignore-popper-size");
|
|
31
|
-
const base_ui_utils_popper_js_resize_to_match_reference_1 = require("@teambit/base-ui.utils.popper-js.resize-to-match-reference");
|
|
32
|
-
const use_animation_frame_1 = require("../use-animation-frame");
|
|
28
|
+
const react_dom_1 = require("@floating-ui/react-dom");
|
|
33
29
|
const frame_module_scss_1 = __importDefault(require("./frame.module.scss"));
|
|
34
|
-
|
|
35
|
-
const
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
{
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
30
|
+
/** frame padding around the target */
|
|
31
|
+
const MARGIN_FROM_TARGET = +frame_module_scss_1.default.offset || 6; // setting fallback 6, for tests
|
|
32
|
+
/** min. distance from the edge of the screen. */
|
|
33
|
+
const MARGIN_FROM_DOC_EDGE = 0;
|
|
34
|
+
// position - bottom start (bottom left corner)
|
|
35
|
+
// x - width - horizontal (cross axis)
|
|
36
|
+
// y - height - vertical (main axis)
|
|
37
|
+
function Frame({ targetRef, watchMotion, className, stylesClass = frame_module_scss_1.default.overlayBorder, style }) {
|
|
38
|
+
const dimensionRef = (0, react_1.useRef)({ width: 0, height: 0 });
|
|
39
|
+
const shiftRef = (0, react_1.useRef)();
|
|
40
|
+
const { x, y, strategy, reference, floating, update, refs } = (0, react_dom_1.useFloating)({
|
|
41
|
+
placement: 'bottom-start',
|
|
42
|
+
middleware: [
|
|
43
|
+
// replace dimensions from previous iterations with the target's size
|
|
44
|
+
// this is only the measured size, not yet the applied size
|
|
45
|
+
{
|
|
46
|
+
name: 'align-to-target',
|
|
47
|
+
fn({ rects }) {
|
|
48
|
+
rects.floating = Object.assign(Object.assign({}, rects.floating), { width: rects.reference.width + 2 * MARGIN_FROM_TARGET, height: rects.reference.height + 2 * MARGIN_FROM_TARGET });
|
|
49
|
+
return {};
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
// reposition x,y, to the top of the reference
|
|
53
|
+
(0, react_dom_1.offset)((options) => -options.reference.height),
|
|
54
|
+
// offset the frame by its extra padding
|
|
55
|
+
(0, react_dom_1.offset)(() => ({ mainAxis: -MARGIN_FROM_TARGET, crossAxis: -MARGIN_FROM_TARGET })),
|
|
56
|
+
// push the frame inside the screen
|
|
57
|
+
(0, react_dom_1.shift)({ rootBoundary: 'document', padding: MARGIN_FROM_DOC_EDGE, mainAxis: true, crossAxis: true }),
|
|
58
|
+
// read "shift" for the size-apply() method (because it doesn't forward middlewareData)
|
|
59
|
+
{
|
|
60
|
+
name: 'read-shift',
|
|
61
|
+
fn({ middlewareData }) {
|
|
62
|
+
shiftRef.current = middlewareData.shift;
|
|
63
|
+
return {};
|
|
64
|
+
},
|
|
65
|
+
},
|
|
66
|
+
// size also applies overflow detection via width and height
|
|
67
|
+
(0, react_dom_1.size)({
|
|
68
|
+
// apply overflow detection in reference to the document
|
|
69
|
+
rootBoundary: 'document',
|
|
70
|
+
padding: MARGIN_FROM_DOC_EDGE,
|
|
71
|
+
apply({ reference: referenceRect, height, width }) {
|
|
72
|
+
var _a, _b, _c;
|
|
73
|
+
const paddingX = 2 * MARGIN_FROM_TARGET - (((_a = shiftRef.current) === null || _a === void 0 ? void 0 : _a.x) || 0);
|
|
74
|
+
const paddingY = 2 * MARGIN_FROM_TARGET - (((_b = shiftRef.current) === null || _b === void 0 ? void 0 : _b.y) || 0);
|
|
75
|
+
dimensionRef.current = {
|
|
76
|
+
width: Math.min(referenceRect.width + paddingX, width),
|
|
77
|
+
height: Math.min(referenceRect.height + paddingY, height),
|
|
78
|
+
};
|
|
79
|
+
Object.assign((_c = refs.floating.current) === null || _c === void 0 ? void 0 : _c.style, dimensionRef.current);
|
|
80
|
+
},
|
|
81
|
+
}),
|
|
82
|
+
],
|
|
56
83
|
});
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
84
|
+
// set target as floating reference
|
|
85
|
+
(0, react_1.useLayoutEffect)(() => {
|
|
86
|
+
reference(targetRef.current);
|
|
87
|
+
}, [targetRef.current]);
|
|
88
|
+
// automatically update on scroll, resize, etc.
|
|
89
|
+
// `watchMotion` will trigger continuous updates using animation frame
|
|
90
|
+
(0, react_1.useEffect)(() => {
|
|
91
|
+
if (!refs.reference.current || !refs.floating.current)
|
|
92
|
+
return () => { };
|
|
93
|
+
return (0, react_dom_1.autoUpdate)(refs.reference.current, refs.floating.current, update, { animationFrame: watchMotion });
|
|
94
|
+
}, [refs.reference.current, refs.floating.current, update, watchMotion]);
|
|
95
|
+
const isReady = x !== null;
|
|
96
|
+
return (react_1.default.createElement("div", { ref: floating, className: (0, classnames_1.default)(className, stylesClass, !isReady && frame_module_scss_1.default.hidden), style: Object.assign(Object.assign(Object.assign({}, style), dimensionRef.current), { position: strategy,
|
|
97
|
+
// starting at pos [0,0] will ensure the label doesn't increase the document size.
|
|
98
|
+
top: y !== null && y !== void 0 ? y : 0, left: x !== null && x !== void 0 ? x : 0 }) }));
|
|
61
99
|
}
|
|
62
100
|
exports.Frame = Frame;
|
|
63
101
|
//# sourceMappingURL=frame.js.map
|
package/dist/frame/frame.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"frame.js","sourceRoot":"","sources":["../../frame/frame.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+
|
|
1
|
+
{"version":3,"file":"frame.js","sourceRoot":"","sources":["../../frame/frame.tsx"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@ $border: 2;
|
|
|
2
2
|
$padding: 4;
|
|
3
3
|
|
|
4
4
|
.overlayBorder {
|
|
5
|
+
box-sizing: border-box;
|
|
5
6
|
border: $border * 1px solid var(--bit-highlighter-color, #eebcc9);
|
|
6
7
|
|
|
7
8
|
border-radius: 11px;
|
|
@@ -11,6 +12,12 @@ $padding: 4;
|
|
|
11
12
|
user-select: none;
|
|
12
13
|
}
|
|
13
14
|
|
|
15
|
+
.hidden {
|
|
16
|
+
// the frame's size is ignored anyways,
|
|
17
|
+
// and so we can use 'display: none' and not 'visibility: hidden'
|
|
18
|
+
display: none;
|
|
19
|
+
}
|
|
20
|
+
|
|
14
21
|
:export {
|
|
15
|
-
offset:
|
|
22
|
+
offset: $border + $padding;
|
|
16
23
|
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { ReactComponentMetaHolder } from '@teambit/react.ui.highlighter.component-metadata.bit-component-meta';
|
|
2
|
+
import { MatchRule, ComponentMatchRule } from '../rule-matcher';
|
|
3
|
+
declare type BubblingOptions = {
|
|
4
|
+
/** filter elements by this rule */
|
|
5
|
+
elementRule?: MatchRule;
|
|
6
|
+
/** filter components by this rule */
|
|
7
|
+
componentRule?: ComponentMatchRule;
|
|
8
|
+
/**
|
|
9
|
+
* continue bubbling when encountering a parent of the same component
|
|
10
|
+
* @default true
|
|
11
|
+
*/
|
|
12
|
+
propagateSameParents?: boolean;
|
|
13
|
+
};
|
|
14
|
+
/** go up the dom tree until reaching a react bit component */
|
|
15
|
+
export declare function bubbleToComponent(element: HTMLElement | null, { elementRule, componentRule, propagateSameParents }?: BubblingOptions): {
|
|
16
|
+
element: HTMLElement;
|
|
17
|
+
components: ReactComponentMetaHolder[];
|
|
18
|
+
};
|
|
19
|
+
export {};
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.bubbleToComponent = void 0;
|
|
4
|
+
const react_modules_dom_to_react_1 = require("@teambit/react.modules.dom-to-react");
|
|
5
|
+
const react_ui_highlighter_component_metadata_bit_component_meta_1 = require("@teambit/react.ui.highlighter.component-metadata.bit-component-meta");
|
|
6
|
+
const rule_matcher_1 = require("../rule-matcher");
|
|
7
|
+
/** go up the dom tree until reaching a react bit component */
|
|
8
|
+
function bubbleToComponent(element, { elementRule, componentRule, propagateSameParents = true } = {}) {
|
|
9
|
+
let current = bubbleToFirstComponent(element, elementRule, componentRule);
|
|
10
|
+
if (!propagateSameParents)
|
|
11
|
+
return current;
|
|
12
|
+
while (current) {
|
|
13
|
+
const parentElement = current.element.parentElement;
|
|
14
|
+
const parent = bubbleToFirstComponent(parentElement, elementRule, componentRule);
|
|
15
|
+
const primeComponent = current === null || current === void 0 ? void 0 : current.components.slice(-1).pop();
|
|
16
|
+
const parentPrimeComponent = parent === null || parent === void 0 ? void 0 : parent.components.slice(-1).pop();
|
|
17
|
+
if ((primeComponent === null || primeComponent === void 0 ? void 0 : primeComponent[react_ui_highlighter_component_metadata_bit_component_meta_1.componentMetaField].id) !== (parentPrimeComponent === null || parentPrimeComponent === void 0 ? void 0 : parentPrimeComponent[react_ui_highlighter_component_metadata_bit_component_meta_1.componentMetaField].id))
|
|
18
|
+
return current;
|
|
19
|
+
current = parent;
|
|
20
|
+
}
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
exports.bubbleToComponent = bubbleToComponent;
|
|
24
|
+
/** go up the dom tree until reaching a react bit component */
|
|
25
|
+
function bubbleToFirstComponent(element, elementRule, componentRule) {
|
|
26
|
+
for (let current = element; current; current = current.parentElement) {
|
|
27
|
+
current = (0, react_modules_dom_to_react_1.toRootElement)(current);
|
|
28
|
+
if (!current)
|
|
29
|
+
return undefined;
|
|
30
|
+
if ((0, rule_matcher_1.ruleMatcher)(current, elementRule)) {
|
|
31
|
+
const components = (0, react_modules_dom_to_react_1.domToReacts)(current);
|
|
32
|
+
const relevantComponents = components.filter((x) => (0, react_ui_highlighter_component_metadata_bit_component_meta_1.hasComponentMeta)(x) && (0, rule_matcher_1.componentRuleMatcher)({ meta: x[react_ui_highlighter_component_metadata_bit_component_meta_1.componentMetaField] }, componentRule));
|
|
33
|
+
if (relevantComponents.length < 1)
|
|
34
|
+
return undefined;
|
|
35
|
+
return {
|
|
36
|
+
element: current,
|
|
37
|
+
components: relevantComponents,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return undefined;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=bubble-to-component.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bubble-to-component.js","sourceRoot":"","sources":["../../hover-highlighter/bubble-to-component.tsx"],"names":[],"mappings":";;;AAAA,oFAAiF;AACjF,oJAI6E;AAC7E,kDAAmG;AAcnG,8DAA8D;AAC9D,SAAgB,iBAAiB,CAC/B,OAA2B,EAC3B,EAAE,WAAW,EAAE,aAAa,EAAE,oBAAoB,GAAG,IAAI,KAAsB,EAAE;IAEjF,IAAI,OAAO,GAAG,sBAAsB,CAAC,OAAO,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;IAC1E,IAAI,CAAC,oBAAoB;QAAE,OAAO,OAAO,CAAC;IAE1C,OAAO,OAAO,EAAE;QACd,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC;QACpD,MAAM,MAAM,GAAG,sBAAsB,CAAC,aAAa,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;QAEjF,MAAM,cAAc,GAAG,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC;QAC3D,MAAM,oBAAoB,GAAG,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC;QAEhE,IAAI,CAAA,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAG,+EAAkB,EAAE,EAAE,OAAK,oBAAoB,aAApB,oBAAoB,uBAApB,oBAAoB,CAAG,+EAAkB,EAAE,EAAE,CAAA;YAAE,OAAO,OAAO,CAAC;QAE9G,OAAO,GAAG,MAAM,CAAC;KAClB;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AApBD,8CAoBC;AAED,8DAA8D;AAC9D,SAAS,sBAAsB,CAC7B,OAA2B,EAC3B,WAAuB,EACvB,aAAkC;IAElC,KAAK,IAAI,OAAO,GAAG,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,aAAa,EAAE;QACpE,OAAO,GAAG,IAAA,0CAAa,EAAC,OAAO,CAAC,CAAC;QACjC,IAAI,CAAC,OAAO;YAAE,OAAO,SAAS,CAAC;QAC/B,IAAI,IAAA,0BAAW,EAAC,OAAO,EAAE,WAAW,CAAC,EAAE;YACrC,MAAM,UAAU,GAAG,IAAA,wCAAW,EAAC,OAAO,CAAC,CAAC;YAExC,MAAM,kBAAkB,GAAG,UAAU,CAAC,MAAM,CAC1C,CAAC,CAAC,EAAE,EAAE,CAAC,IAAA,6EAAgB,EAAC,CAAC,CAAC,IAAI,IAAA,mCAAoB,EAAC,EAAE,IAAI,EAAE,CAAC,CAAC,+EAAkB,CAAC,EAAE,EAAE,aAAa,CAAC,CACrE,CAAC;YAEhC,IAAI,kBAAkB,CAAC,MAAM,GAAG,CAAC;gBAAE,OAAO,SAAS,CAAC;YACpD,OAAO;gBACL,OAAO,EAAE,OAAO;gBAChB,UAAU,EAAE,kBAAkB;aAC/B,CAAC;SACH;KACF;IAED,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const react_1 = __importDefault(require("react"));
|
|
7
|
+
const react_2 = require("@testing-library/react");
|
|
8
|
+
const mock_component_1 = require("../mock-component");
|
|
9
|
+
const bubble_to_component_1 = require("./bubble-to-component");
|
|
10
|
+
it('should find component when starting from a div', () => {
|
|
11
|
+
const { getByText, getByTestId } = (0, react_2.render)(react_1.default.createElement(mock_component_1.MockTarget, { "data-testid": "expected-result" },
|
|
12
|
+
react_1.default.createElement("div", null, "hello world")));
|
|
13
|
+
const rendered = getByText('hello world');
|
|
14
|
+
const result = (0, bubble_to_component_1.bubbleToComponent)(rendered);
|
|
15
|
+
expect(result === null || result === void 0 ? void 0 : result.element).toBe(getByTestId('expected-result'));
|
|
16
|
+
expect(result === null || result === void 0 ? void 0 : result.components).toEqual([mock_component_1.MockTarget]);
|
|
17
|
+
});
|
|
18
|
+
it('should bubble to root component when it renders itself recursively', () => {
|
|
19
|
+
const { getByText, getByTestId } = (0, react_2.render)(react_1.default.createElement(mock_component_1.MockTarget, { "data-testid": "expected-result" },
|
|
20
|
+
react_1.default.createElement(mock_component_1.MockTarget, null,
|
|
21
|
+
react_1.default.createElement(mock_component_1.MockTarget, null,
|
|
22
|
+
react_1.default.createElement("div", null, "hello world")))));
|
|
23
|
+
const rendered = getByText('hello world');
|
|
24
|
+
const result = (0, bubble_to_component_1.bubbleToComponent)(rendered);
|
|
25
|
+
expect(result === null || result === void 0 ? void 0 : result.element).toBe(getByTestId('expected-result'));
|
|
26
|
+
expect(result === null || result === void 0 ? void 0 : result.components).toEqual([mock_component_1.MockTarget]);
|
|
27
|
+
});
|
|
28
|
+
it('should find first component, when parent propagation is disabled', () => {
|
|
29
|
+
const { getByText, getByTestId } = (0, react_2.render)(react_1.default.createElement(mock_component_1.MockTarget, null,
|
|
30
|
+
react_1.default.createElement(mock_component_1.MockTarget, null,
|
|
31
|
+
react_1.default.createElement(mock_component_1.MockTarget, { "data-testid": "expected-result" },
|
|
32
|
+
react_1.default.createElement("div", null, "hello world")))));
|
|
33
|
+
const rendered = getByText('hello world');
|
|
34
|
+
const result = (0, bubble_to_component_1.bubbleToComponent)(rendered, { propagateSameParents: false });
|
|
35
|
+
expect(result === null || result === void 0 ? void 0 : result.element).toBe(getByTestId('expected-result'));
|
|
36
|
+
expect(result === null || result === void 0 ? void 0 : result.components).toEqual([mock_component_1.MockTarget]);
|
|
37
|
+
});
|
|
38
|
+
//# sourceMappingURL=bubble-to-component.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bubble-to-component.spec.js","sourceRoot":"","sources":["../../hover-highlighter/bubble-to-component.spec.tsx"],"names":[],"mappings":";;;;;AAAA,kDAA0B;AAC1B,kDAAgD;AAChD,sDAA+C;AAC/C,+DAA0D;AAE1D,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;IACxD,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,IAAA,cAAM,EACvC,8BAAC,2BAAU,mBAAa,iBAAiB;QACvC,yDAAsB,CACX,CACd,CAAC;IAEF,MAAM,QAAQ,GAAG,SAAS,CAAC,aAAa,CAAC,CAAC;IAE1C,MAAM,MAAM,GAAG,IAAA,uCAAiB,EAAC,QAAQ,CAAC,CAAC;IAE3C,MAAM,CAAC,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,OAAO,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAC7D,MAAM,CAAC,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,2BAAU,CAAC,CAAC,CAAC;AACnD,CAAC,CAAC,CAAC;AAEH,EAAE,CAAC,oEAAoE,EAAE,GAAG,EAAE;IAC5E,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,IAAA,cAAM,EACvC,8BAAC,2BAAU,mBAAa,iBAAiB;QACvC,8BAAC,2BAAU;YACT,8BAAC,2BAAU;gBACT,yDAAsB,CACX,CACF,CACF,CACd,CAAC;IAEF,MAAM,QAAQ,GAAG,SAAS,CAAC,aAAa,CAAC,CAAC;IAE1C,MAAM,MAAM,GAAG,IAAA,uCAAiB,EAAC,QAAQ,CAAC,CAAC;IAE3C,MAAM,CAAC,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,OAAO,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAC7D,MAAM,CAAC,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,2BAAU,CAAC,CAAC,CAAC;AACnD,CAAC,CAAC,CAAC;AAEH,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;IAC1E,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,IAAA,cAAM,EACvC,8BAAC,2BAAU;QACT,8BAAC,2BAAU;YACT,8BAAC,2BAAU,mBAAa,iBAAiB;gBACvC,yDAAsB,CACX,CACF,CACF,CACd,CAAC;IAEF,MAAM,QAAQ,GAAG,SAAS,CAAC,aAAa,CAAC,CAAC;IAE1C,MAAM,MAAM,GAAG,IAAA,uCAAiB,EAAC,QAAQ,EAAE,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAAC,CAAC;IAE5E,MAAM,CAAC,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,OAAO,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAC7D,MAAM,CAAC,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,2BAAU,CAAC,CAAC,CAAC;AACnD,CAAC,CAAC,CAAC"}
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import {
|
|
2
|
+
import { ComponentMetaHolder } from '@teambit/react.ui.highlighter.component-metadata.bit-component-meta';
|
|
3
3
|
import { MatchRule, ComponentMatchRule } from '../rule-matcher';
|
|
4
|
+
declare type HighlightTarget = {
|
|
5
|
+
element: HTMLElement;
|
|
6
|
+
components: ComponentMetaHolder[];
|
|
7
|
+
};
|
|
4
8
|
export declare type useHoverHighlighterOptions = {
|
|
5
9
|
debounceDuration: number;
|
|
6
10
|
scopeClass: string;
|
|
@@ -18,3 +22,4 @@ export declare function useHoverHighlighter<T extends HTMLElement = HTMLElement>
|
|
|
18
22
|
onMouseOver?: undefined;
|
|
19
23
|
onMouseLeave?: undefined;
|
|
20
24
|
};
|
|
25
|
+
export {};
|