Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

rearchitect devtools #78

Draft
wants to merge 183 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
183 commits
Select commit Hold shift + click to select a range
2c20200
initial, sdk status on icon
bryce-fitzsimons Jan 15, 2025
3d33c84
small changes
bryce-fitzsimons Jan 15, 2025
b7df4d4
more status stuff, tab scoping
bryce-fitzsimons Jan 16, 2025
16bb696
more refactors
bryce-fitzsimons Jan 17, 2025
46a51bf
cleanup webpack
bryce-fitzsimons Jan 17, 2025
1981be8
alias imports
bryce-fitzsimons Jan 18, 2025
02b2130
fix css import
bryce-fitzsimons Jan 18, 2025
15121e6
refactors
bryce-fitzsimons Jan 18, 2025
7ba4914
radix support
bryce-fitzsimons Jan 20, 2025
0e897c7
stuf
bryce-fitzsimons Jan 22, 2025
622afb4
useTabState() hook to make popup-managed IO simpler
bryce-fitzsimons Jan 22, 2025
b04229b
useGlobalState hook
bryce-fitzsimons Jan 22, 2025
1b436dd
fix hooks, add persistence to global state
bryce-fitzsimons Jan 22, 2025
ed91b15
Temp
Kevin-Chant Jan 22, 2025
7dbfba1
Add tab components, useTabState for data
Kevin-Chant Jan 22, 2025
9e8d5f0
Re-add test buttons
Kevin-Chant Jan 22, 2025
68a1675
Persist tabState to sessionStorage
Kevin-Chant Jan 22, 2025
55cf918
new settings form using global state hook
bryce-fitzsimons Jan 23, 2025
fa89a02
support missing state (use default), better forms, icons
bryce-fitzsimons Jan 23, 2025
bfbd61f
fix modal flicker
bryce-fitzsimons Jan 23, 2025
2edaa19
Fix sessionstorage key
Kevin-Chant Jan 23, 2025
f5ffee3
Add broadcasts for tabstate changes & listen in useTabState
Kevin-Chant Jan 23, 2025
f151d3a
ui
bryce-fitzsimons Jan 23, 2025
5f96836
Make tabState follow the messaging pattern of globalState
Kevin-Chant Jan 23, 2025
a62ea27
Move message broadcast inside helper
Kevin-Chant Jan 23, 2025
c543121
Start building user attributes page, move sdk info to separate pane
Kevin-Chant Jan 24, 2025
2efc235
Move state optimistic updates forward
Kevin-Chant Jan 24, 2025
9a5909d
ui stuff
bryce-fitzsimons Jan 27, 2025
daa5904
fix multi-tab state flickering
bryce-fitzsimons Jan 27, 2025
5e5f0bd
ui
bryce-fitzsimons Jan 27, 2025
825b06f
ui
bryce-fitzsimons Jan 27, 2025
856e558
inital plumbing
Jan 27, 2025
5e201da
tiny change and added sdkFound
Jan 27, 2025
ea2e451
Move globalState optimistic update forward
Kevin-Chant Jan 27, 2025
f45523f
mutate fields
bryce-fitzsimons Jan 27, 2025
18203af
testing
Jan 27, 2025
2a914c6
Merge remote-tracking branch 'origin/rearchitect-devtools' into rearc…
Jan 27, 2025
6a5e1da
eslint
Jan 27, 2025
8213b69
ui
bryce-fitzsimons Jan 27, 2025
8ed8e2e
post message
Jan 27, 2025
0ab0bbf
rig up attributes form
bryce-fitzsimons Jan 27, 2025
ed9d686
add custom attribute fields
bryce-fitzsimons Jan 28, 2025
b3c47d4
ui
bryce-fitzsimons Jan 28, 2025
9ee35ad
rigging up saving users (wip)
bryce-fitzsimons Jan 28, 2025
88eacb8
hot fix
Jan 28, 2025
a16b7c4
save archetypes, kinda working
bryce-fitzsimons Jan 28, 2025
73ba0f6
Add useApi and populate list of archetypes from GB api
Kevin-Chant Jan 28, 2025
8b63c58
Fix archetype form not resetting on change
Kevin-Chant Jan 28, 2025
e9fa2d6
fix state set bug
bryce-fitzsimons Jan 28, 2025
27040cb
fix state set bug
bryce-fitzsimons Jan 28, 2025
7afe4a2
Swap format of archetypes
Kevin-Chant Jan 28, 2025
b589771
sdk working
Jan 28, 2025
d13b01d
Merge remote-tracking branch 'origin/rearchitect-devtools' into rearc…
Jan 28, 2025
f3c9893
fix sdk tab
bryce-fitzsimons Jan 29, 2025
8dffedc
gb eval hook, fix messaging and state, start on features tab
bryce-fitzsimons Jan 29, 2025
7d71f1c
features wip
bryce-fitzsimons Jan 29, 2025
f54e3c9
more robust sdk Checks
Jan 29, 2025
1c6e6f0
Merge remote-tracking branch 'origin/rearchitect-devtools' into rearc…
Jan 29, 2025
c41ff9a
sdk tab with new data
Jan 29, 2025
e915312
basic stuff working in the tab section for sdk
Jan 29, 2025
90266ce
Load attribute schema from API, start adding Archetype accordion
Kevin-Chant Jan 29, 2025
e6c35bb
added some support for old version
Jan 29, 2025
29a87f5
Style improvements for Archetypes
Kevin-Chant Jan 29, 2025
5ad166b
Merge branch 'rearchitect-devtools' of github.com:growthbook/devtools…
Kevin-Chant Jan 29, 2025
4cc2493
features wip
bryce-fitzsimons Jan 29, 2025
cd53267
ui
bryce-fitzsimons Jan 29, 2025
c041934
ui
bryce-fitzsimons Jan 29, 2025
7288be8
fix stuff
bryce-fitzsimons Jan 30, 2025
70380f8
text removal and some other stuff
Jan 30, 2025
2dd1c49
Merge remote-tracking branch 'origin/rearchitect-devtools' into rearc…
Jan 30, 2025
a593975
clientKey added to sdkData
Jan 30, 2025
2251020
added usestate
Jan 30, 2025
d9e9db7
Validate apikey before using in api
Kevin-Chant Jan 30, 2025
55e5314
More attribute/archetype functionality
Kevin-Chant Jan 30, 2025
4f87551
features ui
bryce-fitzsimons Jan 30, 2025
d40dcb7
value fields
bryce-fitzsimons Jan 30, 2025
59f55fc
ff overrides wip
bryce-fitzsimons Jan 31, 2025
d4b679a
features overrides working, UI wip
bryce-fitzsimons Jan 31, 2025
321dc65
this might fix it
Jan 31, 2025
aefae57
exp overrides kinda working
bryce-fitzsimons Feb 1, 2025
c688194
clean up archetypes list, tab scollTo
bryce-fitzsimons Feb 1, 2025
dc42561
monkeypatches, fix loop
bryce-fitzsimons Feb 1, 2025
6a55034
ui
bryce-fitzsimons Feb 1, 2025
849cf5e
ui
bryce-fitzsimons Feb 1, 2025
3824715
support devtools panel entrypoint
bryce-fitzsimons Feb 2, 2025
5ea0054
ui
bryce-fitzsimons Feb 2, 2025
ea6b753
temp removing the payload since im not happy with how it looks and wh…
Feb 3, 2025
b6590eb
Merge remote-tracking branch 'origin/rearchitect-devtools' into rearc…
Feb 3, 2025
61a0ffd
ui/animation
bryce-fitzsimons Feb 3, 2025
47fce76
fix the ol switcharoo
bryce-fitzsimons Feb 3, 2025
e5fe01b
slightly optimize builds
bryce-fitzsimons Feb 3, 2025
459da17
added tracking callback
Feb 3, 2025
0f81354
tracking callback log
Feb 3, 2025
1788f9f
sdk Logs
Feb 3, 2025
d21b362
added one for trackingcallback
Feb 3, 2025
4d41004
sanity check
Feb 3, 2025
87a80f7
fix (kinda) webpack css
bryce-fitzsimons Feb 3, 2025
34a6c2c
fixed a whoops
Feb 3, 2025
924be4f
fixed another woops
Feb 3, 2025
88ecf9a
fixed some more stuff
Feb 3, 2025
9b24876
show feature flag experiments in experiments tab
bryce-fitzsimons Feb 4, 2025
3ba489c
Change monkeypatching to use gb.logs
Kevin-Chant Feb 4, 2025
9946129
Merge branch 'rearchitect-devtools' of github.com:growthbook/devtools…
Kevin-Chant Feb 4, 2025
5130284
fix force value display for featureExperiments
bryce-fitzsimons Feb 4, 2025
902d469
Fix appending state not working
Kevin-Chant Feb 4, 2025
62805ba
Merge branch 'rearchitect-devtools' of github.com:growthbook/devtools…
Kevin-Chant Feb 4, 2025
35f4700
dev mode forced
Feb 4, 2025
4c9c3d7
added debug mode to true
Feb 4, 2025
8e1af27
webpack devmode
bryce-fitzsimons Feb 4, 2025
59017b5
remove unneeded bundle, improve asset sizes
bryce-fitzsimons Feb 4, 2025
05aeb8f
more webpack stuff
bryce-fitzsimons Feb 4, 2025
8c385fb
Remove unneeded devmode check
Kevin-Chant Feb 4, 2025
ecd4c8d
Add logtype filtering and timestamps
Kevin-Chant Feb 4, 2025
b7b8ffe
Merge remote-tracking branch 'origin/rearchitect-devtools' into rearc…
Feb 4, 2025
180f109
styles wip
bryce-fitzsimons Feb 5, 2025
1351980
features ui
bryce-fitzsimons Feb 5, 2025
a384e40
get initial state hydration working(?)
bryce-fitzsimons Feb 5, 2025
cdcd9cf
Merge remote-tracking branch 'origin/rearchitect-devtools' into rearc…
Feb 5, 2025
fb7a565
fix persistent state bugs with overrides
bryce-fitzsimons Feb 5, 2025
1fd7206
Merge remote-tracking branch 'origin/rearchitect-devtools' into rearc…
Feb 5, 2025
ea2194c
styles
bryce-fitzsimons Feb 6, 2025
1584ab3
ui wip
bryce-fitzsimons Feb 6, 2025
d30b566
ui wip
bryce-fitzsimons Feb 6, 2025
bef9216
rules display WIP, styles
bryce-fitzsimons Feb 7, 2025
150ceb5
Add payload to evaluator and misc css changes
Kevin-Chant Feb 7, 2025
4672740
Undo making elements sticky
Kevin-Chant Feb 7, 2025
01f94b5
wip rule exp
bryce-fitzsimons Feb 7, 2025
08ab29d
wip rule exp
bryce-fitzsimons Feb 7, 2025
8b57419
rule exp
bryce-fitzsimons Feb 7, 2025
7c8f57b
more rule wip
bryce-fitzsimons Feb 7, 2025
8855d9a
more rule stuff
bryce-fitzsimons Feb 7, 2025
59f0837
Start improving logs tab
Kevin-Chant Feb 7, 2025
a51f279
Merge branch 'rearchitect-devtools' of github.com:growthbook/devtools…
Kevin-Chant Feb 7, 2025
1f7afb7
more features stuff
bryce-fitzsimons Feb 8, 2025
b06fd1d
margins
bryce-fitzsimons Feb 8, 2025
e263ec5
lint
bryce-fitzsimons Feb 8, 2025
6ca5c07
ui
bryce-fitzsimons Feb 8, 2025
69de0b2
fix embed script fetch loop
bryce-fitzsimons Feb 8, 2025
bde9c2b
gb link
bryce-fitzsimons Feb 8, 2025
02f296e
rule-specific debug ui
bryce-fitzsimons Feb 9, 2025
b41e76e
rule-specific debug ui (gating rules)
bryce-fitzsimons Feb 9, 2025
a2f03e7
ui cleanup
bryce-fitzsimons Feb 9, 2025
ecca0fd
ui
bryce-fitzsimons Feb 10, 2025
e5219ef
ui
bryce-fitzsimons Feb 10, 2025
69957cc
forgot to push my stuff up last week
Feb 10, 2025
17c79c7
Merge remote-tracking branch 'origin/rearchitect-devtools' into rearc…
Feb 10, 2025
259aade
ui
bryce-fitzsimons Feb 10, 2025
069ae53
fixed
Feb 10, 2025
6812a56
Merge remote-tracking branch 'origin/rearchitect-devtools' into rearc…
Feb 10, 2025
6664c61
Move valuefield to separate file, start updating logs
Kevin-Chant Feb 10, 2025
a176ca7
scrollbar/ui stuff
bryce-fitzsimons Feb 10, 2025
170317f
quick code tidy
Feb 10, 2025
9dbefb9
show status for default value
bryce-fitzsimons Feb 10, 2025
1c8a5e1
Merge remote-tracking branch 'origin/rearchitect-devtools' into rearc…
Feb 10, 2025
8d3bd89
payload update
Feb 10, 2025
b5f7b8d
made sdk part of the current tab
Feb 10, 2025
b832a95
style
Feb 10, 2025
80e9363
updated decryption stuff
Feb 10, 2025
b04520b
removed :
Feb 10, 2025
43fcd9c
Logs styling
Kevin-Chant Feb 10, 2025
cd8d7a1
Minor style fixes
Kevin-Chant Feb 10, 2025
45cf93c
ui
bryce-fitzsimons Feb 11, 2025
640bc7e
ui
bryce-fitzsimons Feb 11, 2025
6cec424
refactors
bryce-fitzsimons Feb 11, 2025
1aa0922
Change appliedArchetype logic, try to debug save modal
Kevin-Chant Feb 11, 2025
5a26de4
Merge branch 'rearchitect-devtools' of github.com:growthbook/devtools…
Kevin-Chant Feb 11, 2025
5289181
Fix saveArchetypeForm
Kevin-Chant Feb 11, 2025
7d56852
features ui
bryce-fitzsimons Feb 11, 2025
2212add
features search
bryce-fitzsimons Feb 11, 2025
7a6785f
ui
bryce-fitzsimons Feb 11, 2025
c4c08ee
add list button
bryce-fitzsimons Feb 11, 2025
9368446
stuff
Feb 11, 2025
90691c6
ui
bryce-fitzsimons Feb 11, 2025
5c7fcc1
basic side thing needs design and better wording
Feb 11, 2025
4481765
Merge remote-tracking branch 'origin/rearchitect-devtools' into rearc…
Feb 11, 2025
0de95dd
Attributes/Archetypes overhaul
Kevin-Chant Feb 11, 2025
5e55e72
Minor fixes
Kevin-Chant Feb 11, 2025
ae146d2
Add clear button for attributeform
Kevin-Chant Feb 11, 2025
bcfde2f
Fix bottom cta styling
Kevin-Chant Feb 11, 2025
2f2a5e0
Move save warning text below save button
Kevin-Chant Feb 11, 2025
6e61b63
experiments wip
bryce-fitzsimons Feb 12, 2025
3abdbe8
fix heights in html
bryce-fitzsimons Feb 12, 2025
dc5dfe3
Start adding delete/rename for local archetypes
Kevin-Chant Feb 12, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
97 changes: 97 additions & 0 deletions .eslintrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
{
"env": {
"node": true,
"browser": true,
"es6": true
},
"settings": {
"react": {
"version": "detect"
},
"import/parsers": {
"@typescript-eslint/parser": [".ts", ".tsx"]
},
"import/resolver": {
"node": true,
"typescript": {
"alwaysTryTypes": true,
"project": ["./tsconfig.json"]
}
}
},
"parser": "@typescript-eslint/parser",
"plugins": [
"react",
"@typescript-eslint",
"prettier",
"no-async-foreach"
],
"extends": [
"eslint:recommended",
"plugin:import/recommended",
"plugin:import/typescript",
"plugin:react/recommended",
"plugin:@typescript-eslint/eslint-recommended",
"plugin:@typescript-eslint/recommended",
"plugin:prettier/recommended",
"plugin:react-hooks/recommended"
],
"parserOptions": {
"ecmaFeatures": {
"jsx": true
},
"ecmaVersion": 2018,
"sourceType": "module"
},
"globals": {
"Atomics": "readonly",
"SharedArrayBuffer": "readonly"
},
"rules": {
"no-unused-expressions": [
"error",
{
"allowShortCircuit": true,
"enforceForJSX": true,
"allowTernary": true
}
],
"no-async-foreach/no-async-foreach": 2,
"@typescript-eslint/explicit-module-boundary-types": "off",
"@typescript-eslint/explicit-function-return-type": "off",
"@typescript-eslint/no-explicit-any": 1,
"@typescript-eslint/no-inferrable-types": [
"warn",
{
"ignoreParameters": true
}
],
"@typescript-eslint/no-unused-vars": [
"warn",
{
"argsIgnorePattern": "^_"
}
],
"no-console": ["warn"],
"no-restricted-imports": "off",
"react/react-in-jsx-scope": "off",
"react/prop-types": "off",
"react-hooks/rules-of-hooks": "error",
"react-hooks/exhaustive-deps": "warn",
"import/order": [
"error",
{
"groups": [
"builtin",
"external",
"internal",
"parent",
"sibling",
"index",
"unknown"
]
}
],
"@typescript-eslint/prefer-ts-expect-error": "error"
}
}
45 changes: 42 additions & 3 deletions devtools.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import {
FetchVisualChangesetPayload,
TransformCopyPayload,
UpdateVisualChangesetPayload,
} from "./src/background";
} from "@/background/visualEditorHandlers";

