@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.
Files changed (134) hide show
  1. package/children-highlighter/children-highlighter.composition.tsx +103 -0
  2. package/children-highlighter/children-highlighter.spec.tsx +22 -0
  3. package/children-highlighter/children-highlighter.tsx +9 -0
  4. package/children-highlighter/index.ts +5 -0
  5. package/children-highlighter/use-children-highlighter.tsx +79 -0
  6. package/component-highlighter.docs.md +191 -0
  7. package/dist/children-highlighter/children-highlighter.composition.d.ts +6 -0
  8. package/dist/children-highlighter/children-highlighter.composition.js +93 -0
  9. package/dist/children-highlighter/children-highlighter.composition.js.map +1 -0
  10. package/dist/children-highlighter/children-highlighter.d.ts +4 -0
  11. package/dist/children-highlighter/children-highlighter.js +24 -0
  12. package/dist/children-highlighter/children-highlighter.js.map +1 -0
  13. package/dist/children-highlighter/children-highlighter.spec.d.ts +1 -0
  14. package/dist/children-highlighter/children-highlighter.spec.js +22 -0
  15. package/dist/children-highlighter/children-highlighter.spec.js.map +1 -0
  16. package/dist/children-highlighter/index.d.ts +4 -0
  17. package/dist/children-highlighter/index.js +8 -0
  18. package/dist/children-highlighter/index.js.map +1 -0
  19. package/dist/children-highlighter/use-children-highlighter.d.ts +18 -0
  20. package/dist/children-highlighter/use-children-highlighter.js +51 -0
  21. package/dist/children-highlighter/use-children-highlighter.js.map +1 -0
  22. package/dist/component-highlighter.docs.md +191 -0
  23. package/dist/element-highlighter/element-highlighter.compositions.d.ts +14 -0
  24. package/dist/element-highlighter/element-highlighter.compositions.js +103 -0
  25. package/dist/element-highlighter/element-highlighter.compositions.js.map +1 -0
  26. package/dist/element-highlighter/element-highlighter.d.ts +22 -0
  27. package/dist/element-highlighter/element-highlighter.js +31 -0
  28. package/dist/element-highlighter/element-highlighter.js.map +1 -0
  29. package/dist/element-highlighter/element-highlighter.module.scss +10 -0
  30. package/dist/element-highlighter/index.d.ts +2 -0
  31. package/dist/element-highlighter/index.js +6 -0
  32. package/dist/element-highlighter/index.js.map +1 -0
  33. package/dist/frame/frame.d.ts +14 -0
  34. package/dist/frame/frame.js +128 -0
  35. package/dist/frame/frame.js.map +1 -0
  36. package/dist/frame/frame.module.scss +23 -0
  37. package/dist/frame/index.d.ts +2 -0
  38. package/dist/frame/index.js +6 -0
  39. package/dist/frame/index.js.map +1 -0
  40. package/dist/hover-highlighter/bubble-to-component.d.ts +24 -0
  41. package/dist/hover-highlighter/bubble-to-component.js +55 -0
  42. package/dist/hover-highlighter/bubble-to-component.js.map +1 -0
  43. package/dist/hover-highlighter/bubble-to-component.spec.d.ts +1 -0
  44. package/dist/hover-highlighter/bubble-to-component.spec.js +38 -0
  45. package/dist/hover-highlighter/bubble-to-component.spec.js.map +1 -0
  46. package/dist/hover-highlighter/hover-highlighter.compositions.d.ts +4 -0
  47. package/dist/hover-highlighter/hover-highlighter.compositions.js +73 -0
  48. package/dist/hover-highlighter/hover-highlighter.compositions.js.map +1 -0
  49. package/dist/hover-highlighter/hover-highlighter.d.ts +4 -0
  50. package/dist/hover-highlighter/hover-highlighter.js +24 -0
  51. package/dist/hover-highlighter/hover-highlighter.js.map +1 -0
  52. package/dist/hover-highlighter/hover-highlighter.spec.d.ts +1 -0
  53. package/dist/hover-highlighter/hover-highlighter.spec.js +95 -0
  54. package/dist/hover-highlighter/hover-highlighter.spec.js.map +1 -0
  55. package/dist/hover-highlighter/index.d.ts +4 -0
  56. package/dist/hover-highlighter/index.js +8 -0
  57. package/dist/hover-highlighter/index.js.map +1 -0
  58. package/dist/hover-highlighter/use-hover-highlighter.d.ts +25 -0
  59. package/dist/hover-highlighter/use-hover-highlighter.js +47 -0
  60. package/dist/hover-highlighter/use-hover-highlighter.js.map +1 -0
  61. package/dist/hybrid-highlighter/hybrid-highlighter.d.ts +36 -0
  62. package/dist/hybrid-highlighter/hybrid-highlighter.js +83 -0
  63. package/dist/hybrid-highlighter/hybrid-highlighter.js.map +1 -0
  64. package/dist/hybrid-highlighter/index.d.ts +2 -0
  65. package/dist/hybrid-highlighter/index.js +6 -0
  66. package/dist/hybrid-highlighter/index.js.map +1 -0
  67. package/dist/ignore-highlighter.d.ts +19 -0
  68. package/dist/ignore-highlighter.js +25 -0
  69. package/dist/ignore-highlighter.js.map +1 -0
  70. package/dist/index.d.ts +10 -0
  71. package/dist/index.js +18 -0
  72. package/dist/index.js.map +1 -0
  73. package/dist/label/component-strip.compositions.d.ts +2 -0
  74. package/dist/label/component-strip.compositions.js +17 -0
  75. package/dist/label/component-strip.compositions.js.map +1 -0
  76. package/dist/label/component-strip.d.ts +7 -0
  77. package/dist/label/component-strip.js +61 -0
  78. package/dist/label/component-strip.js.map +1 -0
  79. package/dist/label/component-strip.module.scss +68 -0
  80. package/dist/label/index.d.ts +4 -0
  81. package/dist/label/index.js +8 -0
  82. package/dist/label/index.js.map +1 -0
  83. package/dist/label/label-container.d.ts +13 -0
  84. package/dist/label/label-container.js +77 -0
  85. package/dist/label/label-container.js.map +1 -0
  86. package/dist/label/label.d.ts +6 -0
  87. package/dist/label/label.js +60 -0
  88. package/dist/label/label.js.map +1 -0
  89. package/dist/label/label.module.scss +32 -0
  90. package/dist/label/links.d.ts +2 -0
  91. package/dist/label/links.js +16 -0
  92. package/dist/label/links.js.map +1 -0
  93. package/dist/label/other-components.d.ts +9 -0
  94. package/dist/label/other-components.js +34 -0
  95. package/dist/label/other-components.js.map +1 -0
  96. package/dist/mock-component.d.ts +14 -0
  97. package/dist/mock-component.js +43 -0
  98. package/dist/mock-component.js.map +1 -0
  99. package/dist/preview-1766004072990.js +10 -0
  100. package/dist/rule-matcher.d.ts +8 -0
  101. package/dist/rule-matcher.js +32 -0
  102. package/dist/rule-matcher.js.map +1 -0
  103. package/element-highlighter/element-highlighter.compositions.tsx +130 -0
  104. package/element-highlighter/element-highlighter.module.scss +10 -0
  105. package/element-highlighter/element-highlighter.tsx +51 -0
  106. package/element-highlighter/index.ts +2 -0
  107. package/frame/frame.module.scss +23 -0
  108. package/frame/frame.tsx +142 -0
  109. package/frame/index.ts +2 -0
  110. package/hover-highlighter/bubble-to-component.spec.tsx +57 -0
  111. package/hover-highlighter/bubble-to-component.tsx +82 -0
  112. package/hover-highlighter/hover-highlighter.compositions.tsx +65 -0
  113. package/hover-highlighter/hover-highlighter.spec.tsx +115 -0
  114. package/hover-highlighter/hover-highlighter.tsx +8 -0
  115. package/hover-highlighter/index.ts +5 -0
  116. package/hover-highlighter/use-hover-highlighter.tsx +85 -0
  117. package/hybrid-highlighter/hybrid-highlighter.tsx +142 -0
  118. package/hybrid-highlighter/index.ts +2 -0
  119. package/ignore-highlighter.tsx +22 -0
  120. package/index.ts +21 -0
  121. package/label/component-strip.compositions.tsx +13 -0
  122. package/label/component-strip.module.scss +68 -0
  123. package/label/component-strip.tsx +57 -0
  124. package/label/index.ts +5 -0
  125. package/label/label-container.tsx +74 -0
  126. package/label/label.module.scss +32 -0
  127. package/label/label.tsx +37 -0
  128. package/label/links.tsx +9 -0
  129. package/label/other-components.tsx +51 -0
  130. package/mock-component.tsx +23 -0
  131. package/package.json +60 -0
  132. package/rule-matcher.tsx +42 -0
  133. package/types/asset.d.ts +29 -0
  134. package/types/style.d.ts +42 -0
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Frame = void 0;
4
+ var frame_1 = require("./frame");
5
+ Object.defineProperty(exports, "Frame", { enumerable: true, get: function () { return frame_1.Frame; } });
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../frame/index.ts"],"names":[],"mappings":";;;AAAA,iCAAgC;AAAvB,8FAAA,KAAK,OAAA"}
@@ -0,0 +1,24 @@
1
+ import { ReactComponentMetaHolder } from '@teambit/react.ui.highlighter.component-metadata.bit-component-meta';
2
+ import { MatchRule, ComponentMatchRule } from '../rule-matcher';
3
+ 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
+ element: any;
20
+ components: {
21
+ __bit_component: any;
22
+ }[];
23
+ };
24
+ export {};
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.bubbleToComponent = bubbleToComponent;
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
+ var _a, _b, _c, _d, _e;
10
+ // check if the element is rendered in Vue
11
+ if (element === null || element === void 0 ? void 0 : element.__vnode) {
12
+ const vueComp = (_b = (_a = element.__vnode) === null || _a === void 0 ? void 0 : _a.ctx) === null || _b === void 0 ? void 0 : _b.type;
13
+ const comp = vueComp === null || vueComp === void 0 ? void 0 : vueComp.__bit_component;
14
+ const compEl = (_e = (_d = (_c = element.__vnode) === null || _c === void 0 ? void 0 : _c.ctx) === null || _d === void 0 ? void 0 : _d.ctx) === null || _e === void 0 ? void 0 : _e.$el;
15
+ if (compEl && comp) {
16
+ return {
17
+ element: compEl,
18
+ components: [{ [react_ui_highlighter_component_metadata_bit_component_meta_1.componentMetaField]: comp }],
19
+ };
20
+ }
21
+ }
22
+ let current = bubbleToFirstComponent(element, elementRule, componentRule);
23
+ if (!propagateSameParents)
24
+ return current;
25
+ while (current) {
26
+ const parentElement = current.element.parentElement;
27
+ const parent = bubbleToFirstComponent(parentElement, elementRule, componentRule);
28
+ const primeComponent = current === null || current === void 0 ? void 0 : current.components.slice(-1).pop();
29
+ const parentPrimeComponent = parent === null || parent === void 0 ? void 0 : parent.components.slice(-1).pop();
30
+ 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))
31
+ return current;
32
+ current = parent;
33
+ }
34
+ return undefined;
35
+ }
36
+ /** go up the dom tree until reaching a react bit component */
37
+ function bubbleToFirstComponent(element, elementRule, componentRule) {
38
+ for (let current = element; current; current = current.parentElement) {
39
+ current = (0, react_modules_dom_to_react_1.toRootElement)(current);
40
+ if (!current)
41
+ return undefined;
42
+ if ((0, rule_matcher_1.ruleMatcher)(current, elementRule)) {
43
+ const components = (0, react_modules_dom_to_react_1.domToReacts)(current);
44
+ 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));
45
+ if (relevantComponents.length < 1)
46
+ return undefined;
47
+ return {
48
+ element: current,
49
+ components: relevantComponents,
50
+ };
51
+ }
52
+ }
53
+ return undefined;
54
+ }
55
+ //# 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":";;AAqBA,8CAiCC;AAtDD,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,0CAA0C;IAC1C,IAAK,OAAe,aAAf,OAAO,uBAAP,OAAO,CAAU,OAAO,EAAE,CAAC;QAC9B,MAAM,OAAO,GAAG,MAAA,MAAC,OAAe,CAAC,OAAO,0CAAE,GAAG,0CAAE,IAAI,CAAC;QACpD,MAAM,IAAI,GAAG,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,eAAe,CAAC;QACtC,MAAM,MAAM,GAAG,MAAA,MAAA,MAAC,OAAe,CAAC,OAAO,0CAAE,GAAG,0CAAE,GAAG,0CAAE,GAAG,CAAC;QACvD,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;YACnB,OAAO;gBACL,OAAO,EAAE,MAAM;gBACf,UAAU,EAAE,CAAC,EAAE,CAAC,+EAAkB,CAAC,EAAE,IAAI,EAAE,CAAC;aAC7C,CAAC;QACJ,CAAC;IACH,CAAC;IAED,IAAI,OAAO,GAAG,sBAAsB,CAAC,OAAO,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;IAC1E,IAAI,CAAC,oBAAoB;QAAE,OAAO,OAAO,CAAC;IAE1C,OAAO,OAAO,EAAE,CAAC;QACf,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;IACnB,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;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,CAAC;QACrE,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,CAAC;YACtC,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;QACJ,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -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"}
@@ -0,0 +1,4 @@
1
+ import React from 'react';
2
+ export declare const ShowWhenHovering: () => React.JSX.Element;
3
+ export declare const UnmountingElement: () => React.JSX.Element;
4
+ export declare const HoverExclusionZones: () => React.JSX.Element;
@@ -0,0 +1,73 @@
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.HoverExclusionZones = exports.UnmountingElement = exports.ShowWhenHovering = void 0;
27
+ const react_1 = __importStar(require("react"));
28
+ const hover_highlighter_1 = require("./hover-highlighter");
29
+ const mock_component_1 = require("../mock-component");
30
+ const ignore_highlighter_1 = require("../ignore-highlighter");
31
+ const ShowWhenHovering = () => {
32
+ const [disabled, setDisabled] = (0, react_1.useState)(false);
33
+ return (react_1.default.createElement("div", { style: { padding: '16px 50px 32px 16px', minWidth: 300, fontFamily: 'sans-serif' } },
34
+ react_1.default.createElement(hover_highlighter_1.HoverHighlighter, { style: { padding: 16 }, disabled: disabled },
35
+ react_1.default.createElement("div", null,
36
+ react_1.default.createElement("br", null),
37
+ react_1.default.createElement("div", null,
38
+ react_1.default.createElement(mock_component_1.MockButton, { onClick: () => setDisabled((x) => !x) }, "Hover here")),
39
+ react_1.default.createElement("div", null,
40
+ disabled ? 'X' : '✓',
41
+ " highlighter is ",
42
+ disabled ? 'disabled' : 'enabled')))));
43
+ };
44
+ exports.ShowWhenHovering = ShowWhenHovering;
45
+ const UnmountingElement = () => {
46
+ const [shown, setShown] = (0, react_1.useState)(true);
47
+ (0, react_1.useEffect)(() => {
48
+ const tid = setInterval(() => setShown((x) => !x), 1500);
49
+ return () => clearInterval(tid);
50
+ }, []);
51
+ return (react_1.default.createElement("div", { style: { padding: '16px 50px 32px 16px', minWidth: 300, fontFamily: 'sans-serif' } },
52
+ react_1.default.createElement(hover_highlighter_1.HoverHighlighter, null,
53
+ react_1.default.createElement("div", null, !shown && '(hidden)'),
54
+ react_1.default.createElement("div", null, shown && react_1.default.createElement(mock_component_1.MockButton, null, "Hover here")),
55
+ react_1.default.createElement("br", null),
56
+ react_1.default.createElement(mock_component_1.MockTarget, null,
57
+ react_1.default.createElement("div", null, shown && react_1.default.createElement(mock_component_1.MockButton, null, "Hover here")),
58
+ react_1.default.createElement("div", null, "same with a container")))));
59
+ };
60
+ exports.UnmountingElement = UnmountingElement;
61
+ const HoverExclusionZones = () => {
62
+ return (react_1.default.createElement("div", { style: { padding: '16px 50px 32px 16px', minWidth: 300, fontFamily: 'sans-serif' } },
63
+ react_1.default.createElement(hover_highlighter_1.HoverHighlighter, null,
64
+ react_1.default.createElement(mock_component_1.MockTarget, null,
65
+ "container (target-able)",
66
+ react_1.default.createElement("div", null, react_1.default.createElement(mock_component_1.MockButton, null, "will be highlighted"))),
67
+ react_1.default.createElement("br", null),
68
+ react_1.default.createElement(mock_component_1.MockTarget, null,
69
+ "container (target-able)",
70
+ react_1.default.createElement("div", Object.assign({}, ignore_highlighter_1.excludeHighlighterAtt), react_1.default.createElement(mock_component_1.MockButton, null, "will be ignored"))))));
71
+ };
72
+ exports.HoverExclusionZones = HoverExclusionZones;
73
+ //# sourceMappingURL=hover-highlighter.compositions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hover-highlighter.compositions.js","sourceRoot":"","sources":["../../hover-highlighter/hover-highlighter.compositions.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+CAAmD;AACnD,2DAAuD;AACvD,sDAA2D;AAC3D,8DAA8D;AAEvD,MAAM,gBAAgB,GAAG,GAAG,EAAE;IACnC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,IAAA,gBAAQ,EAAU,KAAK,CAAC,CAAC;IAEzD,OAAO,CACL,uCAAK,KAAK,EAAE,EAAE,OAAO,EAAE,qBAAqB,EAAE,QAAQ,EAAE,GAAG,EAAE,UAAU,EAAE,YAAY,EAAE;QACrF,8BAAC,oCAAgB,IAAC,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,QAAQ;YAC1D;gBACE,yCAAM;gBACN;oBACE,8BAAC,2BAAU,IAAC,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,iBAAyB,CACtE;gBACN;oBACG,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG;;oBAAkB,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CACpE,CACF,CACW,CACf,CACP,CAAC;AACJ,CAAC,CAAC;AAlBW,QAAA,gBAAgB,oBAkB3B;AAEK,MAAM,iBAAiB,GAAG,GAAG,EAAE;IACpC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,IAAA,gBAAQ,EAAC,IAAI,CAAC,CAAC;IACzC,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QACzD,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IAClC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,CACL,uCAAK,KAAK,EAAE,EAAE,OAAO,EAAE,qBAAqB,EAAE,QAAQ,EAAE,GAAG,EAAE,UAAU,EAAE,YAAY,EAAE;QACrF,8BAAC,oCAAgB;YACf,2CAAM,CAAC,KAAK,IAAI,UAAU,CAAO;YAEjC,2CAAM,KAAK,IAAI,8BAAC,2BAAU,qBAAwB,CAAO;YACzD,yCAAM;YACN,8BAAC,2BAAU;gBACT,2CAAM,KAAK,IAAI,8BAAC,2BAAU,qBAAwB,CAAO;gBACzD,mEAAgC,CACrB,CACI,CACf,CACP,CAAC;AACJ,CAAC,CAAC;AArBW,QAAA,iBAAiB,qBAqB5B;AAEK,MAAM,mBAAmB,GAAG,GAAG,EAAE;IACtC,OAAO,CACL,uCAAK,KAAK,EAAE,EAAE,OAAO,EAAE,qBAAqB,EAAE,QAAQ,EAAE,GAAG,EAAE,UAAU,EAAE,YAAY,EAAE;QACrF,8BAAC,oCAAgB;YACf,8BAAC,2BAAU;;gBAET,2CAAM,8BAAC,2BAAU,8BAAiC,CAAO,CAC9C;YACb,yCAAM;YACN,8BAAC,2BAAU;;gBAET,uDAAS,0CAAqB,GAAG,8BAAC,2BAAU,0BAA6B,CAAO,CACrE,CACI,CACf,CACP,CAAC;AACJ,CAAC,CAAC;AAhBW,QAAA,mBAAmB,uBAgB9B"}
@@ -0,0 +1,4 @@
1
+ import React from 'react';
2
+ import { HybridHighlighterProps } from '../hybrid-highlighter';
3
+ export type HoverHighlighterProps = Omit<HybridHighlighterProps, 'mode'>;
4
+ export declare function HoverHighlighter({ ...props }: HoverHighlighterProps): React.JSX.Element;
@@ -0,0 +1,24 @@
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.HoverHighlighter = HoverHighlighter;
18
+ const react_1 = __importDefault(require("react"));
19
+ const hybrid_highlighter_1 = require("../hybrid-highlighter");
20
+ function HoverHighlighter(_a) {
21
+ var props = __rest(_a, []);
22
+ return react_1.default.createElement(hybrid_highlighter_1.HybridHighlighter, Object.assign({}, props, { mode: 'hover' }));
23
+ }
24
+ //# sourceMappingURL=hover-highlighter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hover-highlighter.js","sourceRoot":"","sources":["../../hover-highlighter/hover-highlighter.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAKA,4CAEC;AAPD,kDAA0B;AAC1B,8DAAkF;AAIlF,SAAgB,gBAAgB,CAAC,EAAmC;QAA9B,KAAK,cAAV,EAAY,CAAF;IACzC,OAAO,8BAAC,sCAAiB,oBAAK,KAAK,IAAE,IAAI,EAAE,OAAO,IAAI,CAAC;AACzD,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,95 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ const react_1 = __importDefault(require("react"));
16
+ const test_utils_1 = require("react-dom/test-utils");
17
+ const react_2 = require("@testing-library/react");
18
+ const react_ui_highlighter_component_metadata_bit_component_meta_1 = require("@teambit/react.ui.highlighter.component-metadata.bit-component-meta");
19
+ const hover_highlighter_1 = require("./hover-highlighter");
20
+ const debounceTime = 2;
21
+ function ButtonComponent({ children }) {
22
+ return react_1.default.createElement("button", null, children);
23
+ }
24
+ ButtonComponent[react_ui_highlighter_component_metadata_bit_component_meta_1.componentMetaField] = {
25
+ // could use a non-bit-id to render the "default" bubble
26
+ id: 'teambit.base-ui/input/button',
27
+ };
28
+ it('should show bubble when hovering on element with bit id', () => __awaiter(void 0, void 0, void 0, function* () {
29
+ const { getByText, findByText } = (0, react_2.render)(react_1.default.createElement(hover_highlighter_1.HoverHighlighter, { debounceSelection: debounceTime },
30
+ react_1.default.createElement(ButtonComponent, null, "hover here")));
31
+ const rendered = getByText('hover here');
32
+ expect(rendered).toBeTruthy();
33
+ (0, test_utils_1.act)(() => {
34
+ react_2.fireEvent.mouseOver(rendered);
35
+ });
36
+ const highlightBubble = yield findByText('input/button');
37
+ expect(highlightBubble).toBeInstanceOf(HTMLElement);
38
+ }));
39
+ it('should hide the highlight when hovering out of the element', () => __awaiter(void 0, void 0, void 0, function* () {
40
+ const { getByText, findByText, queryByText } = (0, react_2.render)(react_1.default.createElement(hover_highlighter_1.HoverHighlighter, { debounceSelection: debounceTime },
41
+ react_1.default.createElement(ButtonComponent, null, "hover here")));
42
+ const rendered = getByText('hover here');
43
+ (0, test_utils_1.act)(() => {
44
+ react_2.fireEvent.mouseOver(rendered);
45
+ });
46
+ const highlightBubble = yield findByText('input/button');
47
+ expect(highlightBubble).toBeInstanceOf(HTMLElement);
48
+ (0, test_utils_1.act)(() => {
49
+ react_2.fireEvent.mouseOut(rendered);
50
+ });
51
+ yield (0, react_2.waitForElementToBeRemoved)(() => queryByText('input/button'));
52
+ }));
53
+ it('should keep the highlighter, when hovering on it (even when moving out of the component zone)', () => __awaiter(void 0, void 0, void 0, function* () {
54
+ const { getByText, findByText } = (0, react_2.render)(react_1.default.createElement(hover_highlighter_1.HoverHighlighter, { debounceSelection: debounceTime },
55
+ react_1.default.createElement(ButtonComponent, null, "hover here")));
56
+ const rendered = getByText('hover here');
57
+ (0, test_utils_1.act)(() => {
58
+ // hover on target element:
59
+ react_2.fireEvent.mouseOver(rendered);
60
+ });
61
+ const highlightBubble = yield findByText('input/button');
62
+ yield (0, test_utils_1.act)(() => __awaiter(void 0, void 0, void 0, function* () {
63
+ // move mouse out of target element, "towards" the highlighter bubble
64
+ // this should trigger hiding
65
+ react_2.fireEvent.mouseOut(rendered);
66
+ // move mouse into the highlighter bubble
67
+ react_2.fireEvent.mouseEnter(highlightBubble);
68
+ // allow react to update state during the act()
69
+ // and before verifying highlighter remains
70
+ yield new Promise((resolve) => setTimeout(resolve, debounceTime + 10));
71
+ }));
72
+ // highlighter should still focus the target button
73
+ expect(yield findByText('input/button')).toBeInstanceOf(HTMLElement);
74
+ }));
75
+ it('should hide the highlighter when moving the mouse away of it', () => __awaiter(void 0, void 0, void 0, function* () {
76
+ const { getByText, queryByText, findByText } = (0, react_2.render)(react_1.default.createElement(hover_highlighter_1.HoverHighlighter, { debounceSelection: debounceTime },
77
+ react_1.default.createElement(ButtonComponent, null, "hover here")));
78
+ const rendered = getByText('hover here');
79
+ // hover on target element:
80
+ yield (0, test_utils_1.act)(() => __awaiter(void 0, void 0, void 0, function* () {
81
+ react_2.fireEvent.mouseOver(rendered);
82
+ }));
83
+ const highlightBubble = yield findByText('input/button');
84
+ yield (0, test_utils_1.act)(() => __awaiter(void 0, void 0, void 0, function* () {
85
+ // hover on highlighter
86
+ react_2.fireEvent.mouseEnter(highlightBubble);
87
+ // leave the highlighter
88
+ react_2.fireEvent.mouseOut(highlightBubble);
89
+ yield new Promise((resolve) => setTimeout(resolve, debounceTime + 10));
90
+ }));
91
+ // highlighter sometimes disappears before this check,
92
+ // so not using waitForElementToBeRemoved, and using setTimeout instead
93
+ expect(queryByText('input/button')).toBeNull();
94
+ }));
95
+ //# sourceMappingURL=hover-highlighter.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hover-highlighter.spec.js","sourceRoot":"","sources":["../../hover-highlighter/hover-highlighter.spec.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export { useHoverHighlighter } from './use-hover-highlighter';
2
+ export type { useHoverHighlighterOptions } from './use-hover-highlighter';
3
+ export { HoverHighlighter } from './hover-highlighter';
4
+ export type { HoverHighlighterProps } from './hover-highlighter';
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HoverHighlighter = exports.useHoverHighlighter = void 0;
4
+ var use_hover_highlighter_1 = require("./use-hover-highlighter");
5
+ Object.defineProperty(exports, "useHoverHighlighter", { enumerable: true, get: function () { return use_hover_highlighter_1.useHoverHighlighter; } });
6
+ var hover_highlighter_1 = require("./hover-highlighter");
7
+ Object.defineProperty(exports, "HoverHighlighter", { enumerable: true, get: function () { return hover_highlighter_1.HoverHighlighter; } });
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../hover-highlighter/index.ts"],"names":[],"mappings":";;;AAAA,iEAA8D;AAArD,4HAAA,mBAAmB,OAAA;AAG5B,yDAAuD;AAA9C,qHAAA,gBAAgB,OAAA"}
@@ -0,0 +1,25 @@
1
+ import React from 'react';
2
+ import { ComponentMetaHolder } from '@teambit/react.ui.highlighter.component-metadata.bit-component-meta';
3
+ import { MatchRule, ComponentMatchRule } from '../rule-matcher';
4
+ type HighlightTarget = {
5
+ element: HTMLElement;
6
+ components: ComponentMetaHolder[];
7
+ };
8
+ export type useHoverHighlighterOptions = {
9
+ debounceDuration: number;
10
+ scopeClass: string;
11
+ disabled?: boolean;
12
+ /** filter highlighter targets by this query selector. (May be a more complex object in the future) */
13
+ rule?: MatchRule;
14
+ /** filter targets by this component match rule */
15
+ componentRule?: ComponentMatchRule;
16
+ };
17
+ /** fires onChange when targeting a new component */
18
+ export declare function useHoverHighlighter<T extends HTMLElement = HTMLElement>(onChange: (target?: HighlightTarget) => void, props: React.HTMLAttributes<T>, { debounceDuration, scopeClass, disabled, rule, componentRule }: useHoverHighlighterOptions): {
19
+ onMouseOver?: undefined;
20
+ onMouseLeave?: undefined;
21
+ } | {
22
+ onMouseOver: (event: React.MouseEvent<T, MouseEvent>) => void;
23
+ onMouseLeave: (event: React.MouseEvent<T, MouseEvent>) => void;
24
+ };
25
+ export {};
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useHoverHighlighter = useHoverHighlighter;
4
+ const react_1 = require("react");
5
+ const use_debounce_1 = require("use-debounce");
6
+ const react_ui_hover_selector_1 = require("@teambit/react.ui.hover-selector");
7
+ const ignore_highlighter_1 = require("../ignore-highlighter");
8
+ const bubble_to_component_1 = require("./bubble-to-component");
9
+ /** fires onChange when targeting a new component */
10
+ function useHoverHighlighter(onChange, props = {}, { debounceDuration, scopeClass, disabled, rule, componentRule }) {
11
+ const { handleElement } = useHoverHandler({ onChange, scopeClass, debounceDuration, disabled, rule, componentRule });
12
+ const handlers = (0, react_ui_hover_selector_1.useHoverSelection)(disabled ? undefined : handleElement, props);
13
+ return handlers;
14
+ }
15
+ function useHoverHandler({ onChange, scopeClass = '', debounceDuration, disabled, rule, componentRule, }) {
16
+ // debounced method is ref'ed, so no need for useCallback
17
+ const _handleElement = (element) => {
18
+ // clear highlighter at the edges:
19
+ if (!element || element.hasAttribute('data-nullify-component-highlight')) {
20
+ onChange(undefined);
21
+ return;
22
+ }
23
+ // clear when ancestor has 'data-ignore-component-highlight'
24
+ if (element.closest(`.${scopeClass} ${ignore_highlighter_1.excludeHighlighterSelector}`)) {
25
+ onChange(undefined);
26
+ return;
27
+ }
28
+ // skip DOM trees having 'data-skip-component-highlight'
29
+ if (element.closest(`.${scopeClass} ${ignore_highlighter_1.skipHighlighterSelector}`))
30
+ return;
31
+ const result = (0, bubble_to_component_1.bubbleToComponent)(element, { elementRule: rule, componentRule });
32
+ if (!result)
33
+ return;
34
+ onChange({
35
+ element: result.element,
36
+ components: result.components,
37
+ });
38
+ };
39
+ const handleElement = (0, use_debounce_1.useDebouncedCallback)(_handleElement, debounceDuration);
40
+ // clear when disabling
41
+ (0, react_1.useEffect)(() => {
42
+ if (disabled)
43
+ handleElement.cancel();
44
+ }, [disabled, handleElement]);
45
+ return { handleElement };
46
+ }
47
+ //# sourceMappingURL=use-hover-highlighter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-hover-highlighter.js","sourceRoot":"","sources":["../../hover-highlighter/use-hover-highlighter.tsx"],"names":[],"mappings":";;AAqBA,kDAUC;AA/BD,iCAAyC;AACzC,+CAAoD;AACpD,8EAAqE;AAGrE,8DAA4F;AAE5F,+DAA0D;AAa1D,oDAAoD;AACpD,SAAgB,mBAAmB,CACjC,QAA4C,EAC5C,QAAiC,EAAE,EACnC,EAAE,gBAAgB,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,EAA8B;IAE3F,MAAM,EAAE,aAAa,EAAE,GAAG,eAAe,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,gBAAgB,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC;IAErH,MAAM,QAAQ,GAAG,IAAA,2CAAiB,EAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;IAEhF,OAAO,QAAQ,CAAC;AAClB,CAAC;AAWD,SAAS,eAAe,CAAC,EACvB,QAAQ,EACR,UAAU,GAAG,EAAE,EACf,gBAAgB,EAChB,QAAQ,EACR,IAAI,EACJ,aAAa,GACY;IACzB,yDAAyD;IACzD,MAAM,cAAc,GAAG,CAAC,OAA2B,EAAE,EAAE;QACrD,kCAAkC;QAClC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,YAAY,CAAC,kCAAkC,CAAC,EAAE,CAAC;YACzE,QAAQ,CAAC,SAAS,CAAC,CAAC;YACpB,OAAO;QACT,CAAC;QAED,4DAA4D;QAC5D,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,UAAU,IAAI,+CAA0B,EAAE,CAAC,EAAE,CAAC;YACpE,QAAQ,CAAC,SAAS,CAAC,CAAC;YACpB,OAAO;QACT,CAAC;QAED,wDAAwD;QACxD,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,UAAU,IAAI,4CAAuB,EAAE,CAAC;YAAE,OAAO;QAEzE,MAAM,MAAM,GAAG,IAAA,uCAAiB,EAAC,OAAO,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC;QAChF,IAAI,CAAC,MAAM;YAAE,OAAO;QAEpB,QAAQ,CAAC;YACP,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,UAAU,EAAE,MAAM,CAAC,UAAU;SAC9B,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG,IAAA,mCAAoB,EAAC,cAAc,EAAE,gBAAgB,CAAC,CAAC;IAE7E,uBAAuB;IACvB,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,IAAI,QAAQ;YAAE,aAAa,CAAC,MAAM,EAAE,CAAC;IACvC,CAAC,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC;IAE9B,OAAO,EAAE,aAAa,EAAE,CAAC;AAC3B,CAAC"}
@@ -0,0 +1,36 @@
1
+ import React, { CSSProperties } from 'react';
2
+ import { Placement, HighlightClasses } from '../element-highlighter';
3
+ import type { MatchRule, ComponentMatchRule } from '../rule-matcher';
4
+ export interface HybridHighlighterProps extends React.HTMLAttributes<HTMLDivElement> {
5
+ /** stop all highlighting and drop listeners */
6
+ disabled?: boolean;
7
+ /** default pop location for the label */
8
+ placement?: Placement;
9
+ /** customize styles */
10
+ classes?: HighlightClasses;
11
+ /** customize highlighter */
12
+ highlightStyle?: CSSProperties;
13
+ /** debounces element hover selection.
14
+ * A higher value will reduce element lookups as well as "keep" the highlight on the current element for longer.
15
+ * Initial selection (when no element is currently selected) will always happen immediately to improve the user experience.
16
+ * @default 80ms
17
+ */
18
+ debounceSelection?: number;
19
+ /** continually update frame position to match moving elements */
20
+ watchMotion?: boolean;
21
+ /** filter highlighter targets by this query selector. (May be a more complex object in the future) */
22
+ rule?: MatchRule;
23
+ /** filter components to match this rule. Can be id, array of ids, or a function */
24
+ componentRule?: ComponentMatchRule;
25
+ /** set the behavior of the highlighter.
26
+ * `disabled` - stops highlighting.
27
+ * `allChildren` - highlights all components rendered under children
28
+ * `hover` - highlighters the component immediately under the mouse cursor
29
+ * */
30
+ mode?: 'allChildren' | 'hover';
31
+ bgColor?: string;
32
+ bgColorHover?: string;
33
+ bgColorActive?: string;
34
+ }
35
+ /** automatically highlight components on hover */
36
+ export declare function HybridHighlighter({ disabled, mode, debounceSelection, watchMotion, placement, rule, componentRule, classes, highlightStyle, className, style, bgColor, bgColorHover, bgColorActive, children, ...rest }: HybridHighlighterProps): React.JSX.Element;
@@ -0,0 +1,83 @@
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 __rest = (this && this.__rest) || function (s, e) {
26
+ var t = {};
27
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
28
+ t[p] = s[p];
29
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
30
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
31
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
32
+ t[p[i]] = s[p[i]];
33
+ }
34
+ return t;
35
+ };
36
+ var __importDefault = (this && this.__importDefault) || function (mod) {
37
+ return (mod && mod.__esModule) ? mod : { "default": mod };
38
+ };
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ exports.HybridHighlighter = HybridHighlighter;
41
+ const react_1 = __importStar(require("react"));
42
+ const classnames_1 = __importDefault(require("classnames"));
43
+ const uuid_1 = require("uuid");
44
+ const hover_highlighter_1 = require("../hover-highlighter");
45
+ const element_highlighter_1 = require("../element-highlighter");
46
+ const children_highlighter_1 = require("../children-highlighter");
47
+ /** automatically highlight components on hover */
48
+ function HybridHighlighter(_a) {
49
+ var { disabled, mode = 'hover', debounceSelection = 80, watchMotion = true, placement, rule, componentRule, classes, highlightStyle, className, style, bgColor, bgColorHover, bgColorActive, children } = _a, rest = __rest(_a, ["disabled", "mode", "debounceSelection", "watchMotion", "placement", "rule", "componentRule", "classes", "highlightStyle", "className", "style", "bgColor", "bgColorHover", "bgColorActive", "children"]);
50
+ const ref = (0, react_1.createRef)();
51
+ const [targets, setTarget] = (0, react_1.useState)({});
52
+ // const scopeClass = useRef(`hl-scope-${v4()}`).current;
53
+ const [scopeClass, setScopeClass] = (0, react_1.useState)('');
54
+ (0, react_1.useEffect)(() => {
55
+ setScopeClass(`hl-scope-${(0, uuid_1.v4)()}`);
56
+ }, []);
57
+ const hasTargets = Object.entries(targets).length > 0;
58
+ // clear targets when disabled
59
+ (0, react_1.useEffect)(() => {
60
+ if (disabled)
61
+ setTarget({});
62
+ }, [disabled]);
63
+ const handlers = (0, hover_highlighter_1.useHoverHighlighter)((nextTarget) => setTarget(nextTarget ? { 'hover-target': nextTarget } : {}), rest, {
64
+ debounceDuration: hasTargets ? debounceSelection : 0,
65
+ scopeClass,
66
+ disabled: disabled || mode !== 'hover',
67
+ rule,
68
+ componentRule,
69
+ });
70
+ (0, children_highlighter_1.useChildrenHighlighter)({
71
+ onChange: setTarget,
72
+ scopeRef: ref,
73
+ scopeClass,
74
+ disabled: disabled || mode !== 'allChildren',
75
+ rule,
76
+ componentRule,
77
+ });
78
+ const _styles = (0, react_1.useMemo)(() => (Object.assign({ '--bit-highlighter-color': bgColor, '--bit-highlighter-color-hover': bgColorHover, '--bit-highlighter-color-active': bgColorActive }, style)), [bgColor, bgColorHover, bgColorActive, style]);
79
+ return (react_1.default.createElement("div", Object.assign({ ref: ref }, rest, handlers, { style: _styles, className: (0, classnames_1.default)(className, scopeClass), "data-nullify-component-highlight": true }),
80
+ children,
81
+ Object.entries(targets).map(([key, target]) => (react_1.default.createElement(element_highlighter_1.ElementHighlighter, { key: key, targetRef: { current: target.element }, components: target.components, classes: classes, style: highlightStyle, placement: placement, watchMotion: watchMotion })))));
82
+ }
83
+ //# sourceMappingURL=hybrid-highlighter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hybrid-highlighter.js","sourceRoot":"","sources":["../../hybrid-highlighter/hybrid-highlighter.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { HybridHighlighter } from './hybrid-highlighter';
2
+ export type { HybridHighlighterProps } from './hybrid-highlighter';
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HybridHighlighter = void 0;
4
+ var hybrid_highlighter_1 = require("./hybrid-highlighter");
5
+ Object.defineProperty(exports, "HybridHighlighter", { enumerable: true, get: function () { return hybrid_highlighter_1.HybridHighlighter; } });
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../hybrid-highlighter/index.ts"],"names":[],"mappings":";;;AAAA,2DAAyD;AAAhD,uHAAA,iBAAiB,OAAA"}