diff --git a/README.md b/README.md
index 8480aee..d0d95fd 100644
--- a/README.md
+++ b/README.md
@@ -18,6 +18,8 @@ To use Keyword Highlighter, simply click on the extension icon in the top right-
Keyword Highlighter uses storage to store user settings and preferences, making it easy to access them every time the extension is used. This feature provides a more personalized and seamless experience for the user.
+![](/docs/chrome-web-store/Screenshot_2.png)
+
## Contributions
If you'd like to contribute to Keyword Highlighter, please feel free to submit a pull request. We welcome any feedback or suggestions to improve the functionality of the extension.
diff --git a/docs/chrome-web-store/Screenshot_1.png b/docs/chrome-web-store/Screenshot_1.png
index 390a913..2f1cde5 100644
Binary files a/docs/chrome-web-store/Screenshot_1.png and b/docs/chrome-web-store/Screenshot_1.png differ
diff --git a/docs/chrome-web-store/Screenshot_2.png b/docs/chrome-web-store/Screenshot_2.png
new file mode 100644
index 0000000..c8cd1da
Binary files /dev/null and b/docs/chrome-web-store/Screenshot_2.png differ
diff --git a/manifest.ts b/manifest.ts
index 78b1231..7f12b9f 100644
--- a/manifest.ts
+++ b/manifest.ts
@@ -14,7 +14,6 @@ const manifest: chrome.runtime.ManifestV3 = {
type: "module",
},
action: {
- default_popup: "src/pages/popup/index.html",
default_icon: "icon-34.png",
},
icons: {
diff --git a/package.json b/package.json
index 4e3d6cf..76965f4 100644
--- a/package.json
+++ b/package.json
@@ -17,6 +17,11 @@
},
"type": "module",
"dependencies": {
+ "@emotion/react": "^11.11.0",
+ "@emotion/styled": "^11.11.0",
+ "@fontsource/roboto": "^4.5.8",
+ "@mui/icons-material": "^5.11.16",
+ "@mui/material": "^5.12.3",
"lodash.debounce": "^4.0.8",
"lodash.throttle": "^4.1.1",
"react": "18.2.0",
diff --git a/public/manifest.json b/public/manifest.json
index 7716c32..f00bdee 100644
--- a/public/manifest.json
+++ b/public/manifest.json
@@ -9,26 +9,17 @@
"type": "module"
},
"action": {
- "default_popup": "src/pages/popup/index.html",
"default_icon": "icon-34.png"
},
"icons": {
"128": "icon-128.png"
},
- "permissions": [
- "storage"
- ],
+ "permissions": ["storage"],
"content_scripts": [
{
- "matches": [
- "https://www.linkedin.com/*"
- ],
- "js": [
- "src/pages/content/index.js"
- ],
- "css": [
- "assets/css/contentStyle16834373313.chunk.css"
- ]
+ "matches": ["https://www.linkedin.com/*"],
+ "js": ["src/pages/content/index.js"],
+ "css": ["assets/css/contentStyle16836018082.chunk.css"]
}
],
"web_accessible_resources": [
@@ -39,9 +30,7 @@
"icon-128.png",
"icon-34.png"
],
- "matches": [
- "*://*/*"
- ]
+ "matches": ["*://*/*"]
}
]
-}
\ No newline at end of file
+}
diff --git a/src/pages/background/index.ts b/src/pages/background/index.ts
index 305028c..2919b17 100644
--- a/src/pages/background/index.ts
+++ b/src/pages/background/index.ts
@@ -1,5 +1,11 @@
import reloadOnUpdate from "virtual:reload-on-update-in-background-script";
+chrome.action.setPopup({ popup: '' });
+
+chrome.action.onClicked.addListener(() => {
+ chrome.tabs.create({ url: 'src/pages/options/index.html' });
+});
+
reloadOnUpdate("pages/background");
/**
diff --git a/src/pages/content/components/App.tsx b/src/pages/content/components/App.tsx
index f320648..ac0b8ae 100644
--- a/src/pages/content/components/App.tsx
+++ b/src/pages/content/components/App.tsx
@@ -1,31 +1,35 @@
import { useEffect, useState } from "react";
-import { get } from "@services/storage/storageService";
-import {
- SETTINGS_KEYWORDS,
- OBSERVABLE_DEBOUNCE_TIME_MS,
-} from "@services/constants";
+import { OBSERVABLE_DEBOUNCE_TIME_MS } from "@services/constants";
+import { getRules } from "@src/services/storage/optionsService";
+import { IKeywordRule } from "@src/pages/options/components/KeywordRule";
import Highlighter from "./Highlighter";
export default function App() {
- const [keywords, setKeywords] = useState("");
+ const [rules, setRules] = useState([]);
+
+ const map = (rule: IKeywordRule) => {
+ return {
+ className: rule.id,
+ keywords: rule.keywords,
+ styles: rule.cssStyles,
+ };
+ };
useEffect(() => {
- get(SETTINGS_KEYWORDS).then((result) => {
- const keywords = result?.[SETTINGS_KEYWORDS] || null;
- if (keywords) {
- setKeywords(keywords);
- }
+ getRules().then((rules) => {
+ setRules(rules.map(map));
});
}, []);
- if (!keywords) {
- return;
- }
-
return (
-
+ <>
+ {rules.map((rule) => (
+
+ ))}
+ >
);
}
diff --git a/src/pages/content/components/Highlighter.tsx b/src/pages/content/components/Highlighter.tsx
index b465199..ab24d9d 100644
--- a/src/pages/content/components/Highlighter.tsx
+++ b/src/pages/content/components/Highlighter.tsx
@@ -1,4 +1,4 @@
-import React, { useCallback, useEffect, useMemo } from "react";
+import React, { useCallback, useMemo } from "react";
import { findAndWrap } from "@src/lib/findAndWrapHTMLNodes";
import useMutationObservable, {
DEFAULT_OPTIONS,
@@ -7,19 +7,21 @@ import useMutationObservable, {
interface HighlighterProps {
debounceTimeMs: number;
keywords: string;
+ highlightedClassName: string;
}
export default function Highlighter({
debounceTimeMs,
keywords,
+ highlightedClassName,
}: HighlighterProps) {
const onMutation = useCallback(() => {
findAndWrap(document.body, {
findTextRegExp: new RegExp(keywords.replaceAll(",", "|"), "gi"),
wrapWithTag: "span",
- wrapWithClassName: "highlighted",
+ wrapWithClassName: highlightedClassName,
wrapIf: (node: Text) => {
- return !node.parentElement.classList.contains("highlighted");
+ return !node.parentElement.classList.contains(highlightedClassName);
},
});
}, []);
diff --git a/src/pages/content/components/index.tsx b/src/pages/content/components/index.tsx
index b281ab4..2824e9f 100644
--- a/src/pages/content/components/index.tsx
+++ b/src/pages/content/components/index.tsx
@@ -2,12 +2,9 @@ import { createRoot } from "react-dom/client";
import DebugPopup from "@src/pages/content/components/DebugPopup";
import App from "@src/pages/content/components/App";
import { get } from "@services/storage/storageService";
-import {
- SETTINGS_DEBUG,
- SETTINGS_HIGHLIGHTED_STYLES,
- SETTINGS_HIGHLIGHTED_STYLES_DEFAULT_VALUE,
-} from "@services/constants";
+import { SETTINGS_DEBUG, SETTINGS_KEYWORD_RULES } from "@services/constants";
import refreshOnUpdate from "virtual:reload-on-update-in-view";
+import { getRules } from "@src/services/storage/optionsService";
refreshOnUpdate("pages/content");
@@ -36,20 +33,16 @@ const initApp = () => {
createRoot(root).render();
};
-const addStyleBlock = (styles: string) => {
+const addStyleBlock = (className: string, styles: string) => {
var sheet = document.createElement("style");
- sheet.innerHTML = `.highlighted { ${styles} }`;
+ sheet.innerHTML = `.${className} { ${styles} }`;
document.body.appendChild(sheet);
};
const initStyles = () => {
- const key = SETTINGS_HIGHLIGHTED_STYLES,
- defaultValue = SETTINGS_HIGHLIGHTED_STYLES_DEFAULT_VALUE;
-
- get(key).then((result) => {
- const highlightedStyles = result?.[key] || defaultValue;
- if (highlightedStyles) {
- addStyleBlock(highlightedStyles);
+ getRules().then((styles) => {
+ for (const style of styles) {
+ addStyleBlock(style.id, style.cssStyles);
}
});
};
diff --git a/src/pages/newtab/Newtab.css b/src/pages/newtab/Newtab.css
deleted file mode 100644
index 74b5e05..0000000
--- a/src/pages/newtab/Newtab.css
+++ /dev/null
@@ -1,38 +0,0 @@
-.App {
- text-align: center;
-}
-
-.App-logo {
- height: 40vmin;
- pointer-events: none;
-}
-
-@media (prefers-reduced-motion: no-preference) {
- .App-logo {
- animation: App-logo-spin infinite 20s linear;
- }
-}
-
-.App-header {
- background-color: #282c34;
- min-height: 100vh;
- display: flex;
- flex-direction: column;
- align-items: center;
- justify-content: center;
- font-size: calc(10px + 2vmin);
- color: white;
-}
-
-.App-link {
- color: #61dafb;
-}
-
-@keyframes App-logo-spin {
- from {
- transform: rotate(0deg);
- }
- to {
- transform: rotate(360deg);
- }
-}
diff --git a/src/pages/newtab/Newtab.scss b/src/pages/newtab/Newtab.scss
deleted file mode 100644
index 8960c7b..0000000
--- a/src/pages/newtab/Newtab.scss
+++ /dev/null
@@ -1,10 +0,0 @@
-$myColor: red;
-
-h1,
-h2,
-h3,
-h4,
-h5,
-h6 {
- color: $myColor;
-}
diff --git a/src/pages/newtab/Newtab.tsx b/src/pages/newtab/Newtab.tsx
deleted file mode 100644
index b63a57f..0000000
--- a/src/pages/newtab/Newtab.tsx
+++ /dev/null
@@ -1,28 +0,0 @@
-import React from "react";
-import logo from "@assets/img/logo.svg";
-import "@pages/newtab/Newtab.css";
-import "@pages/newtab/Newtab.scss";
-
-const Newtab = () => {
- return (
-
- );
-};
-
-export default Newtab;
diff --git a/src/pages/newtab/index.css b/src/pages/newtab/index.css
deleted file mode 100644
index ec2585e..0000000
--- a/src/pages/newtab/index.css
+++ /dev/null
@@ -1,13 +0,0 @@
-body {
- margin: 0;
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
- 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
- sans-serif;
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale;
-}
-
-code {
- font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',
- monospace;
-}
diff --git a/src/pages/newtab/index.html b/src/pages/newtab/index.html
deleted file mode 100644
index 0d5481b..0000000
--- a/src/pages/newtab/index.html
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
- New tab
-
-
-
-
-
-
-
diff --git a/src/pages/newtab/index.tsx b/src/pages/newtab/index.tsx
deleted file mode 100644
index 950551b..0000000
--- a/src/pages/newtab/index.tsx
+++ /dev/null
@@ -1,18 +0,0 @@
-import React from "react";
-import { createRoot } from "react-dom/client";
-import Newtab from "@pages/newtab/Newtab";
-import "@pages/newtab/index.css";
-import refreshOnUpdate from "virtual:reload-on-update-in-view";
-
-refreshOnUpdate("pages/newtab");
-
-function init() {
- const appContainer = document.querySelector("#app-container");
- if (!appContainer) {
- throw new Error("Can not find #app-container");
- }
- const root = createRoot(appContainer);
- root.render();
-}
-
-init();
diff --git a/src/pages/options/Options.tsx b/src/pages/options/Options.tsx
index 28d8fe9..400421e 100644
--- a/src/pages/options/Options.tsx
+++ b/src/pages/options/Options.tsx
@@ -1,8 +1,174 @@
-import React from "react";
+import React, { useEffect, useState } from "react";
+import CssBaseline from "@mui/material/CssBaseline";
+import Box from "@mui/material/Box";
+import Button from "@mui/material/Button";
+import Container from "@mui/material/Container";
+import Paper from "@mui/material/Paper";
+import Grid from "@mui/material/Grid";
+import Typography from "@mui/material/Typography";
+import TextField from "@mui/material/TextField";
+import FormControlLabel from "@mui/material/FormControlLabel";
+import Checkbox from "@mui/material/Checkbox";
+import Divider from "@mui/material/Divider";
+import { createTheme, ThemeProvider } from "@mui/material/styles";
+import { get, set } from "@services/storage/storageService";
+import { uid } from "@services/uidService";
import "@pages/options/Options.css";
+import {
+ SETTINGS_DEBUG,
+ SETTINGS_KEYWORD_RULES,
+ TEXT_OPTIONS,
+ TEXT_OPTIONS_DISPLAY_DEBUG,
+ TEXT_OPTIONS_SAVED_SUCCESSFULLY,
+} from "@src/services/constants";
+import Header from "./components/Header";
+import KeywordRule, { IKeywordRule } from "./components/KeywordRule";
-const Options: React.FC = () => {
- return Options
;
-};
+const theme = createTheme();
-export default Options;
+export default function Options() {
+ const [displayDebug, setDisplayDebug] = useState(false);
+ const [rules, setRules] = useState([]);
+
+ useEffect(() => {
+ initForm();
+ }, []);
+
+ const initForm = () => {
+ get([SETTINGS_DEBUG, SETTINGS_KEYWORD_RULES]).then((result) => {
+ setDisplayDebug(result?.[SETTINGS_DEBUG] || false);
+ setRules(result?.[SETTINGS_KEYWORD_RULES] || [createRule()]);
+ });
+ };
+
+ const handleDisplayDebugChange = (
+ event: React.ChangeEvent
+ ) => {
+ setDisplayDebug(event.target.checked);
+ };
+
+ const handleAddRule = () => {
+ const newRule = createRule();
+ setRules([...rules, newRule]);
+ };
+
+ const createRule = () => {
+ return {
+ id: uid(),
+ keywords: null,
+ cssStyles: null,
+ enabledOn: null,
+ };
+ };
+
+ const handleRuleChange = (rule: IKeywordRule) => {
+ const newRules = [...rules];
+ const index = newRules.findIndex((item) => item.id === rule.id);
+ newRules[index] = { ...newRules[index], ...rule };
+ setRules(newRules);
+ };
+
+ const handleDeleteRule = (rule: IKeywordRule) => {
+ const newRules = rules.filter((item) => item.id !== rule.id);
+ if (!newRules.length) {
+ newRules.push(createRule());
+ }
+ setRules(newRules);
+ };
+
+ const handleApply = async () => {
+ await set({
+ [SETTINGS_DEBUG]: displayDebug,
+ [SETTINGS_KEYWORD_RULES]: rules,
+ });
+ alert(TEXT_OPTIONS_SAVED_SUCCESSFULLY);
+ };
+
+ const handleCancel = () => initForm();
+
+ const handleReset = () => {
+ const newRules = [createRule()];
+ setRules(newRules);
+ setDisplayDebug(false);
+ };
+
+ return (
+
+
+
+
+
+
+ {TEXT_OPTIONS}
+
+
+
+ {rules.map((rule) => (
+
+ ))}
+
+
+
+
+
+
+
+
+
+ }
+ label={TEXT_OPTIONS_DISPLAY_DEBUG}
+ />
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/pages/options/components/Header.tsx b/src/pages/options/components/Header.tsx
new file mode 100644
index 0000000..be26108
--- /dev/null
+++ b/src/pages/options/components/Header.tsx
@@ -0,0 +1,26 @@
+import React from "react";
+import AppBar from "@mui/material/AppBar";
+import Box from "@mui/material/Box";
+import Toolbar from "@mui/material/Toolbar";
+import Typography from "@mui/material/Typography";
+import { TEXT_EXTENSION_TITLE } from "@src/services/constants";
+
+export default function Header() {
+ return (
+ `1px solid ${t.palette.divider}`,
+ }}
+ >
+
+
+ {TEXT_EXTENSION_TITLE}
+
+
+
+ );
+}
diff --git a/src/pages/options/components/KeywordRule.tsx b/src/pages/options/components/KeywordRule.tsx
new file mode 100644
index 0000000..85f1153
--- /dev/null
+++ b/src/pages/options/components/KeywordRule.tsx
@@ -0,0 +1,111 @@
+import React from "react";
+import Grid from "@mui/material/Grid";
+import TextField from "@mui/material/TextField";
+import Divider from "@mui/material/Divider";
+import IconButton from "@mui/material/IconButton";
+import DeleteIcon from "@mui/icons-material/Delete";
+import Button from "@mui/material/Button";
+
+export interface IKeywordRule {
+ id: string;
+ keywords: string;
+ cssStyles: string;
+ enabledOn: string;
+}
+
+export type KeywordRuleProps = IKeywordRule & {
+ onRuleChange: (rule: IKeywordRule) => void;
+ onDeleteRule: (rule: IKeywordRule) => void;
+};
+
+export default function KeywordRule(props: KeywordRuleProps) {
+ const { keywords, cssStyles, enabledOn, onRuleChange, onDeleteRule } = props;
+
+ const handleKeywordsChange: React.ChangeEventHandler = (
+ event
+ ) => {
+ onRuleChange({
+ ...props,
+ keywords: event.target.value,
+ });
+ };
+
+ const handleCssStylesChange: React.ChangeEventHandler = (
+ event
+ ) => {
+ onRuleChange({
+ ...props,
+ cssStyles: event.target.value,
+ });
+ };
+
+ const handleEnabledOnChange: React.ChangeEventHandler = (
+ event
+ ) => {
+ onRuleChange({
+ ...props,
+ enabledOn: event.target.value,
+ });
+ };
+
+ const handleDeleteClick = () => {
+ onDeleteRule({
+ ...props,
+ });
+ };
+
+ return (
+ <>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+ );
+}
diff --git a/src/pages/popup/Popup.css b/src/pages/popup/Popup.css
deleted file mode 100644
index c92d90a..0000000
--- a/src/pages/popup/Popup.css
+++ /dev/null
@@ -1,44 +0,0 @@
-.App {
- position: absolute;
- top: 0px;
- bottom: 0px;
- left: 0px;
- right: 0px;
- height: 100%;
- padding: 10px;
- background-color: #282c34;
-}
-
-.App-logo {
- height: 30vmin;
- pointer-events: none;
-}
-
-@media (prefers-reduced-motion: no-preference) {
- .App-logo {
- animation: App-logo-spin infinite 20s linear;
- }
-}
-
-.App-header {
- height: 100%;
- display: flex;
- flex-direction: column;
- align-items: center;
- justify-content: center;
- font-size: calc(10px + 2vmin);
- color: white;
-}
-
-.App-link {
- color: #61dafb;
-}
-
-@keyframes App-logo-spin {
- from {
- transform: rotate(0deg);
- }
- to {
- transform: rotate(360deg);
- }
-}
diff --git a/src/pages/popup/Popup.tsx b/src/pages/popup/Popup.tsx
deleted file mode 100644
index f3e85b8..0000000
--- a/src/pages/popup/Popup.tsx
+++ /dev/null
@@ -1,87 +0,0 @@
-import { ChangeEvent } from "react";
-import "@pages/popup/Popup.css";
-import {
- SETTINGS_DEBUG,
- SETTINGS_KEYWORDS,
- SETTINGS_HIGHLIGHTED_STYLES,
- SETTINGS_HIGHLIGHTED_STYLES_DEFAULT_VALUE,
-} from "@services/constants";
-import useSettingsHook from "./hooks/useSettingsHook";
-
-const Popup = () => {
- const [debug, setDebug] = useSettingsHook(SETTINGS_DEBUG);
- const [keywords, setKeywords] = useSettingsHook(SETTINGS_KEYWORDS);
- const [highlightedStyles, setHighlightedStyles] = useSettingsHook(
- SETTINGS_HIGHLIGHTED_STYLES
- );
-
- const handleDebugChange = (e: ChangeEvent) => {
- setDebug(e.target.checked);
- };
-
- const handleKeywordsChange = (e: ChangeEvent) => {
- setKeywords(e.target.value);
- };
-
- const handleHighlightedStylesChange = (
- e: ChangeEvent
- ) => {
- setHighlightedStyles(e.target.value);
- };
-
- return (
-
-
-
-
-
- );
-};
-
-export default Popup;
diff --git a/src/pages/popup/hooks/useSettingsHook.tsx b/src/pages/popup/hooks/useSettingsHook.tsx
deleted file mode 100644
index e3ddb4c..0000000
--- a/src/pages/popup/hooks/useSettingsHook.tsx
+++ /dev/null
@@ -1,24 +0,0 @@
-import React, { useEffect, useState } from "react";
-import {
- get as getFromStorage,
- set as saveToStorage,
-} from "@services/storage/storageService";
-
-export default function useSettingsHook(
- key: string
-): [T, (value: T) => Promise] {
- const [value, setValue] = useState();
-
- useEffect(() => {
- getFromStorage(key).then((result) => {
- const value = result?.[key] || "";
- setValue(value);
- });
- }, [value]);
-
- const setter = (value: T): Promise => {
- return saveToStorage({ [key]: value }).then(() => setValue(value));
- };
-
- return [value, setter];
-}
diff --git a/src/pages/popup/index.css b/src/pages/popup/index.css
deleted file mode 100644
index 897e1d1..0000000
--- a/src/pages/popup/index.css
+++ /dev/null
@@ -1,17 +0,0 @@
-body {
- width: 400px;
- height: 440px;
- margin: 0;
- font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen",
- "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue",
- sans-serif;
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale;
-
- position: relative;
-}
-
-code {
- font-family: source-code-pro, Menlo, Monaco, Consolas, "Courier New",
- monospace;
-}
diff --git a/src/pages/popup/index.html b/src/pages/popup/index.html
deleted file mode 100644
index 815f959..0000000
--- a/src/pages/popup/index.html
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
- Popup
-
-
-
-
-
-
-
diff --git a/src/pages/popup/index.tsx b/src/pages/popup/index.tsx
deleted file mode 100644
index 87abf70..0000000
--- a/src/pages/popup/index.tsx
+++ /dev/null
@@ -1,18 +0,0 @@
-import React from "react";
-import { createRoot } from "react-dom/client";
-import "@pages/popup/index.css";
-import Popup from "@pages/popup/Popup";
-import refreshOnUpdate from "virtual:reload-on-update-in-view";
-
-refreshOnUpdate("pages/popup");
-
-function init() {
- const appContainer = document.querySelector("#app-container");
- if (!appContainer) {
- throw new Error("Can not find #app-container");
- }
- const root = createRoot(appContainer);
- root.render();
-}
-
-init();
diff --git a/src/services/constants.tsx b/src/services/constants.tsx
index 103c353..a1bf30c 100644
--- a/src/services/constants.tsx
+++ b/src/services/constants.tsx
@@ -1,6 +1,9 @@
export const SETTINGS_DEBUG = "settings.debug";
-export const SETTINGS_KEYWORDS = "settings.keywords";
-export const SETTINGS_HIGHLIGHTED_STYLES = "settings.highlighted-styles";
-export const SETTINGS_HIGHLIGHTED_STYLES_DEFAULT_VALUE =
- "background-color: yellow;";
+export const SETTINGS_KEYWORD_RULES = "settings.keyword_rules";
export const OBSERVABLE_DEBOUNCE_TIME_MS = 500;
+
+export const TEXT_EXTENSION_TITLE = "Keywords Highlighter";
+export const TEXT_OPTIONS = "Options";
+export const TEXT_OPTIONS_DISPLAY_DEBUG = "Display debug popup";
+export const TEXT_OPTIONS_SAVED_SUCCESSFULLY =
+ "Your options have been successfully saved.";
diff --git a/src/services/storage/optionsService.tsx b/src/services/storage/optionsService.tsx
new file mode 100644
index 0000000..aedd641
--- /dev/null
+++ b/src/services/storage/optionsService.tsx
@@ -0,0 +1,8 @@
+import { SETTINGS_KEYWORD_RULES } from "../constants";
+import { get } from "./storageService";
+
+export async function getRules() {
+ const result = await get(SETTINGS_KEYWORD_RULES);
+
+ return result?.[SETTINGS_KEYWORD_RULES] || [];
+}
diff --git a/src/services/uidService.tsx b/src/services/uidService.tsx
new file mode 100644
index 0000000..31427b5
--- /dev/null
+++ b/src/services/uidService.tsx
@@ -0,0 +1,3 @@
+export function uid() {
+ return Date.now().toString(36) + Math.random().toString(36).substr(2);
+}
diff --git a/vite.config.ts b/vite.config.ts
index efcc290..07d257f 100644
--- a/vite.config.ts
+++ b/vite.config.ts
@@ -49,8 +49,6 @@ export default defineConfig({
content: resolve(pagesDir, "content", "index.ts"),
background: resolve(pagesDir, "background", "index.ts"),
contentStyle: resolve(pagesDir, "content", "style.scss"),
- popup: resolve(pagesDir, "popup", "index.html"),
- newtab: resolve(pagesDir, "newtab", "index.html"),
options: resolve(pagesDir, "options", "index.html"),
},
watch: {
diff --git a/yarn.lock b/yarn.lock
index 40f78d5..b311936 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -91,7 +91,7 @@
dependencies:
"@babel/types" "^7.18.6"
-"@babel/helper-module-imports@^7.21.4":
+"@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.21.4":
version "7.21.4"
resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz#ac88b2f76093637489e718a90cec6cf8a9b029af"
integrity sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==
@@ -299,7 +299,7 @@
"@babel/plugin-syntax-jsx" "^7.21.4"
"@babel/types" "^7.21.5"
-"@babel/runtime@^7.12.5":
+"@babel/runtime@^7.12.5", "@babel/runtime@^7.18.3", "@babel/runtime@^7.21.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.7":
version "7.21.5"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.21.5.tgz#8492dddda9644ae3bda3b45eabe87382caee7200"
integrity sha512-8jI69toZqqcsnqGGqwGS4Qb1VwLOEp4hz+CXPywcvjs60u3B4Pom/U/7rm4W8tMOYEB+E9wgD0mW1l3r8qlI9Q==
@@ -345,6 +345,113 @@
resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39"
integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==
+"@emotion/babel-plugin@^11.11.0":
+ version "11.11.0"
+ resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz#c2d872b6a7767a9d176d007f5b31f7d504bb5d6c"
+ integrity sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==
+ dependencies:
+ "@babel/helper-module-imports" "^7.16.7"
+ "@babel/runtime" "^7.18.3"
+ "@emotion/hash" "^0.9.1"
+ "@emotion/memoize" "^0.8.1"
+ "@emotion/serialize" "^1.1.2"
+ babel-plugin-macros "^3.1.0"
+ convert-source-map "^1.5.0"
+ escape-string-regexp "^4.0.0"
+ find-root "^1.1.0"
+ source-map "^0.5.7"
+ stylis "4.2.0"
+
+"@emotion/cache@^11.10.8", "@emotion/cache@^11.11.0":
+ version "11.11.0"
+ resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.11.0.tgz#809b33ee6b1cb1a625fef7a45bc568ccd9b8f3ff"
+ integrity sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==
+ dependencies:
+ "@emotion/memoize" "^0.8.1"
+ "@emotion/sheet" "^1.2.2"
+ "@emotion/utils" "^1.2.1"
+ "@emotion/weak-memoize" "^0.3.1"
+ stylis "4.2.0"
+
+"@emotion/hash@^0.9.1":
+ version "0.9.1"
+ resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.9.1.tgz#4ffb0055f7ef676ebc3a5a91fb621393294e2f43"
+ integrity sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==
+
+"@emotion/is-prop-valid@^1.2.0", "@emotion/is-prop-valid@^1.2.1":
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz#23116cf1ed18bfeac910ec6436561ecb1a3885cc"
+ integrity sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==
+ dependencies:
+ "@emotion/memoize" "^0.8.1"
+
+"@emotion/memoize@^0.8.1":
+ version "0.8.1"
+ resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.8.1.tgz#c1ddb040429c6d21d38cc945fe75c818cfb68e17"
+ integrity sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==
+
+"@emotion/react@^11.11.0":
+ version "11.11.0"
+ resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.11.0.tgz#408196b7ef8729d8ad08fc061b03b046d1460e02"
+ integrity sha512-ZSK3ZJsNkwfjT3JpDAWJZlrGD81Z3ytNDsxw1LKq1o+xkmO5pnWfr6gmCC8gHEFf3nSSX/09YrG67jybNPxSUw==
+ dependencies:
+ "@babel/runtime" "^7.18.3"
+ "@emotion/babel-plugin" "^11.11.0"
+ "@emotion/cache" "^11.11.0"
+ "@emotion/serialize" "^1.1.2"
+ "@emotion/use-insertion-effect-with-fallbacks" "^1.0.1"
+ "@emotion/utils" "^1.2.1"
+ "@emotion/weak-memoize" "^0.3.1"
+ hoist-non-react-statics "^3.3.1"
+
+"@emotion/serialize@^1.1.2":
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.1.2.tgz#017a6e4c9b8a803bd576ff3d52a0ea6fa5a62b51"
+ integrity sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA==
+ dependencies:
+ "@emotion/hash" "^0.9.1"
+ "@emotion/memoize" "^0.8.1"
+ "@emotion/unitless" "^0.8.1"
+ "@emotion/utils" "^1.2.1"
+ csstype "^3.0.2"
+
+"@emotion/sheet@^1.2.2":
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.2.2.tgz#d58e788ee27267a14342303e1abb3d508b6d0fec"
+ integrity sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==
+
+"@emotion/styled@^11.11.0":
+ version "11.11.0"
+ resolved "https://registry.yarnpkg.com/@emotion/styled/-/styled-11.11.0.tgz#26b75e1b5a1b7a629d7c0a8b708fbf5a9cdce346"
+ integrity sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==
+ dependencies:
+ "@babel/runtime" "^7.18.3"
+ "@emotion/babel-plugin" "^11.11.0"
+ "@emotion/is-prop-valid" "^1.2.1"
+ "@emotion/serialize" "^1.1.2"
+ "@emotion/use-insertion-effect-with-fallbacks" "^1.0.1"
+ "@emotion/utils" "^1.2.1"
+
+"@emotion/unitless@^0.8.1":
+ version "0.8.1"
+ resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.8.1.tgz#182b5a4704ef8ad91bde93f7a860a88fd92c79a3"
+ integrity sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==
+
+"@emotion/use-insertion-effect-with-fallbacks@^1.0.1":
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz#08de79f54eb3406f9daaf77c76e35313da963963"
+ integrity sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==
+
+"@emotion/utils@^1.2.1":
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.2.1.tgz#bbab58465738d31ae4cb3dbb6fc00a5991f755e4"
+ integrity sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==
+
+"@emotion/weak-memoize@^0.3.1":
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz#d0fce5d07b0620caa282b5131c297bb60f9d87e6"
+ integrity sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==
+
"@esbuild/android-arm@0.15.18":
version "0.15.18"
resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.15.18.tgz#266d40b8fdcf87962df8af05b76219bc786b4f80"
@@ -387,6 +494,11 @@
resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.36.0.tgz#9837f768c03a1e4a30bd304a64fb8844f0e72efe"
integrity sha512-lxJ9R5ygVm8ZWgYdUweoq5ownDlJ4upvoWmO4eLxBYHdMo+vZ/Rx0EN6MbKWDJOSUGrqJy2Gt+Dyv/VKml0fjg==
+"@fontsource/roboto@^4.5.8":
+ version "4.5.8"
+ resolved "https://registry.yarnpkg.com/@fontsource/roboto/-/roboto-4.5.8.tgz#56347764786079838faf43f0eeda22dd7328437f"
+ integrity sha512-CnD7zLItIzt86q4Sj3kZUiLcBk1dSk81qcqgMGaZe7SQ1P8hFNxhMl5AZthK1zrDM5m74VVhaOpuMGIL4gagaA==
+
"@humanwhocodes/config-array@^0.11.8":
version "0.11.8"
resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.8.tgz#03595ac2075a4dc0f191cc2131de14fbd7d410b9"
@@ -651,6 +763,99 @@
"@jridgewell/resolve-uri" "3.1.0"
"@jridgewell/sourcemap-codec" "1.4.14"
+"@mui/base@5.0.0-alpha.128":
+ version "5.0.0-alpha.128"
+ resolved "https://registry.yarnpkg.com/@mui/base/-/base-5.0.0-alpha.128.tgz#8ce4beb971ac989df0b1d3b2bd3e9274dbfa604f"
+ integrity sha512-wub3wxNN+hUp8hzilMlXX3sZrPo75vsy1cXEQpqdTfIFlE9HprP1jlulFiPg5tfPst2OKmygXr2hhmgvAKRrzQ==
+ dependencies:
+ "@babel/runtime" "^7.21.0"
+ "@emotion/is-prop-valid" "^1.2.0"
+ "@mui/types" "^7.2.4"
+ "@mui/utils" "^5.12.3"
+ "@popperjs/core" "^2.11.7"
+ clsx "^1.2.1"
+ prop-types "^15.8.1"
+ react-is "^18.2.0"
+
+"@mui/core-downloads-tracker@^5.12.3":
+ version "5.12.3"
+ resolved "https://registry.yarnpkg.com/@mui/core-downloads-tracker/-/core-downloads-tracker-5.12.3.tgz#3dffe62dccc065ddd7338e97d7be4b917004287e"
+ integrity sha512-yiJZ+knaknPHuRKhRk4L6XiwppwkAahVal3LuYpvBH7GkA2g+D9WLEXOEnNYtVFUggyKf6fWGLGnx0iqzkU5YA==
+
+"@mui/icons-material@^5.11.16":
+ version "5.11.16"
+ resolved "https://registry.yarnpkg.com/@mui/icons-material/-/icons-material-5.11.16.tgz#417fa773c56672e39d6ccfed9ac55591985f0d38"
+ integrity sha512-oKkx9z9Kwg40NtcIajF9uOXhxiyTZrrm9nmIJ4UjkU2IdHpd4QVLbCc/5hZN/y0C6qzi2Zlxyr9TGddQx2vx2A==
+ dependencies:
+ "@babel/runtime" "^7.21.0"
+
+"@mui/material@^5.12.3":
+ version "5.12.3"
+ resolved "https://registry.yarnpkg.com/@mui/material/-/material-5.12.3.tgz#398c1b123fb065763558bc1f9fc47d1f8cb87d0c"
+ integrity sha512-xNmKlrEN4HsTaKFNLZfc7ie7CXx2YqEeO//hsXZx2p3MGtDdeMr2sV3jC4hsFs57RhQlF79weY7uVvC8xSuVbg==
+ dependencies:
+ "@babel/runtime" "^7.21.0"
+ "@mui/base" "5.0.0-alpha.128"
+ "@mui/core-downloads-tracker" "^5.12.3"
+ "@mui/system" "^5.12.3"
+ "@mui/types" "^7.2.4"
+ "@mui/utils" "^5.12.3"
+ "@types/react-transition-group" "^4.4.5"
+ clsx "^1.2.1"
+ csstype "^3.1.2"
+ prop-types "^15.8.1"
+ react-is "^18.2.0"
+ react-transition-group "^4.4.5"
+
+"@mui/private-theming@^5.12.3":
+ version "5.12.3"
+ resolved "https://registry.yarnpkg.com/@mui/private-theming/-/private-theming-5.12.3.tgz#f5e4704e25d9d91b906561cae573cda8f3801e10"
+ integrity sha512-o1e7Z1Bp27n4x2iUHhegV4/Jp6H3T6iBKHJdLivS5GbwsuAE/5l4SnZ+7+K+e5u9TuhwcAKZLkjvqzkDe8zqfA==
+ dependencies:
+ "@babel/runtime" "^7.21.0"
+ "@mui/utils" "^5.12.3"
+ prop-types "^15.8.1"
+
+"@mui/styled-engine@^5.12.3":
+ version "5.12.3"
+ resolved "https://registry.yarnpkg.com/@mui/styled-engine/-/styled-engine-5.12.3.tgz#3307643d52c81947a624cdd0437536cc8109c4f0"
+ integrity sha512-AhZtiRyT8Bjr7fufxE/mLS+QJ3LxwX1kghIcM2B2dvJzSSg9rnIuXDXM959QfUVIM3C8U4x3mgVoPFMQJvc4/g==
+ dependencies:
+ "@babel/runtime" "^7.21.0"
+ "@emotion/cache" "^11.10.8"
+ csstype "^3.1.2"
+ prop-types "^15.8.1"
+
+"@mui/system@^5.12.3":
+ version "5.12.3"
+ resolved "https://registry.yarnpkg.com/@mui/system/-/system-5.12.3.tgz#306b3cdffa3046067640219c1e5dd7e3dae38ff9"
+ integrity sha512-JB/6sypHqeJCqwldWeQ1MKkijH829EcZAKKizxbU2MJdxGG5KSwZvTBa5D9qiJUA1hJFYYupjiuy9ZdJt6rV6w==
+ dependencies:
+ "@babel/runtime" "^7.21.0"
+ "@mui/private-theming" "^5.12.3"
+ "@mui/styled-engine" "^5.12.3"
+ "@mui/types" "^7.2.4"
+ "@mui/utils" "^5.12.3"
+ clsx "^1.2.1"
+ csstype "^3.1.2"
+ prop-types "^15.8.1"
+
+"@mui/types@^7.2.4":
+ version "7.2.4"
+ resolved "https://registry.yarnpkg.com/@mui/types/-/types-7.2.4.tgz#b6fade19323b754c5c6de679a38f068fd50b9328"
+ integrity sha512-LBcwa8rN84bKF+f5sDyku42w1NTxaPgPyYKODsh01U1fVstTClbUoSA96oyRBnSNyEiAVjKm6Gwx9vjR+xyqHA==
+
+"@mui/utils@^5.12.3":
+ version "5.12.3"
+ resolved "https://registry.yarnpkg.com/@mui/utils/-/utils-5.12.3.tgz#3fa3570dac7ec66bb9cc84ab7c16ab6e1b7200f2"
+ integrity sha512-D/Z4Ub3MRl7HiUccid7sQYclTr24TqUAQFFlxHQF8FR177BrCTQ0JJZom7EqYjZCdXhwnSkOj2ph685MSKNtIA==
+ dependencies:
+ "@babel/runtime" "^7.21.0"
+ "@types/prop-types" "^15.7.5"
+ "@types/react-is" "^16.7.1 || ^17.0.0"
+ prop-types "^15.8.1"
+ react-is "^18.2.0"
+
"@nodelib/fs.scandir@2.1.5":
version "2.1.5"
resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5"
@@ -672,6 +877,11 @@
"@nodelib/fs.scandir" "2.1.5"
fastq "^1.6.0"
+"@popperjs/core@^2.11.7":
+ version "2.11.7"
+ resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.7.tgz#ccab5c8f7dc557a52ca3288c10075c9ccd37fff7"
+ integrity sha512-Cr4OjIkipTtcXKjAsm8agyleBuDHvxzeBoa1v543lbv1YaIwQjESsVcmjiWiPEbC1FIeHOG/Op9kdCmAmiS3Kw==
+
"@rollup/plugin-typescript@^8.5.0":
version "8.5.0"
resolved "https://registry.yarnpkg.com/@rollup/plugin-typescript/-/plugin-typescript-8.5.0.tgz#7ea11599a15b0a30fa7ea69ce3b791d41b862515"
@@ -862,12 +1072,17 @@
resolved "https://registry.yarnpkg.com/@types/node/-/node-18.15.11.tgz#b3b790f09cb1696cffcec605de025b088fa4225f"
integrity sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==
+"@types/parse-json@^4.0.0":
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0"
+ integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==
+
"@types/prettier@^2.1.5":
version "2.7.2"
resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.2.tgz#6c2324641cc4ba050a8c710b2b251b377581fbf0"
integrity sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==
-"@types/prop-types@*":
+"@types/prop-types@*", "@types/prop-types@^15.7.5":
version "15.7.5"
resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf"
integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==
@@ -886,6 +1101,20 @@
dependencies:
"@types/react" "*"
+"@types/react-is@^16.7.1 || ^17.0.0":
+ version "17.0.4"
+ resolved "https://registry.yarnpkg.com/@types/react-is/-/react-is-17.0.4.tgz#3cccd02851f7f7a75b21d6e922da26bc7f8f44ad"
+ integrity sha512-FLzd0K9pnaEvKz4D1vYxK9JmgQPiGk1lu23o1kqGsLeT0iPbRSF7b76+S5T9fD8aRa0B8bY7I/3DebEj+1ysBA==
+ dependencies:
+ "@types/react" "^17"
+
+"@types/react-transition-group@^4.4.5":
+ version "4.4.6"
+ resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.6.tgz#18187bcda5281f8e10dfc48f0943e2fdf4f75e2e"
+ integrity sha512-VnCdSxfcm08KjsJVQcfBmhEQAPnLB8G08hAxn39azX1qYBQ/5RVQuoHuKIcfKOdncuaUvEpFKFzEvbtIMsfVew==
+ dependencies:
+ "@types/react" "*"
+
"@types/react@*":
version "18.2.5"
resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.5.tgz#f9403e1113b12b53f7edcdd9a900c10dd4b49a59"
@@ -904,6 +1133,15 @@
"@types/scheduler" "*"
csstype "^3.0.2"
+"@types/react@^17":
+ version "17.0.59"
+ resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.59.tgz#5aa4e161a356fcb824d81f166e01bad9e82243bb"
+ integrity sha512-gSON5zWYIGyoBcycCE75E9+r6dCC2dHdsrVkOEiIYNU5+Q28HcBAuqvDuxHcCbMfHBHdeT5Tva/AFn3rnMKE4g==
+ dependencies:
+ "@types/prop-types" "*"
+ "@types/scheduler" "*"
+ csstype "^3.0.2"
+
"@types/scheduler@*":
version "0.16.3"
resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.3.tgz#cef09e3ec9af1d63d2a6cc5b383a737e24e6dcf5"
@@ -1266,6 +1504,15 @@ babel-plugin-jest-hoist@^29.5.0:
"@types/babel__core" "^7.1.14"
"@types/babel__traverse" "^7.0.6"
+babel-plugin-macros@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz#9ef6dc74deb934b4db344dc973ee851d148c50c1"
+ integrity sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==
+ dependencies:
+ "@babel/runtime" "^7.12.5"
+ cosmiconfig "^7.0.0"
+ resolve "^1.19.0"
+
babel-preset-current-node-syntax@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b"
@@ -1430,6 +1677,11 @@ cliui@^8.0.1:
strip-ansi "^6.0.1"
wrap-ansi "^7.0.0"
+clsx@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.2.1.tgz#0ddc4a20a549b59c93a4116bb26f5294ca17dc12"
+ integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==
+
co@^4.6.0:
version "4.6.0"
resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
@@ -1476,7 +1728,7 @@ concat-map@0.0.1:
resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==
-convert-source-map@^1.6.0, convert-source-map@^1.7.0:
+convert-source-map@^1.5.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0:
version "1.9.0"
resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f"
integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==
@@ -1486,6 +1738,17 @@ convert-source-map@^2.0.0:
resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a"
integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==
+cosmiconfig@^7.0.0:
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6"
+ integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==
+ dependencies:
+ "@types/parse-json" "^4.0.0"
+ import-fresh "^3.2.1"
+ parse-json "^5.0.0"
+ path-type "^4.0.0"
+ yaml "^1.10.0"
+
cross-env@^7.0.3:
version "7.0.3"
resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf"
@@ -1530,7 +1793,7 @@ cssstyle@^2.3.0:
dependencies:
cssom "~0.3.6"
-csstype@^3.0.2:
+csstype@^3.0.2, csstype@^3.1.2:
version "3.1.2"
resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b"
integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==
@@ -1644,6 +1907,14 @@ dom-accessibility-api@^0.5.9:
resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz#5a7429e6066eb3664d911e33fb0e45de8eb08453"
integrity sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==
+dom-helpers@^5.0.1:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902"
+ integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==
+ dependencies:
+ "@babel/runtime" "^7.8.7"
+ csstype "^3.0.2"
+
domexception@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/domexception/-/domexception-4.0.0.tgz#4ad1be56ccadc86fc76d033353999a8037d03673"
@@ -2164,6 +2435,11 @@ fill-range@^7.0.1:
dependencies:
to-regex-range "^5.0.1"
+find-root@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4"
+ integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==
+
find-up@^4.0.0, find-up@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19"
@@ -2405,6 +2681,13 @@ has@^1.0.3:
dependencies:
function-bind "^1.1.1"
+hoist-non-react-statics@^3.3.1:
+ version "3.3.2"
+ resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45"
+ integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==
+ dependencies:
+ react-is "^16.7.0"
+
hosted-git-info@^2.1.4:
version "2.8.9"
resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9"
@@ -3627,7 +3910,7 @@ parse-json@^4.0.0:
error-ex "^1.3.1"
json-parse-better-errors "^1.0.1"
-parse-json@^5.2.0:
+parse-json@^5.0.0, parse-json@^5.2.0:
version "5.2.0"
resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd"
integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==
@@ -3770,7 +4053,7 @@ prompts@^2.0.1:
kleur "^3.0.3"
sisteransi "^1.0.5"
-prop-types@^15.8.1:
+prop-types@^15.6.2, prop-types@^15.8.1:
version "15.8.1"
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5"
integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==
@@ -3812,7 +4095,7 @@ react-dom@18.2.0:
loose-envify "^1.1.0"
scheduler "^0.23.0"
-react-is@^16.13.1:
+react-is@^16.13.1, react-is@^16.7.0:
version "16.13.1"
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
@@ -3822,7 +4105,7 @@ react-is@^17.0.1:
resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0"
integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==
-react-is@^18.0.0:
+react-is@^18.0.0, react-is@^18.2.0:
version "18.2.0"
resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b"
integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==
@@ -3832,6 +4115,16 @@ react-refresh@^0.14.0:
resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.0.tgz#4e02825378a5f227079554d4284889354e5f553e"
integrity sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==
+react-transition-group@^4.4.5:
+ version "4.4.5"
+ resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.5.tgz#e53d4e3f3344da8521489fbef8f2581d42becdd1"
+ integrity sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==
+ dependencies:
+ "@babel/runtime" "^7.5.5"
+ dom-helpers "^5.0.1"
+ loose-envify "^1.4.0"
+ prop-types "^15.6.2"
+
react@18.2.0:
version "18.2.0"
resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5"
@@ -3901,7 +4194,7 @@ resolve.exports@^2.0.0:
resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800"
integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==
-resolve@^1.10.0, resolve@^1.17.0, resolve@^1.20.0, resolve@^1.22.1:
+resolve@^1.10.0, resolve@^1.17.0, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.1:
version "1.22.2"
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f"
integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==
@@ -4072,6 +4365,11 @@ source-map-support@0.5.13:
buffer-from "^1.0.0"
source-map "^0.6.0"
+source-map@^0.5.7:
+ version "0.5.7"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
+ integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==
+
source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1:
version "0.6.1"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
@@ -4221,6 +4519,11 @@ strip-json-comments@^3.1.0, strip-json-comments@^3.1.1:
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
+stylis@4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.2.0.tgz#79daee0208964c8fe695a42fcffcac633a211a51"
+ integrity sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==
+
supports-color@^5.3.0:
version "5.5.0"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
@@ -4604,6 +4907,11 @@ yallist@^4.0.0:
resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
+yaml@^1.10.0:
+ version "1.10.2"
+ resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b"
+ integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==
+
yargs-parser@^21.0.1, yargs-parser@^21.1.1:
version "21.1.1"
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35"