declare global {
interface Window {
Expand Down Expand Up @@ -152,6 +152,16 @@ type TransformCopyResponseMessage = {
data: TransformCopyPayload;
};

type UpdateTabState = {
append?: boolean;
type: "UPDATE_TAB_STATE";
data: {
property: string;
value: unknown;
tabId: number;
};
};

// Messages sent to content script
export type Message =
| RequestRefreshMessage
Expand All @@ -165,7 +175,8 @@ export type Message =
| UpdateVisualChangesetRequestMessage
| UpdateVisualChangesetResponseMessage
| TransformCopyRequestMessage
| TransformCopyResponseMessage;
| TransformCopyResponseMessage
| UpdateTabState;

export type BGLoadVisualChangsetMessage = {
type: "BG_LOAD_VISUAL_CHANGESET";
Expand All @@ -191,8 +202,36 @@ export type BGTransformCopyMessage = {
};
};

type SDKHealthCheckResult = {
canConnect: boolean;
hasPayload: boolean;
hasClientKey?: boolean;
errorMessage?: string;
version?: string;
sdkFound: boolean;
clientKey?: string;
isLoading?: boolean;
payload?: Record<string, any>;
devModeEnabled: boolean;
hasTrackingCallback?: boolean;
trackingCallbackParams?: string[];
hasDecryptionKey?: boolean;
payloadDecrypted?:boolean;
usingLogEvents?: boolean;
isRemoteEval?: boolean;
usingStickyBucketing?: boolean;
streaming?: boolean;
apiHost?: string;
};

type BGSetSDKUsageData = {
type: "GB_SDK_UPDATED";
data: SDKHealthCheckResult & { tabId?: number };
};

// Messages sent to background script
export type BGMessage =
| BGLoadVisualChangsetMessage
| BGUpdateVisualChangsetMessage
| BGTransformCopyMessage;
| BGTransformCopyMessage
| BGSetSDKUsageData;
23 changes: 20 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,12 @@
"@emotion/styled": "^11.13.0",
"@growthbook/growthbook": "^1.3.1",
"@medv/finder": "^3.2.0",
"@phosphor-icons/react": "^2.1.7",
"@radix-ui/colors": "^3.0.0",
"@radix-ui/react-accordion": "^1.2.0",
"@radix-ui/react-form": "^0.1.1",
"@radix-ui/react-tooltip": "^1.1.2",
"@radix-ui/themes": "^3.1.3",
"clsx": "^2.1.1",
"dom-mutator": "^0.7.0",
"framer-motion": "^11.3.24",
Expand All @@ -36,19 +40,33 @@
"react-icons": "^5.3.0",
"react-syntax-highlighter": "^15.5.0",
"react-textarea-autosize": "^8.5.3",
"style-to-object": "^1.0.6"
"style-to-object": "^1.0.6",
"swr": "^2.3.0",
"uniqid": "^5.4.0"
},
"devDependencies": {
"@types/chrome": "^0.0.270",
"@types/eslint": "^8.4.5",
"@types/jest": "^29.5.12",
"@types/react": "^18.2.0",
"@types/react-dom": "^18.2.0",
"@types/react-syntax-highlighter": "^15.5.13",
"@types/uniqid": "^5.3.4",
"@typescript-eslint/eslint-plugin": "^8.22.0",
"@typescript-eslint/parser": "^8.22.0",
"autoprefixer": "^10.4.20",
"copy-webpack-plugin": "^12.0.2",
"css-loader": "^7.1.2",
"eslint": "^8.20.0",
"eslint-config-prettier": "^6.11.0",
"eslint-import-resolver-typescript": "^3.5.1",
"eslint-plugin-import": "^2.26.0",
"eslint-plugin-no-async-foreach": "^0.1.1",
"eslint-plugin-prettier": "^3.1.3",
"eslint-plugin-react": "^7.30.1",
"glob": "^11.0.0",
"jest": "^29.7.0",
"mini-css-extract-plugin": "^2.9.2",
"node-fetch": "^3.3.2",
"postcss": "^8.4.41",
"postcss-loader": "^8.1.1",
Expand All @@ -61,7 +79,6 @@
"typescript": "^5.5.4",
"url-loader": "^4.1.1",
"webpack": "^5.97.1",
"webpack-cli": "^6.0.1",
"webpack-merge": "^6.0.1"
"webpack-cli": "^6.0.1"
}
}
9 changes: 5 additions & 4 deletions public/devtools_panel.html
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
<!DOCTYPE html>
<html>
<html style="background: #fff; position: relative; overflow-y: hidden; min-height: 100vh;">
<head>
<meta charset="UTF-8">
<title>GrowthBook DevTools</title>
<link rel="stylesheet" href="css/popup.css">
</head>

