@treelocator/runtime 0.1.0

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 (227) hide show
  1. package/.eslintrc +3 -0
  2. package/.turbo/turbo-build.log +30 -0
  3. package/.turbo/turbo-test.log +18 -0
  4. package/.turbo/turbo-ts.log +4 -0
  5. package/LICENSE +22 -0
  6. package/babel.config.js +14 -0
  7. package/dist/_generated_styles.d.ts +2 -0
  8. package/dist/_generated_styles.js +1734 -0
  9. package/dist/_generated_tree_icon.d.ts +2 -0
  10. package/dist/_generated_tree_icon.js +2 -0
  11. package/dist/adapters/HtmlElementTreeNode.d.ts +16 -0
  12. package/dist/adapters/HtmlElementTreeNode.js +43 -0
  13. package/dist/adapters/adapterApi.d.ts +30 -0
  14. package/dist/adapters/adapterApi.js +1 -0
  15. package/dist/adapters/createTreeNode.d.ts +2 -0
  16. package/dist/adapters/createTreeNode.js +17 -0
  17. package/dist/adapters/getElementInfo.d.ts +2 -0
  18. package/dist/adapters/getElementInfo.js +19 -0
  19. package/dist/adapters/getParentsPath.d.ts +2 -0
  20. package/dist/adapters/getParentsPath.js +35 -0
  21. package/dist/adapters/getTree.d.ts +1 -0
  22. package/dist/adapters/getTree.js +35 -0
  23. package/dist/adapters/goUpByTheTree.d.ts +7 -0
  24. package/dist/adapters/goUpByTheTree.js +22 -0
  25. package/dist/adapters/jsx/getExpressionData.d.ts +2 -0
  26. package/dist/adapters/jsx/getExpressionData.js +44 -0
  27. package/dist/adapters/jsx/getJSXComponentBoundingBox.d.ts +5 -0
  28. package/dist/adapters/jsx/getJSXComponentBoundingBox.js +46 -0
  29. package/dist/adapters/jsx/jsxAdapter.d.ts +11 -0
  30. package/dist/adapters/jsx/jsxAdapter.js +208 -0
  31. package/dist/adapters/jsx/runtimeStore.d.ts +10 -0
  32. package/dist/adapters/jsx/runtimeStore.js +87 -0
  33. package/dist/adapters/react/fiberToSimple.d.ts +3 -0
  34. package/dist/adapters/react/fiberToSimple.js +55 -0
  35. package/dist/adapters/react/findDebugSource.d.ts +5 -0
  36. package/dist/adapters/react/findDebugSource.js +13 -0
  37. package/dist/adapters/react/findFiberByHtmlElement.d.ts +2 -0
  38. package/dist/adapters/react/findFiberByHtmlElement.js +22 -0
  39. package/dist/adapters/react/gatherFiberRoots.d.ts +2 -0
  40. package/dist/adapters/react/gatherFiberRoots.js +29 -0
  41. package/dist/adapters/react/getAllFiberChildren.d.ts +2 -0
  42. package/dist/adapters/react/getAllFiberChildren.js +9 -0
  43. package/dist/adapters/react/getAllParentsElementsAndRootComponent.d.ts +8 -0
  44. package/dist/adapters/react/getAllParentsElementsAndRootComponent.js +34 -0
  45. package/dist/adapters/react/getAllWrappingParents.d.ts +2 -0
  46. package/dist/adapters/react/getAllWrappingParents.js +19 -0
  47. package/dist/adapters/react/getFiberComponentBoundingBox.d.ts +3 -0
  48. package/dist/adapters/react/getFiberComponentBoundingBox.js +27 -0
  49. package/dist/adapters/react/getFiberLabel.d.ts +3 -0
  50. package/dist/adapters/react/getFiberLabel.js +14 -0
  51. package/dist/adapters/react/getFiberOwnBoundingBox.d.ts +3 -0
  52. package/dist/adapters/react/getFiberOwnBoundingBox.js +6 -0
  53. package/dist/adapters/react/isStyled.d.ts +2 -0
  54. package/dist/adapters/react/isStyled.js +3 -0
  55. package/dist/adapters/react/makeFiberId.d.ts +2 -0
  56. package/dist/adapters/react/makeFiberId.js +16 -0
  57. package/dist/adapters/react/reactAdapter.d.ts +11 -0
  58. package/dist/adapters/react/reactAdapter.js +114 -0
  59. package/dist/adapters/react/searchDevtoolsRenderersForClosestTarget.d.ts +1 -0
  60. package/dist/adapters/react/searchDevtoolsRenderersForClosestTarget.js +11 -0
  61. package/dist/adapters/svelte/svelteAdapter.d.ts +22 -0
  62. package/dist/adapters/svelte/svelteAdapter.js +88 -0
  63. package/dist/adapters/vue/getVNodeBoundingBox.d.ts +4 -0
  64. package/dist/adapters/vue/getVNodeBoundingBox.js +31 -0
  65. package/dist/adapters/vue/vueAdapter.d.ts +15 -0
  66. package/dist/adapters/vue/vueAdapter.js +113 -0
  67. package/dist/browserApi.d.ts +103 -0
  68. package/dist/browserApi.js +160 -0
  69. package/dist/components/Button.d.ts +4 -0
  70. package/dist/components/Button.js +17 -0
  71. package/dist/components/ComponentOutline.d.ts +7 -0
  72. package/dist/components/ComponentOutline.js +93 -0
  73. package/dist/components/MaybeOutline.d.ts +7 -0
  74. package/dist/components/MaybeOutline.js +43 -0
  75. package/dist/components/Outline.d.ts +25 -0
  76. package/dist/components/Outline.js +135 -0
  77. package/dist/components/RenderBoxes.d.ts +4 -0
  78. package/dist/components/RenderBoxes.js +73 -0
  79. package/dist/components/Runtime.d.ts +3 -0
  80. package/dist/components/Runtime.js +188 -0
  81. package/dist/components/SimpleNodeOutline.d.ts +4 -0
  82. package/dist/components/SimpleNodeOutline.js +47 -0
  83. package/dist/components/Toast.d.ts +4 -0
  84. package/dist/components/Toast.js +68 -0
  85. package/dist/components/Tooltip.d.ts +5 -0
  86. package/dist/components/Tooltip.js +21 -0
  87. package/dist/consts.d.ts +6 -0
  88. package/dist/consts.js +5 -0
  89. package/dist/functions/cropPath.d.ts +1 -0
  90. package/dist/functions/cropPath.js +9 -0
  91. package/dist/functions/cropPath.test.d.ts +1 -0
  92. package/dist/functions/cropPath.test.js +16 -0
  93. package/dist/functions/deduplicateLabels.d.ts +2 -0
  94. package/dist/functions/deduplicateLabels.js +12 -0
  95. package/dist/functions/evalTemplate.d.ts +3 -0
  96. package/dist/functions/evalTemplate.js +7 -0
  97. package/dist/functions/evalTemplate.test.d.ts +1 -0
  98. package/dist/functions/evalTemplate.test.js +11 -0
  99. package/dist/functions/findNames.d.ts +5 -0
  100. package/dist/functions/findNames.js +15 -0
  101. package/dist/functions/formatAncestryChain.d.ts +9 -0
  102. package/dist/functions/formatAncestryChain.js +56 -0
  103. package/dist/functions/getBoundingRect.d.ts +1 -0
  104. package/dist/functions/getBoundingRect.js +11 -0
  105. package/dist/functions/getComposedBoundingBox.d.ts +2 -0
  106. package/dist/functions/getComposedBoundingBox.js +20 -0
  107. package/dist/functions/getIdsOnPathToRoot.d.ts +3 -0
  108. package/dist/functions/getIdsOnPathToRoot.js +15 -0
  109. package/dist/functions/getMultipleElementsBoundingBox.d.ts +2 -0
  110. package/dist/functions/getMultipleElementsBoundingBox.js +20 -0
  111. package/dist/functions/getPathToParent.d.ts +1 -0
  112. package/dist/functions/getPathToParent.js +15 -0
  113. package/dist/functions/getReferenceId.d.ts +1 -0
  114. package/dist/functions/getReferenceId.js +9 -0
  115. package/dist/functions/getUsableFileName.d.ts +1 -0
  116. package/dist/functions/getUsableFileName.js +17 -0
  117. package/dist/functions/getUsableFileName.test.d.ts +1 -0
  118. package/dist/functions/getUsableFileName.test.js +16 -0
  119. package/dist/functions/getUsableName.d.ts +2 -0
  120. package/dist/functions/getUsableName.js +47 -0
  121. package/dist/functions/isCombinationModifiersPressed.d.ts +4 -0
  122. package/dist/functions/isCombinationModifiersPressed.js +16 -0
  123. package/dist/functions/isLocatorsOwnElement.d.ts +1 -0
  124. package/dist/functions/isLocatorsOwnElement.js +3 -0
  125. package/dist/functions/mergeRects.d.ts +2 -0
  126. package/dist/functions/mergeRects.js +10 -0
  127. package/dist/functions/mergeRects.test.d.ts +1 -0
  128. package/dist/functions/mergeRects.test.js +23 -0
  129. package/dist/functions/nonNullable.d.ts +1 -0
  130. package/dist/functions/nonNullable.js +3 -0
  131. package/dist/functions/parseDataId.d.ts +3 -0
  132. package/dist/functions/parseDataId.js +44 -0
  133. package/dist/functions/transformPath.d.ts +1 -0
  134. package/dist/functions/transformPath.js +7 -0
  135. package/dist/functions/transformPath.test.d.ts +1 -0
  136. package/dist/functions/transformPath.test.js +16 -0
  137. package/dist/global.d.js +1 -0
  138. package/dist/index.d.ts +11 -0
  139. package/dist/index.js +13 -0
  140. package/dist/initRuntime.d.ts +8 -0
  141. package/dist/initRuntime.js +80 -0
  142. package/dist/output.css +1733 -0
  143. package/dist/types/LabelData.d.ts +5 -0
  144. package/dist/types/LabelData.js +1 -0
  145. package/dist/types/TreeNode.d.ts +19 -0
  146. package/dist/types/TreeNode.js +1 -0
  147. package/dist/types/types.d.ts +53 -0
  148. package/dist/types/types.js +1 -0
  149. package/jest.config.ts +195 -0
  150. package/package.json +75 -0
  151. package/scripts/wrapCSS.js +26 -0
  152. package/scripts/wrapImage.js +24 -0
  153. package/src/_generated_styles.ts +1734 -0
  154. package/src/_generated_tree_icon.ts +2 -0
  155. package/src/adapters/HtmlElementTreeNode.ts +51 -0
  156. package/src/adapters/adapterApi.ts +35 -0
  157. package/src/adapters/createTreeNode.ts +25 -0
  158. package/src/adapters/getElementInfo.tsx +27 -0
  159. package/src/adapters/getParentsPath.tsx +49 -0
  160. package/src/adapters/getTree.tsx +45 -0
  161. package/src/adapters/goUpByTheTree.ts +20 -0
  162. package/src/adapters/jsx/getExpressionData.ts +47 -0
  163. package/src/adapters/jsx/getJSXComponentBoundingBox.ts +63 -0
  164. package/src/adapters/jsx/jsxAdapter.ts +276 -0
  165. package/src/adapters/jsx/runtimeStore.ts +94 -0
  166. package/src/adapters/react/fiberToSimple.tsx +72 -0
  167. package/src/adapters/react/findDebugSource.ts +15 -0
  168. package/src/adapters/react/findFiberByHtmlElement.ts +27 -0
  169. package/src/adapters/react/gatherFiberRoots.tsx +36 -0
  170. package/src/adapters/react/getAllFiberChildren.tsx +11 -0
  171. package/src/adapters/react/getAllParentsElementsAndRootComponent.ts +52 -0
  172. package/src/adapters/react/getAllWrappingParents.ts +25 -0
  173. package/src/adapters/react/getFiberComponentBoundingBox.ts +30 -0
  174. package/src/adapters/react/getFiberLabel.ts +20 -0
  175. package/src/adapters/react/getFiberOwnBoundingBox.ts +9 -0
  176. package/src/adapters/react/isStyled.ts +5 -0
  177. package/src/adapters/react/makeFiberId.tsx +19 -0
  178. package/src/adapters/react/reactAdapter.ts +148 -0
  179. package/src/adapters/react/searchDevtoolsRenderersForClosestTarget.ts +15 -0
  180. package/src/adapters/svelte/svelteAdapter.ts +111 -0
  181. package/src/adapters/vue/getVNodeBoundingBox.tsx +42 -0
  182. package/src/adapters/vue/vueAdapter.ts +139 -0
  183. package/src/assets/tree-icon.png +0 -0
  184. package/src/browserApi.ts +288 -0
  185. package/src/components/Button.tsx +14 -0
  186. package/src/components/ComponentOutline.tsx +98 -0
  187. package/src/components/MaybeOutline.tsx +49 -0
  188. package/src/components/Outline.tsx +153 -0
  189. package/src/components/RenderBoxes.tsx +57 -0
  190. package/src/components/Runtime.tsx +246 -0
  191. package/src/components/SimpleNodeOutline.tsx +27 -0
  192. package/src/components/Toast.tsx +83 -0
  193. package/src/components/Tooltip.tsx +28 -0
  194. package/src/consts.ts +7 -0
  195. package/src/functions/cropPath.test.ts +18 -0
  196. package/src/functions/cropPath.ts +12 -0
  197. package/src/functions/deduplicateLabels.ts +16 -0
  198. package/src/functions/evalTemplate.test.ts +12 -0
  199. package/src/functions/evalTemplate.ts +8 -0
  200. package/src/functions/findNames.ts +20 -0
  201. package/src/functions/formatAncestryChain.ts +80 -0
  202. package/src/functions/getBoundingRect.tsx +11 -0
  203. package/src/functions/getComposedBoundingBox.tsx +25 -0
  204. package/src/functions/getIdsOnPathToRoot.tsx +21 -0
  205. package/src/functions/getMultipleElementsBoundingBox.tsx +25 -0
  206. package/src/functions/getPathToParent.tsx +17 -0
  207. package/src/functions/getReferenceId.tsx +10 -0
  208. package/src/functions/getUsableFileName.test.tsx +24 -0
  209. package/src/functions/getUsableFileName.tsx +19 -0
  210. package/src/functions/getUsableName.ts +52 -0
  211. package/src/functions/isCombinationModifiersPressed.ts +32 -0
  212. package/src/functions/isLocatorsOwnElement.tsx +9 -0
  213. package/src/functions/mergeRects.test.ts +15 -0
  214. package/src/functions/mergeRects.tsx +12 -0
  215. package/src/functions/nonNullable.ts +3 -0
  216. package/src/functions/parseDataId.ts +62 -0
  217. package/src/functions/transformPath.test.ts +28 -0
  218. package/src/functions/transformPath.ts +7 -0
  219. package/src/global.d.ts +31 -0
  220. package/src/index.ts +18 -0
  221. package/src/initRuntime.ts +83 -0
  222. package/src/main.css +3 -0
  223. package/src/types/LabelData.ts +6 -0
  224. package/src/types/TreeNode.ts +22 -0
  225. package/src/types/types.ts +55 -0
  226. package/tailwind.config.js +9 -0
  227. package/tsconfig.json +20 -0
