@teambit/react.ui.component-highlighter 0.0.0-3456ec42c20f5ecbc6cb251096040bd1c79ecc95
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/children-highlighter.composition.tsx +103 -0
- package/children-highlighter/children-highlighter.spec.tsx +22 -0
- package/children-highlighter/children-highlighter.tsx +9 -0
- package/children-highlighter/index.ts +5 -0
- package/children-highlighter/use-children-highlighter.tsx +79 -0
- package/component-highlighter.docs.md +191 -0
- package/dist/children-highlighter/children-highlighter.composition.d.ts +6 -0
- package/dist/children-highlighter/children-highlighter.composition.js +93 -0
- package/dist/children-highlighter/children-highlighter.composition.js.map +1 -0
- package/dist/children-highlighter/children-highlighter.d.ts +4 -0
- package/dist/children-highlighter/children-highlighter.js +24 -0
- package/dist/children-highlighter/children-highlighter.js.map +1 -0
- package/dist/children-highlighter/children-highlighter.spec.d.ts +1 -0
- package/dist/children-highlighter/children-highlighter.spec.js +22 -0
- package/dist/children-highlighter/children-highlighter.spec.js.map +1 -0
- package/dist/children-highlighter/index.d.ts +4 -0
- package/dist/children-highlighter/index.js +8 -0
- package/dist/children-highlighter/index.js.map +1 -0
- package/dist/children-highlighter/use-children-highlighter.d.ts +18 -0
- package/dist/children-highlighter/use-children-highlighter.js +51 -0
- package/dist/children-highlighter/use-children-highlighter.js.map +1 -0
- package/dist/component-highlighter.docs.md +191 -0
- package/dist/element-highlighter/element-highlighter.compositions.d.ts +14 -0
- package/dist/element-highlighter/element-highlighter.compositions.js +103 -0
- package/dist/element-highlighter/element-highlighter.compositions.js.map +1 -0
- package/dist/element-highlighter/element-highlighter.d.ts +22 -0
- package/dist/element-highlighter/element-highlighter.js +31 -0
- package/dist/element-highlighter/element-highlighter.js.map +1 -0
- package/dist/element-highlighter/element-highlighter.module.scss +10 -0
- package/dist/element-highlighter/index.d.ts +2 -0
- package/dist/element-highlighter/index.js +6 -0
- package/dist/element-highlighter/index.js.map +1 -0
- package/dist/frame/frame.d.ts +14 -0
- package/dist/frame/frame.js +128 -0
- package/dist/frame/frame.js.map +1 -0
- package/dist/frame/frame.module.scss +23 -0
- package/dist/frame/index.d.ts +2 -0
- package/dist/frame/index.js +6 -0
- package/dist/frame/index.js.map +1 -0
- package/dist/hover-highlighter/bubble-to-component.d.ts +24 -0
- package/dist/hover-highlighter/bubble-to-component.js +55 -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/hover-highlighter.compositions.d.ts +4 -0
- package/dist/hover-highlighter/hover-highlighter.compositions.js +73 -0
- package/dist/hover-highlighter/hover-highlighter.compositions.js.map +1 -0
- package/dist/hover-highlighter/hover-highlighter.d.ts +4 -0
- package/dist/hover-highlighter/hover-highlighter.js +24 -0
- package/dist/hover-highlighter/hover-highlighter.js.map +1 -0
- package/dist/hover-highlighter/hover-highlighter.spec.d.ts +1 -0
- package/dist/hover-highlighter/hover-highlighter.spec.js +95 -0
- package/dist/hover-highlighter/hover-highlighter.spec.js.map +1 -0
- package/dist/hover-highlighter/index.d.ts +4 -0
- package/dist/hover-highlighter/index.js +8 -0
- package/dist/hover-highlighter/index.js.map +1 -0
- package/dist/hover-highlighter/use-hover-highlighter.d.ts +25 -0
- package/dist/hover-highlighter/use-hover-highlighter.js +47 -0
- package/dist/hover-highlighter/use-hover-highlighter.js.map +1 -0
- package/dist/hybrid-highlighter/hybrid-highlighter.d.ts +36 -0
- package/dist/hybrid-highlighter/hybrid-highlighter.js +83 -0
- package/dist/hybrid-highlighter/hybrid-highlighter.js.map +1 -0
- package/dist/hybrid-highlighter/index.d.ts +2 -0
- package/dist/hybrid-highlighter/index.js +6 -0
- package/dist/hybrid-highlighter/index.js.map +1 -0
- package/dist/ignore-highlighter.d.ts +19 -0
- package/dist/ignore-highlighter.js +25 -0
- package/dist/ignore-highlighter.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/label/component-strip.compositions.d.ts +2 -0
- package/dist/label/component-strip.compositions.js +17 -0
- package/dist/label/component-strip.compositions.js.map +1 -0
- package/dist/label/component-strip.d.ts +7 -0
- package/dist/label/component-strip.js +61 -0
- package/dist/label/component-strip.js.map +1 -0
- package/dist/label/component-strip.module.scss +68 -0
- package/dist/label/index.d.ts +4 -0
- package/dist/label/index.js +8 -0
- package/dist/label/index.js.map +1 -0
- package/dist/label/label-container.d.ts +13 -0
- package/dist/label/label-container.js +77 -0
- package/dist/label/label-container.js.map +1 -0
- package/dist/label/label.d.ts +6 -0
- package/dist/label/label.js +60 -0
- package/dist/label/label.js.map +1 -0
- package/dist/label/label.module.scss +32 -0
- package/dist/label/links.d.ts +2 -0
- package/dist/label/links.js +16 -0
- package/dist/label/links.js.map +1 -0
- package/dist/label/other-components.d.ts +9 -0
- package/dist/label/other-components.js +34 -0
- package/dist/label/other-components.js.map +1 -0
- package/dist/mock-component.d.ts +14 -0
- package/dist/mock-component.js +43 -0
- package/dist/mock-component.js.map +1 -0
- package/dist/preview-1766004072990.js +10 -0
- package/dist/rule-matcher.d.ts +8 -0
- package/dist/rule-matcher.js +32 -0
- package/dist/rule-matcher.js.map +1 -0
- package/element-highlighter/element-highlighter.compositions.tsx +130 -0
- package/element-highlighter/element-highlighter.module.scss +10 -0
- package/element-highlighter/element-highlighter.tsx +51 -0
- package/element-highlighter/index.ts +2 -0
- package/frame/frame.module.scss +23 -0
- package/frame/frame.tsx +142 -0
- package/frame/index.ts +2 -0
- package/hover-highlighter/bubble-to-component.spec.tsx +57 -0
- package/hover-highlighter/bubble-to-component.tsx +82 -0
- package/hover-highlighter/hover-highlighter.compositions.tsx +65 -0
- package/hover-highlighter/hover-highlighter.spec.tsx +115 -0
- package/hover-highlighter/hover-highlighter.tsx +8 -0
- package/hover-highlighter/index.ts +5 -0
- package/hover-highlighter/use-hover-highlighter.tsx +85 -0
- package/hybrid-highlighter/hybrid-highlighter.tsx +142 -0
- package/hybrid-highlighter/index.ts +2 -0
- package/ignore-highlighter.tsx +22 -0
- package/index.ts +21 -0
- package/label/component-strip.compositions.tsx +13 -0
- package/label/component-strip.module.scss +68 -0
- package/label/component-strip.tsx +57 -0
- package/label/index.ts +5 -0
- package/label/label-container.tsx +74 -0
- package/label/label.module.scss +32 -0
- package/label/label.tsx +37 -0
- package/label/links.tsx +9 -0
- package/label/other-components.tsx +51 -0
- package/mock-component.tsx +23 -0
- package/package.json +60 -0
- package/rule-matcher.tsx +42 -0
- package/types/asset.d.ts +29 -0
- package/types/style.d.ts +42 -0
|
@@ -0,0 +1,51 @@
|
|
|
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
|
+
exports.useChildrenHighlighter = useChildrenHighlighter;
|
|
7
|
+
const react_1 = require("react");
|
|
8
|
+
const get_xpath_1 = __importDefault(require("get-xpath"));
|
|
9
|
+
const react_modules_dom_to_react_1 = require("@teambit/react.modules.dom-to-react");
|
|
10
|
+
const react_ui_highlighter_component_metadata_bit_component_meta_1 = require("@teambit/react.ui.highlighter.component-metadata.bit-component-meta");
|
|
11
|
+
const ignore_highlighter_1 = require("../ignore-highlighter");
|
|
12
|
+
const rule_matcher_1 = require("../rule-matcher");
|
|
13
|
+
function useChildrenHighlighter({ onChange, disabled, scopeRef, scopeClass: scopeSelector = '', rule, componentRule, }) {
|
|
14
|
+
(0, react_1.useEffect)(() => {
|
|
15
|
+
const nextTargets = {};
|
|
16
|
+
const scopeElement = scopeRef.current;
|
|
17
|
+
if (!scopeElement || !scopeSelector || disabled)
|
|
18
|
+
return;
|
|
19
|
+
// select all elements (except excluded)
|
|
20
|
+
let allElements = Array.from(scopeElement.querySelectorAll(targetsSelector(`.${scopeSelector}`)));
|
|
21
|
+
// apply rule filtering
|
|
22
|
+
if (rule)
|
|
23
|
+
allElements = allElements.filter((elem) => (0, rule_matcher_1.ruleMatcher)(elem, rule));
|
|
24
|
+
// seek the root element:
|
|
25
|
+
const rootElements = allElements.map(react_modules_dom_to_react_1.toRootElement).filter((x) => !!x);
|
|
26
|
+
// deduplicate
|
|
27
|
+
const uniqueRoots = new Set(rootElements);
|
|
28
|
+
uniqueRoots.forEach((element) => {
|
|
29
|
+
if (!element)
|
|
30
|
+
return;
|
|
31
|
+
const comps = (0, react_modules_dom_to_react_1.domToReacts)(element);
|
|
32
|
+
const componentsWithMeta = comps.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 (componentsWithMeta.length < 1)
|
|
34
|
+
return;
|
|
35
|
+
const key = (0, get_xpath_1.default)(element);
|
|
36
|
+
nextTargets[key] = { element, components: componentsWithMeta };
|
|
37
|
+
});
|
|
38
|
+
onChange(nextTargets);
|
|
39
|
+
}, [disabled, scopeSelector]);
|
|
40
|
+
}
|
|
41
|
+
function targetsSelector(
|
|
42
|
+
/**
|
|
43
|
+
* the scope in which to consider the exclude selector.
|
|
44
|
+
* The `:scope` modifier is appropriate, but is not supported in older browsers.
|
|
45
|
+
*/
|
|
46
|
+
scopeSelector = ':scope') {
|
|
47
|
+
const excludedSelector = `${scopeSelector} ${ignore_highlighter_1.excludeHighlighterSelector}, ${scopeSelector} ${ignore_highlighter_1.excludeHighlighterSelector} *`;
|
|
48
|
+
const skippedSelector = `${scopeSelector} ${ignore_highlighter_1.skipHighlighterSelector}, ${scopeSelector} ${ignore_highlighter_1.skipHighlighterSelector} *`;
|
|
49
|
+
return `:not(${excludedSelector}, ${skippedSelector})`;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=use-children-highlighter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-children-highlighter.js","sourceRoot":"","sources":["../../children-highlighter/use-children-highlighter.tsx"],"names":[],"mappings":";;;;;AA2BA,wDAsCC;AAjED,iCAAiE;AACjE,0DAAiC;AACjC,oFAAiF;AACjF,oJAK6E;AAC7E,8DAA4F;AAC5F,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,CAAC,aAAa,IAAI,QAAQ;YAAE,OAAO;QAExD,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;AAED,SAAS,eAAe;AACtB;;;GAGG;AACH,aAAa,GAAG,QAAQ;IAExB,MAAM,gBAAgB,GAAG,GAAG,aAAa,IAAI,+CAA0B,KAAK,aAAa,IAAI,+CAA0B,IAAI,CAAC;IAC5H,MAAM,eAAe,GAAG,GAAG,aAAa,IAAI,4CAAuB,KAAK,aAAa,IAAI,4CAAuB,IAAI,CAAC;IAErH,OAAO,QAAQ,gBAAgB,KAAK,eAAe,GAAG,CAAC;AACzD,CAAC"}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Highlights Bit Components and links to their Bit scope
|
|
3
|
+
labels: ['component', 'highlight', 'react']
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
import { HighlightedElement } from './element-highlighter/element-highlighter.compositions';
|
|
7
|
+
|
|
8
|
+
The component highlighter allows you to visually inspect bit react components, and provides a link to its documentation page.
|
|
9
|
+
It is mostly used for compositions debugging.
|
|
10
|
+
|
|
11
|
+
<HighlightedElement />
|
|
12
|
+
|
|
13
|
+
## How to use?
|
|
14
|
+
|
|
15
|
+
Simplest way to use the component is by wrapping your code with `ComponentHighlighter`.
|
|
16
|
+
It will automatically detect components from DOM elements, just by hovering on them.
|
|
17
|
+
|
|
18
|
+
```tsx
|
|
19
|
+
import { ComponentHighlighter } from '@teambit/react.ui.component-highlighter';
|
|
20
|
+
|
|
21
|
+
function App() {
|
|
22
|
+
return (
|
|
23
|
+
<ComponentHighlighter>
|
|
24
|
+
<Header />
|
|
25
|
+
<Feed />
|
|
26
|
+
</ComponentHighlighter>
|
|
27
|
+
);
|
|
28
|
+
}
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
You can also use it manually, to have more control:
|
|
32
|
+
|
|
33
|
+
```tsx
|
|
34
|
+
import { ElementHighlighter } from '@teambit/react.ui.component-highlighter';
|
|
35
|
+
|
|
36
|
+
function ManualHighlight() {
|
|
37
|
+
const targetRef = createRef<HTMLElement | undefined>(null);
|
|
38
|
+
|
|
39
|
+
return (
|
|
40
|
+
<div>
|
|
41
|
+
<div ref={targetRef}>highlight target</div>
|
|
42
|
+
<ElementHighlighter targetRef={targetRef} components={['teambit.design/ui/icon-button']} />
|
|
43
|
+
</div>
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## How does it work?
|
|
49
|
+
|
|
50
|
+
The manual highlighter works by positioning elements (a frame and a label) to a target element. It uses [PopperJS](https://popper.js.org/) to correctly align them to the element.
|
|
51
|
+
|
|
52
|
+
The automatic highlighter then adds an event listener for hover events, which automatically tracks mouse movements and finds the most relevant React component using [DOM-to-react](https://bit.dev/teambit/react/modules/dom-to-react). It bubbles up the DOM until it finds a component with bit metadata.
|
|
53
|
+
|
|
54
|
+
Where does the metadata come from? The highlighter assumes the code has been transpiled by Bit's [custom babel plugin](https://bit.dev/teambit/react/babel/bit-react-transformer). The plugin looks for React components (i.e. functions or classes), and attaches a metadata object to them.
|
|
55
|
+
|
|
56
|
+
> The `Bit React Transformer` babel plugin is already running in the Preview, during `bit start`.
|
|
57
|
+
> It only effects the browser bundle, and not the dists.
|
|
58
|
+
|
|
59
|
+
The result looks like this:
|
|
60
|
+
|
|
61
|
+
```tsx
|
|
62
|
+
var __bit_component = {
|
|
63
|
+
id: 'teambit.base-ui/button@1.0.0',
|
|
64
|
+
homepage: 'https://bit.dev/teambit/base-ui/input/button',
|
|
65
|
+
exported: true,
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
export function Button() {
|
|
69
|
+
return <div>click me!</div>;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// attaches metadata:
|
|
73
|
+
Button.__bit_component = __bit_component;
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### Modes
|
|
77
|
+
|
|
78
|
+
The Component Highlighter comes in a few different modes:
|
|
79
|
+
|
|
80
|
+
- `hover` - this will track your mouse movements, and show the highlighter for the element the user is currently hovering on.
|
|
81
|
+
- `allChildren` - this automatically detects all components nested inside the highlighter, and apply a highlighter to them. Currently, this detection only happens once on initial setup, so it does not detect changes.
|
|
82
|
+
|
|
83
|
+
In addition to changing the `mode` prop, you can also use convenience exports from the same package:
|
|
84
|
+
|
|
85
|
+
```tsx
|
|
86
|
+
import { ChildrenHighlighter, HoverHighlighter } from '@teambit/react.ui.component-highlighter';
|
|
87
|
+
|
|
88
|
+
function example() {
|
|
89
|
+
return (
|
|
90
|
+
<div>
|
|
91
|
+
<HoverHighlighter>
|
|
92
|
+
<App />
|
|
93
|
+
</HoverHighlighter>
|
|
94
|
+
|
|
95
|
+
<ChildrenHighlighter>
|
|
96
|
+
<App />
|
|
97
|
+
</ChildrenHighlighter>
|
|
98
|
+
</div>
|
|
99
|
+
);
|
|
100
|
+
}
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### Debounce
|
|
104
|
+
|
|
105
|
+
Normally, moving quickly between elements could produce a jitter effect, where the highlighter "jumps" between elements, making interaction difficult.
|
|
106
|
+
A debounce mitigates this by batching re-targets and smooths out the experience.
|
|
107
|
+
First time selection will always happen immediately, for a snappy experience.
|
|
108
|
+
|
|
109
|
+
You can control the debounce rate with the `debounceSelection` prop. (default - `80ms`)
|
|
110
|
+
|
|
111
|
+
## Exclusions Zones
|
|
112
|
+
|
|
113
|
+
To disabled highlighting in a specific area of the DOM, you can use the `<ExcludeHighlighter />` component:
|
|
114
|
+
|
|
115
|
+
```tsx
|
|
116
|
+
import { ExcludeHighlighter, excludeHighlighterAtt } from '@teambit/react.ui.component-highlighter';
|
|
117
|
+
|
|
118
|
+
// ...
|
|
119
|
+
|
|
120
|
+
return (
|
|
121
|
+
<div>
|
|
122
|
+
<ExcludeHighlighter>
|
|
123
|
+
<Card>this component will not be highlighted</Card>
|
|
124
|
+
</ExcludeHighlighter>
|
|
125
|
+
|
|
126
|
+
{/* you can also add the exclude attribute without making a new div */}
|
|
127
|
+
<Card {...excludeHighlighterAtt}>this component will also be skipped</Card>
|
|
128
|
+
</div>
|
|
129
|
+
);
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
Another options would be use use the `rule` prop.
|
|
133
|
+
Inspired by Webpack rules, it provides a query selector or function that the highlighter target will have to match.
|
|
134
|
+
For example:
|
|
135
|
+
|
|
136
|
+
```tsx
|
|
137
|
+
<ComponentHighlighter rule="#include *">
|
|
138
|
+
<Button>will not be highlighted</Button>
|
|
139
|
+
<div id="include">
|
|
140
|
+
<Button>this will be highlighted</Button>
|
|
141
|
+
</div>
|
|
142
|
+
</ComponentHighlighter>
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
You can also filter by component id, using the `componentRule` prop:
|
|
146
|
+
|
|
147
|
+
```tsx
|
|
148
|
+
<ComponentHighlighter componentRule="teambit.design/ui/icon-button">
|
|
149
|
+
<Paragraph>will not be highlighted</Paragraph>
|
|
150
|
+
<Button>this will be highlighted</Button>
|
|
151
|
+
</ComponentHighlighter>
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
## Customization
|
|
155
|
+
|
|
156
|
+
Use these CSS variables to edit the highlighter color
|
|
157
|
+
|
|
158
|
+
```css
|
|
159
|
+
--bit-highlighter-color: #eebcc9;
|
|
160
|
+
--bit-highlighter-color-hover: #f6dae2;
|
|
161
|
+
--bit-highlighter-color-active: #e79db1;
|
|
162
|
+
--bit-highlighter-shadow: 0px 11px 29px 0px rgba(0, 0, 0, 0.23));
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
While it is preferred to use the css variables, you can also set them using react props:
|
|
166
|
+
|
|
167
|
+
```tsx
|
|
168
|
+
<ComponentHighlighter bgColor="#eebcc9" bgColorHover="#f6dae2" bgColorActive="#e79db1">
|
|
169
|
+
...
|
|
170
|
+
</ComponentHighlighter>
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
And for complete control, you can pass these classes:
|
|
174
|
+
|
|
175
|
+
```tsx
|
|
176
|
+
const classes = {
|
|
177
|
+
/** containing div */
|
|
178
|
+
container?: string;
|
|
179
|
+
/** border */
|
|
180
|
+
frame?: string;
|
|
181
|
+
/** component id links */
|
|
182
|
+
label?: string;
|
|
183
|
+
};
|
|
184
|
+
|
|
185
|
+
<ComponentHighlighter classes={classes}>
|
|
186
|
+
...
|
|
187
|
+
</ComponentHighlighter>
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
You can control the size using regular `font-size`.
|
|
191
|
+
Keep in mind that the label can be either two elements (when using component id), and a single element (for other texts)
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import React, { CSSProperties } from 'react';
|
|
2
|
+
type HighlightedElementProps = {
|
|
3
|
+
style?: CSSProperties;
|
|
4
|
+
targetStyle?: CSSProperties;
|
|
5
|
+
className?: string;
|
|
6
|
+
watchMotion?: boolean;
|
|
7
|
+
};
|
|
8
|
+
export declare const HighlightedElement: ({ style, targetStyle, watchMotion, className }: HighlightedElementProps) => React.JSX.Element;
|
|
9
|
+
export declare const Customized: () => React.JSX.Element;
|
|
10
|
+
export declare const Sizes: () => React.JSX.Element;
|
|
11
|
+
export declare const MovingElement: () => React.JSX.Element;
|
|
12
|
+
export declare const FullscreenElement: () => React.JSX.Element;
|
|
13
|
+
export declare function OffscreenElements(): React.JSX.Element;
|
|
14
|
+
export {};
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.FullscreenElement = exports.MovingElement = exports.Sizes = exports.Customized = exports.HighlightedElement = void 0;
|
|
27
|
+
exports.OffscreenElements = OffscreenElements;
|
|
28
|
+
const react_1 = __importStar(require("react"));
|
|
29
|
+
const element_highlighter_1 = require("./element-highlighter");
|
|
30
|
+
const mock_component_1 = require("../mock-component");
|
|
31
|
+
const HighlightedElement = ({ style, targetStyle, watchMotion, className }) => {
|
|
32
|
+
const targetRef = (0, react_1.createRef)();
|
|
33
|
+
return (react_1.default.createElement("div", { className: className, style: { padding: '16px 16px 40px 16px', width: 300, fontFamily: 'sans-serif' } },
|
|
34
|
+
react_1.default.createElement("div", { ref: targetRef, style: Object.assign({ width: 100 }, targetStyle) }, "highlight target"),
|
|
35
|
+
react_1.default.createElement(element_highlighter_1.ElementHighlighter, { targetRef: targetRef, components: [mock_component_1.MockTarget], style: style, watchMotion: watchMotion, placement: "bottom" })));
|
|
36
|
+
};
|
|
37
|
+
exports.HighlightedElement = HighlightedElement;
|
|
38
|
+
const Customized = () => {
|
|
39
|
+
return (react_1.default.createElement(exports.HighlightedElement, { style: {
|
|
40
|
+
'--bit-highlighter-color': '#94deb4',
|
|
41
|
+
'--bit-highlighter-color-hover': '#d0f1de',
|
|
42
|
+
'--bit-highlighter-color-active': '#37b26c',
|
|
43
|
+
} }));
|
|
44
|
+
};
|
|
45
|
+
exports.Customized = Customized;
|
|
46
|
+
const Sizes = () => {
|
|
47
|
+
return (react_1.default.createElement("div", null,
|
|
48
|
+
react_1.default.createElement(exports.HighlightedElement, { style: { fontSize: 10 } }),
|
|
49
|
+
react_1.default.createElement(exports.HighlightedElement, { style: { fontSize: 14 } }),
|
|
50
|
+
react_1.default.createElement(exports.HighlightedElement, { style: { fontSize: 18 } })));
|
|
51
|
+
};
|
|
52
|
+
exports.Sizes = Sizes;
|
|
53
|
+
const fps = 30;
|
|
54
|
+
const frameInterval = 1000 / fps;
|
|
55
|
+
const MovingElement = () => {
|
|
56
|
+
const [margin, setMargin] = (0, react_1.useState)(0);
|
|
57
|
+
(0, react_1.useEffect)(() => {
|
|
58
|
+
const intervalId = setInterval(() => setMargin((x) => (x + 1) % 100), frameInterval);
|
|
59
|
+
return () => clearInterval(intervalId);
|
|
60
|
+
}, []);
|
|
61
|
+
return react_1.default.createElement(exports.HighlightedElement, { targetStyle: { marginLeft: margin }, watchMotion: true });
|
|
62
|
+
};
|
|
63
|
+
exports.MovingElement = MovingElement;
|
|
64
|
+
const FullscreenElement = () => {
|
|
65
|
+
const targetRef = (0, react_1.createRef)();
|
|
66
|
+
return (react_1.default.createElement("div", { style: { fontFamily: 'sans-serif' } },
|
|
67
|
+
react_1.default.createElement("div", { ref: targetRef, style: {
|
|
68
|
+
height: '100vh',
|
|
69
|
+
width: '100%',
|
|
70
|
+
background: '#bceed4',
|
|
71
|
+
} },
|
|
72
|
+
"This element will cover the entire document,",
|
|
73
|
+
react_1.default.createElement("br", null),
|
|
74
|
+
"pushing the highlighter to the edge of the window.",
|
|
75
|
+
react_1.default.createElement("br", null),
|
|
76
|
+
"The highlighter should remain inside and expand no further than the document."),
|
|
77
|
+
react_1.default.createElement(element_highlighter_1.ElementHighlighter, { targetRef: targetRef, components: [mock_component_1.MockTarget], watchMotion: true })));
|
|
78
|
+
};
|
|
79
|
+
exports.FullscreenElement = FullscreenElement;
|
|
80
|
+
const edgeStyles = { position: 'absolute', background: 'cyan', padding: 30 };
|
|
81
|
+
const centerStyles = {
|
|
82
|
+
top: { top: -30, left: '50%', transform: 'translate(-50%,0)' },
|
|
83
|
+
right: { right: -30, top: '50%', transform: 'translate(0, -50%)' },
|
|
84
|
+
bottom: { bottom: -30, left: '50%', transform: 'translate(-50%,0)' },
|
|
85
|
+
left: { left: -30, top: '50%', transform: 'translate(0, -50%)' },
|
|
86
|
+
};
|
|
87
|
+
function OffscreenElements() {
|
|
88
|
+
const target01 = (0, react_1.createRef)();
|
|
89
|
+
const target02 = (0, react_1.createRef)();
|
|
90
|
+
const target03 = (0, react_1.createRef)();
|
|
91
|
+
const target04 = (0, react_1.createRef)();
|
|
92
|
+
return (react_1.default.createElement("div", { style: { fontFamily: 'sans-serif', height: '100%' } },
|
|
93
|
+
react_1.default.createElement("div", { style: { position: 'relative', width: '100%', height: '100%', overflow: 'hidden' } },
|
|
94
|
+
react_1.default.createElement("div", { ref: target01, style: Object.assign(Object.assign({}, edgeStyles), centerStyles.top) }, "top"),
|
|
95
|
+
react_1.default.createElement("div", { ref: target02, style: Object.assign(Object.assign({}, edgeStyles), centerStyles.right) }, "right"),
|
|
96
|
+
react_1.default.createElement("div", { ref: target03, style: Object.assign(Object.assign({}, edgeStyles), centerStyles.bottom) }, "bottom"),
|
|
97
|
+
react_1.default.createElement("div", { ref: target04, style: Object.assign(Object.assign({}, edgeStyles), centerStyles.left) }, "left"),
|
|
98
|
+
react_1.default.createElement(element_highlighter_1.ElementHighlighter, { targetRef: target01, components: [mock_component_1.MockTarget], watchMotion: true }),
|
|
99
|
+
react_1.default.createElement(element_highlighter_1.ElementHighlighter, { targetRef: target02, components: [mock_component_1.MockTarget], watchMotion: true }),
|
|
100
|
+
react_1.default.createElement(element_highlighter_1.ElementHighlighter, { targetRef: target03, components: [mock_component_1.MockTarget], watchMotion: true }),
|
|
101
|
+
react_1.default.createElement(element_highlighter_1.ElementHighlighter, { targetRef: target04, components: [mock_component_1.MockTarget], watchMotion: true }))));
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=element-highlighter.compositions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"element-highlighter.compositions.js","sourceRoot":"","sources":["../../element-highlighter/element-highlighter.compositions.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAqGA,8CA4BC;AAjID,+CAA6E;AAC7E,+DAA2D;AAC3D,sDAA+C;AASxC,MAAM,kBAAkB,GAAG,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,EAA2B,EAAE,EAAE;IAC5G,MAAM,SAAS,GAAG,IAAA,iBAAS,GAAkB,CAAC;IAE9C,OAAO,CACL,uCAAK,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,qBAAqB,EAAE,KAAK,EAAE,GAAG,EAAE,UAAU,EAAE,YAAY,EAAE;QACxG,uCAAK,GAAG,EAAE,SAAS,EAAE,KAAK,kBAAI,KAAK,EAAE,GAAG,IAAK,WAAW,wBAElD;QAEN,8BAAC,wCAAkB,IACjB,SAAS,EAAE,SAAS,EACpB,UAAU,EAAE,CAAC,2BAAU,CAAC,EACxB,KAAK,EAAE,KAAK,EACZ,WAAW,EAAE,WAAW,EACxB,SAAS,EAAC,QAAQ,GAClB,CACE,CACP,CAAC;AACJ,CAAC,CAAC;AAlBW,QAAA,kBAAkB,sBAkB7B;AAEK,MAAM,UAAU,GAAG,GAAG,EAAE;IAC7B,OAAO,CACL,8BAAC,0BAAkB,IACjB,KAAK,EACH;YACE,yBAAyB,EAAE,SAAS;YACpC,+BAA+B,EAAE,SAAS;YAC1C,gCAAgC,EAAE,SAAS;SAC3B,GAEpB,CACH,CAAC;AACJ,CAAC,CAAC;AAZW,QAAA,UAAU,cAYrB;AAEK,MAAM,KAAK,GAAG,GAAG,EAAE;IACxB,OAAO,CACL;QACE,8BAAC,0BAAkB,IAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,GAAI;QAC/C,8BAAC,0BAAkB,IAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,GAAI;QAC/C,8BAAC,0BAAkB,IAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,GAAI,CAC3C,CACP,CAAC;AACJ,CAAC,CAAC;AARW,QAAA,KAAK,SAQhB;AAEF,MAAM,GAAG,GAAG,EAAE,CAAC;AACf,MAAM,aAAa,GAAG,IAAI,GAAG,GAAG,CAAC;AAE1B,MAAM,aAAa,GAAG,GAAG,EAAE;IAChC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,IAAA,gBAAQ,EAAC,CAAC,CAAC,CAAC;IAExC,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,EAAE,aAAa,CAAC,CAAC;QACrF,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;IACzC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,8BAAC,0BAAkB,IAAC,WAAW,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,WAAW,SAAG,CAAC;AACjF,CAAC,CAAC;AATW,QAAA,aAAa,iBASxB;AAEK,MAAM,iBAAiB,GAAG,GAAG,EAAE;IACpC,MAAM,SAAS,GAAG,IAAA,iBAAS,GAAkB,CAAC;IAE9C,OAAO,CACL,uCAAK,KAAK,EAAE,EAAE,UAAU,EAAE,YAAY,EAAE;QACtC,uCACE,GAAG,EAAE,SAAS,EACd,KAAK,EAAE;gBACL,MAAM,EAAE,OAAO;gBACf,KAAK,EAAE,MAAM;gBACb,UAAU,EAAE,SAAS;aACtB;;YAGD,yCAAM;;YAEN,yCAAM;4FAEF;QACN,8BAAC,wCAAkB,IAAC,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,2BAAU,CAAC,EAAE,WAAW,SAAG,CAC9E,CACP,CAAC;AACJ,CAAC,CAAC;AAtBW,QAAA,iBAAiB,qBAsB5B;AAEF,MAAM,UAAU,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAW,CAAC;AACtF,MAAM,YAAY,GAAG;IACnB,GAAG,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,mBAAmB,EAAE;IAC9D,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,oBAAoB,EAAE;IAClE,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,mBAAmB,EAAE;IACpE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,oBAAoB,EAAE;CACjE,CAAC;AAEF,SAAgB,iBAAiB;IAC/B,MAAM,QAAQ,GAAG,IAAA,iBAAS,GAAkB,CAAC;IAC7C,MAAM,QAAQ,GAAG,IAAA,iBAAS,GAAkB,CAAC;IAC7C,MAAM,QAAQ,GAAG,IAAA,iBAAS,GAAkB,CAAC;IAC7C,MAAM,QAAQ,GAAG,IAAA,iBAAS,GAAkB,CAAC;IAE7C,OAAO,CACL,uCAAK,KAAK,EAAE,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE;QACtD,uCAAK,KAAK,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE;YACrF,uCAAK,GAAG,EAAE,QAAQ,EAAE,KAAK,kCAAO,UAAU,GAAK,YAAY,CAAC,GAAG,WAEzD;YACN,uCAAK,GAAG,EAAE,QAAQ,EAAE,KAAK,kCAAO,UAAU,GAAK,YAAY,CAAC,KAAK,aAE3D;YACN,uCAAK,GAAG,EAAE,QAAQ,EAAE,KAAK,kCAAO,UAAU,GAAK,YAAY,CAAC,MAAM,cAE5D;YACN,uCAAK,GAAG,EAAE,QAAQ,EAAE,KAAK,kCAAO,UAAU,GAAK,YAAY,CAAC,IAAI,YAE1D;YACN,8BAAC,wCAAkB,IAAC,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,2BAAU,CAAC,EAAE,WAAW,SAAG;YACjF,8BAAC,wCAAkB,IAAC,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,2BAAU,CAAC,EAAE,WAAW,SAAG;YACjF,8BAAC,wCAAkB,IAAC,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,2BAAU,CAAC,EAAE,WAAW,SAAG;YACjF,8BAAC,wCAAkB,IAAC,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,2BAAU,CAAC,EAAE,WAAW,SAAG,CAC7E,CACF,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import React, { RefObject } from 'react';
|
|
2
|
+
import { ComponentMetaHolder } from '@teambit/react.ui.highlighter.component-metadata.bit-component-meta';
|
|
3
|
+
import { Placement } from '../label';
|
|
4
|
+
export interface ElementHighlighterProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
5
|
+
/** highlight this element */
|
|
6
|
+
targetRef: RefObject<HTMLElement | null>;
|
|
7
|
+
/** components with metadata to show in the label */
|
|
8
|
+
components?: (ComponentMetaHolder | string)[];
|
|
9
|
+
/** default location of the label */
|
|
10
|
+
placement?: Placement;
|
|
11
|
+
/** customize styles */
|
|
12
|
+
classes?: HighlightClasses;
|
|
13
|
+
/** continually update highlighter to match moving elements */
|
|
14
|
+
watchMotion?: boolean;
|
|
15
|
+
}
|
|
16
|
+
export { Placement };
|
|
17
|
+
export type HighlightClasses = {
|
|
18
|
+
container?: string;
|
|
19
|
+
frame?: string;
|
|
20
|
+
label?: string;
|
|
21
|
+
};
|
|
22
|
+
export declare function ElementHighlighter({ targetRef, components, placement, watchMotion, className, classes, ...props }: ElementHighlighterProps): React.JSX.Element;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
3
|
+
var t = {};
|
|
4
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
5
|
+
t[p] = s[p];
|
|
6
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
7
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
8
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
9
|
+
t[p[i]] = s[p[i]];
|
|
10
|
+
}
|
|
11
|
+
return t;
|
|
12
|
+
};
|
|
13
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
14
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.ElementHighlighter = ElementHighlighter;
|
|
18
|
+
const react_1 = __importDefault(require("react"));
|
|
19
|
+
const classnames_1 = __importDefault(require("classnames"));
|
|
20
|
+
const frame_1 = require("../frame");
|
|
21
|
+
const label_1 = require("../label");
|
|
22
|
+
const ignore_highlighter_1 = require("../ignore-highlighter");
|
|
23
|
+
const element_highlighter_module_scss_1 = __importDefault(require("./element-highlighter.module.scss"));
|
|
24
|
+
function ElementHighlighter(_a) {
|
|
25
|
+
var { targetRef, components, placement = 'top', watchMotion, className, classes } = _a, props = __rest(_a, ["targetRef", "components", "placement", "watchMotion", "className", "classes"]);
|
|
26
|
+
return (react_1.default.createElement("div", Object.assign({}, props, ignore_highlighter_1.skipHighlighterAttr, { 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: 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
|
+
}
|
|
31
|
+
//# sourceMappingURL=element-highlighter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"element-highlighter.js","sourceRoot":"","sources":["../../element-highlighter/element-highlighter.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;AA8BA,gDAoBC;AAlDD,kDAAyC;AACzC,4DAAoC;AAEpC,oCAAiC;AACjC,oCAA4D;AAC5D,8DAA4D;AAC5D,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,wCAAmB,IAAE,SAAS,EAAE,IAAA,oBAAU,EAAC,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,SAAS,EAAE,yCAAM,CAAC,SAAS,EAAE,SAAS,CAAC;QAC7G,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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ElementHighlighter = void 0;
|
|
4
|
+
var element_highlighter_1 = require("./element-highlighter");
|
|
5
|
+
Object.defineProperty(exports, "ElementHighlighter", { enumerable: true, get: function () { return element_highlighter_1.ElementHighlighter; } });
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../element-highlighter/index.ts"],"names":[],"mappings":";;;AAAA,6DAA2D;AAAlD,yHAAA,kBAAkB,OAAA"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import React, { RefObject } from 'react';
|
|
2
|
+
export declare const useIsomorphicLayoutEffect: typeof React.useEffect;
|
|
3
|
+
export interface FrameProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
4
|
+
/** apply the frame to this element */
|
|
5
|
+
targetRef: RefObject<HTMLElement | null>;
|
|
6
|
+
/**
|
|
7
|
+
* the specific flavor of the frame.
|
|
8
|
+
* @default "redBorderClass"
|
|
9
|
+
*/
|
|
10
|
+
stylesClass?: string;
|
|
11
|
+
/** continually update frame position to match moving elements */
|
|
12
|
+
watchMotion?: boolean;
|
|
13
|
+
}
|
|
14
|
+
export declare function Frame({ targetRef, watchMotion, className, stylesClass, style }: FrameProps): React.JSX.Element;
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
26
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
27
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
28
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
29
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
30
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
31
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
32
|
+
});
|
|
33
|
+
};
|
|
34
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
35
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
36
|
+
};
|
|
37
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
38
|
+
exports.useIsomorphicLayoutEffect = void 0;
|
|
39
|
+
exports.Frame = Frame;
|
|
40
|
+
const react_1 = __importStar(require("react"));
|
|
41
|
+
const classnames_1 = __importDefault(require("classnames"));
|
|
42
|
+
const react_dom_1 = require("@floating-ui/react-dom");
|
|
43
|
+
const frame_module_scss_1 = __importDefault(require("./frame.module.scss"));
|
|
44
|
+
exports.useIsomorphicLayoutEffect = typeof window !== 'undefined' ? react_1.useLayoutEffect : react_1.useEffect;
|
|
45
|
+
/** frame padding around the target */
|
|
46
|
+
const MARGIN_FROM_TARGET = +frame_module_scss_1.default.offset || 6; // setting fallback 6, for tests
|
|
47
|
+
/** min. distance from the edge of the screen. */
|
|
48
|
+
const MARGIN_FROM_DOC_EDGE = 0;
|
|
49
|
+
const overflowParameters = { rootBoundary: 'document', padding: MARGIN_FROM_DOC_EDGE };
|
|
50
|
+
const SHIFT_POSITIVE = 'shiftPositive';
|
|
51
|
+
const HAS_RESIZE_OBSERVER = typeof window !== 'undefined' && !!window.ResizeObserver;
|
|
52
|
+
function Frame({ targetRef, watchMotion, className, stylesClass = frame_module_scss_1.default.overlayBorder, style }) {
|
|
53
|
+
var _a;
|
|
54
|
+
const dimensionRef = (0, react_1.useRef)({ width: 0, height: 0 });
|
|
55
|
+
const { x, y, strategy, reference, floating, update, refs, middlewareData } = (0, react_dom_1.useFloating)({
|
|
56
|
+
placement: 'bottom-start',
|
|
57
|
+
middleware: [
|
|
58
|
+
// replace dimensions from previous iterations with the target's size
|
|
59
|
+
// this is only the measured size, not yet the applied size
|
|
60
|
+
{
|
|
61
|
+
name: 'align-to-target',
|
|
62
|
+
fn({ rects }) {
|
|
63
|
+
rects.floating = Object.assign(Object.assign({}, rects.floating), { width: rects.reference.width + 2 * MARGIN_FROM_TARGET, height: rects.reference.height + 2 * MARGIN_FROM_TARGET });
|
|
64
|
+
return {};
|
|
65
|
+
},
|
|
66
|
+
},
|
|
67
|
+
// reposition x,y, to the top of the reference
|
|
68
|
+
(0, react_dom_1.offset)(({ rects }) => -rects.reference.height),
|
|
69
|
+
// offset the frame by its extra padding
|
|
70
|
+
(0, react_dom_1.offset)(() => ({ mainAxis: -MARGIN_FROM_TARGET, crossAxis: -MARGIN_FROM_TARGET })),
|
|
71
|
+
// pushes the frame into the document. Similar to shift(), but only pushes when coods are negative
|
|
72
|
+
{
|
|
73
|
+
name: 'shiftPositive',
|
|
74
|
+
fn: (args) => __awaiter(this, void 0, void 0, function* () {
|
|
75
|
+
const overflow = yield (0, react_dom_1.detectOverflow)(args, overflowParameters);
|
|
76
|
+
const nextCoords = {
|
|
77
|
+
x: overflow.left > 0 ? args.x + overflow.left : args.x,
|
|
78
|
+
y: overflow.top > 0 ? args.y + overflow.top : args.y,
|
|
79
|
+
};
|
|
80
|
+
const shiftAmount = {
|
|
81
|
+
x: nextCoords.x - args.x,
|
|
82
|
+
y: nextCoords.y - args.y,
|
|
83
|
+
};
|
|
84
|
+
return Object.assign(Object.assign({}, nextCoords), { data: shiftAmount });
|
|
85
|
+
}),
|
|
86
|
+
},
|
|
87
|
+
// size also applies overflow detection via width and height
|
|
88
|
+
(0, react_dom_1.size)({
|
|
89
|
+
// apply overflow detection in reference to the document
|
|
90
|
+
rootBoundary: 'document',
|
|
91
|
+
padding: MARGIN_FROM_DOC_EDGE,
|
|
92
|
+
apply({ elements, rects, availableHeight, availableWidth, middlewareData }) {
|
|
93
|
+
const shift = middlewareData[SHIFT_POSITIVE] || { x: 0, y: 0 };
|
|
94
|
+
const paddingX = 2 * MARGIN_FROM_TARGET - shift.x;
|
|
95
|
+
const paddingY = 2 * MARGIN_FROM_TARGET - shift.y;
|
|
96
|
+
const dimensions = {
|
|
97
|
+
width: rects.reference.width + paddingX,
|
|
98
|
+
height: rects.reference.height + paddingY,
|
|
99
|
+
maxWidth: availableWidth,
|
|
100
|
+
maxHeight: availableHeight,
|
|
101
|
+
};
|
|
102
|
+
// per floating-ui docs, apply styles directly during apply()
|
|
103
|
+
Object.assign(elements.floating.style, dimensions);
|
|
104
|
+
// also store in reference, so react renders will have the same value
|
|
105
|
+
dimensionRef.current = dimensions;
|
|
106
|
+
},
|
|
107
|
+
}),
|
|
108
|
+
(0, react_dom_1.hide)({ strategy: 'referenceHidden' }),
|
|
109
|
+
],
|
|
110
|
+
});
|
|
111
|
+
// set target as floating reference
|
|
112
|
+
(0, exports.useIsomorphicLayoutEffect)(() => {
|
|
113
|
+
reference(targetRef.current);
|
|
114
|
+
}, [targetRef.current]);
|
|
115
|
+
// automatically update on scroll, resize, etc.
|
|
116
|
+
// `watchMotion` will trigger continuous updates using animation frame
|
|
117
|
+
(0, react_1.useEffect)(() => {
|
|
118
|
+
if (!refs.reference.current || !refs.floating.current || !HAS_RESIZE_OBSERVER)
|
|
119
|
+
return () => { };
|
|
120
|
+
return (0, react_dom_1.autoUpdate)(refs.reference.current, refs.floating.current, update, { animationFrame: watchMotion });
|
|
121
|
+
}, [refs.reference.current, refs.floating.current, update, watchMotion]);
|
|
122
|
+
// could check if x !== null
|
|
123
|
+
const isReady = !((_a = middlewareData.hide) === null || _a === void 0 ? void 0 : _a.referenceHidden);
|
|
124
|
+
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,
|
|
125
|
+
// starting at pos [0,0] will ensure the label doesn't increase the document size.
|
|
126
|
+
top: y !== null && y !== void 0 ? y : 0, left: x !== null && x !== void 0 ? x : 0 }) }));
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=frame.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frame.js","sourceRoot":"","sources":["../../frame/frame.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
$border: 2;
|
|
2
|
+
$padding: 4;
|
|
3
|
+
|
|
4
|
+
.overlayBorder {
|
|
5
|
+
box-sizing: border-box;
|
|
6
|
+
border: $border * 1px solid var(--bit-highlighter-color, #eebcc9);
|
|
7
|
+
|
|
8
|
+
border-radius: 11px;
|
|
9
|
+
padding: $padding * 1px;
|
|
10
|
+
|
|
11
|
+
pointer-events: none;
|
|
12
|
+
user-select: none;
|
|
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
|
+
|
|
21
|
+
:export {
|
|
22
|
+
offset: $border + $padding;
|
|
23
|
+
}
|