<body>
<body style="overflow-y: hidden;">
<div id="root"></div>
<script src="js/devtools_panel.js"></script>
<script src="js/popup.js"></script>
</body>
</html>
Binary file added public/logo128-connected.png
bryce-fitzsimons marked this conversation as resolved.
Show resolved Hide resolved
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/logo128-problem.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/logo128.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file removed public/logo192.png
Binary file not shown.
12 changes: 6 additions & 6 deletions public/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,9 @@
"resources": [
"js/devtools_embed_script.js",
"js/visual_editor.js",
"js/logo192.png",
"js/create-api-key.png",
"options.html"
"js/logo128.png",
"js/logo128-connected.png",
"js/logo128-problem.png"
]
}
],
Expand All @@ -35,9 +35,9 @@
"host_permissions": ["<all_urls>"],

"icons": {
"16": "logo192.png",
"48": "logo192.png",
"128": "logo192.png"
"16": "logo128.png",
"48": "logo128.png",
"128": "logo128.png"
},

"devtools_page": "devtools.html",
Expand Down
16 changes: 9 additions & 7 deletions public/popup.html
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
<!DOCTYPE html>
<html>
<head>
<html style="background: #fff; position: relative; overflow-y: hidden; width: 700px; height: 550px;">
<head>
<meta charset="UTF-8">
<title>GrowthBook DevTools</title>
</head>
<body>
<div id="root"></div>
<script src="js/popup.js"></script>
</body>
<link rel="stylesheet" href="css/popup.css">
</head>
<body style="overflow-y: hidden;">
<div id="root"></div>
<script src="js/popup.js"></script>
</body>
</html>
Loading