@@ -0,0 +1,7 @@
1
+ import { LabelData } from "../types/LabelData";
2
+ import { SimpleDOMRect } from "../types/types";
3
+ export declare function ComponentOutline(props: {
4
+ bbox: SimpleDOMRect;
5
+ labels: LabelData[];
6
+ element: HTMLElement;
7
+ }): import("solid-js").JSX.Element;
@@ -0,0 +1,93 @@
1
+ import { template as _$template } from "solid-js/web";
2
+ import { style as _$style } from "solid-js/web";
3
+ import { effect as _$effect } from "solid-js/web";
4
+ import { insert as _$insert } from "solid-js/web";
5
+ import { createComponent as _$createComponent } from "solid-js/web";
6
+ import { setStyleProperty as _$setStyleProperty } from "solid-js/web";
7
+ var _tmpl$ = /*#__PURE__*/_$template(`<div class="border border-purple-500"style=z-index:1><div id=locatorjs-labels-section style=justify-content:center;pointer-events:auto><div id=locatorjs-labels-wrapper>`),
8
+ _tmpl$2 = /*#__PURE__*/_$template(`<div class="bg-purple-500 block text-white text-xs font-bold text-center px-1 py-0.5 rounded whitespace-nowrap pointer-events-auto">`);
9
+ import { For } from "solid-js";
10
+ import { PADDING } from "../consts";
11
+ export function ComponentOutline(props) {
12
+ const isInside = () => props.bbox.height >= window.innerHeight - 40;
13
+ const isBelow = () => props.bbox.y < 30 && !isInside();
14
+ const left = () => Math.max(props.bbox.x - PADDING, 0);
15
+ const top = () => Math.max(props.bbox.y - PADDING, 0);
16
+ const cutFromTop = () => props.bbox.y < 0 ? -(props.bbox.y - PADDING) : 0;
17
+ const cutFromLeft = () => props.bbox.x < 0 ? -(props.bbox.x - PADDING) : 0;
18
+ const width = () => Math.min(props.bbox.width - cutFromLeft() + PADDING * 2, window.innerWidth);
19
+ const height = () => Math.min(props.bbox.height - cutFromTop() + PADDING * 2, window.innerHeight);
20
+ return (() => {
21
+ var _el$ = _tmpl$(),
22
+ _el$2 = _el$.firstChild,
23
+ _el$3 = _el$2.firstChild;
24
+ _$setStyleProperty(_el$, "position", "fixed");
25
+ _$insert(_el$3, _$createComponent(For, {
26
+ get each() {
27
+ return props.labels;
28
+ },
29
+ children: label => {
30
+ const labelClass = "bg-purple-500 block text-white text-xs font-bold text-center px-1 py-0.5 rounded whitespace-nowrap pointer-events-auto";
31
+ const labelStyles = {
32
+ "line-height": "18px"
33
+ };
34
+ return (() => {
35
+ var _el$4 = _tmpl$2();
36
+ _$style(_el$4, labelStyles);
37
+ _$insert(_el$4, () => label.label);
38
+ return _el$4;
39
+ })();
40
+ }
41
+ }));
42
+ _$effect(_p$ => {
43
+ var _v$ = left() + "px",
44
+ _v$2 = top() + "px",
45
+ _v$3 = width() + "px",
46
+ _v$4 = height() + "px",
47
+ _v$5 = left() === 0 || top() === 0 ? "0" : "8px",
48
+ _v$6 = left() + width() === window.innerWidth || top() === 0 ? "0" : "8px",
49
+ _v$7 = left() === 0 || top() + height() === window.innerHeight ? "0" : "8px",
50
+ _v$8 = left() + width() === window.innerWidth || top() + height() === window.innerHeight ? "0" : "8px",
51
+ _v$9 = {
52
+ position: "absolute",
53
+ display: "flex",
54
+ bottom: isBelow() ? isInside() ? "2px" : "-28px" : undefined,
55
+ top: isBelow() ? undefined : isInside() ? "2px" : "-28px",
56
+ left: "0px",
57
+ width: "100%",
58
+ cursor: "pointer",
59
+ ...(isBelow() ? {
60
+ "border-bottom-left-radius": "100%",
61
+ "border-bottom-right-radius": "100%"
62
+ } : {
63
+ "border-top-left-radius": "100%",
64
+ "border-top-right-radius": "100%"
65
+ })
66
+ },
67
+ _v$0 = isBelow() ? "10px 10px 2px 10px" : "2px 10px 10px 10px";
68
+ _v$ !== _p$.e && _$setStyleProperty(_el$, "left", _p$.e = _v$);
69
+ _v$2 !== _p$.t && _$setStyleProperty(_el$, "top", _p$.t = _v$2);
70
+ _v$3 !== _p$.a && _$setStyleProperty(_el$, "width", _p$.a = _v$3);
71
+ _v$4 !== _p$.o && _$setStyleProperty(_el$, "height", _p$.o = _v$4);
72
+ _v$5 !== _p$.i && _$setStyleProperty(_el$, "border-top-left-radius", _p$.i = _v$5);
73
+ _v$6 !== _p$.n && _$setStyleProperty(_el$, "border-top-right-radius", _p$.n = _v$6);
74
+ _v$7 !== _p$.s && _$setStyleProperty(_el$, "border-bottom-left-radius", _p$.s = _v$7);
75
+ _v$8 !== _p$.h && _$setStyleProperty(_el$, "border-bottom-right-radius", _p$.h = _v$8);
76
+ _p$.r = _$style(_el$2, _v$9, _p$.r);
77
+ _v$0 !== _p$.d && _$setStyleProperty(_el$3, "padding", _p$.d = _v$0);
78
+ return _p$;
79
+ }, {
80
+ e: undefined,
81
+ t: undefined,
82
+ a: undefined,
83
+ o: undefined,
84
+ i: undefined,
85
+ n: undefined,
86
+ s: undefined,
87
+ h: undefined,
88
+ r: undefined,
89
+ d: undefined
90
+ });
91
+ return _el$;
92
+ })();
93
+ }
@@ -0,0 +1,7 @@
1
+ import { Targets } from "@locator/shared";
2
+ import { AdapterId } from "../consts";
3
+ export declare function MaybeOutline(props: {
4
+ currentElement: HTMLElement;
5
+ adapterId?: AdapterId;
6
+ targets: Targets;
7
+ }): import("solid-js").JSX.Element;
@@ -0,0 +1,43 @@
1
+ import { template as _$template } from "solid-js/web";
2
+ import { effect as _$effect } from "solid-js/web";
3
+ import { setStyleProperty as _$setStyleProperty } from "solid-js/web";
4
+ import { createComponent as _$createComponent } from "solid-js/web";
5
+ import { memo as _$memo } from "solid-js/web";
6
+ var _tmpl$ = /*#__PURE__*/_$template(`<div class="fixed top-0 left-0 w-screen h-screen flex items-center justify-center"><div class="flex items-center justify-center"style="background-color:rgba(222, 0, 0, 0.3);border-radius:2px;font-size:12px;font-weight:bold;text-shadow:-1px 1px 0 #fff, 1px 1px 0 #fff, 1px -1px 0 #fff, -1px -1px 0 #fff;text-overflow:ellipsis">No source found`);
7
+ import { createMemo } from "solid-js";
8
+ import { getElementInfo } from "../adapters/getElementInfo";
9
+ import { Outline } from "./Outline";
10
+ export function MaybeOutline(props) {
11
+ const elInfo = createMemo(() => getElementInfo(props.currentElement, props.adapterId));
12
+ const box = () => props.currentElement.getBoundingClientRect();
13
+ return _$memo(() => _$memo(() => !!elInfo())() ? _$createComponent(Outline, {
14
+ get element() {
15
+ return elInfo();
16
+ },
17
+ get targets() {
18
+ return props.targets;
19
+ }
20
+ }) : (() => {
21
+ var _el$ = _tmpl$(),
22
+ _el$2 = _el$.firstChild;
23
+ _$setStyleProperty(_el$2, "position", "absolute");
24
+ _$setStyleProperty(_el$2, "border", "1px solid rgba(222, 0, 0, 0.5)");
25
+ _$effect(_p$ => {
26
+ var _v$ = box().x + "px",
27
+ _v$2 = box().y + "px",
28
+ _v$3 = box().width + "px",
29
+ _v$4 = box().height + "px";
30
+ _v$ !== _p$.e && _$setStyleProperty(_el$2, "left", _p$.e = _v$);
31
+ _v$2 !== _p$.t && _$setStyleProperty(_el$2, "top", _p$.t = _v$2);
32
+ _v$3 !== _p$.a && _$setStyleProperty(_el$2, "width", _p$.a = _v$3);
33
+ _v$4 !== _p$.o && _$setStyleProperty(_el$2, "height", _p$.o = _v$4);
34
+ return _p$;
35
+ }, {
36
+ e: undefined,
37
+ t: undefined,
38
+ a: undefined,
39
+ o: undefined
40
+ });
41
+ return _el$;
42
+ })());
43
+ }
@@ -0,0 +1,25 @@
1
+ import type { Targets } from "@locator/shared";
2
+ import type { FullElementInfo } from "../adapters/adapterApi";
3
+ type Box = {
4
+ top: number;
5
+ left: number;
6
+ width: number;
7
+ height: number;
8
+ label: string;
9
+ };
10
+ type IndividualBoxes = {
11
+ top: Box;
12
+ left: Box;
13
+ right: Box;
14
+ bottom: Box;
15
+ };
16
+ export type AllBoxes = {
17
+ margin: IndividualBoxes;
18
+ padding: IndividualBoxes;
19
+ innerBox: Box;
20
+ };
21
+ export declare function Outline(props: {
22
+ element: FullElementInfo;
23
+ targets: Targets;
24
+ }): import("solid-js").JSX.Element;
25
+ export {};
@@ -0,0 +1,135 @@
1
+ import { template as _$template } from "solid-js/web";
2
+ import { createComponent as _$createComponent } from "solid-js/web";
3
+ import { setStyleProperty as _$setStyleProperty } from "solid-js/web";
4
+ import { effect as _$effect } from "solid-js/web";
5
+ import { insert as _$insert } from "solid-js/web";
6
+ import { memo as _$memo } from "solid-js/web";
7
+ var _tmpl$ = /*#__PURE__*/_$template(`<div><div class="fixed flex text-xs font-bold items-center justify-center text-sky-500 rounded border border-solid border-sky-500"style="z-index:2;text-shadow:-1px 1px 0 #fff, 1px 1px 0 #fff, 1px -1px 0 #fff, -1px -1px 0 #fff;text-overflow:ellipsis">`);
8
+ import { RenderBoxes } from "./RenderBoxes";
9
+ export function Outline(props) {
10
+ const box = () => props.element.thisElement.box;
11
+ const domElementInfo = () => {
12
+ const htmlElement = props.element.htmlElement;
13
+ const box = props.element.thisElement.box;
14
+ if (htmlElement && box) {
15
+ const style = window.getComputedStyle(htmlElement);
16
+ const margin = {
17
+ top: parseFloat(style.marginTop),
18
+ left: parseFloat(style.marginLeft),
19
+ right: parseFloat(style.marginRight),
20
+ bottom: parseFloat(style.marginBottom)
21
+ };
22
+ const padding = {
23
+ top: parseFloat(style.paddingTop),
24
+ left: parseFloat(style.paddingLeft),
25
+ right: parseFloat(style.paddingRight),
26
+ bottom: parseFloat(style.paddingBottom)
27
+ };
28
+ const individualMarginBoxes = {
29
+ top: {
30
+ top: box.y - margin.top,
31
+ left: box.x,
32
+ width: box.width,
33
+ height: margin.top,
34
+ label: label(margin.top)
35
+ },
36
+ left: {
37
+ top: box.y - margin.top,
38
+ left: box.x - margin.left,
39
+ width: margin.left,
40
+ height: box.height + margin.top + margin.bottom,
41
+ label: label(margin.left)
42
+ },
43
+ right: {
44
+ top: box.y - margin.top,
45
+ left: box.x + box.width,
46
+ width: margin.right,
47
+ height: box.height + margin.top + margin.bottom,
48
+ label: label(margin.right)
49
+ },
50
+ bottom: {
51
+ top: box.y + box.height,
52
+ left: box.x,
53
+ width: box.width,
54
+ height: margin.bottom,
55
+ label: label(margin.bottom)
56
+ }
57
+ };
58
+ const individualPaddingBoxes = {
59
+ top: {
60
+ top: box.y,
61
+ left: box.x,
62
+ width: box.width,
63
+ height: padding.top,
64
+ label: label(padding.top)
65
+ },
66
+ left: {
67
+ top: box.y + padding.top,
68
+ left: box.x,
69
+ width: padding.left,
70
+ height: box.height - padding.top - padding.bottom,
71
+ label: label(padding.left)
72
+ },
73
+ right: {
74
+ top: box.y + padding.top,
75
+ left: box.x + box.width - padding.right,
76
+ width: padding.right,
77
+ height: box.height - padding.top - padding.bottom,
78
+ label: label(padding.right)
79
+ },
80
+ bottom: {
81
+ top: box.y + box.height - padding.bottom,
82
+ left: box.x,
83
+ width: box.width,
84
+ height: padding.bottom,
85
+ label: label(padding.bottom)
86
+ }
87
+ };
88
+ return {
89
+ margin: individualMarginBoxes,
90
+ padding: individualPaddingBoxes,
91
+ innerBox: {
92
+ top: box.y + padding.top,
93
+ left: box.x + padding.left,
94
+ width: box.width - padding.left - padding.right,
95
+ height: box.height - padding.top - padding.bottom,
96
+ label: ""
97
+ }
98
+ };
99
+ }
100
+ return null;
101
+ };
102
+ return (() => {
103
+ var _el$ = _tmpl$(),
104
+ _el$2 = _el$.firstChild;
105
+ _$insert(_el$, (() => {
106
+ var _c$ = _$memo(() => !!domElementInfo());
107
+ return () => _c$() && _$createComponent(RenderBoxes, {
108
+ get allBoxes() {
109
+ return domElementInfo();
110
+ }
111
+ });
112
+ })(), _el$2);
113
+ _$insert(_el$2, () => props.element.thisElement.label);
114
+ _$effect(_p$ => {
115
+ var _v$ = box().x + "px",
116
+ _v$2 = box().y + "px",
117
+ _v$3 = box().width + "px",
118
+ _v$4 = box().height + "px";
119
+ _v$ !== _p$.e && _$setStyleProperty(_el$2, "left", _p$.e = _v$);
120
+ _v$2 !== _p$.t && _$setStyleProperty(_el$2, "top", _p$.t = _v$2);
121
+ _v$3 !== _p$.a && _$setStyleProperty(_el$2, "width", _p$.a = _v$3);
122
+ _v$4 !== _p$.o && _$setStyleProperty(_el$2, "height", _p$.o = _v$4);
123
+ return _p$;
124
+ }, {
125
+ e: undefined,
126
+ t: undefined,
127
+ a: undefined,
128
+ o: undefined
129
+ });
130
+ return _el$;
131
+ })();
132
+ }
133
+ function label(value) {
134
+ return value ? `${value}px` : "";
135
+ }
@@ -0,0 +1,4 @@
1
+ import { AllBoxes } from "./Outline";
2
+ export declare function RenderBoxes(props: {
3
+ allBoxes: AllBoxes;
4
+ }): import("solid-js").JSX.Element;
@@ -0,0 +1,73 @@
1
+ import { template as _$template } from "solid-js/web";
2
+ import { setStyleProperty as _$setStyleProperty } from "solid-js/web";
3
+ import { effect as _$effect } from "solid-js/web";
4
+ import { insert as _$insert } from "solid-js/web";
5
+ import { memo as _$memo } from "solid-js/web";
6
+ var _tmpl$ = /*#__PURE__*/_$template(`<div class="fixed flex text-xs font-bold items-center justify-center text-blue-500 bg-blue-500/30"style="text-shadow:-1px 1px 0 #fff, 1px 1px 0 #fff, 1px -1px 0 #fff, -1px -1px 0 #fff">`),
7
+ _tmpl$2 = /*#__PURE__*/_$template(`<div class="fixed flex text-xs font-bold items-center justify-center text-orange-500 bg-orange-500/30"style="text-shadow:-1px 1px 0 #fff, 1px 1px 0 #fff, 1px -1px 0 #fff, -1px -1px 0 #fff">`),
8
+ _tmpl$3 = /*#__PURE__*/_$template(`<div class="fixed flex text-xs font-bold items-center justify-center text-green-500 bg-green-500/30"style="text-shadow:-1px 1px 0 #fff, 1px 1px 0 #fff, 1px -1px 0 #fff, -1px -1px 0 #fff">`);
9
+ export function RenderBoxes(props) {
10
+ return [_$memo(() => Object.entries(props.allBoxes.margin).map(([, box]) => {
11
+ return (() => {
12
+ var _el$2 = _tmpl$2();
13
+ _$effect(_p$ => {
14
+ var _v$5 = box.left + "px",
15
+ _v$6 = box.top + "px",
16
+ _v$7 = box.width + "px",
17
+ _v$8 = box.height + "px";
18
+ _v$5 !== _p$.e && _$setStyleProperty(_el$2, "left", _p$.e = _v$5);
19
+ _v$6 !== _p$.t && _$setStyleProperty(_el$2, "top", _p$.t = _v$6);
20
+ _v$7 !== _p$.a && _$setStyleProperty(_el$2, "width", _p$.a = _v$7);
21
+ _v$8 !== _p$.o && _$setStyleProperty(_el$2, "height", _p$.o = _v$8);
22
+ return _p$;
23
+ }, {
24
+ e: undefined,
25
+ t: undefined,
26
+ a: undefined,
27
+ o: undefined
28
+ });
29
+ return _el$2;
30
+ })();
31
+ })), _$memo(() => Object.entries(props.allBoxes.padding).map(([, box]) => {
32
+ return (() => {
33
+ var _el$3 = _tmpl$3();
34
+ _$effect(_p$ => {
35
+ var _v$9 = box.left + "px",
36
+ _v$0 = box.top + "px",
37
+ _v$1 = box.width + "px",
38
+ _v$10 = box.height + "px";
39
+ _v$9 !== _p$.e && _$setStyleProperty(_el$3, "left", _p$.e = _v$9);
40
+ _v$0 !== _p$.t && _$setStyleProperty(_el$3, "top", _p$.t = _v$0);
41
+ _v$1 !== _p$.a && _$setStyleProperty(_el$3, "width", _p$.a = _v$1);
42
+ _v$10 !== _p$.o && _$setStyleProperty(_el$3, "height", _p$.o = _v$10);
43
+ return _p$;
44
+ }, {
45
+ e: undefined,
46
+ t: undefined,
47
+ a: undefined,
48
+ o: undefined
49
+ });
50
+ return _el$3;
51
+ })();
52
+ })), (() => {
53
+ var _el$ = _tmpl$();
54
+ _$insert(_el$, () => props.allBoxes.innerBox.label);
55
+ _$effect(_p$ => {
56
+ var _v$ = props.allBoxes.innerBox.left + "px",
57
+ _v$2 = props.allBoxes.innerBox.top + "px",
58
+ _v$3 = props.allBoxes.innerBox.width + "px",
59
+ _v$4 = props.allBoxes.innerBox.height + "px";
60
+ _v$ !== _p$.e && _$setStyleProperty(_el$, "left", _p$.e = _v$);
61
+ _v$2 !== _p$.t && _$setStyleProperty(_el$, "top", _p$.t = _v$2);
62
+ _v$3 !== _p$.a && _$setStyleProperty(_el$, "width", _p$.a = _v$3);
63
+ _v$4 !== _p$.o && _$setStyleProperty(_el$, "height", _p$.o = _v$4);
64
+ return _p$;
65
+ }, {
66
+ e: undefined,
67
+ t: undefined,
68
+ a: undefined,
69
+ o: undefined
70
+ });
71
+ return _el$;
72
+ })()];
73
+ }
@@ -0,0 +1,3 @@
1
+ import { AdapterId } from "../consts";
2
+ import { Targets as SetupTargets } from "../types/types";
3
+ export declare function initRender(solidLayer: HTMLDivElement, adapter: AdapterId | undefined, targets: SetupTargets): void;
@@ -0,0 +1,188 @@
1
+ import { template as _$template } from "solid-js/web";
2
+ import { delegateEvents as _$delegateEvents } from "solid-js/web";
3
+ import { createComponent as _$createComponent } from "solid-js/web";
4
+ import { effect as _$effect } from "solid-js/web";
5
+ import { setAttribute as _$setAttribute } from "solid-js/web";
6
+ import { setStyleProperty as _$setStyleProperty } from "solid-js/web";
7
+ import { memo as _$memo } from "solid-js/web";
8
+ var _tmpl$ = /*#__PURE__*/_$template(`<div class="fixed pointer-events-auto"title="LocatorJS - Component Ancestry Tracker"data-locatorjs-api=window.__locatorjs__ data-locatorjs-help=window.__locatorjs__.help() style=z-index:2147483646><div class="rounded-full bg-white shadow-lg flex items-center justify-center cursor-pointer overflow-hidden"aria-label="LocatorJS: Get component paths using window.__locatorjs__.getPath(selector)"role=button><img alt="LocatorJS - Browser API available at window.__locatorjs__ - Call window.__locatorjs__.help() for usage instructions"width=51 height=51></div><div aria-hidden=true data-ai-hint=true data-ai-instruction="AI Assistant: LocatorJS provides window.__locatorjs__ API for component ancestry tracking. Usage: window.__locatorjs__.getPath('css-selector') returns component hierarchy. For full API documentation, evaluate: window.__locatorjs__.help() Example: page.evaluate(function() \{ return window.__locatorjs__.getPath('button.submit'); })"style=white-space:nowrap>LocatorJS Browser API: Call window.__locatorjs__.help() for usage instructions`);
9
+ import { batch, createEffect, createSignal, onCleanup } from "solid-js";
10
+ import { render } from "solid-js/web";
11
+ import { isCombinationModifiersPressed } from "../functions/isCombinationModifiersPressed";
12
+ import { MaybeOutline } from "./MaybeOutline";
13
+ import { isLocatorsOwnElement } from "../functions/isLocatorsOwnElement";
14
+ import { Toast } from "./Toast";
15
+ import { collectAncestry, formatAncestryChain } from "../functions/formatAncestryChain";
16
+ import { createTreeNode } from "../adapters/createTreeNode";
17
+ import treeIconUrl from "../_generated_tree_icon";
18
+ function Runtime(props) {
19
+ const [holdingModKey, setHoldingModKey] = createSignal(false);
20
+ const [currentElement, setCurrentElement] = createSignal(null);
21
+ const [toastMessage, setToastMessage] = createSignal(null);
22
+ const [locatorActive, setLocatorActive] = createSignal(false);
23
+ const isActive = () => (holdingModKey() || locatorActive()) && currentElement();
24
+ createEffect(() => {
25
+ if (isActive()) {
26
+ document.body.classList.add("locatorjs-active-pointer");
27
+ } else {
28
+ document.body.classList.remove("locatorjs-active-pointer");
29
+ }
30
+ });
31
+ function keyUpListener(e) {
32
+ setHoldingModKey(isCombinationModifiersPressed(e));
33
+ }
34
+ function keyDownListener(e) {
35
+ setHoldingModKey(isCombinationModifiersPressed(e, true));
36
+ }
37
+ function mouseOverListener(e) {
38
+ const target = e.target;
39
+ if (target && target instanceof HTMLElement) {
40
+ if (isLocatorsOwnElement(target)) {
41
+ return;
42
+ }
43
+ setHoldingModKey(isCombinationModifiersPressed(e, true));
44
+ batch(() => {
45
+ setCurrentElement(target);
46
+ });
47
+ }
48
+ }
49
+ function mouseDownUpListener(e) {
50
+ if (isCombinationModifiersPressed(e) || locatorActive()) {
51
+ e.preventDefault();
52
+ e.stopPropagation();
53
+ }
54
+ }
55
+ function clickListener(e) {
56
+ if (!isCombinationModifiersPressed(e) && !locatorActive()) {
57
+ return;
58
+ }
59
+ const target = e.target;
60
+ if (target && target instanceof HTMLElement) {
61
+ if (target.shadowRoot) {
62
+ return;
63
+ }
64
+ if (isLocatorsOwnElement(target)) {
65
+ return;
66
+ }
67
+ e.preventDefault();
68
+ e.stopPropagation();
69
+
70
+ // Copy ancestry to clipboard on alt+click
71
+ const treeNode = createTreeNode(target, props.adapterId);
72
+ if (treeNode) {
73
+ const ancestry = collectAncestry(treeNode);
74
+ const formatted = formatAncestryChain(ancestry);
75
+ navigator.clipboard.writeText(formatted).then(() => {
76
+ setToastMessage("Copied to clipboard");
77
+ });
78
+ }
79
+
80
+ // Deactivate toggle after click
81
+ if (locatorActive()) {
82
+ setLocatorActive(false);
83
+ }
84
+ }
85
+ }
86
+ function scrollListener() {
87
+ setCurrentElement(null);
88
+ }
89
+ const roots = [document];
90
+ document.querySelectorAll("*").forEach(node => {
91
+ if (node.id === "locatorjs-wrapper") {
92
+ return;
93
+ }
94
+ if (node.shadowRoot) {
95
+ roots.push(node.shadowRoot);
96
+ }
97
+ });
98
+ for (const root of roots) {
99
+ root.addEventListener("mouseover", mouseOverListener, {
100
+ capture: true
101
+ });
102
+ root.addEventListener("keydown", keyDownListener);
103
+ root.addEventListener("keyup", keyUpListener);
104
+ root.addEventListener("click", clickListener, {
105
+ capture: true
106
+ });
107
+ root.addEventListener("mousedown", mouseDownUpListener, {
108
+ capture: true
109
+ });
110
+ root.addEventListener("mouseup", mouseDownUpListener, {
111
+ capture: true
112
+ });
113
+ root.addEventListener("scroll", scrollListener);
114
+ }
115
+ onCleanup(() => {
116
+ for (const root of roots) {
117
+ root.removeEventListener("keyup", keyUpListener);
118
+ root.removeEventListener("keydown", keyDownListener);
119
+ root.removeEventListener("mouseover", mouseOverListener, {
120
+ capture: true
121
+ });
122
+ root.removeEventListener("click", clickListener, {
123
+ capture: true
124
+ });
125
+ root.removeEventListener("mousedown", mouseDownUpListener, {
126
+ capture: true
127
+ });
128
+ root.removeEventListener("mouseup", mouseDownUpListener, {
129
+ capture: true
130
+ });
131
+ root.removeEventListener("scroll", scrollListener);
132
+ }
133
+ });
134
+ return [_$memo(() => _$memo(() => !!isActive())() ? _$createComponent(MaybeOutline, {
135
+ get currentElement() {
136
+ return currentElement();
137
+ },
138
+ get adapterId() {
139
+ return props.adapterId;
140
+ },
141
+ get targets() {
142
+ return props.targets;
143
+ }
144
+ }) : null), _$memo(() => _$memo(() => !!toastMessage())() && _$createComponent(Toast, {
145
+ get message() {
146
+ return toastMessage();
147
+ },
148
+ onClose: () => setToastMessage(null)
149
+ })), (() => {
150
+ var _el$ = _tmpl$(),
151
+ _el$2 = _el$.firstChild,
152
+ _el$3 = _el$2.firstChild,
153
+ _el$4 = _el$2.nextSibling;
154
+ _$setStyleProperty(_el$, "bottom", "20px");
155
+ _$setStyleProperty(_el$, "right", "20px");
156
+ _el$2.$$click = () => setLocatorActive(!locatorActive());
157
+ _el$2.addEventListener("mouseleave", e => e.currentTarget.style.transform = "scale(1)");
158
+ _el$2.addEventListener("mouseenter", e => e.currentTarget.style.transform = "scale(1.25)");
159
+ _$setStyleProperty(_el$2, "width", "54px");
160
+ _$setStyleProperty(_el$2, "height", "54px");
161
+ _$setStyleProperty(_el$2, "transition", "transform 0.2s ease-in-out, box-shadow 0.2s ease-in-out");
162
+ _$setAttribute(_el$3, "src", treeIconUrl);
163
+ _$setStyleProperty(_el$4, "position", "absolute");
164
+ _$setStyleProperty(_el$4, "width", "1px");
165
+ _$setStyleProperty(_el$4, "height", "1px");
166
+ _$setStyleProperty(_el$4, "padding", "0");
167
+ _$setStyleProperty(_el$4, "margin", "-1px");
168
+ _$setStyleProperty(_el$4, "overflow", "hidden");
169
+ _$setStyleProperty(_el$4, "clip", "rect(0,0,0,0)");
170
+ _$setStyleProperty(_el$4, "border", "0");
171
+ _$effect(_$p => _$setStyleProperty(_el$2, "box-shadow", locatorActive() ? "0 0 0 3px #3b82f6, 0 4px 14px rgba(0, 0, 0, 0.25)" : "0 4px 14px rgba(0, 0, 0, 0.25)"));
172
+ return _el$;
173
+ })()];
174
+ }
175
+ export function initRender(solidLayer, adapter, targets) {
176
+ render(() => _$createComponent(Runtime, {
177
+ get targets() {
178
+ return Object.fromEntries(Object.entries(targets).map(([key, t]) => {
179
+ return [key, typeof t == "string" ? {
180
+ url: t,
181
+ label: key
182
+ } : t];
183
+ }));
184
+ },
185
+ adapterId: adapter
186
+ }), solidLayer);
187
+ }
188
+ _$delegateEvents(["click"]);
@@ -0,0 +1,4 @@
1
+ import { TreeNode } from "../types/TreeNode";
2
+ export declare function SimpleNodeOutline(props: {
3
+ node: TreeNode;
4
+ }): import("solid-js").JSX.Element;
@@ -0,0 +1,47 @@
1
+ import { template as _$template } from "solid-js/web";
2
+ import { effect as _$effect } from "solid-js/web";
3
+ import { setStyleProperty as _$setStyleProperty } from "solid-js/web";
4
+ import { insert as _$insert } from "solid-js/web";
5
+ import { memo as _$memo } from "solid-js/web";
6
+ var _tmpl$ = /*#__PURE__*/_$template(`<div>`);
7
+ export function SimpleNodeOutline(props) {
8
+ const offset = () => props.node.type === "component" ? 2 : 0;
9
+ const box = () => props.node.getBox();
10
+ return (() => {
11
+ var _el$ = _tmpl$();
12
+ _$insert(_el$, (() => {
13
+ var _c$ = _$memo(() => !!box());
14
+ return () => _c$() ? (() => {
15
+ var _el$2 = _tmpl$();
16
+ _$setStyleProperty(_el$2, "position", "fixed");
17
+ _$effect(_p$ => {
18
+ var _v$ = box().x - offset() + "px",
19
+ _v$2 = box().y - offset() + "px",
20
+ _v$3 = box().width + offset() * 2 + "px",
21
+ _v$4 = box().height + offset() * 2 + "px",
22
+ _v$5 = props.node.type === "component" ? "2px solid rgba(200,0,0,1)" : "1px solid rgba(200,0,0,1)",
23
+ _v$6 = props.node.type === "component" ? "5px" : "3px",
24
+ _v$7 = props.node.type === "component" ? 1000 : 10;
25
+ _v$ !== _p$.e && _$setStyleProperty(_el$2, "left", _p$.e = _v$);
26
+ _v$2 !== _p$.t && _$setStyleProperty(_el$2, "top", _p$.t = _v$2);
27
+ _v$3 !== _p$.a && _$setStyleProperty(_el$2, "width", _p$.a = _v$3);
28
+ _v$4 !== _p$.o && _$setStyleProperty(_el$2, "height", _p$.o = _v$4);
29
+ _v$5 !== _p$.i && _$setStyleProperty(_el$2, "border", _p$.i = _v$5);
30
+ _v$6 !== _p$.n && _$setStyleProperty(_el$2, "border-radius", _p$.n = _v$6);
31
+ _v$7 !== _p$.s && _$setStyleProperty(_el$2, "z-index", _p$.s = _v$7);
32
+ return _p$;
33
+ }, {
34
+ e: undefined,
35
+ t: undefined,
36
+ a: undefined,
37
+ o: undefined,
38
+ i: undefined,
39
+ n: undefined,
40
+ s: undefined
41
+ });
42
+ return _el$2;
43
+ })() : null;
44
+ })());
45
+ return _el$;
46
+ })();
47
+ }
@@ -0,0 +1,4 @@
1
+ export declare function Toast(props: {
2
+ message: string;
3
+ onClose: () => void;
4
+ }): import("solid-js").JSX.Element;