diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 79540c57..5a13eaba 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -14,7 +14,7 @@ jobs:
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0
with:
- node-version: 24.11.0
+ node-version: 24.11.1
cache: npm
- uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0
id: node_modules_cache_id
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 73843e2c..899246bc 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -20,7 +20,7 @@ jobs:
VERSION=$(jq -r '.version' dist/manifest.json)
echo "VERSION=$VERSION" >> $GITHUB_ENV
- name: Create tag and release note
- uses: softprops/action-gh-release@6da8fa9354ddfdc4aeace5fc48d7f679b5214090 # v2.4.1
+ uses: softprops/action-gh-release@5be0e66d93ac7ed76da52eca8bb058f665c3a5fe # v2.4.2
with:
target_commitish: main
name: ${{ env.VERSION }}
@@ -34,7 +34,7 @@ jobs:
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0
with:
- node-version: 24.11.0
+ node-version: 24.11.1
cache: npm
- uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0
id: node_modules_cache_id
diff --git a/biome.json b/biome.json
index a1c67fbc..78134579 100644
--- a/biome.json
+++ b/biome.json
@@ -1,5 +1,5 @@
{
- "$schema": "https://biomejs.dev/schemas/2.3.1/schema.json",
+ "$schema": "https://biomejs.dev/schemas/2.3.5/schema.json",
"assist": { "actions": { "source": { "organizeImports": "on" } } },
"files": {
"ignoreUnknown": false,
diff --git a/dist/manifest.json b/dist/manifest.json
index ebc56ade..57a59839 100644
--- a/dist/manifest.json
+++ b/dist/manifest.json
@@ -4,7 +4,7 @@
"short_name": "__MSG_app_name_short__",
"description": "__MSG_app_desc__",
"default_locale": "en",
- "version": "2.38.5",
+ "version": "2.38.6",
"action": {
"default_title": "TabTabTab",
"default_icon": {
diff --git a/package-lock.json b/package-lock.json
index 84eed1db..51e51775 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -11,23 +11,23 @@
"@dnd-kit/sortable": "^10.0.0",
"@emotion/react": "^11.14.0",
"@emotion/styled": "^11.14.1",
- "@mui/icons-material": "^7.3.4",
- "@mui/material": "^7.3.4",
+ "@mui/icons-material": "^7.3.5",
+ "@mui/material": "^7.3.5",
"react": "^19.2.0",
"react-dom": "^19.2.0",
"tldts": "^7.0.17"
},
"devDependencies": {
- "@biomejs/biome": "^2.3.2",
- "@types/chrome": "^0.1.27",
- "@types/node": "^24.9.2",
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
- "@vitejs/plugin-react": "^5.1.0",
+ "@biomejs/biome": "^2.3.5",
+ "@types/chrome": "^0.1.29",
+ "@types/node": "^24.10.1",
+ "@types/react": "^19.2.5",
+ "@types/react-dom": "^19.2.3",
+ "@vitejs/plugin-react": "^5.1.1",
"chromex-locale-lint": "^0.1.0",
"typescript": "^5.9.3",
- "vite": "^7.1.12",
- "vitest": "^4.0.6"
+ "vite": "^7.2.2",
+ "vitest": "^4.0.9"
}
},
"node_modules/@babel/code-frame": {
@@ -320,9 +320,9 @@
}
},
"node_modules/@biomejs/biome": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.3.2.tgz",
- "integrity": "sha512-8e9tzamuDycx7fdrcJ/F/GDZ8SYukc5ud6tDicjjFqURKYFSWMl0H0iXNXZEGmcmNUmABgGuHThPykcM41INgg==",
+ "version": "2.3.5",
+ "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.3.5.tgz",
+ "integrity": "sha512-HvLhNlIlBIbAV77VysRIBEwp55oM/QAjQEin74QQX9Xb259/XP/D5AGGnZMOyF1el4zcvlNYYR3AyTMUV3ILhg==",
"dev": true,
"license": "MIT OR Apache-2.0",
"bin": {
@@ -336,20 +336,20 @@
"url": "https://opencollective.com/biome"
},
"optionalDependencies": {
- "@biomejs/cli-darwin-arm64": "2.3.2",
- "@biomejs/cli-darwin-x64": "2.3.2",
- "@biomejs/cli-linux-arm64": "2.3.2",
- "@biomejs/cli-linux-arm64-musl": "2.3.2",
- "@biomejs/cli-linux-x64": "2.3.2",
- "@biomejs/cli-linux-x64-musl": "2.3.2",
- "@biomejs/cli-win32-arm64": "2.3.2",
- "@biomejs/cli-win32-x64": "2.3.2"
+ "@biomejs/cli-darwin-arm64": "2.3.5",
+ "@biomejs/cli-darwin-x64": "2.3.5",
+ "@biomejs/cli-linux-arm64": "2.3.5",
+ "@biomejs/cli-linux-arm64-musl": "2.3.5",
+ "@biomejs/cli-linux-x64": "2.3.5",
+ "@biomejs/cli-linux-x64-musl": "2.3.5",
+ "@biomejs/cli-win32-arm64": "2.3.5",
+ "@biomejs/cli-win32-x64": "2.3.5"
}
},
"node_modules/@biomejs/cli-darwin-arm64": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.3.2.tgz",
- "integrity": "sha512-4LECm4kc3If0JISai4c3KWQzukoUdpxy4fRzlrPcrdMSRFksR9ZoXK7JBcPuLBmd2SoT4/d7CQS33VnZpgBjew==",
+ "version": "2.3.5",
+ "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.3.5.tgz",
+ "integrity": "sha512-fLdTur8cJU33HxHUUsii3GLx/TR0BsfQx8FkeqIiW33cGMtUD56fAtrh+2Fx1uhiCsVZlFh6iLKUU3pniZREQw==",
"cpu": [
"arm64"
],
@@ -364,9 +364,9 @@
}
},
"node_modules/@biomejs/cli-darwin-x64": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.3.2.tgz",
- "integrity": "sha512-jNMnfwHT4N3wi+ypRfMTjLGnDmKYGzxVr1EYAPBcauRcDnICFXN81wD6wxJcSUrLynoyyYCdfW6vJHS/IAoTDA==",
+ "version": "2.3.5",
+ "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.3.5.tgz",
+ "integrity": "sha512-qpT8XDqeUlzrOW8zb4k3tjhT7rmvVRumhi2657I2aGcY4B+Ft5fNwDdZGACzn8zj7/K1fdWjgwYE3i2mSZ+vOA==",
"cpu": [
"x64"
],
@@ -381,9 +381,9 @@
}
},
"node_modules/@biomejs/cli-linux-arm64": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.3.2.tgz",
- "integrity": "sha512-amnqvk+gWybbQleRRq8TMe0rIv7GHss8mFJEaGuEZYWg1Tw14YKOkeo8h6pf1c+d3qR+JU4iT9KXnBKGON4klw==",
+ "version": "2.3.5",
+ "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.3.5.tgz",
+ "integrity": "sha512-u/pybjTBPGBHB66ku4pK1gj+Dxgx7/+Z0jAriZISPX1ocTO8aHh8x8e7Kb1rB4Ms0nA/SzjtNOVJ4exVavQBCw==",
"cpu": [
"arm64"
],
@@ -398,9 +398,9 @@
}
},
"node_modules/@biomejs/cli-linux-arm64-musl": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.3.2.tgz",
- "integrity": "sha512-2Zz4usDG1GTTPQnliIeNx6eVGGP2ry5vE/v39nT73a3cKN6t5H5XxjcEoZZh62uVZvED7hXXikclvI64vZkYqw==",
+ "version": "2.3.5",
+ "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.3.5.tgz",
+ "integrity": "sha512-eGUG7+hcLgGnMNl1KHVZUYxahYAhC462jF/wQolqu4qso2MSk32Q+QrpN7eN4jAHAg7FUMIo897muIhK4hXhqg==",
"cpu": [
"arm64"
],
@@ -415,9 +415,9 @@
}
},
"node_modules/@biomejs/cli-linux-x64": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.3.2.tgz",
- "integrity": "sha512-8BG/vRAhFz1pmuyd24FQPhNeueLqPtwvZk6yblABY2gzL2H8fLQAF/Z2OPIc+BPIVPld+8cSiKY/KFh6k81xfA==",
+ "version": "2.3.5",
+ "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.3.5.tgz",
+ "integrity": "sha512-XrIVi9YAW6ye0CGQ+yax0gLfx+BFOtKaNX74n+xHWla6Cl6huUmcKNO7HPx7BiKnJUzrxXY1qYlm7xMvi08X4g==",
"cpu": [
"x64"
],
@@ -432,9 +432,9 @@
}
},
"node_modules/@biomejs/cli-linux-x64-musl": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.3.2.tgz",
- "integrity": "sha512-gzB19MpRdTuOuLtPpFBGrV3Lq424gHyq2lFj8wfX9tvLMLdmA/R9C7k/mqBp/spcbWuHeIEKgEs3RviOPcWGBA==",
+ "version": "2.3.5",
+ "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.3.5.tgz",
+ "integrity": "sha512-awVuycTPpVTH/+WDVnEEYSf6nbCBHf/4wB3lquwT7puhNg8R4XvonWNZzUsfHZrCkjkLhFH/vCZK5jHatD9FEg==",
"cpu": [
"x64"
],
@@ -449,9 +449,9 @@
}
},
"node_modules/@biomejs/cli-win32-arm64": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.3.2.tgz",
- "integrity": "sha512-lCruqQlfWjhMlOdyf5pDHOxoNm4WoyY2vZ4YN33/nuZBRstVDuqPPjS0yBkbUlLEte11FbpW+wWSlfnZfSIZvg==",
+ "version": "2.3.5",
+ "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.3.5.tgz",
+ "integrity": "sha512-DlBiMlBZZ9eIq4H7RimDSGsYcOtfOIfZOaI5CqsWiSlbTfqbPVfWtCf92wNzx8GNMbu1s7/g3ZZESr6+GwM/SA==",
"cpu": [
"arm64"
],
@@ -466,9 +466,9 @@
}
},
"node_modules/@biomejs/cli-win32-x64": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.3.2.tgz",
- "integrity": "sha512-6Ee9P26DTb4D8sN9nXxgbi9Dw5vSOfH98M7UlmkjKB2vtUbrRqCbZiNfryGiwnPIpd6YUoTl7rLVD2/x1CyEHQ==",
+ "version": "2.3.5",
+ "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.3.5.tgz",
+ "integrity": "sha512-nUmR8gb6yvrKhtRgzwo/gDimPwnO5a4sCydf8ZS2kHIJhEmSmk+STsusr1LHTuM//wXppBawvSQi2xFXJCdgKQ==",
"cpu": [
"x64"
],
@@ -1171,9 +1171,9 @@
}
},
"node_modules/@mui/core-downloads-tracker": {
- "version": "7.3.4",
- "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-7.3.4.tgz",
- "integrity": "sha512-BIktMapG3r4iXwIhYNpvk97ZfYWTreBBQTWjQKbNbzI64+ULHfYavQEX2w99aSWHS58DvXESWIgbD9adKcUOBw==",
+ "version": "7.3.5",
+ "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-7.3.5.tgz",
+ "integrity": "sha512-kOLwlcDPnVz2QMhiBv0OQ8le8hTCqKM9cRXlfVPL91l3RGeOsxrIhNRsUt3Xb8wb+pTVUolW+JXKym93vRKxCw==",
"license": "MIT",
"funding": {
"type": "opencollective",
@@ -1181,9 +1181,9 @@
}
},
"node_modules/@mui/icons-material": {
- "version": "7.3.4",
- "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-7.3.4.tgz",
- "integrity": "sha512-9n6Xcq7molXWYb680N2Qx+FRW8oT6j/LXF5PZFH3ph9X/Rct0B/BlLAsFI7iL9ySI6LVLuQIVtrLiPT82R7OZw==",
+ "version": "7.3.5",
+ "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-7.3.5.tgz",
+ "integrity": "sha512-LciL1GLMZ+VlzyHAALSVAR22t8IST4LCXmljcUSx2NOutgO2XnxdIp8ilFbeNf9wpo0iUFbAuoQcB7h+HHIf3A==",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.28.4"
@@ -1196,7 +1196,7 @@
"url": "https://opencollective.com/mui-org"
},
"peerDependencies": {
- "@mui/material": "^7.3.4",
+ "@mui/material": "^7.3.5",
"@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
"react": "^17.0.0 || ^18.0.0 || ^19.0.0"
},
@@ -1207,23 +1207,23 @@
}
},
"node_modules/@mui/material": {
- "version": "7.3.4",
- "resolved": "https://registry.npmjs.org/@mui/material/-/material-7.3.4.tgz",
- "integrity": "sha512-gEQL9pbJZZHT7lYJBKQCS723v1MGys2IFc94COXbUIyCTWa+qC77a7hUax4Yjd5ggEm35dk4AyYABpKKWC4MLw==",
+ "version": "7.3.5",
+ "resolved": "https://registry.npmjs.org/@mui/material/-/material-7.3.5.tgz",
+ "integrity": "sha512-8VVxFmp1GIm9PpmnQoCoYo0UWHoOrdA57tDL62vkpzEgvb/d71Wsbv4FRg7r1Gyx7PuSo0tflH34cdl/NvfHNQ==",
"license": "MIT",
"peer": true,
"dependencies": {
"@babel/runtime": "^7.28.4",
- "@mui/core-downloads-tracker": "^7.3.4",
- "@mui/system": "^7.3.3",
- "@mui/types": "^7.4.7",
- "@mui/utils": "^7.3.3",
+ "@mui/core-downloads-tracker": "^7.3.5",
+ "@mui/system": "^7.3.5",
+ "@mui/types": "^7.4.8",
+ "@mui/utils": "^7.3.5",
"@popperjs/core": "^2.11.8",
"@types/react-transition-group": "^4.4.12",
"clsx": "^2.1.1",
"csstype": "^3.1.3",
"prop-types": "^15.8.1",
- "react-is": "^19.1.1",
+ "react-is": "^19.2.0",
"react-transition-group": "^4.4.5"
},
"engines": {
@@ -1236,7 +1236,7 @@
"peerDependencies": {
"@emotion/react": "^11.5.0",
"@emotion/styled": "^11.3.0",
- "@mui/material-pigment-css": "^7.3.3",
+ "@mui/material-pigment-css": "^7.3.5",
"@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
"react": "^17.0.0 || ^18.0.0 || ^19.0.0",
"react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0"
@@ -1257,13 +1257,13 @@
}
},
"node_modules/@mui/private-theming": {
- "version": "7.3.3",
- "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-7.3.3.tgz",
- "integrity": "sha512-OJM+9nj5JIyPUvsZ5ZjaeC9PfktmK+W5YaVLToLR8L0lB/DGmv1gcKE43ssNLSvpoW71Hct0necfade6+kW3zQ==",
+ "version": "7.3.5",
+ "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-7.3.5.tgz",
+ "integrity": "sha512-cTx584W2qrLonwhZLbEN7P5pAUu0nZblg8cLBlTrZQ4sIiw8Fbvg7GvuphQaSHxPxrCpa7FDwJKtXdbl2TSmrA==",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.28.4",
- "@mui/utils": "^7.3.3",
+ "@mui/utils": "^7.3.5",
"prop-types": "^15.8.1"
},
"engines": {
@@ -1284,9 +1284,9 @@
}
},
"node_modules/@mui/styled-engine": {
- "version": "7.3.3",
- "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-7.3.3.tgz",
- "integrity": "sha512-CmFxvRJIBCEaWdilhXMw/5wFJ1+FT9f3xt+m2pPXhHPeVIbBg9MnMvNSJjdALvnQJMPw8jLhrUtXmN7QAZV2fw==",
+ "version": "7.3.5",
+ "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-7.3.5.tgz",
+ "integrity": "sha512-zbsZ0uYYPndFCCPp2+V3RLcAN6+fv4C8pdwRx6OS3BwDkRCN8WBehqks7hWyF3vj1kdQLIWrpdv/5Y0jHRxYXQ==",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.28.4",
@@ -1318,16 +1318,16 @@
}
},
"node_modules/@mui/system": {
- "version": "7.3.3",
- "resolved": "https://registry.npmjs.org/@mui/system/-/system-7.3.3.tgz",
- "integrity": "sha512-Lqq3emZr5IzRLKaHPuMaLBDVaGvxoh6z7HMWd1RPKawBM5uMRaQ4ImsmmgXWtwJdfZux5eugfDhXJUo2mliS8Q==",
+ "version": "7.3.5",
+ "resolved": "https://registry.npmjs.org/@mui/system/-/system-7.3.5.tgz",
+ "integrity": "sha512-yPaf5+gY3v80HNkJcPi6WT+r9ebeM4eJzrREXPxMt7pNTV/1eahyODO4fbH3Qvd8irNxDFYn5RQ3idHW55rA6g==",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.28.4",
- "@mui/private-theming": "^7.3.3",
- "@mui/styled-engine": "^7.3.3",
- "@mui/types": "^7.4.7",
- "@mui/utils": "^7.3.3",
+ "@mui/private-theming": "^7.3.5",
+ "@mui/styled-engine": "^7.3.5",
+ "@mui/types": "^7.4.8",
+ "@mui/utils": "^7.3.5",
"clsx": "^2.1.1",
"csstype": "^3.1.3",
"prop-types": "^15.8.1"
@@ -1358,9 +1358,9 @@
}
},
"node_modules/@mui/types": {
- "version": "7.4.7",
- "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.4.7.tgz",
- "integrity": "sha512-8vVje9rdEr1rY8oIkYgP+Su5Kwl6ik7O3jQ0wl78JGSmiZhRHV+vkjooGdKD8pbtZbutXFVTWQYshu2b3sG9zw==",
+ "version": "7.4.8",
+ "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.4.8.tgz",
+ "integrity": "sha512-ZNXLBjkPV6ftLCmmRCafak3XmSn8YV0tKE/ZOhzKys7TZXUiE0mZxlH8zKDo6j6TTUaDnuij68gIG+0Ucm7Xhw==",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.28.4"
@@ -1375,17 +1375,17 @@
}
},
"node_modules/@mui/utils": {
- "version": "7.3.3",
- "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-7.3.3.tgz",
- "integrity": "sha512-kwNAUh7bLZ7mRz9JZ+6qfRnnxbE4Zuc+RzXnhSpRSxjTlSTj7b4JxRLXpG+MVtPVtqks5k/XC8No1Vs3x4Z2gg==",
+ "version": "7.3.5",
+ "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-7.3.5.tgz",
+ "integrity": "sha512-jisvFsEC3sgjUjcPnR4mYfhzjCDIudttSGSbe1o/IXFNu0kZuR+7vqQI0jg8qtcVZBHWrwTfvAZj9MNMumcq1g==",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.28.4",
- "@mui/types": "^7.4.7",
+ "@mui/types": "^7.4.8",
"@types/prop-types": "^15.7.15",
"clsx": "^2.1.1",
"prop-types": "^15.8.1",
- "react-is": "^19.1.1"
+ "react-is": "^19.2.0"
},
"engines": {
"node": ">=14.0.0"
@@ -1415,9 +1415,9 @@
}
},
"node_modules/@rolldown/pluginutils": {
- "version": "1.0.0-beta.43",
- "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.43.tgz",
- "integrity": "sha512-5Uxg7fQUCmfhax7FJke2+8B6cqgeUJUD9o2uXIKXhD+mG0mL6NObmVoi9wXEU1tY89mZKgAYA6fTbftx3q2ZPQ==",
+ "version": "1.0.0-beta.47",
+ "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.47.tgz",
+ "integrity": "sha512-8QagwMH3kNCuzD8EWL8R2YPW5e4OrHNSAHRFDdmFqEwEaD/KcNKjVoumo+gP2vW5eKB2UPbM6vTYiGZX0ixLnw==",
"dev": true,
"license": "MIT"
},
@@ -1789,9 +1789,9 @@
}
},
"node_modules/@types/chrome": {
- "version": "0.1.27",
- "resolved": "https://registry.npmjs.org/@types/chrome/-/chrome-0.1.27.tgz",
- "integrity": "sha512-pkkCb0Ft8X+Igi751POzT+YqchSxUCtB6s4Gs6ttgSj8qzJga/qlJMgSW1mKxuQTW4i0sTqQbqVtzXDS5AU+4A==",
+ "version": "0.1.29",
+ "resolved": "https://registry.npmjs.org/@types/chrome/-/chrome-0.1.29.tgz",
+ "integrity": "sha512-AMEjLNCFjLWEqXJNbSgZk9+kaC8SX0FOCd46ZZqE2IaCzmeRGbFEhCEbhoV6kzale+WqSeiiqjHgA7Q31shdoA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -1835,9 +1835,9 @@
"dev": true
},
"node_modules/@types/node": {
- "version": "24.9.2",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-24.9.2.tgz",
- "integrity": "sha512-uWN8YqxXxqFMX2RqGOrumsKeti4LlmIMIyV0lgut4jx7KQBcBiW6vkDtIBvHnHIquwNfJhk8v2OtmO8zXWHfPA==",
+ "version": "24.10.1",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.1.tgz",
+ "integrity": "sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==",
"dev": true,
"license": "MIT",
"peer": true,
@@ -1857,9 +1857,9 @@
"license": "MIT"
},
"node_modules/@types/react": {
- "version": "19.2.2",
- "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.2.tgz",
- "integrity": "sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA==",
+ "version": "19.2.5",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.5.tgz",
+ "integrity": "sha512-keKxkZMqnDicuvFoJbzrhbtdLSPhj/rZThDlKWCDbgXmUg0rEUFtRssDXKYmtXluZlIqiC5VqkCgRwzuyLHKHw==",
"license": "MIT",
"peer": true,
"dependencies": {
@@ -1867,9 +1867,9 @@
}
},
"node_modules/@types/react-dom": {
- "version": "19.2.2",
- "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.2.tgz",
- "integrity": "sha512-9KQPoO6mZCi7jcIStSnlOWn2nEF3mNmyr3rIAsGnAbQKYbRLyqmeSc39EVgtxXVia+LMT8j3knZLAZAh+xLmrw==",
+ "version": "19.2.3",
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz",
+ "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==",
"dev": true,
"license": "MIT",
"peerDependencies": {
@@ -1886,16 +1886,16 @@
}
},
"node_modules/@vitejs/plugin-react": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.1.0.tgz",
- "integrity": "sha512-4LuWrg7EKWgQaMJfnN+wcmbAW+VSsCmqGohftWjuct47bv8uE4n/nPpq4XjJPsxgq00GGG5J8dvBczp8uxScew==",
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.1.1.tgz",
+ "integrity": "sha512-WQfkSw0QbQ5aJ2CHYw23ZGkqnRwqKHD/KYsMeTkZzPT4Jcf0DcBxBtwMJxnu6E7oxw5+JC6ZAiePgh28uJ1HBA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/core": "^7.28.4",
+ "@babel/core": "^7.28.5",
"@babel/plugin-transform-react-jsx-self": "^7.27.1",
"@babel/plugin-transform-react-jsx-source": "^7.27.1",
- "@rolldown/pluginutils": "1.0.0-beta.43",
+ "@rolldown/pluginutils": "1.0.0-beta.47",
"@types/babel__core": "^7.20.5",
"react-refresh": "^0.18.0"
},
@@ -1907,17 +1907,17 @@
}
},
"node_modules/@vitest/expect": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.6.tgz",
- "integrity": "sha512-5j8UUlBVhOjhj4lR2Nt9sEV8b4WtbcYh8vnfhTNA2Kn5+smtevzjNq+xlBuVhnFGXiyPPNzGrOVvmyHWkS5QGg==",
+ "version": "4.0.9",
+ "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.9.tgz",
+ "integrity": "sha512-C2vyXf5/Jfj1vl4DQYxjib3jzyuswMi/KHHVN2z+H4v16hdJ7jMZ0OGe3uOVIt6LyJsAofDdaJNIFEpQcrSTFw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@standard-schema/spec": "^1.0.0",
"@types/chai": "^5.2.2",
- "@vitest/spy": "4.0.6",
- "@vitest/utils": "4.0.6",
- "chai": "^6.0.1",
+ "@vitest/spy": "4.0.9",
+ "@vitest/utils": "4.0.9",
+ "chai": "^6.2.0",
"tinyrainbow": "^3.0.3"
},
"funding": {
@@ -1925,15 +1925,15 @@
}
},
"node_modules/@vitest/mocker": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.6.tgz",
- "integrity": "sha512-3COEIew5HqdzBFEYN9+u0dT3i/NCwppLnO1HkjGfAP1Vs3vti1Hxm/MvcbC4DAn3Szo1M7M3otiAaT83jvqIjA==",
+ "version": "4.0.9",
+ "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.9.tgz",
+ "integrity": "sha512-PUyaowQFHW+9FKb4dsvvBM4o025rWMlEDXdWRxIOilGaHREYTi5Q2Rt9VCgXgPy/hHZu1LeuXtrA/GdzOatP2g==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@vitest/spy": "4.0.6",
+ "@vitest/spy": "4.0.9",
"estree-walker": "^3.0.3",
- "magic-string": "^0.30.19"
+ "magic-string": "^0.30.21"
},
"funding": {
"url": "https://opencollective.com/vitest"
@@ -1952,9 +1952,9 @@
}
},
"node_modules/@vitest/pretty-format": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.6.tgz",
- "integrity": "sha512-4vptgNkLIA1W1Nn5X4x8rLJBzPiJwnPc+awKtfBE5hNMVsoAl/JCCPPzNrbf+L4NKgklsis5Yp2gYa+XAS442g==",
+ "version": "4.0.9",
+ "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.9.tgz",
+ "integrity": "sha512-Hor0IBTwEi/uZqB7pvGepyElaM8J75pYjrrqbC8ZYMB9/4n5QA63KC15xhT+sqHpdGWfdnPo96E8lQUxs2YzSQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -1965,13 +1965,13 @@
}
},
"node_modules/@vitest/runner": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.6.tgz",
- "integrity": "sha512-trPk5qpd7Jj+AiLZbV/e+KiiaGXZ8ECsRxtnPnCrJr9OW2mLB72Cb824IXgxVz/mVU3Aj4VebY+tDTPn++j1Og==",
+ "version": "4.0.9",
+ "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.9.tgz",
+ "integrity": "sha512-aF77tsXdEvIJRkj9uJZnHtovsVIx22Ambft9HudC+XuG/on1NY/bf5dlDti1N35eJT+QZLb4RF/5dTIG18s98w==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@vitest/utils": "4.0.6",
+ "@vitest/utils": "4.0.9",
"pathe": "^2.0.3"
},
"funding": {
@@ -1979,14 +1979,14 @@
}
},
"node_modules/@vitest/snapshot": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.6.tgz",
- "integrity": "sha512-PaYLt7n2YzuvxhulDDu6c9EosiRuIE+FI2ECKs6yvHyhoga+2TBWI8dwBjs+IeuQaMtZTfioa9tj3uZb7nev1g==",
+ "version": "4.0.9",
+ "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.9.tgz",
+ "integrity": "sha512-r1qR4oYstPbnOjg0Vgd3E8ADJbi4ditCzqr+Z9foUrRhIy778BleNyZMeAJ2EjV+r4ASAaDsdciC9ryMy8xMMg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@vitest/pretty-format": "4.0.6",
- "magic-string": "^0.30.19",
+ "@vitest/pretty-format": "4.0.9",
+ "magic-string": "^0.30.21",
"pathe": "^2.0.3"
},
"funding": {
@@ -1994,9 +1994,9 @@
}
},
"node_modules/@vitest/spy": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.6.tgz",
- "integrity": "sha512-g9jTUYPV1LtRPRCQfhbMintW7BTQz1n6WXYQYRQ25qkyffA4bjVXjkROokZnv7t07OqfaFKw1lPzqKGk1hmNuQ==",
+ "version": "4.0.9",
+ "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.9.tgz",
+ "integrity": "sha512-J9Ttsq0hDXmxmT8CUOWUr1cqqAj2FJRGTdyEjSR+NjoOGKEqkEWj+09yC0HhI8t1W6t4Ctqawl1onHgipJve1A==",
"dev": true,
"license": "MIT",
"funding": {
@@ -2004,13 +2004,13 @@
}
},
"node_modules/@vitest/utils": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.6.tgz",
- "integrity": "sha512-bG43VS3iYKrMIZXBo+y8Pti0O7uNju3KvNn6DrQWhQQKcLavMB+0NZfO1/QBAEbq0MaQ3QjNsnnXlGQvsh0Z6A==",
+ "version": "4.0.9",
+ "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.9.tgz",
+ "integrity": "sha512-cEol6ygTzY4rUPvNZM19sDf7zGa35IYTm9wfzkHoT/f5jX10IOY7QleWSOh5T0e3I3WVozwK5Asom79qW8DiuQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@vitest/pretty-format": "4.0.6",
+ "@vitest/pretty-format": "4.0.9",
"tinyrainbow": "^3.0.3"
},
"funding": {
@@ -3051,9 +3051,9 @@
}
},
"node_modules/vite": {
- "version": "7.1.12",
- "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.12.tgz",
- "integrity": "sha512-ZWyE8YXEXqJrrSLvYgrRP7p62OziLW7xI5HYGWFzOvupfAlrLvURSzv/FyGyy0eidogEM3ujU+kUG1zuHgb6Ug==",
+ "version": "7.2.2",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-7.2.2.tgz",
+ "integrity": "sha512-BxAKBWmIbrDgrokdGZH1IgkIk/5mMHDreLDmCJ0qpyJaAteP8NvMhkwr/ZCQNqNH97bw/dANTE9PDzqwJghfMQ==",
"dev": true,
"license": "MIT",
"peer": true,
@@ -3127,26 +3127,26 @@
}
},
"node_modules/vitest": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.6.tgz",
- "integrity": "sha512-gR7INfiVRwnEOkCk47faros/9McCZMp5LM+OMNWGLaDBSvJxIzwjgNFufkuePBNaesGRnLmNfW+ddbUJRZn0nQ==",
+ "version": "4.0.9",
+ "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.9.tgz",
+ "integrity": "sha512-E0Ja2AX4th+CG33yAFRC+d1wFx2pzU5r6HtG6LiPSE04flaE0qB6YyjSw9ZcpJAtVPfsvZGtJlKWZpuW7EHRxg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@vitest/expect": "4.0.6",
- "@vitest/mocker": "4.0.6",
- "@vitest/pretty-format": "4.0.6",
- "@vitest/runner": "4.0.6",
- "@vitest/snapshot": "4.0.6",
- "@vitest/spy": "4.0.6",
- "@vitest/utils": "4.0.6",
+ "@vitest/expect": "4.0.9",
+ "@vitest/mocker": "4.0.9",
+ "@vitest/pretty-format": "4.0.9",
+ "@vitest/runner": "4.0.9",
+ "@vitest/snapshot": "4.0.9",
+ "@vitest/spy": "4.0.9",
+ "@vitest/utils": "4.0.9",
"debug": "^4.4.3",
"es-module-lexer": "^1.7.0",
"expect-type": "^1.2.2",
- "magic-string": "^0.30.19",
+ "magic-string": "^0.30.21",
"pathe": "^2.0.3",
"picomatch": "^4.0.3",
- "std-env": "^3.9.0",
+ "std-env": "^3.10.0",
"tinybench": "^2.9.0",
"tinyexec": "^0.3.2",
"tinyglobby": "^0.2.15",
@@ -3167,10 +3167,10 @@
"@edge-runtime/vm": "*",
"@types/debug": "^4.1.12",
"@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0",
- "@vitest/browser-playwright": "4.0.6",
- "@vitest/browser-preview": "4.0.6",
- "@vitest/browser-webdriverio": "4.0.6",
- "@vitest/ui": "4.0.6",
+ "@vitest/browser-playwright": "4.0.9",
+ "@vitest/browser-preview": "4.0.9",
+ "@vitest/browser-webdriverio": "4.0.9",
+ "@vitest/ui": "4.0.9",
"happy-dom": "*",
"jsdom": "*"
},
diff --git a/package.json b/package.json
index 4c69a097..b3083137 100755
--- a/package.json
+++ b/package.json
@@ -20,22 +20,22 @@
"@dnd-kit/sortable": "^10.0.0",
"@emotion/react": "^11.14.0",
"@emotion/styled": "^11.14.1",
- "@mui/icons-material": "^7.3.4",
- "@mui/material": "^7.3.4",
+ "@mui/icons-material": "^7.3.5",
+ "@mui/material": "^7.3.5",
"react": "^19.2.0",
"react-dom": "^19.2.0",
"tldts": "^7.0.17"
},
"devDependencies": {
- "@biomejs/biome": "^2.3.2",
- "@types/chrome": "^0.1.27",
- "@types/node": "^24.9.2",
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
- "@vitejs/plugin-react": "^5.1.0",
+ "@biomejs/biome": "^2.3.5",
+ "@types/chrome": "^0.1.29",
+ "@types/node": "^24.10.1",
+ "@types/react": "^19.2.5",
+ "@types/react-dom": "^19.2.3",
+ "@vitejs/plugin-react": "^5.1.1",
"chromex-locale-lint": "^0.1.0",
"typescript": "^5.9.3",
- "vite": "^7.1.12",
- "vitest": "^4.0.6"
+ "vite": "^7.2.2",
+ "vitest": "^4.0.9"
}
}
diff --git a/src/background/index.ts b/src/background/index.ts
deleted file mode 100644
index 81914cd4..00000000
--- a/src/background/index.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-import { addTabGroupingListeners } from "./AutoTabGrouping";
-import { addTabAccessesListener } from "./TabActivityTracker";
-import { activateTabCleanerScheduler } from "./TabCleanerScheduler";
-import { addToolBarActions } from "./ToolBarAction";
-
-if (import.meta.env.DEV) {
- chrome.action.setBadgeText({ text: "DEV" });
-}
-
-// TabActivityTracker
-addTabAccessesListener();
-
-// TabCleanerScheduler
-activateTabCleanerScheduler();
-
-// AutoTabGrouping
-addTabGroupingListeners();
-
-// ToolBarAction
-addToolBarActions();
diff --git a/src/entrypoints/background.ts b/src/entrypoints/background.ts
new file mode 100644
index 00000000..81788bfe
--- /dev/null
+++ b/src/entrypoints/background.ts
@@ -0,0 +1,20 @@
+import { addTabGroupingListeners } from "../platform/background/AutoTabGrouping";
+import { addTabAccessesListener } from "../platform/background/TabActivityTracker";
+import { activateTabCleanerScheduler } from "../platform/background/TabCleanerScheduler";
+import { addToolBarActions } from "../platform/background/ToolBarAction";
+
+if (import.meta.env.DEV) {
+ chrome.action.setBadgeText({ text: "DEV" });
+}
+
+// TabActivityTracker
+addTabAccessesListener();
+
+// TabCleanerScheduler
+activateTabCleanerScheduler();
+
+// AutoTabGrouping
+addTabGroupingListeners();
+
+// ToolBarAction
+addToolBarActions();
diff --git a/src/presentation/views/options/index.tsx b/src/entrypoints/options.tsx
similarity index 63%
rename from src/presentation/views/options/index.tsx
rename to src/entrypoints/options.tsx
index c75c2291..0f17ec14 100644
--- a/src/presentation/views/options/index.tsx
+++ b/src/entrypoints/options.tsx
@@ -1,7 +1,7 @@
import { createRoot } from "react-dom/client";
-import App from "./App";
+import OptionsApp from "../ui/OptionsApp";
const app = document.getElementById("app");
const root = createRoot(app);
-root.render();
+root.render();
diff --git a/src/presentation/views/popup/index.tsx b/src/entrypoints/popup.tsx
similarity index 64%
rename from src/presentation/views/popup/index.tsx
rename to src/entrypoints/popup.tsx
index c75c2291..0023399e 100644
--- a/src/presentation/views/popup/index.tsx
+++ b/src/entrypoints/popup.tsx
@@ -1,7 +1,6 @@
import { createRoot } from "react-dom/client";
-
-import App from "./App";
+import PopupApp from "../ui/PopupApp";
const app = document.getElementById("app");
const root = createRoot(app);
-root.render();
+root.render();
diff --git a/src/presentation/views/sidePanel/index.tsx b/src/entrypoints/sidePanel.tsx
similarity index 61%
rename from src/presentation/views/sidePanel/index.tsx
rename to src/entrypoints/sidePanel.tsx
index 66f538bb..ff6cf864 100644
--- a/src/presentation/views/sidePanel/index.tsx
+++ b/src/entrypoints/sidePanel.tsx
@@ -1,6 +1,6 @@
import { createRoot } from "react-dom/client";
-import App from "../popup/App";
+import PopupApp from "../ui/PopupApp";
const app = document.getElementById("app");
const root = createRoot(app);
-root.render();
+root.render();
diff --git a/src/background/AutoTabGrouping.ts b/src/platform/background/AutoTabGrouping.ts
similarity index 97%
rename from src/background/AutoTabGrouping.ts
rename to src/platform/background/AutoTabGrouping.ts
index c2babea6..c208fdcb 100644
--- a/src/background/AutoTabGrouping.ts
+++ b/src/platform/background/AutoTabGrouping.ts
@@ -1,7 +1,7 @@
import { parse } from "tldts";
-import { sortGroupsAlphabetically } from "../data/repository/TabGroupRepository";
-import { getTabGroupSetting } from "../data/repository/TabGroupSettingRepository";
-import type { TabGroupSetting } from "../model/TabGroupSetting";
+import type { TabGroupSetting } from "../../model/TabGroupSetting";
+import { sortGroupsAlphabetically } from "../repository/TabGroupRepository";
+import { getTabGroupSetting } from "../repository/TabGroupSettingRepository";
export const addTabGroupingListeners = () => {
chrome.tabs.onUpdated.addListener(onTabUpdated);
diff --git a/src/background/TabActivityTracker.ts b/src/platform/background/TabActivityTracker.ts
similarity index 93%
rename from src/background/TabActivityTracker.ts
rename to src/platform/background/TabActivityTracker.ts
index 1dee72f8..3cd1c8c1 100644
--- a/src/background/TabActivityTracker.ts
+++ b/src/platform/background/TabActivityTracker.ts
@@ -2,7 +2,7 @@ import {
cleanupTabLastActivatedAt,
updateRecentActiveTabs,
updateTabLastActivatedAt,
-} from "../data/repository/TabsRepository";
+} from "../repository/TabsRepository";
export const addTabAccessesListener = () => {
chrome.tabs.onCreated.addListener((tab) => {
diff --git a/src/background/TabCleanerScheduler.ts b/src/platform/background/TabCleanerScheduler.ts
similarity index 68%
rename from src/background/TabCleanerScheduler.ts
rename to src/platform/background/TabCleanerScheduler.ts
index 746def0b..3884e7bc 100644
--- a/src/background/TabCleanerScheduler.ts
+++ b/src/platform/background/TabCleanerScheduler.ts
@@ -1,8 +1,8 @@
-import { getTabCleanerSetting } from "../data/repository/TabCleanerRepository";
-import { closeTab } from "../data/repository/TabsRepository";
-import { getWindows } from "../data/repository/WindowsRepository";
-import { shouldCleanUp } from "../model/TabCleaner";
-import { flatTabsInWindows } from "../model/Window";
+import { shouldCleanUp } from "../../model/TabCleaner";
+import { flatTabsInWindows } from "../../model/Window";
+import { getTabCleanerSetting } from "../repository/TabCleanerRepository";
+import { closeTab } from "../repository/TabsRepository";
+import { getWindows } from "../repository/WindowsRepository";
export const activateTabCleanerScheduler = async () => {
const tabCleanerAlarmName = "tabCleanerAlarm";
diff --git a/src/background/ToolBarAction.ts b/src/platform/background/ToolBarAction.ts
similarity index 80%
rename from src/background/ToolBarAction.ts
rename to src/platform/background/ToolBarAction.ts
index 0a6ae3dc..2d35e44f 100644
--- a/src/background/ToolBarAction.ts
+++ b/src/platform/background/ToolBarAction.ts
@@ -1,14 +1,14 @@
+import t from "../../i18n/Translations";
import {
getToolbarSetting,
navigateToOptionsPage,
-} from "../data/repository/SettingsRepository";
+} from "../repository/SettingsRepository";
import {
getTabGroupSetting,
groupTabsBySetting,
-} from "../data/repository/TabGroupSettingRepository";
-import { setToolbarIconBehavior } from "../data/repository/ToolbarRepository";
-import { getWindows, saveWindow } from "../data/repository/WindowsRepository";
-import t from "../i18n/Translations";
+} from "../repository/TabGroupSettingRepository";
+import { setToolbarIconBehavior } from "../repository/ToolbarRepository";
+import { getWindows, saveWindow } from "../repository/WindowsRepository";
const saveCurrentWindowId = "saveCurrentWindow";
const groupTabsNowId = "groupTabsNow";
diff --git a/src/data/repository/SettingsRepository.ts b/src/platform/repository/SettingsRepository.ts
similarity index 100%
rename from src/data/repository/SettingsRepository.ts
rename to src/platform/repository/SettingsRepository.ts
diff --git a/src/data/repository/TabCleanerRepository.ts b/src/platform/repository/TabCleanerRepository.ts
similarity index 100%
rename from src/data/repository/TabCleanerRepository.ts
rename to src/platform/repository/TabCleanerRepository.ts
diff --git a/src/data/repository/TabGroupRepository.ts b/src/platform/repository/TabGroupRepository.ts
similarity index 100%
rename from src/data/repository/TabGroupRepository.ts
rename to src/platform/repository/TabGroupRepository.ts
diff --git a/src/data/repository/TabGroupSettingRepository.ts b/src/platform/repository/TabGroupSettingRepository.ts
similarity index 100%
rename from src/data/repository/TabGroupSettingRepository.ts
rename to src/platform/repository/TabGroupSettingRepository.ts
diff --git a/src/data/repository/TabsRepository.ts b/src/platform/repository/TabsRepository.ts
similarity index 100%
rename from src/data/repository/TabsRepository.ts
rename to src/platform/repository/TabsRepository.ts
diff --git a/src/data/repository/ThemeRepository.ts b/src/platform/repository/ThemeRepository.ts
similarity index 100%
rename from src/data/repository/ThemeRepository.ts
rename to src/platform/repository/ThemeRepository.ts
diff --git a/src/data/repository/ToolbarRepository.ts b/src/platform/repository/ToolbarRepository.ts
similarity index 100%
rename from src/data/repository/ToolbarRepository.ts
rename to src/platform/repository/ToolbarRepository.ts
diff --git a/src/data/repository/WindowsRepository.ts b/src/platform/repository/WindowsRepository.ts
similarity index 100%
rename from src/data/repository/WindowsRepository.ts
rename to src/platform/repository/WindowsRepository.ts
diff --git a/src/data/storage/ChromeLocalStorage.ts b/src/platform/storage/ChromeLocalStorage.ts
similarity index 100%
rename from src/data/storage/ChromeLocalStorage.ts
rename to src/platform/storage/ChromeLocalStorage.ts
diff --git a/src/data/storage/ChromeSessionStorage.ts b/src/platform/storage/ChromeSessionStorage.ts
similarity index 100%
rename from src/data/storage/ChromeSessionStorage.ts
rename to src/platform/storage/ChromeSessionStorage.ts
diff --git a/src/presentation/views/shared/components/TidyTabsPage/index.tsx b/src/presentation/views/shared/components/TidyTabsPage/index.tsx
deleted file mode 100644
index add1af2e..00000000
--- a/src/presentation/views/shared/components/TidyTabsPage/index.tsx
+++ /dev/null
@@ -1,20 +0,0 @@
-import Stack from "@mui/material/Stack";
-import TabCleanerSettingForm from "./TabCleanerForm";
-import TabGroupingForm from "./TabGroupingForm";
-
-type TidyTabsPageProps = {
- dense?: boolean;
-};
-
-const TidyTabsPage = (props: TidyTabsPageProps) => {
- const { dense = false } = props;
-
- return (
-
-
-
-
- );
-};
-
-export default TidyTabsPage;
diff --git a/src/presentation/views/options/App.tsx b/src/ui/OptionsApp.tsx
similarity index 73%
rename from src/presentation/views/options/App.tsx
rename to src/ui/OptionsApp.tsx
index 4d370b42..810972b0 100644
--- a/src/presentation/views/options/App.tsx
+++ b/src/ui/OptionsApp.tsx
@@ -4,16 +4,16 @@ import { createTheme } from "@mui/material/styles";
import useMediaQuery from "@mui/material/useMediaQuery";
import type React from "react";
import { useContext } from "react";
-import { ModeContext, ModeProvider } from "../../contexts/ModeContext";
+import { ModeContext, ModeProvider } from "./contexts/ModeContext";
import {
ThemeColorContext,
ThemeColorProvider,
-} from "../../contexts/ThemeColorContext";
-import { WindowsProvider } from "../../contexts/WindowsContext";
-import { tabGroupColorPalette } from "../shared/resources/tabGroupColorPalette";
-import { themeColorPaletteBy } from "../shared/resources/themeColorPalette";
-import Header from "./Header";
-import Overview from "./Overview";
+} from "./contexts/ThemeColorContext";
+import { WindowsProvider } from "./contexts/WindowsContext";
+import Header from "./options/Header";
+import Overview from "./options/Overview";
+import { tabGroupColorPalette } from "./resources/tabGroupColorPalette";
+import { themeColorPaletteBy } from "./resources/themeColorPalette";
const MuiThemeProvider = ({ children }: { children: React.ReactNode }) => {
const { mode } = useContext(ModeContext);
@@ -32,7 +32,7 @@ const MuiThemeProvider = ({ children }: { children: React.ReactNode }) => {
return {children};
};
-const App = () => {
+const OptionsApp = () => {
return (
@@ -49,4 +49,4 @@ const App = () => {
);
};
-export default App;
+export default OptionsApp;
diff --git a/src/presentation/views/popup/App.tsx b/src/ui/PopupApp.tsx
similarity index 68%
rename from src/presentation/views/popup/App.tsx
rename to src/ui/PopupApp.tsx
index 9438c37e..6433442f 100644
--- a/src/presentation/views/popup/App.tsx
+++ b/src/ui/PopupApp.tsx
@@ -1,12 +1,12 @@
import CssBaseline from "@mui/material/CssBaseline";
import { useEffect } from "react";
-import { ModeProvider } from "../../contexts/ModeContext";
-import { ThemeColorProvider } from "../../contexts/ThemeColorContext";
-import { WindowsProvider } from "../../contexts/WindowsContext";
-import Home from "./components/Home";
-import MuiThemeProvider from "./components/MuiThemeProvider";
+import { ModeProvider } from "./contexts/ModeContext";
+import { ThemeColorProvider } from "./contexts/ThemeColorContext";
+import { WindowsProvider } from "./contexts/WindowsContext";
+import Home from "./popup/Home";
+import MuiThemeProvider from "./popup/MuiThemeProvider";
-const App = ({ sidePanel = false }) => {
+const PopupApp = ({ sidePanel = false }) => {
useEffect(() => {
if (sidePanel) return;
@@ -35,4 +35,4 @@ const App = ({ sidePanel = false }) => {
);
};
-export default App;
+export default PopupApp;
diff --git a/src/presentation/views/shared/components/ActionMenu.tsx b/src/ui/components/ActionMenu.tsx
similarity index 96%
rename from src/presentation/views/shared/components/ActionMenu.tsx
rename to src/ui/components/ActionMenu.tsx
index 39dd194a..017912d9 100644
--- a/src/presentation/views/shared/components/ActionMenu.tsx
+++ b/src/ui/components/ActionMenu.tsx
@@ -24,17 +24,25 @@ import Menu from "@mui/material/Menu";
import MenuItem from "@mui/material/MenuItem";
import SvgIcon from "@mui/material/SvgIcon";
import type React from "react";
+import t from "../../i18n/Translations";
+import type { Tab } from "../../model/Tab";
+import type {
+ Pinned,
+ StoredTabGroup,
+ TabGroup,
+} from "../../model/TabContainer";
+import type { StoredWindow, Window } from "../../model/Window";
import {
navigateToOptionsPage,
openSidePanel,
-} from "../../../../data/repository/SettingsRepository";
+} from "../../platform/repository/SettingsRepository";
import {
closeTabGroup,
removeStoredTabGroup,
restoreTabGroup,
saveTabGroup,
ungroup,
-} from "../../../../data/repository/TabGroupRepository";
+} from "../../platform/repository/TabGroupRepository";
import {
addTabToNewGroup,
closeTabs,
@@ -48,23 +56,15 @@ import {
screenshotVisibleArea,
unpinAllTabs,
unpinTab,
-} from "../../../../data/repository/TabsRepository";
+} from "../../platform/repository/TabsRepository";
import {
closeWindow,
removeStoredWindow,
restoreWindow,
saveWindow,
saveWindows,
-} from "../../../../data/repository/WindowsRepository";
-import t from "../../../../i18n/Translations";
-import type { Tab } from "../../../../model/Tab";
-import type {
- Pinned,
- StoredTabGroup,
- TabGroup,
-} from "../../../../model/TabContainer";
-import type { StoredWindow, Window } from "../../../../model/Window";
-import mergeWindow from "../../../functions/mergeWindow";
+} from "../../platform/repository/WindowsRepository";
+import mergeWindow from "../functions/mergeWindow";
type ActionMenuItemAttrs =
| {
diff --git a/src/presentation/views/shared/components/DragAndDropContext.tsx b/src/ui/components/DragAndDropContext.tsx
similarity index 96%
rename from src/presentation/views/shared/components/DragAndDropContext.tsx
rename to src/ui/components/DragAndDropContext.tsx
index a7c21b21..0cd74f76 100644
--- a/src/presentation/views/shared/components/DragAndDropContext.tsx
+++ b/src/ui/components/DragAndDropContext.tsx
@@ -20,22 +20,7 @@ import type { RectMap } from "@dnd-kit/core/dist/store/types";
import type { Coordinates } from "@dnd-kit/core/dist/types";
import type { SortableData } from "@dnd-kit/sortable";
import { useCallback, useContext, useMemo, useRef, useState } from "react";
-import {
- addTabToTabGroup,
- moveTabGroup,
- moveTabGroupToOtherWindow,
-} from "../../../../data/repository/TabGroupRepository";
-import {
- moveTab,
- moveTabOutOfGroup,
- moveTabToOtherWindow,
- unpinTab,
-} from "../../../../data/repository/TabsRepository";
-import {
- addWindowWithTab,
- addWindowWithTabGroup,
-} from "../../../../data/repository/WindowsRepository";
-import type { Tab } from "../../../../model/Tab";
+import type { Tab } from "../../model/Tab";
import {
isPinned,
isPinnedId,
@@ -43,7 +28,7 @@ import {
isTabContainer,
isTabGroup,
type TabGroup,
-} from "../../../../model/TabContainer";
+} from "../../model/TabContainer";
import {
findParentContainer,
findWindow,
@@ -51,10 +36,25 @@ import {
indexOfWindowChild,
moveTabOrTabGroup,
type Window,
-} from "../../../../model/Window";
-import { WindowsContext } from "../../../contexts/WindowsContext";
-import moveTabFromPinnedToPinned from "../../../functions/moveTabFromPinnedToPinned";
-import moveTabFromRootToPinned from "../../../functions/moveTabFromRootToPinned";
+} from "../../model/Window";
+import {
+ addTabToTabGroup,
+ moveTabGroup,
+ moveTabGroupToOtherWindow,
+} from "../../platform/repository/TabGroupRepository";
+import {
+ moveTab,
+ moveTabOutOfGroup,
+ moveTabToOtherWindow,
+ unpinTab,
+} from "../../platform/repository/TabsRepository";
+import {
+ addWindowWithTab,
+ addWindowWithTabGroup,
+} from "../../platform/repository/WindowsRepository";
+import { WindowsContext } from "../contexts/WindowsContext";
+import moveTabFromPinnedToPinned from "../functions/moveTabFromPinnedToPinned";
+import moveTabFromRootToPinned from "../functions/moveTabFromRootToPinned";
import TabGroupContainer from "./TabGroupContainer";
import TabItem from "./TabItem";
diff --git a/src/presentation/views/shared/components/PaperWithHeader.tsx b/src/ui/components/PaperWithHeader.tsx
similarity index 100%
rename from src/presentation/views/shared/components/PaperWithHeader.tsx
rename to src/ui/components/PaperWithHeader.tsx
diff --git a/src/presentation/views/shared/components/PinnedContainer.tsx b/src/ui/components/PinnedContainer.tsx
similarity index 95%
rename from src/presentation/views/shared/components/PinnedContainer.tsx
rename to src/ui/components/PinnedContainer.tsx
index e87bd300..4ce7a993 100644
--- a/src/presentation/views/shared/components/PinnedContainer.tsx
+++ b/src/ui/components/PinnedContainer.tsx
@@ -15,14 +15,14 @@ import ListItemText from "@mui/material/ListItemText";
import Stack from "@mui/material/Stack";
import Typography from "@mui/material/Typography";
import { useContext, useState } from "react";
-import t from "../../../../i18n/Translations";
+import t from "../../i18n/Translations";
import {
adjacentToTabContainerAfter,
adjacentToTabContainerBefore,
type Pinned,
-} from "../../../../model/TabContainer";
-import type { WindowId } from "../../../../model/Window";
-import { WindowsContext } from "../../../contexts/WindowsContext";
+} from "../../model/TabContainer";
+import type { WindowId } from "../../model/Window";
+import { WindowsContext } from "../contexts/WindowsContext";
import { PinnedActionMenu } from "./ActionMenu";
type PinnedContainerProps = {
diff --git a/src/presentation/views/shared/components/SortableItem.tsx b/src/ui/components/SortableItem.tsx
similarity index 94%
rename from src/presentation/views/shared/components/SortableItem.tsx
rename to src/ui/components/SortableItem.tsx
index 9b578568..508ddf2f 100644
--- a/src/presentation/views/shared/components/SortableItem.tsx
+++ b/src/ui/components/SortableItem.tsx
@@ -1,6 +1,6 @@
import { useSortable } from "@dnd-kit/sortable";
import { CSS } from "@dnd-kit/utilities";
-import type { WindowId } from "../../../../model/Window";
+import type { WindowId } from "../../model/Window";
type SortableItemProps = {
id: string;
diff --git a/src/presentation/views/shared/components/SortableTabs.tsx b/src/ui/components/SortableTabs.tsx
similarity index 94%
rename from src/presentation/views/shared/components/SortableTabs.tsx
rename to src/ui/components/SortableTabs.tsx
index 5aac04ce..da7dace2 100644
--- a/src/presentation/views/shared/components/SortableTabs.tsx
+++ b/src/ui/components/SortableTabs.tsx
@@ -2,7 +2,7 @@ import {
SortableContext,
verticalListSortingStrategy,
} from "@dnd-kit/sortable";
-import type { Tab } from "../../../../model/Tab";
+import type { Tab } from "../../model/Tab";
import SortableItem from "./SortableItem";
import TabItem from "./TabItem";
diff --git a/src/presentation/views/shared/components/TabFavicon.tsx b/src/ui/components/TabFavicon.tsx
similarity index 100%
rename from src/presentation/views/shared/components/TabFavicon.tsx
rename to src/ui/components/TabFavicon.tsx
diff --git a/src/presentation/views/shared/components/TabGroupColorRadio.tsx b/src/ui/components/TabGroupColorRadio.tsx
similarity index 92%
rename from src/presentation/views/shared/components/TabGroupColorRadio.tsx
rename to src/ui/components/TabGroupColorRadio.tsx
index ac10c913..5199a32c 100644
--- a/src/presentation/views/shared/components/TabGroupColorRadio.tsx
+++ b/src/ui/components/TabGroupColorRadio.tsx
@@ -1,7 +1,7 @@
import CircleIcon from "@mui/icons-material/Circle";
import Radio from "@mui/material/Radio";
import { useTheme } from "@mui/material/styles";
-import type { TabGroupColor } from "../../../../model/TabContainer";
+import type { TabGroupColor } from "../../model/TabContainer";
type TabGroupColorRadioProps = {
color: TabGroupColor;
diff --git a/src/presentation/views/shared/components/TabGroupContainer.tsx b/src/ui/components/TabGroupContainer.tsx
similarity index 98%
rename from src/presentation/views/shared/components/TabGroupContainer.tsx
rename to src/ui/components/TabGroupContainer.tsx
index 3ab378ee..ec3790d1 100644
--- a/src/presentation/views/shared/components/TabGroupContainer.tsx
+++ b/src/ui/components/TabGroupContainer.tsx
@@ -16,19 +16,19 @@ import { useTheme } from "@mui/material/styles";
import TextField from "@mui/material/TextField";
import Typography from "@mui/material/Typography";
import { useContext, useEffect, useRef, useState } from "react";
-import {
- collapseTabGroup,
- expandTabGroup,
- updateTabGroupColor,
- updateTabGroupTitle,
-} from "../../../../data/repository/TabGroupRepository";
import {
adjacentToTabContainerAfter,
adjacentToTabContainerBefore,
type TabGroup,
tabGroupColors,
-} from "../../../../model/TabContainer";
-import { WindowsContext } from "../../../contexts/WindowsContext";
+} from "../../model/TabContainer";
+import {
+ collapseTabGroup,
+ expandTabGroup,
+ updateTabGroupColor,
+ updateTabGroupTitle,
+} from "../../platform/repository/TabGroupRepository";
+import { WindowsContext } from "../contexts/WindowsContext";
import { TabGroupActionMenu } from "./ActionMenu";
import TabGroupColorRadio from "./TabGroupColorRadio";
diff --git a/src/presentation/views/shared/components/TabItem.tsx b/src/ui/components/TabItem.tsx
similarity index 95%
rename from src/presentation/views/shared/components/TabItem.tsx
rename to src/ui/components/TabItem.tsx
index 3cb601af..682546c2 100644
--- a/src/presentation/views/shared/components/TabItem.tsx
+++ b/src/ui/components/TabItem.tsx
@@ -15,22 +15,22 @@ import Stack from "@mui/material/Stack";
import { useTheme } from "@mui/material/styles";
import Typography from "@mui/material/Typography";
import { forwardRef, useContext, useState } from "react";
-import { closeTab, focusTab } from "../../../../data/repository/TabsRepository";
-import t from "../../../../i18n/Translations";
-import { durationSinceLastActivatedAt, type Tab } from "../../../../model/Tab";
+import t from "../../i18n/Translations";
+import { durationSinceLastActivatedAt, type Tab } from "../../model/Tab";
import {
isPinned,
isTabGroup,
type TabContainer,
-} from "../../../../model/TabContainer";
+} from "../../model/TabContainer";
import {
findParentContainer,
findTabGroup,
hasDuplicatedTabs,
type Window,
-} from "../../../../model/Window";
-import { WindowsContext } from "../../../contexts/WindowsContext";
-import resolveDuplicatedTabs from "../../../functions/resolveDuplicatedTabs";
+} from "../../model/Window";
+import { closeTab, focusTab } from "../../platform/repository/TabsRepository";
+import { WindowsContext } from "../contexts/WindowsContext";
+import resolveDuplicatedTabs from "../functions/resolveDuplicatedTabs";
import { TabItemActionMenu } from "./ActionMenu";
import TabFavicon from "./TabFavicon";
diff --git a/src/presentation/views/shared/components/TabList.tsx b/src/ui/components/TabList.tsx
similarity index 91%
rename from src/presentation/views/shared/components/TabList.tsx
rename to src/ui/components/TabList.tsx
index 78418f33..ff0824c7 100644
--- a/src/presentation/views/shared/components/TabList.tsx
+++ b/src/ui/components/TabList.tsx
@@ -4,10 +4,10 @@ import {
} from "@dnd-kit/sortable";
import List from "@mui/material/List";
import { memo, useContext, useState } from "react";
-import type { Tab } from "../../../../model/Tab";
-import { isPinned, isTabGroup } from "../../../../model/TabContainer";
-import type { WindowChild } from "../../../../model/Window";
-import { WindowsContext } from "../../../contexts/WindowsContext";
+import type { Tab } from "../../model/Tab";
+import { isPinned, isTabGroup } from "../../model/TabContainer";
+import type { WindowChild } from "../../model/Window";
+import { WindowsContext } from "../contexts/WindowsContext";
import PinnedContainer from "./PinnedContainer";
import SortableItem from "./SortableItem";
import SortableTabs from "./SortableTabs";
diff --git a/src/presentation/contexts/ModeContext.tsx b/src/ui/contexts/ModeContext.tsx
similarity index 94%
rename from src/presentation/contexts/ModeContext.tsx
rename to src/ui/contexts/ModeContext.tsx
index 3b3229ab..1b42a069 100644
--- a/src/presentation/contexts/ModeContext.tsx
+++ b/src/ui/contexts/ModeContext.tsx
@@ -1,10 +1,10 @@
import { createContext, useEffect, useState } from "react";
+import type { Mode } from "../../model/Theme";
import {
addListenerOnChangeMode,
getMode,
removeListenerOnChangeMode,
-} from "../../data/repository/ThemeRepository";
-import type { Mode } from "../../model/Theme";
+} from "../../platform/repository/ThemeRepository";
type ModeContextType = {
mode: Mode;
diff --git a/src/presentation/contexts/StoredTabGroupsContext.tsx b/src/ui/contexts/StoredTabGroupsContext.tsx
similarity index 95%
rename from src/presentation/contexts/StoredTabGroupsContext.tsx
rename to src/ui/contexts/StoredTabGroupsContext.tsx
index e7c6bc84..6a88a40f 100644
--- a/src/presentation/contexts/StoredTabGroupsContext.tsx
+++ b/src/ui/contexts/StoredTabGroupsContext.tsx
@@ -1,11 +1,11 @@
import { createContext, useEffect, useState } from "react";
+import { type AsyncState, initialState } from "../../model/AsyncState";
+import type { StoredTabGroup } from "../../model/TabContainer";
import {
addListenerOnChangeStoredTabGroups,
getStoredTabGroups,
removeListenerOnChangeStoredTabGroups,
-} from "../../data/repository/TabGroupRepository";
-import { type AsyncState, initialState } from "../../model/AsyncState";
-import type { StoredTabGroup } from "../../model/TabContainer";
+} from "../../platform/repository/TabGroupRepository";
import useAsync from "../hooks/useAsync";
export const StoredTabGroupsContext =
diff --git a/src/presentation/contexts/StoredWindowsContext.tsx b/src/ui/contexts/StoredWindowsContext.tsx
similarity index 95%
rename from src/presentation/contexts/StoredWindowsContext.tsx
rename to src/ui/contexts/StoredWindowsContext.tsx
index 0b880f91..f91607b8 100644
--- a/src/presentation/contexts/StoredWindowsContext.tsx
+++ b/src/ui/contexts/StoredWindowsContext.tsx
@@ -1,11 +1,11 @@
import { createContext, useEffect, useState } from "react";
+import { type AsyncState, initialState } from "../../model/AsyncState";
+import type { StoredWindow } from "../../model/Window";
import {
addListenerOnChangeStoredWindows,
getStoredWindows,
removeListenerOnChangeStoredWindows,
-} from "../../data/repository/WindowsRepository";
-import { type AsyncState, initialState } from "../../model/AsyncState";
-import type { StoredWindow } from "../../model/Window";
+} from "../../platform/repository/WindowsRepository";
import useAsync from "../hooks/useAsync";
export const StoredWindowsContext =
diff --git a/src/presentation/contexts/ThemeColorContext.tsx b/src/ui/contexts/ThemeColorContext.tsx
similarity index 95%
rename from src/presentation/contexts/ThemeColorContext.tsx
rename to src/ui/contexts/ThemeColorContext.tsx
index 993fe0fc..0e2ca885 100644
--- a/src/presentation/contexts/ThemeColorContext.tsx
+++ b/src/ui/contexts/ThemeColorContext.tsx
@@ -1,10 +1,10 @@
import { createContext, useEffect, useState } from "react";
+import { defaultThemeColor, type ThemeColor } from "../../model/Theme";
import {
addListenerOnChangeThemeColor,
getThemeColor,
removeListenerOnChangeThemeColor,
-} from "../../data/repository/ThemeRepository";
-import { defaultThemeColor, type ThemeColor } from "../../model/Theme";
+} from "../../platform/repository/ThemeRepository";
type ThemeColorContextType = {
themeColor: ThemeColor;
diff --git a/src/presentation/contexts/WindowsContext.tsx b/src/ui/contexts/WindowsContext.tsx
similarity index 91%
rename from src/presentation/contexts/WindowsContext.tsx
rename to src/ui/contexts/WindowsContext.tsx
index 328ff243..fe47e11f 100644
--- a/src/presentation/contexts/WindowsContext.tsx
+++ b/src/ui/contexts/WindowsContext.tsx
@@ -1,10 +1,10 @@
import { createContext, useCallback, useEffect, useState } from "react";
+import type { Window } from "../../model/Window";
import {
addListenerOnChangeTabs,
removeListenerOnChangeTabs,
-} from "../../data/repository/TabsRepository";
-import { getWindows } from "../../data/repository/WindowsRepository";
-import type { Window } from "../../model/Window";
+} from "../../platform/repository/TabsRepository";
+import { getWindows } from "../../platform/repository/WindowsRepository";
type WindowsContextType = {
windows: Window[];
diff --git a/src/presentation/functions/groupTabsBySearchKeyword.ts b/src/ui/functions/groupTabsBySearchKeyword.ts
similarity index 80%
rename from src/presentation/functions/groupTabsBySearchKeyword.ts
rename to src/ui/functions/groupTabsBySearchKeyword.ts
index 2982b7a3..e293eaa1 100644
--- a/src/presentation/functions/groupTabsBySearchKeyword.ts
+++ b/src/ui/functions/groupTabsBySearchKeyword.ts
@@ -1,10 +1,10 @@
-import { createGroupWithTabs } from "../../data/repository/TabGroupRepository";
-import { addTabsToGroup } from "../../data/repository/TabsRepository";
import {
findGroupsByName,
flatTabsInWindows,
type Window,
} from "../../model/Window";
+import { createGroupWithTabs } from "../../platform/repository/TabGroupRepository";
+import { addTabsToGroup } from "../../platform/repository/TabsRepository";
const groupTabsBySearchKeyword = async (
keyword: string,
diff --git a/src/presentation/functions/mergeWindow.ts b/src/ui/functions/mergeWindow.ts
similarity index 80%
rename from src/presentation/functions/mergeWindow.ts
rename to src/ui/functions/mergeWindow.ts
index 74eddebb..8ab84a7b 100644
--- a/src/presentation/functions/mergeWindow.ts
+++ b/src/ui/functions/mergeWindow.ts
@@ -1,7 +1,7 @@
-import { moveTabGroup } from "../../data/repository/TabGroupRepository";
-import { moveTab, pinTab } from "../../data/repository/TabsRepository";
import { isPinned, isTab, isTabGroup } from "../../model/TabContainer";
import type { Window } from "../../model/Window";
+import { moveTabGroup } from "../../platform/repository/TabGroupRepository";
+import { moveTab, pinTab } from "../../platform/repository/TabsRepository";
const mergeWindow = async (destWindowId: number, sourceWindow: Window) => {
for (const child of sourceWindow.children) {
diff --git a/src/presentation/functions/moveTabFromPinnedToPinned.ts b/src/ui/functions/moveTabFromPinnedToPinned.ts
similarity index 84%
rename from src/presentation/functions/moveTabFromPinnedToPinned.ts
rename to src/ui/functions/moveTabFromPinnedToPinned.ts
index b59e30f0..cd733cb1 100644
--- a/src/presentation/functions/moveTabFromPinnedToPinned.ts
+++ b/src/ui/functions/moveTabFromPinnedToPinned.ts
@@ -1,4 +1,4 @@
-import { moveTab, pinTab } from "../../data/repository/TabsRepository";
+import { moveTab, pinTab } from "../../platform/repository/TabsRepository";
const moveTabFromPinnedToPinned = async (
tabId: number,
diff --git a/src/presentation/functions/moveTabFromRootToPinned.ts b/src/ui/functions/moveTabFromRootToPinned.ts
similarity index 76%
rename from src/presentation/functions/moveTabFromRootToPinned.ts
rename to src/ui/functions/moveTabFromRootToPinned.ts
index 71e4e97d..91b2097c 100644
--- a/src/presentation/functions/moveTabFromRootToPinned.ts
+++ b/src/ui/functions/moveTabFromRootToPinned.ts
@@ -1,4 +1,4 @@
-import { moveTab, pinTab } from "../../data/repository/TabsRepository";
+import { moveTab, pinTab } from "../../platform/repository/TabsRepository";
const moveTabFromRootToPinned = async (
tabId: number,
diff --git a/src/presentation/functions/resolveDuplicatedTabs.ts b/src/ui/functions/resolveDuplicatedTabs.ts
similarity index 87%
rename from src/presentation/functions/resolveDuplicatedTabs.ts
rename to src/ui/functions/resolveDuplicatedTabs.ts
index 28ddd40f..37e55b4b 100644
--- a/src/presentation/functions/resolveDuplicatedTabs.ts
+++ b/src/ui/functions/resolveDuplicatedTabs.ts
@@ -1,6 +1,6 @@
-import { closeTabs } from "../../data/repository/TabsRepository";
import { isSamePageTabs, type Tab } from "../../model/Tab";
import { flatTabsInWindows, type Window } from "../../model/Window";
+import { closeTabs } from "../../platform/repository/TabsRepository";
const resolveDuplicatedTabs = async (windows: Window[], targetTab: Tab) => {
const allTabs = flatTabsInWindows(windows);
diff --git a/src/presentation/hooks/useAsync.ts b/src/ui/hooks/useAsync.ts
similarity index 100%
rename from src/presentation/hooks/useAsync.ts
rename to src/ui/hooks/useAsync.ts
diff --git a/src/presentation/hooks/useDebounce.ts b/src/ui/hooks/useDebounce.ts
similarity index 100%
rename from src/presentation/hooks/useDebounce.ts
rename to src/ui/hooks/useDebounce.ts
diff --git a/src/presentation/views/options/Header.tsx b/src/ui/options/Header.tsx
similarity index 100%
rename from src/presentation/views/options/Header.tsx
rename to src/ui/options/Header.tsx
diff --git a/src/presentation/views/options/Overview.tsx b/src/ui/options/Overview.tsx
similarity index 90%
rename from src/presentation/views/options/Overview.tsx
rename to src/ui/options/Overview.tsx
index b8ceb1a7..ca434dac 100644
--- a/src/presentation/views/options/Overview.tsx
+++ b/src/ui/options/Overview.tsx
@@ -11,16 +11,16 @@ import Stack from "@mui/material/Stack";
import { alpha, useTheme } from "@mui/material/styles";
import Typography from "@mui/material/Typography";
import { useContext, useState } from "react";
-import { addWindow } from "../../../data/repository/WindowsRepository";
-import t from "../../../i18n/Translations";
-import { flatTabsInWindow, type Window } from "../../../model/Window";
-import { WindowsContext } from "../../contexts/WindowsContext";
-import { WindowActionMenu } from "../shared/components/ActionMenu";
+import t from "../../i18n/Translations";
+import { flatTabsInWindow, type Window } from "../../model/Window";
+import { addWindow } from "../../platform/repository/WindowsRepository";
+import { WindowActionMenu } from "../components/ActionMenu";
import DragAndDropContext, {
DROPPABLE_EMPTY_WINDOW_COLUMN_ID,
DROPPABLE_WINDOW_COLUMN_ID_PREFIX,
-} from "../shared/components/DragAndDropContext";
-import TabList from "../shared/components/TabList";
+} from "../components/DragAndDropContext";
+import TabList from "../components/TabList";
+import { WindowsContext } from "../contexts/WindowsContext";
type WindowColumnProps = {
windows: Window[];
diff --git a/src/presentation/views/options/TabSearchForm.tsx b/src/ui/options/TabSearchForm.tsx
similarity index 97%
rename from src/presentation/views/options/TabSearchForm.tsx
rename to src/ui/options/TabSearchForm.tsx
index 958a38ad..3362bd30 100644
--- a/src/presentation/views/options/TabSearchForm.tsx
+++ b/src/ui/options/TabSearchForm.tsx
@@ -18,16 +18,16 @@ import TextField from "@mui/material/TextField";
import Tooltip from "@mui/material/Tooltip";
import Typography from "@mui/material/Typography";
import { useCallback, useContext, useEffect, useRef, useState } from "react";
+import t from "../../i18n/Translations";
+import type { Tab } from "../../model/Tab";
+import { findTabsByTitleOrUrl } from "../../model/Window";
import {
focusTab,
getRecentActiveTabs,
-} from "../../../data/repository/TabsRepository";
-import t from "../../../i18n/Translations";
-import type { Tab } from "../../../model/Tab";
-import { findTabsByTitleOrUrl } from "../../../model/Window";
-import { WindowsContext, WindowsProvider } from "../../contexts/WindowsContext";
-import groupTabsBySearchKeyword from "../../functions/groupTabsBySearchKeyword";
-import TabItem from "../shared/components/TabItem";
+} from "../../platform/repository/TabsRepository";
+import TabItem from "../components/TabItem";
+import { WindowsContext, WindowsProvider } from "../contexts/WindowsContext";
+import groupTabsBySearchKeyword from "../functions/groupTabsBySearchKeyword";
const smoothScrollTo = (container: HTMLElement, targetScrollTop: number) => {
const startScrollTop = container.scrollTop;
diff --git a/src/presentation/views/popup/components/Header.tsx b/src/ui/popup/Header.tsx
similarity index 95%
rename from src/presentation/views/popup/components/Header.tsx
rename to src/ui/popup/Header.tsx
index 4dcbfdeb..fa902fad 100644
--- a/src/presentation/views/popup/components/Header.tsx
+++ b/src/ui/popup/Header.tsx
@@ -13,8 +13,8 @@ import { alpha, styled } from "@mui/material/styles";
import Toolbar from "@mui/material/Toolbar";
import Typography from "@mui/material/Typography";
import { useState } from "react";
-import t from "../../../../i18n/Translations";
-import { PopupHeaderActionMenu } from "../../shared/components/ActionMenu";
+import t from "../../i18n/Translations";
+import { PopupHeaderActionMenu } from "../components/ActionMenu";
import type { PopupPage } from "./Home";
type HeaderProps = {
@@ -38,7 +38,7 @@ const Search = styled("div")(({ theme }) => ({
}));
const SearchIconWrapper = styled("div")(({ theme }) => ({
- padding: theme.spacing(0, 2),
+ padding: theme.spacing(0, 1),
height: "100%",
position: "absolute",
pointerEvents: "none",
@@ -51,7 +51,7 @@ const StyledInputBase = styled(InputBase)(({ theme }) => ({
color: "inherit",
"& .MuiInputBase-input": {
padding: theme.spacing(1, 1, 1, 0),
- paddingLeft: `calc(1em + ${theme.spacing(4)})`,
+ paddingLeft: `calc(1em + ${theme.spacing(3)})`,
transition: theme.transitions.create("width"),
width: "100%",
},
diff --git a/src/presentation/views/popup/components/Home.tsx b/src/ui/popup/Home.tsx
similarity index 80%
rename from src/presentation/views/popup/components/Home.tsx
rename to src/ui/popup/Home.tsx
index c0ba3f85..2b72fc79 100644
--- a/src/presentation/views/popup/components/Home.tsx
+++ b/src/ui/popup/Home.tsx
@@ -1,12 +1,12 @@
import Box from "@mui/material/Box";
import { useEffect, useState } from "react";
-import { getPopupSizeSetting } from "../../../../data/repository/SettingsRepository";
-import { defaultPopupSize, type PopupSize } from "../../../../model/PopupSize";
-import SaveAndRestorePage from "../../shared/components/SaveAndRestorePage";
-import SettingsPage from "../../shared/components/SettingsPage";
-import TidyTabsPage from "../../shared/components/TidyTabsPage";
+import { defaultPopupSize, type PopupSize } from "../../model/PopupSize";
+import { getPopupSizeSetting } from "../../platform/repository/SettingsRepository";
import Header from "./Header";
+import SaveAndRestorePage from "./SaveAndRestorePage";
import SearchResult from "./SearchResult";
+import SettingsPage from "./SettingsPage";
+import TidyTabsPage from "./TidyTabsPage";
import WindowsContainer from "./WindowsContainer";
export type PopupPage = "root" | "saveAndRestore" | "tidyTabs" | "settings";
@@ -55,12 +55,12 @@ const Home = (props: HomeProps) => {
)}
{searchText.length === 0 && currentPage === "saveAndRestore" && (
-
+
)}
{searchText.length === 0 && currentPage === "tidyTabs" && (
-
+
)}
{searchText.length === 0 && currentPage === "settings" && (
diff --git a/src/presentation/views/popup/components/MuiThemeProvider.tsx b/src/ui/popup/MuiThemeProvider.tsx
similarity index 84%
rename from src/presentation/views/popup/components/MuiThemeProvider.tsx
rename to src/ui/popup/MuiThemeProvider.tsx
index e9867531..5853ec7b 100644
--- a/src/presentation/views/popup/components/MuiThemeProvider.tsx
+++ b/src/ui/popup/MuiThemeProvider.tsx
@@ -2,10 +2,10 @@ import { ThemeProvider } from "@emotion/react";
import { createTheme } from "@mui/material/styles";
import useMediaQuery from "@mui/material/useMediaQuery";
import { useContext, useMemo } from "react";
-import { ModeContext } from "../../../contexts/ModeContext";
-import { ThemeColorContext } from "../../../contexts/ThemeColorContext";
-import { tabGroupColorPalette } from "../../shared/resources/tabGroupColorPalette";
-import { themeColorPaletteBy } from "../../shared/resources/themeColorPalette";
+import { ModeContext } from "../contexts/ModeContext";
+import { ThemeColorContext } from "../contexts/ThemeColorContext";
+import { tabGroupColorPalette } from "../resources/tabGroupColorPalette";
+import { themeColorPaletteBy } from "../resources/themeColorPalette";
type MuiThemeProviderProps = {
children: React.ReactNode;
@@ -56,7 +56,8 @@ const MuiThemeProvider = (props: MuiThemeProviderProps) => {
MuiToolbar: {
styleOverrides: {
root: {
- minHeight: 42,
+ minHeight: 48,
+ padding: 8,
},
},
},
diff --git a/src/presentation/views/shared/components/SaveAndRestorePage/AddTabFrom.tsx b/src/ui/popup/SaveAndRestorePage/AddTabFrom.tsx
similarity index 96%
rename from src/presentation/views/shared/components/SaveAndRestorePage/AddTabFrom.tsx
rename to src/ui/popup/SaveAndRestorePage/AddTabFrom.tsx
index 6ec4b2ed..e3b34514 100644
--- a/src/presentation/views/shared/components/SaveAndRestorePage/AddTabFrom.tsx
+++ b/src/ui/popup/SaveAndRestorePage/AddTabFrom.tsx
@@ -3,9 +3,9 @@ import CircularProgress from "@mui/material/CircularProgress";
import Stack from "@mui/material/Stack";
import TextField from "@mui/material/TextField";
import { forwardRef, useCallback, useEffect, useState } from "react";
-import t from "../../../../../i18n/Translations";
-import useDebounce from "../../../../hooks/useDebounce";
-import TabFavicon from "../TabFavicon";
+import t from "../../../i18n/Translations";
+import TabFavicon from "../../components/TabFavicon";
+import useDebounce from "../../hooks/useDebounce";
type AddTabFormProps = {
onComplete: (data: {
diff --git a/src/presentation/views/shared/components/SaveAndRestorePage/StoredTabGroups.tsx b/src/ui/popup/SaveAndRestorePage/StoredTabGroups.tsx
similarity index 93%
rename from src/presentation/views/shared/components/SaveAndRestorePage/StoredTabGroups.tsx
rename to src/ui/popup/SaveAndRestorePage/StoredTabGroups.tsx
index 436ad657..5bfd8c37 100644
--- a/src/presentation/views/shared/components/SaveAndRestorePage/StoredTabGroups.tsx
+++ b/src/ui/popup/SaveAndRestorePage/StoredTabGroups.tsx
@@ -17,31 +17,27 @@ import { alpha, styled, useTheme } from "@mui/material/styles";
import TextField from "@mui/material/TextField";
import Typography from "@mui/material/Typography";
import { useContext, useEffect, useRef, useState } from "react";
+import t from "../../../i18n/Translations";
+import { isLoading } from "../../../model/AsyncState";
+import {
+ type StoredTabGroup,
+ tabGroupColors,
+} from "../../../model/TabContainer";
import {
addTabToSavedGroup,
removeTabFromStoredTabGroup,
updateStoredTabGroupColor,
updateStoredTabGroupName,
-} from "../../../../../data/repository/TabGroupRepository";
-import t from "../../../../../i18n/Translations";
-import { isLoading } from "../../../../../model/AsyncState";
-import {
- type StoredTabGroup,
- tabGroupColors,
-} from "../../../../../model/TabContainer";
-import { StoredTabGroupsContext } from "../../../../contexts/StoredTabGroupsContext";
-import { StoredTabGroupActionMenu } from "../ActionMenu";
-import TabGroupColorRadio from "../TabGroupColorRadio";
+} from "../../../platform/repository/TabGroupRepository";
+import { StoredTabGroupActionMenu } from "../../components/ActionMenu";
+import TabGroupColorRadio from "../../components/TabGroupColorRadio";
+import { StoredTabGroupsContext } from "../../contexts/StoredTabGroupsContext";
import AddTabForm from "./AddTabFrom";
import StoredTabItem from "./StoredTabItem";
-type StoredTabGroupsProps = {
- dense: boolean;
-};
type StoredTabGroupAccordionProps = {
group: StoredTabGroup;
index: number;
- dense: boolean;
};
const OutlinedAccordion = styled((props: AccordionProps) => (
@@ -68,7 +64,7 @@ const AccordionDetails = styled(MuiAccordionDetails)(({ theme }) => ({
}));
const StoredTabGroupAccordion = (props: StoredTabGroupAccordionProps) => {
- const { group, index, dense } = props;
+ const { group, index } = props;
const theme = useTheme();
const editTabGroupFormRef = useRef(null);
const editButtonRef = useRef(null);
@@ -141,7 +137,7 @@ const StoredTabGroupAccordion = (props: StoredTabGroupAccordionProps) => {
{
);
};
-const StoredTabGroups = (props: StoredTabGroupsProps) => {
- const { dense } = props;
+const StoredTabGroups = () => {
const state = useContext(StoredTabGroupsContext);
const sortedGroups = state.value?.sort((a, b) =>
a.storedAt > b.storedAt ? -1 : 1,
@@ -310,7 +305,6 @@ const StoredTabGroups = (props: StoredTabGroupsProps) => {
key={group.internalUid}
group={group}
index={index}
- dense={dense}
/>
))}
diff --git a/src/presentation/views/shared/components/SaveAndRestorePage/StoredTabItem.tsx b/src/ui/popup/SaveAndRestorePage/StoredTabItem.tsx
similarity index 89%
rename from src/presentation/views/shared/components/SaveAndRestorePage/StoredTabItem.tsx
rename to src/ui/popup/SaveAndRestorePage/StoredTabItem.tsx
index b8a8cf8a..acdc7693 100644
--- a/src/presentation/views/shared/components/SaveAndRestorePage/StoredTabItem.tsx
+++ b/src/ui/popup/SaveAndRestorePage/StoredTabItem.tsx
@@ -4,9 +4,9 @@ import ListItem from "@mui/material/ListItem";
import ListItemButton from "@mui/material/ListItemButton";
import ListItemText from "@mui/material/ListItemText";
import { useState } from "react";
-import { createNewTab } from "../../../../../data/repository/TabsRepository";
-import type { StoredTab } from "../../../../../model/Tab";
-import TabFavicon from "../TabFavicon";
+import type { StoredTab } from "../../../model/Tab";
+import { createNewTab } from "../../../platform/repository/TabsRepository";
+import TabFavicon from "../../components/TabFavicon";
type StoredGridTabItemProps = {
tab: StoredTab;
diff --git a/src/presentation/views/shared/components/SaveAndRestorePage/StoredTabItemContainer.tsx b/src/ui/popup/SaveAndRestorePage/StoredTabItemContainer.tsx
similarity index 96%
rename from src/presentation/views/shared/components/SaveAndRestorePage/StoredTabItemContainer.tsx
rename to src/ui/popup/SaveAndRestorePage/StoredTabItemContainer.tsx
index 4228bebb..634d7d15 100644
--- a/src/presentation/views/shared/components/SaveAndRestorePage/StoredTabItemContainer.tsx
+++ b/src/ui/popup/SaveAndRestorePage/StoredTabItemContainer.tsx
@@ -15,19 +15,19 @@ import Stack from "@mui/material/Stack";
import { useTheme } from "@mui/material/styles";
import Typography from "@mui/material/Typography";
import { useState } from "react";
-import {
- restorePinned,
- restoreTabGroup,
-} from "../../../../../data/repository/TabGroupRepository";
-import t from "../../../../../i18n/Translations";
+import t from "../../../i18n/Translations";
import {
adjacentToStoredTabContainerAfter,
adjacentToStoredTabContainerBefore,
isStoredPinned,
isStoredTabGroup,
type StoredTabContainer,
-} from "../../../../../model/TabContainer";
-import type { StoredWindow } from "../../../../../model/Window";
+} from "../../../model/TabContainer";
+import type { StoredWindow } from "../../../model/Window";
+import {
+ restorePinned,
+ restoreTabGroup,
+} from "../../../platform/repository/TabGroupRepository";
import StoredTabItem from "./StoredTabItem";
type StoredTabItemContainerProps = {
diff --git a/src/presentation/views/shared/components/SaveAndRestorePage/StoredWindows.tsx b/src/ui/popup/SaveAndRestorePage/StoredWindows.tsx
similarity index 93%
rename from src/presentation/views/shared/components/SaveAndRestorePage/StoredWindows.tsx
rename to src/ui/popup/SaveAndRestorePage/StoredWindows.tsx
index 5530ed39..13648b38 100644
--- a/src/presentation/views/shared/components/SaveAndRestorePage/StoredWindows.tsx
+++ b/src/ui/popup/SaveAndRestorePage/StoredWindows.tsx
@@ -18,29 +18,25 @@ import { alpha, styled } from "@mui/material/styles";
import TextField from "@mui/material/TextField";
import Typography from "@mui/material/Typography";
import { useContext, useEffect, useRef, useState } from "react";
+import t from "../../../i18n/Translations";
+import { isLoading } from "../../../model/AsyncState";
+import type { StoredWindow } from "../../../model/Window";
import {
addTabToStoredWindow,
removeItemFromStoredWindow,
saveWindow,
updateStoredWindowName,
-} from "../../../../../data/repository/WindowsRepository";
-import t from "../../../../../i18n/Translations";
-import { isLoading } from "../../../../../model/AsyncState";
-import type { StoredWindow } from "../../../../../model/Window";
-import { StoredWindowsContext } from "../../../../contexts/StoredWindowsContext";
-import { WindowsContext } from "../../../../contexts/WindowsContext";
-import { StoredWindowActionMenu } from "../ActionMenu";
+} from "../../../platform/repository/WindowsRepository";
+import { StoredWindowActionMenu } from "../../components/ActionMenu";
+import { StoredWindowsContext } from "../../contexts/StoredWindowsContext";
+import { WindowsContext } from "../../contexts/WindowsContext";
import AddTabForm from "./AddTabFrom";
import StoredTabItem from "./StoredTabItem";
import { StoredTabItemContainer } from "./StoredTabItemContainer";
-type StoredWindowsProps = {
- dense?: boolean;
-};
type StoredWindowAccordionProps = {
window: StoredWindow;
index: number;
- dense: boolean;
};
const OutlinedAccordion = styled((props: AccordionProps) => (
@@ -67,7 +63,7 @@ const AccordionDetails = styled(MuiAccordionDetails)(({ theme }) => ({
}));
const StoredWindowAccordion = (props: StoredWindowAccordionProps) => {
- const { window, index, dense } = props;
+ const { window, index } = props;
const editWindowNameFormRef = useRef(null);
const editButtonRef = useRef(null);
const addTabFormRef = useRef(null);
@@ -142,7 +138,7 @@ const StoredWindowAccordion = (props: StoredWindowAccordionProps) => {
{
);
};
-const StoredWindows = (props: StoredWindowsProps) => {
- const { dense } = props;
+const StoredWindows = () => {
const state = useContext(StoredWindowsContext);
const sortedWindows = state.value?.sort((a, b) =>
a.storedAt > b.storedAt ? -1 : 1,
@@ -284,7 +279,6 @@ const StoredWindows = (props: StoredWindowsProps) => {
key={window.internalUid}
window={window}
index={index}
- dense={dense}
/>
))}
diff --git a/src/presentation/views/shared/components/SaveAndRestorePage/index.tsx b/src/ui/popup/SaveAndRestorePage/index.tsx
similarity index 72%
rename from src/presentation/views/shared/components/SaveAndRestorePage/index.tsx
rename to src/ui/popup/SaveAndRestorePage/index.tsx
index bbb46239..630ca3d4 100644
--- a/src/presentation/views/shared/components/SaveAndRestorePage/index.tsx
+++ b/src/ui/popup/SaveAndRestorePage/index.tsx
@@ -2,20 +2,15 @@ import Stack from "@mui/material/Stack";
import ToggleButton from "@mui/material/ToggleButton";
import ToggleButtonGroup from "@mui/material/ToggleButtonGroup";
import { useState } from "react";
-import t from "../../../../../i18n/Translations";
-import { StoredTabGroupsProvider } from "../../../../contexts/StoredTabGroupsContext";
-import { StoredWindowsProvider } from "../../../../contexts/StoredWindowsContext";
+import t from "../../../i18n/Translations";
+import { StoredTabGroupsProvider } from "../../contexts/StoredTabGroupsContext";
+import { StoredWindowsProvider } from "../../contexts/StoredWindowsContext";
import StoredTabGroups from "./StoredTabGroups";
import StoredWindows from "./StoredWindows";
type Page = "window" | "tabGroup";
-type SaveAndRestorePageProps = {
- dense?: boolean;
-};
-
-const SaveAndRestorePage = (props: SaveAndRestorePageProps) => {
- const { dense = false } = props;
+const SaveAndRestorePage = () => {
const [currentPage, setCurrentPage] = useState("window");
const pages = [
{
@@ -34,7 +29,7 @@ const SaveAndRestorePage = (props: SaveAndRestorePageProps) => {
};
return (
-
+
{
{currentPage === "window" && (
-
+
)}
{currentPage === "tabGroup" && (
-
+
)}
diff --git a/src/presentation/views/popup/components/SearchResult.tsx b/src/ui/popup/SearchResult.tsx
similarity index 92%
rename from src/presentation/views/popup/components/SearchResult.tsx
rename to src/ui/popup/SearchResult.tsx
index 582e23b9..90e46ca7 100644
--- a/src/presentation/views/popup/components/SearchResult.tsx
+++ b/src/ui/popup/SearchResult.tsx
@@ -8,16 +8,16 @@ import Stack from "@mui/material/Stack";
import Tooltip from "@mui/material/Tooltip";
import Typography from "@mui/material/Typography";
import { useContext, useEffect, useRef, useState } from "react";
+import t from "../../i18n/Translations";
+import type { Tab } from "../../model/Tab";
+import { findTabsByTitleOrUrl } from "../../model/Window";
import {
focusTab,
getRecentActiveTabs,
-} from "../../../../data/repository/TabsRepository";
-import t from "../../../../i18n/Translations";
-import type { Tab } from "../../../../model/Tab";
-import { findTabsByTitleOrUrl } from "../../../../model/Window";
-import { WindowsContext } from "../../../contexts/WindowsContext";
-import groupTabsBySearchKeyword from "../../../functions/groupTabsBySearchKeyword";
-import TabItem from "../../shared/components/TabItem";
+} from "../../platform/repository/TabsRepository";
+import TabItem from "../components/TabItem";
+import { WindowsContext } from "../contexts/WindowsContext";
+import groupTabsBySearchKeyword from "../functions/groupTabsBySearchKeyword";
type SearchResultProps = {
searchText: string;
diff --git a/src/presentation/views/shared/components/SettingsPage/ModeSettingForm.tsx b/src/ui/popup/SettingsPage/ModeSettingForm.tsx
similarity index 82%
rename from src/presentation/views/shared/components/SettingsPage/ModeSettingForm.tsx
rename to src/ui/popup/SettingsPage/ModeSettingForm.tsx
index e73e65d3..6a8ac06d 100644
--- a/src/presentation/views/shared/components/SettingsPage/ModeSettingForm.tsx
+++ b/src/ui/popup/SettingsPage/ModeSettingForm.tsx
@@ -4,11 +4,11 @@ import SettingsBrightnessIcon from "@mui/icons-material/SettingsBrightness";
import ToggleButton from "@mui/material/ToggleButton";
import ToggleButtonGroup from "@mui/material/ToggleButtonGroup";
import { useContext } from "react";
-import { updateMode } from "../../../../../data/repository/ThemeRepository";
-import t from "../../../../../i18n/Translations";
-import type { Mode } from "../../../../../model/Theme";
-import { ModeContext } from "../../../../contexts/ModeContext";
-import PaperWithHeader from "../PaperWithHeader";
+import t from "../../../i18n/Translations";
+import type { Mode } from "../../../model/Theme";
+import { updateMode } from "../../../platform/repository/ThemeRepository";
+import PaperWithHeader from "../../components/PaperWithHeader";
+import { ModeContext } from "../../contexts/ModeContext";
const ModeSettingForm = () => {
const { mode } = useContext(ModeContext);
diff --git a/src/presentation/views/shared/components/SettingsPage/PopupSizeSettingForm.tsx b/src/ui/popup/SettingsPage/PopupSizeSettingForm.tsx
similarity index 97%
rename from src/presentation/views/shared/components/SettingsPage/PopupSizeSettingForm.tsx
rename to src/ui/popup/SettingsPage/PopupSizeSettingForm.tsx
index d934b8cc..892003e1 100644
--- a/src/presentation/views/shared/components/SettingsPage/PopupSizeSettingForm.tsx
+++ b/src/ui/popup/SettingsPage/PopupSizeSettingForm.tsx
@@ -10,13 +10,12 @@ import Stack from "@mui/material/Stack";
import TextField from "@mui/material/TextField";
import Typography from "@mui/material/Typography";
import { useEffect, useState } from "react";
-
+import t from "../../../i18n/Translations";
import {
getPopupSizeSetting,
updatePopupSizeSetting,
-} from "../../../../../data/repository/SettingsRepository";
-import t from "../../../../../i18n/Translations";
-import PaperWithHeader from "../PaperWithHeader";
+} from "../../../platform/repository/SettingsRepository";
+import PaperWithHeader from "../../components/PaperWithHeader";
type SettingForm = {
height: string;
diff --git a/src/presentation/views/shared/components/SettingsPage/ThemeColorSettingForm.tsx b/src/ui/popup/SettingsPage/ThemeColorSettingForm.tsx
similarity index 64%
rename from src/presentation/views/shared/components/SettingsPage/ThemeColorSettingForm.tsx
rename to src/ui/popup/SettingsPage/ThemeColorSettingForm.tsx
index 92c736a3..2ffe90b6 100644
--- a/src/presentation/views/shared/components/SettingsPage/ThemeColorSettingForm.tsx
+++ b/src/ui/popup/SettingsPage/ThemeColorSettingForm.tsx
@@ -1,11 +1,11 @@
import Stack from "@mui/material/Stack";
import { useContext } from "react";
-import { updateThemeColor } from "../../../../../data/repository/ThemeRepository";
-import t from "../../../../../i18n/Translations";
-import { themeColors } from "../../../../../model/Theme";
-import { ThemeColorContext } from "../../../../contexts/ThemeColorContext";
-import PaperWithHeader from "../PaperWithHeader";
-import TabGroupColorRadio from "../TabGroupColorRadio";
+import t from "../../../i18n/Translations";
+import { themeColors } from "../../../model/Theme";
+import { updateThemeColor } from "../../../platform/repository/ThemeRepository";
+import PaperWithHeader from "../../components/PaperWithHeader";
+import TabGroupColorRadio from "../../components/TabGroupColorRadio";
+import { ThemeColorContext } from "../../contexts/ThemeColorContext";
const ThemeColorSetting = () => {
const { themeColor } = useContext(ThemeColorContext);
diff --git a/src/presentation/views/shared/components/SettingsPage/ToolbarSettingForm.tsx b/src/ui/popup/SettingsPage/ToolbarSettingForm.tsx
similarity index 84%
rename from src/presentation/views/shared/components/SettingsPage/ToolbarSettingForm.tsx
rename to src/ui/popup/SettingsPage/ToolbarSettingForm.tsx
index 402d448d..1deaaf1c 100644
--- a/src/presentation/views/shared/components/SettingsPage/ToolbarSettingForm.tsx
+++ b/src/ui/popup/SettingsPage/ToolbarSettingForm.tsx
@@ -4,14 +4,14 @@ import ListItemText from "@mui/material/ListItemText";
import MenuItem from "@mui/material/MenuItem";
import Select, { type SelectChangeEvent } from "@mui/material/Select";
import { useEffect, useState } from "react";
-import { getToolbarSetting } from "../../../../../data/repository/SettingsRepository";
-import { setToolbarIconClickOpenView } from "../../../../../data/repository/ToolbarRepository";
-import t from "../../../../../i18n/Translations";
+import t from "../../../i18n/Translations";
import {
isValidIconClickOpenView,
type ToolbarSetting,
-} from "../../../../../model/ToolbarSetting";
-import PaperWithHeader from "../PaperWithHeader";
+} from "../../../model/ToolbarSetting";
+import { getToolbarSetting } from "../../../platform/repository/SettingsRepository";
+import { setToolbarIconClickOpenView } from "../../../platform/repository/ToolbarRepository";
+import PaperWithHeader from "../../components/PaperWithHeader";
const ToolbarSettingForm = () => {
const [settingState, setSettingState] = useState(null);
diff --git a/src/presentation/views/shared/components/SettingsPage/index.tsx b/src/ui/popup/SettingsPage/index.tsx
similarity index 100%
rename from src/presentation/views/shared/components/SettingsPage/index.tsx
rename to src/ui/popup/SettingsPage/index.tsx
diff --git a/src/presentation/views/shared/components/TidyTabsPage/TabCleanerForm.tsx b/src/ui/popup/TidyTabsPage/TabCleanerForm.tsx
similarity index 90%
rename from src/presentation/views/shared/components/TidyTabsPage/TabCleanerForm.tsx
rename to src/ui/popup/TidyTabsPage/TabCleanerForm.tsx
index ca3ce45e..24f4927b 100644
--- a/src/presentation/views/shared/components/TidyTabsPage/TabCleanerForm.tsx
+++ b/src/ui/popup/TidyTabsPage/TabCleanerForm.tsx
@@ -10,26 +10,22 @@ import Stack from "@mui/material/Stack";
import Switch from "@mui/material/Switch";
import TextField from "@mui/material/TextField";
import { useEffect, useState } from "react";
+import t from "../../../i18n/Translations";
+import type { DurationUnit, TabCleaner } from "../../../model/TabCleaner";
import {
addListenerOnChangeTabCleanerSetting,
getTabCleanerSetting,
updateTabCleanerSetting,
-} from "../../../../../data/repository/TabCleanerRepository";
-import { removeListenerOnChangeTabGroupSetting } from "../../../../../data/repository/TabGroupSettingRepository";
-import t from "../../../../../i18n/Translations";
-import type { DurationUnit, TabCleaner } from "../../../../../model/TabCleaner";
-import PaperWithHeader from "../PaperWithHeader";
+} from "../../../platform/repository/TabCleanerRepository";
+import { removeListenerOnChangeTabGroupSetting } from "../../../platform/repository/TabGroupSettingRepository";
+import PaperWithHeader from "../../components/PaperWithHeader";
-type TabCleanerFormProps = {
- dense: boolean;
-};
type DurationErrorState = {
isError: boolean;
errorMessage: string;
};
-const TabCleanerForm = (props: TabCleanerFormProps) => {
- const { dense } = props;
+const TabCleanerForm = () => {
const [setting, setSetting] = useState(null);
const [inputDuration, setInputDuration] = useState("");
const [durationError, setDurationError] = useState({
@@ -89,7 +85,7 @@ const TabCleanerForm = (props: TabCleanerFormProps) => {
return (
{setting && (
-
+
{
- const { dense } = props;
+const TabGroupingForm = () => {
const [setting, setSetting] = useState(null);
useEffect(() => {
@@ -70,7 +65,7 @@ const TabGroupingForm = (props: TabGroupingFormProps) => {
{setting && (
<>
-
+
{t.tabGroupingDetailSettingsSubheader}
diff --git a/src/ui/popup/TidyTabsPage/index.tsx b/src/ui/popup/TidyTabsPage/index.tsx
new file mode 100644
index 00000000..288905b7
--- /dev/null
+++ b/src/ui/popup/TidyTabsPage/index.tsx
@@ -0,0 +1,14 @@
+import Stack from "@mui/material/Stack";
+import TabCleanerSettingForm from "./TabCleanerForm";
+import TabGroupingForm from "./TabGroupingForm";
+
+const TidyTabsPage = () => {
+ return (
+
+
+
+
+ );
+};
+
+export default TidyTabsPage;
diff --git a/src/presentation/views/popup/components/WindowTab.tsx b/src/ui/popup/WindowTab.tsx
similarity index 95%
rename from src/presentation/views/popup/components/WindowTab.tsx
rename to src/ui/popup/WindowTab.tsx
index d5cf5029..9ec20553 100644
--- a/src/presentation/views/popup/components/WindowTab.tsx
+++ b/src/ui/popup/WindowTab.tsx
@@ -7,8 +7,8 @@ import IconButton from "@mui/material/IconButton";
import { alpha, useTheme } from "@mui/material/styles";
import Tab from "@mui/material/Tab";
import { useState } from "react";
-import type { Window, WindowId } from "../../../../model/Window";
-import { WindowActionMenu } from "../../shared/components/ActionMenu";
+import type { Window, WindowId } from "../../model/Window";
+import { WindowActionMenu } from "../components/ActionMenu";
type WindowTabProps = {
id: WindowId;
diff --git a/src/presentation/views/popup/components/WindowTabs.tsx b/src/ui/popup/WindowTabs.tsx
similarity index 93%
rename from src/presentation/views/popup/components/WindowTabs.tsx
rename to src/ui/popup/WindowTabs.tsx
index 92e8de40..1049ec03 100644
--- a/src/presentation/views/popup/components/WindowTabs.tsx
+++ b/src/ui/popup/WindowTabs.tsx
@@ -3,9 +3,9 @@ import { useTheme } from "@mui/material/styles";
import Tabs from "@mui/material/Tabs";
import { type Dispatch, useContext, useEffect } from "react";
-import t from "../../../../i18n/Translations";
-import { flatTabsInWindow } from "../../../../model/Window";
-import { WindowsContext } from "../../../contexts/WindowsContext";
+import t from "../../i18n/Translations";
+import { flatTabsInWindow } from "../../model/Window";
+import { WindowsContext } from "../contexts/WindowsContext";
import WindowTab from "./WindowTab";
diff --git a/src/presentation/views/popup/components/WindowsContainer.tsx b/src/ui/popup/WindowsContainer.tsx
similarity index 77%
rename from src/presentation/views/popup/components/WindowsContainer.tsx
rename to src/ui/popup/WindowsContainer.tsx
index e89450e2..13f66558 100644
--- a/src/presentation/views/popup/components/WindowsContainer.tsx
+++ b/src/ui/popup/WindowsContainer.tsx
@@ -1,9 +1,7 @@
import { useContext, useEffect, useState } from "react";
-
-import { WindowsContext } from "../../../contexts/WindowsContext";
-
-import DragAndDropContext from "../../shared/components/DragAndDropContext";
-import TabList from "../../shared/components/TabList";
+import DragAndDropContext from "../components/DragAndDropContext";
+import TabList from "../components/TabList";
+import { WindowsContext } from "../contexts/WindowsContext";
import WindowTabs from "./WindowTabs";
const WindowsContainer = () => {
diff --git a/src/presentation/views/shared/resources/tabGroupColorPalette.ts b/src/ui/resources/tabGroupColorPalette.ts
similarity index 96%
rename from src/presentation/views/shared/resources/tabGroupColorPalette.ts
rename to src/ui/resources/tabGroupColorPalette.ts
index e11c14ca..f0b7caae 100644
--- a/src/presentation/views/shared/resources/tabGroupColorPalette.ts
+++ b/src/ui/resources/tabGroupColorPalette.ts
@@ -1,5 +1,5 @@
import type { Palette } from "@mui/material/styles";
-import type { Mode } from "../../../../model/Theme";
+import type { Mode } from "../../model/Theme";
declare module "@mui/material/styles" {
interface Palette {
diff --git a/src/presentation/views/shared/resources/themeColorPalette.ts b/src/ui/resources/themeColorPalette.ts
similarity index 97%
rename from src/presentation/views/shared/resources/themeColorPalette.ts
rename to src/ui/resources/themeColorPalette.ts
index d5298852..df624273 100644
--- a/src/presentation/views/shared/resources/themeColorPalette.ts
+++ b/src/ui/resources/themeColorPalette.ts
@@ -10,7 +10,7 @@ import {
yellow,
} from "@mui/material/colors";
import type { PaletteColorOptions } from "@mui/material/styles";
-import type { Mode, ThemeColor } from "../../../../model/Theme";
+import type { Mode, ThemeColor } from "../../model/Theme";
export const themeColorPaletteBy = (
themeColor: ThemeColor,
diff --git a/vite.config.ts b/vite.config.ts
index 0f55c8e7..7b461f09 100644
--- a/vite.config.ts
+++ b/vite.config.ts
@@ -19,16 +19,10 @@ export default defineConfig(({ mode }) => {
reportCompressedSize: isProduction,
rollupOptions: {
input: {
- popup: resolve(__dirname, "src/presentation/views/popup/index.tsx"),
- sidePanel: resolve(
- __dirname,
- "src/presentation/views/sidePanel/index.tsx",
- ),
- options: resolve(
- __dirname,
- "src/presentation/views/options/index.tsx",
- ),
- background: resolve(__dirname, "src/background/index.ts"),
+ popup: resolve(__dirname, "src/entrypoints/popup.tsx"),
+ sidePanel: resolve(__dirname, "src/entrypoints/sidePanel.tsx"),
+ options: resolve(__dirname, "src/entrypoints/options.tsx"),
+ background: resolve(__dirname, "src/entrypoints/background.ts"),
},
output: {
entryFileNames: "[name].js",