mirror of
https://github.com/SteamDeckHomebrew/decky-frontend-lib.git
synced 2026-05-20 18:10:08 +02:00
Compare commits
70 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5aad952936 | ||
|
|
c2b0fad298 | ||
|
|
4d4cfedfe0 | ||
|
|
bb12921863 | ||
|
|
223739af25 | ||
|
|
95d977df45 | ||
|
|
0f2692a3f2 | ||
|
|
ebf496bf61 | ||
|
|
0a5170e412 | ||
|
|
11dd82bbb1 | ||
|
|
153bb209d1 | ||
|
|
e27b638d26 | ||
|
|
7d287f10d6 | ||
|
|
9925bc8cfb | ||
|
|
179a93d5e1 | ||
|
|
5203ce348a | ||
|
|
3f47b5ccce | ||
|
|
d22d32677b | ||
|
|
30e319425b | ||
|
|
aebdfaa089 | ||
|
|
de914b1a35 | ||
|
|
4c4fda47e3 | ||
|
|
678084e4fd | ||
|
|
4f8f65d429 | ||
|
|
8a352d288d | ||
|
|
fd0d011cbf | ||
|
|
70219d90bc | ||
|
|
1ff9351f96 | ||
|
|
c256d341c8 | ||
|
|
c9b583945c | ||
|
|
c213204ff4 | ||
|
|
9128c1e7da | ||
|
|
a06650cf09 | ||
|
|
3170779c6b | ||
|
|
5ffa14bec8 | ||
|
|
ee51dc5fc0 | ||
|
|
b38ec17d8f | ||
|
|
8b54ee990e | ||
|
|
7e01781d40 | ||
|
|
2b31473614 | ||
|
|
8bfeae4b35 | ||
|
|
a7761321bc | ||
|
|
979a630f2b | ||
|
|
a4d1fcf086 | ||
|
|
e9e7f5c026 | ||
|
|
9a691cea09 | ||
|
|
44d9b90cdc | ||
|
|
585c3b8348 | ||
|
|
1287493b63 | ||
|
|
bf01a0184b | ||
|
|
fb5f043ba9 | ||
|
|
26f2c92dce | ||
|
|
01e53d4c13 | ||
|
|
18d341f82a | ||
|
|
3ca8c43a54 | ||
|
|
99353467ad | ||
|
|
b093ce93ba | ||
|
|
74a7cbaf94 | ||
|
|
8fb35e3c09 | ||
|
|
5d5cb31638 | ||
|
|
21f1e5f0af | ||
|
|
0fa43701a9 | ||
|
|
4d52eaea12 | ||
|
|
7e1182a83f | ||
|
|
167ded103a | ||
|
|
b8ddf3d927 | ||
|
|
62f4b354a8 | ||
|
|
79d229be50 | ||
|
|
f43157fde5 | ||
|
|
19819b7a5b |
@@ -7,6 +7,7 @@
|
||||
"preset": "angular",
|
||||
"releaseRules": [
|
||||
{"type": "chore", "scope": "classes", "release": "patch"},
|
||||
{"type": "docs", "scope": "steamclient", "release": "patch"},
|
||||
{"type": "*", "scope": "docs", "release": false}
|
||||
]
|
||||
}
|
||||
|
||||
186
CHANGELOG.md
186
CHANGELOG.md
@@ -1,3 +1,189 @@
|
||||
## [3.24.5](https://github.com/SteamDeckHomebrew/decky-frontend-lib/compare/v3.24.4...v3.24.5) (2024-02-03)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **finds:** make modal and scroll components work on latest betaa ([c2b0fad](https://github.com/SteamDeckHomebrew/decky-frontend-lib/commit/c2b0fad298512aa8778c677275bd497bd8f7b00e))
|
||||
|
||||
## [3.24.4](https://github.com/SteamDeckHomebrew/decky-frontend-lib/compare/v3.24.3...v3.24.4) (2024-01-22)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **types:** fix incorrect `as` on many components leading to any types ([bb12921](https://github.com/SteamDeckHomebrew/decky-frontend-lib/commit/bb129218634b77ddb1d73b0fe38a91898073707c))
|
||||
|
||||
## [3.24.3](https://github.com/SteamDeckHomebrew/decky-frontend-lib/compare/v3.24.2...v3.24.3) (2024-01-20)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **router:** wait 2s if internal navigators init fails ([95d977d](https://github.com/SteamDeckHomebrew/decky-frontend-lib/commit/95d977df452d3b73b007c98854deab1842fa6fbf))
|
||||
|
||||
## [3.24.2](https://github.com/SteamDeckHomebrew/decky-frontend-lib/compare/v3.24.1...v3.24.2) (2024-01-20)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **navigation:** Fix on chromium 109 ([#100](https://github.com/SteamDeckHomebrew/decky-frontend-lib/issues/100)) ([ebf496b](https://github.com/SteamDeckHomebrew/decky-frontend-lib/commit/ebf496bf61cffa1a5205b4a094fd2279011bffa9))
|
||||
|
||||
## [3.24.1](https://github.com/SteamDeckHomebrew/decky-frontend-lib/compare/v3.24.0...v3.24.1) (2023-12-13)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **utils/react:** support react 18, add getReactRoot ([11dd82b](https://github.com/SteamDeckHomebrew/decky-frontend-lib/commit/11dd82bbb1814ac4d2fa9d381372e325daba2558))
|
||||
|
||||
# [3.24.0](https://github.com/SteamDeckHomebrew/decky-frontend-lib/compare/v3.23.1...v3.24.0) (2023-12-03)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **static-classes:** add BasicAppDetailsSectionStylerClasses ([#99](https://github.com/SteamDeckHomebrew/decky-frontend-lib/issues/99)) ([e27b638](https://github.com/SteamDeckHomebrew/decky-frontend-lib/commit/e27b638d26e41332b1554dbd55ca0c55a1821138))
|
||||
|
||||
## [3.23.1](https://github.com/SteamDeckHomebrew/decky-frontend-lib/compare/v3.23.0...v3.23.1) (2023-11-09)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **webpack:** don't break if a module fails to load ([5203ce3](https://github.com/SteamDeckHomebrew/decky-frontend-lib/commit/5203ce348afd727da0c8c52f6d8f8a16712f88d2))
|
||||
|
||||
# [3.23.0](https://github.com/SteamDeckHomebrew/decky-frontend-lib/compare/v3.22.1...v3.23.0) (2023-10-11)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **static-classes:** add more css classes ([#94](https://github.com/SteamDeckHomebrew/decky-frontend-lib/issues/94)) ([30e3194](https://github.com/SteamDeckHomebrew/decky-frontend-lib/commit/30e319425bd4b0ee481dd7bd3245dacd90806afb))
|
||||
|
||||
## [3.22.1](https://github.com/SteamDeckHomebrew/decky-frontend-lib/compare/v3.22.0...v3.22.1) (2023-10-10)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **useQuickAccessVisible:** use the "Page Visibility API" instead of focus/blur ([4c4fda4](https://github.com/SteamDeckHomebrew/decky-frontend-lib/commit/4c4fda47e3d9fd936b493c5965634a0ff443014f))
|
||||
|
||||
# [3.22.0](https://github.com/SteamDeckHomebrew/decky-frontend-lib/compare/v3.21.8...v3.22.0) (2023-08-09)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* add patch indicator to prevent crashes ([3170779](https://github.com/SteamDeckHomebrew/decky-frontend-lib/commit/3170779c6b3d02ea17f7b6c1fbd57e00498ffe4f))
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* add components found while working on tabmaster ([4f8f65d](https://github.com/SteamDeckHomebrew/decky-frontend-lib/commit/4f8f65d42979149cc80b4a86545d3d0d9bf14bf3))
|
||||
* add components found while working on tabmaster ([fd0d011](https://github.com/SteamDeckHomebrew/decky-frontend-lib/commit/fd0d011cbf05790c5a1078970b5be72f9267402c))
|
||||
|
||||
## [3.21.8](https://github.com/SteamDeckHomebrew/decky-frontend-lib/compare/v3.21.7...v3.21.8) (2023-06-27)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* the typescript compiler was eating the enum ([c9b5839](https://github.com/SteamDeckHomebrew/decky-frontend-lib/commit/c9b583945c1cb5267b41a821743590a841572abe))
|
||||
|
||||
## [3.21.7](https://github.com/SteamDeckHomebrew/decky-frontend-lib/compare/v3.21.6...v3.21.7) (2023-06-26)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* add patch indicator to prevent crashes ([#88](https://github.com/SteamDeckHomebrew/decky-frontend-lib/issues/88)) ([9128c1e](https://github.com/SteamDeckHomebrew/decky-frontend-lib/commit/9128c1e7dadb98a8926d3dba9907a01cc78d90cf))
|
||||
|
||||
## [3.21.6](https://github.com/SteamDeckHomebrew/decky-frontend-lib/compare/v3.21.5...v3.21.6) (2023-06-22)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* reposition parameter for file picker V2 ([ee51dc5](https://github.com/SteamDeckHomebrew/decky-frontend-lib/commit/ee51dc5fc0dd5bdc2b0b9e10aa27607fbe51f491))
|
||||
|
||||
## [3.21.5](https://github.com/SteamDeckHomebrew/decky-frontend-lib/compare/v3.21.4...v3.21.5) (2023-06-22)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* missing parameter ([8b54ee9](https://github.com/SteamDeckHomebrew/decky-frontend-lib/commit/8b54ee990ee4d9b51174737979c35ab7ad92ed7a))
|
||||
|
||||
## [3.21.4](https://github.com/SteamDeckHomebrew/decky-frontend-lib/compare/v3.21.3...v3.21.4) (2023-06-22)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* move the new file picker api as v2 ([8bfeae4](https://github.com/SteamDeckHomebrew/decky-frontend-lib/commit/8bfeae4b3593b2efa0aa075a0d9e0b5926cdf169))
|
||||
|
||||
## [3.21.3](https://github.com/SteamDeckHomebrew/decky-frontend-lib/compare/v3.21.2...v3.21.3) (2023-06-22)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* total is not needed as a return value to plugins ([979a630](https://github.com/SteamDeckHomebrew/decky-frontend-lib/commit/979a630f2b02ac4a1ac19e38002244f9dfe97177))
|
||||
|
||||
## [3.21.2](https://github.com/SteamDeckHomebrew/decky-frontend-lib/compare/v3.21.1...v3.21.2) (2023-06-18)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **SidebarNavigation:** allow ReactNode for page title ([44d9b90](https://github.com/SteamDeckHomebrew/decky-frontend-lib/commit/44d9b90cdcfb9e6441fdb1e4b21fe844f1f29fd5))
|
||||
|
||||
## [3.21.1](https://github.com/SteamDeckHomebrew/decky-frontend-lib/compare/v3.21.0...v3.21.1) (2023-05-28)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **reorderable-list:** open label type from string to ReactNode ([fb5f043](https://github.com/SteamDeckHomebrew/decky-frontend-lib/commit/fb5f043ba9eeed0209960c8ae4ae597c2831b8c8))
|
||||
|
||||
# [3.21.0](https://github.com/SteamDeckHomebrew/decky-frontend-lib/compare/v3.20.7...v3.21.0) (2023-05-19)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **Utils:** return null when SP not found ([18d341f](https://github.com/SteamDeckHomebrew/decky-frontend-lib/commit/18d341f82acf843ff830d1bf3d44678f3f2eda52))
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **StaticClasses:** add new GamepadUI classes ([3ca8c43](https://github.com/SteamDeckHomebrew/decky-frontend-lib/commit/3ca8c43a542b1049c4e203ad186e555401fbfbfe))
|
||||
|
||||
## [3.20.7](https://github.com/SteamDeckHomebrew/decky-frontend-lib/compare/v3.20.6...v3.20.7) (2023-05-10)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **decky:** fix decky on latest beta ([74a7cba](https://github.com/SteamDeckHomebrew/decky-frontend-lib/commit/74a7cbaf94538c68a01f5fa707935c4d21570c5f))
|
||||
|
||||
## [3.20.6](https://github.com/SteamDeckHomebrew/decky-frontend-lib/compare/v3.20.5...v3.20.6) (2023-04-29)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **QuickAccessTab:** set decky tab ID to 999 ([5d5cb31](https://github.com/SteamDeckHomebrew/decky-frontend-lib/commit/5d5cb31638070deae9970a93c587b447d5e56559))
|
||||
|
||||
## [3.20.5](https://github.com/SteamDeckHomebrew/decky-frontend-lib/compare/v3.20.4...v3.20.5) (2023-04-04)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* reorderable list no longer toggles on backout ([7e1182a](https://github.com/SteamDeckHomebrew/decky-frontend-lib/commit/7e1182a83f7fafbec6fe115a72f8b64b71c119a4))
|
||||
|
||||
## [3.20.4](https://github.com/SteamDeckHomebrew/decky-frontend-lib/compare/v3.20.3...v3.20.4) (2023-04-04)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **SteamSpinner:** oh apparently the class was moved outside the component for some reason?????? ([b8ddf3d](https://github.com/SteamDeckHomebrew/decky-frontend-lib/commit/b8ddf3d927401d04c0fde8ebc8960639369b8ad3))
|
||||
|
||||
## [3.20.3](https://github.com/SteamDeckHomebrew/decky-frontend-lib/compare/v3.20.2...v3.20.3) (2023-04-04)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **SteamSpinner:** fix the fix ([79d229b](https://github.com/SteamDeckHomebrew/decky-frontend-lib/commit/79d229be50d26e2510af0ea16cdf6644371a5967))
|
||||
|
||||
## [3.20.2](https://github.com/SteamDeckHomebrew/decky-frontend-lib/compare/v3.20.1...v3.20.2) (2023-04-04)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **SteamSpinner:** dont error on latest desktop beta ([19819b7](https://github.com/SteamDeckHomebrew/decky-frontend-lib/commit/19819b7a5bc9434fa802f4e8dca4f4cb6921df07))
|
||||
|
||||
## [3.20.1](https://github.com/SteamDeckHomebrew/decky-frontend-lib/compare/v3.20.0...v3.20.1) (2023-04-03)
|
||||
|
||||
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
|
||||
Library used to develop plugins used for use with [decky-loader](https://github.com/SteamDeckHomebrew/decky-loader).
|
||||
|
||||
## Decky Loader Discord [](https://discord.gg/ZU74G2NJzk)
|
||||
## Decky Loader Discord [](https://deckbrew.xyz/discord)
|
||||
|
||||
Please contact the developers here for questions and support that cannot be addressed via a Github issue.
|
||||
Please [contact the developers here](https://deckbrew.xyz/discord) for questions and support that cannot be addressed via a Github issue.
|
||||
|
||||
## Developers and Contributors
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "decky-frontend-lib",
|
||||
"version": "3.20.1",
|
||||
"version": "3.24.5",
|
||||
"description": "A library for building decky plugins",
|
||||
"main": "dist/index.js",
|
||||
"types": "dist/index.d.ts",
|
||||
|
||||
125
pnpm-lock.yaml
generated
Executable file → Normal file
125
pnpm-lock.yaml
generated
Executable file → Normal file
@@ -1,5 +1,9 @@
|
||||
lockfileVersion: '6.0'
|
||||
|
||||
settings:
|
||||
autoInstallPeers: true
|
||||
excludeLinksFromLockfile: false
|
||||
|
||||
devDependencies:
|
||||
'@commitlint/cli':
|
||||
specifier: ^17.0.2
|
||||
@@ -88,6 +92,14 @@ packages:
|
||||
'@babel/highlight': 7.18.6
|
||||
dev: true
|
||||
|
||||
/@babel/code-frame@7.22.13:
|
||||
resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==}
|
||||
engines: {node: '>=6.9.0'}
|
||||
dependencies:
|
||||
'@babel/highlight': 7.22.20
|
||||
chalk: 2.4.2
|
||||
dev: true
|
||||
|
||||
/@babel/compat-data@7.21.4:
|
||||
resolution: {integrity: sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g==}
|
||||
engines: {node: '>=6.9.0'}
|
||||
@@ -105,7 +117,7 @@ packages:
|
||||
'@babel/helpers': 7.21.0
|
||||
'@babel/parser': 7.21.4
|
||||
'@babel/template': 7.20.7
|
||||
'@babel/traverse': 7.21.4
|
||||
'@babel/traverse': 7.23.2
|
||||
'@babel/types': 7.21.4
|
||||
convert-source-map: 1.9.0
|
||||
debug: 4.3.4
|
||||
@@ -126,6 +138,16 @@ packages:
|
||||
jsesc: 2.5.2
|
||||
dev: true
|
||||
|
||||
/@babel/generator@7.23.0:
|
||||
resolution: {integrity: sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==}
|
||||
engines: {node: '>=6.9.0'}
|
||||
dependencies:
|
||||
'@babel/types': 7.23.0
|
||||
'@jridgewell/gen-mapping': 0.3.2
|
||||
'@jridgewell/trace-mapping': 0.3.17
|
||||
jsesc: 2.5.2
|
||||
dev: true
|
||||
|
||||
/@babel/helper-compilation-targets@7.21.4(@babel/core@7.21.4):
|
||||
resolution: {integrity: sha512-Fa0tTuOXZ1iL8IeDFUWCzjZcn+sJGd9RZdH9esYVjEejGmzf+FFYQpMi/kZUk2kPy/q1H3/GPw7np8qar/stfg==}
|
||||
engines: {node: '>=6.9.0'}
|
||||
@@ -145,19 +167,24 @@ packages:
|
||||
engines: {node: '>=6.9.0'}
|
||||
dev: true
|
||||
|
||||
/@babel/helper-function-name@7.21.0:
|
||||
resolution: {integrity: sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==}
|
||||
/@babel/helper-environment-visitor@7.22.20:
|
||||
resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==}
|
||||
engines: {node: '>=6.9.0'}
|
||||
dependencies:
|
||||
'@babel/template': 7.20.7
|
||||
'@babel/types': 7.21.4
|
||||
dev: true
|
||||
|
||||
/@babel/helper-hoist-variables@7.18.6:
|
||||
resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==}
|
||||
/@babel/helper-function-name@7.23.0:
|
||||
resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==}
|
||||
engines: {node: '>=6.9.0'}
|
||||
dependencies:
|
||||
'@babel/types': 7.21.4
|
||||
'@babel/template': 7.22.15
|
||||
'@babel/types': 7.23.0
|
||||
dev: true
|
||||
|
||||
/@babel/helper-hoist-variables@7.22.5:
|
||||
resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==}
|
||||
engines: {node: '>=6.9.0'}
|
||||
dependencies:
|
||||
'@babel/types': 7.23.0
|
||||
dev: true
|
||||
|
||||
/@babel/helper-module-imports@7.21.4:
|
||||
@@ -177,7 +204,7 @@ packages:
|
||||
'@babel/helper-split-export-declaration': 7.18.6
|
||||
'@babel/helper-validator-identifier': 7.19.1
|
||||
'@babel/template': 7.20.7
|
||||
'@babel/traverse': 7.21.4
|
||||
'@babel/traverse': 7.23.2
|
||||
'@babel/types': 7.21.4
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
@@ -202,16 +229,33 @@ packages:
|
||||
'@babel/types': 7.21.4
|
||||
dev: true
|
||||
|
||||
/@babel/helper-split-export-declaration@7.22.6:
|
||||
resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==}
|
||||
engines: {node: '>=6.9.0'}
|
||||
dependencies:
|
||||
'@babel/types': 7.23.0
|
||||
dev: true
|
||||
|
||||
/@babel/helper-string-parser@7.19.4:
|
||||
resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==}
|
||||
engines: {node: '>=6.9.0'}
|
||||
dev: true
|
||||
|
||||
/@babel/helper-string-parser@7.22.5:
|
||||
resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==}
|
||||
engines: {node: '>=6.9.0'}
|
||||
dev: true
|
||||
|
||||
/@babel/helper-validator-identifier@7.19.1:
|
||||
resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==}
|
||||
engines: {node: '>=6.9.0'}
|
||||
dev: true
|
||||
|
||||
/@babel/helper-validator-identifier@7.22.20:
|
||||
resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==}
|
||||
engines: {node: '>=6.9.0'}
|
||||
dev: true
|
||||
|
||||
/@babel/helper-validator-option@7.21.0:
|
||||
resolution: {integrity: sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==}
|
||||
engines: {node: '>=6.9.0'}
|
||||
@@ -222,7 +266,7 @@ packages:
|
||||
engines: {node: '>=6.9.0'}
|
||||
dependencies:
|
||||
'@babel/template': 7.20.7
|
||||
'@babel/traverse': 7.21.4
|
||||
'@babel/traverse': 7.23.2
|
||||
'@babel/types': 7.21.4
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
@@ -237,6 +281,15 @@ packages:
|
||||
js-tokens: 4.0.0
|
||||
dev: true
|
||||
|
||||
/@babel/highlight@7.22.20:
|
||||
resolution: {integrity: sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==}
|
||||
engines: {node: '>=6.9.0'}
|
||||
dependencies:
|
||||
'@babel/helper-validator-identifier': 7.22.20
|
||||
chalk: 2.4.2
|
||||
js-tokens: 4.0.0
|
||||
dev: true
|
||||
|
||||
/@babel/parser@7.21.4:
|
||||
resolution: {integrity: sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw==}
|
||||
engines: {node: '>=6.0.0'}
|
||||
@@ -245,6 +298,14 @@ packages:
|
||||
'@babel/types': 7.21.4
|
||||
dev: true
|
||||
|
||||
/@babel/parser@7.23.0:
|
||||
resolution: {integrity: sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==}
|
||||
engines: {node: '>=6.0.0'}
|
||||
hasBin: true
|
||||
dependencies:
|
||||
'@babel/types': 7.23.0
|
||||
dev: true
|
||||
|
||||
/@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.21.4):
|
||||
resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==}
|
||||
peerDependencies:
|
||||
@@ -373,18 +434,27 @@ packages:
|
||||
'@babel/types': 7.21.4
|
||||
dev: true
|
||||
|
||||
/@babel/traverse@7.21.4:
|
||||
resolution: {integrity: sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q==}
|
||||
/@babel/template@7.22.15:
|
||||
resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==}
|
||||
engines: {node: '>=6.9.0'}
|
||||
dependencies:
|
||||
'@babel/code-frame': 7.21.4
|
||||
'@babel/generator': 7.21.4
|
||||
'@babel/helper-environment-visitor': 7.18.9
|
||||
'@babel/helper-function-name': 7.21.0
|
||||
'@babel/helper-hoist-variables': 7.18.6
|
||||
'@babel/helper-split-export-declaration': 7.18.6
|
||||
'@babel/parser': 7.21.4
|
||||
'@babel/types': 7.21.4
|
||||
'@babel/code-frame': 7.22.13
|
||||
'@babel/parser': 7.23.0
|
||||
'@babel/types': 7.23.0
|
||||
dev: true
|
||||
|
||||
/@babel/traverse@7.23.2:
|
||||
resolution: {integrity: sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==}
|
||||
engines: {node: '>=6.9.0'}
|
||||
dependencies:
|
||||
'@babel/code-frame': 7.22.13
|
||||
'@babel/generator': 7.23.0
|
||||
'@babel/helper-environment-visitor': 7.22.20
|
||||
'@babel/helper-function-name': 7.23.0
|
||||
'@babel/helper-hoist-variables': 7.22.5
|
||||
'@babel/helper-split-export-declaration': 7.22.6
|
||||
'@babel/parser': 7.23.0
|
||||
'@babel/types': 7.23.0
|
||||
debug: 4.3.4
|
||||
globals: 11.12.0
|
||||
transitivePeerDependencies:
|
||||
@@ -400,6 +470,15 @@ packages:
|
||||
to-fast-properties: 2.0.0
|
||||
dev: true
|
||||
|
||||
/@babel/types@7.23.0:
|
||||
resolution: {integrity: sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==}
|
||||
engines: {node: '>=6.9.0'}
|
||||
dependencies:
|
||||
'@babel/helper-string-parser': 7.22.5
|
||||
'@babel/helper-validator-identifier': 7.22.20
|
||||
to-fast-properties: 2.0.0
|
||||
dev: true
|
||||
|
||||
/@bcoe/v8-coverage@0.2.3:
|
||||
resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==}
|
||||
dev: true
|
||||
@@ -2739,7 +2818,7 @@ packages:
|
||||
dependencies:
|
||||
'@babel/core': 7.21.4
|
||||
'@babel/parser': 7.21.4
|
||||
'@babel/traverse': 7.21.4
|
||||
'@babel/traverse': 7.23.2
|
||||
'@babel/types': 7.21.4
|
||||
find-line-column: 0.5.2
|
||||
transitivePeerDependencies:
|
||||
@@ -3393,7 +3472,7 @@ packages:
|
||||
'@babel/core': 7.21.4
|
||||
'@babel/generator': 7.21.4
|
||||
'@babel/plugin-syntax-typescript': 7.21.4(@babel/core@7.21.4)
|
||||
'@babel/traverse': 7.21.4
|
||||
'@babel/traverse': 7.23.2
|
||||
'@babel/types': 7.21.4
|
||||
'@jest/transform': 27.5.1
|
||||
'@jest/types': 27.5.1
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { Fragment, JSXElementConstructor, ReactElement, useEffect, useState } from 'react';
|
||||
import { Fragment, JSXElementConstructor, ReactElement, ReactNode, useEffect, useState } from 'react';
|
||||
|
||||
import { Field, FieldProps, Focusable, GamepadButton } from '../deck-components';
|
||||
|
||||
@@ -9,7 +9,7 @@ import { Field, FieldProps, Focusable, GamepadButton } from '../deck-components'
|
||||
* @param position The position of this entry in the list.
|
||||
*/
|
||||
export type ReorderableEntry<T> = {
|
||||
label: string;
|
||||
label: ReactNode;
|
||||
data?: T;
|
||||
position: number;
|
||||
};
|
||||
@@ -54,8 +54,9 @@ export function ReorderableList<T>(props: ReorderableListProps<T>) {
|
||||
|
||||
function saveOnBackout(e: Event) {
|
||||
const event = e as CustomEvent;
|
||||
if (event.detail.button == GamepadButton.CANCEL) {
|
||||
toggleReorderEnabled();
|
||||
if (event.detail.button == GamepadButton.CANCEL && reorderEnabled) {
|
||||
setReorderEnabled(!reorderEnabled);
|
||||
props.onSave(entryList);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -9,14 +9,7 @@ function getQuickAccessWindow(): Window | null {
|
||||
/**
|
||||
* Returns state indicating the visibility of quick access menu.
|
||||
*
|
||||
* @remarks
|
||||
* During development it is possible to open the quick access menu without giving it
|
||||
* focus in some cases. In such cases, the quick access menu state is invisible.
|
||||
*
|
||||
* This seems to be impossible to replicate when running the deck normally. Even in
|
||||
* the edge cases it always seems to have a focus.
|
||||
*
|
||||
* @returns `true` if quick access menu is visible (focused) and `false` otherwise.
|
||||
* @returns `true` if quick access menu is visible and `false` otherwise.
|
||||
*
|
||||
* @example
|
||||
* import { VFC, useEffect } from "react";
|
||||
@@ -44,7 +37,10 @@ function getQuickAccessWindow(): Window | null {
|
||||
* };
|
||||
*/
|
||||
export function useQuickAccessVisible(): boolean {
|
||||
const [isVisible, setIsVisible] = useState(getQuickAccessWindow()?.document.hasFocus() ?? true);
|
||||
// By default we say that document is not hidden, unless we know otherwise.
|
||||
// This would cover the cases when Valve breaks something and the quick access window
|
||||
// cannot be accessed anymore - the plugins that use this would continue working somewhat.
|
||||
const [isHidden, setIsHidden] = useState(getQuickAccessWindow()?.document.hidden ?? false);
|
||||
|
||||
useEffect(() => {
|
||||
const quickAccessWindow = getQuickAccessWindow();
|
||||
@@ -53,16 +49,12 @@ export function useQuickAccessVisible(): boolean {
|
||||
return;
|
||||
}
|
||||
|
||||
const onBlur = () => setIsVisible(false);
|
||||
const onFocus = () => setIsVisible(true);
|
||||
|
||||
quickAccessWindow.addEventListener('blur', onBlur);
|
||||
quickAccessWindow.addEventListener('focus', onFocus);
|
||||
const onVisibilityChange = () => setIsHidden(quickAccessWindow.document.hidden);
|
||||
quickAccessWindow.addEventListener('visibilitychange', onVisibilityChange);
|
||||
return () => {
|
||||
quickAccessWindow.removeEventListener('blur', onBlur);
|
||||
quickAccessWindow.removeEventListener('focus', onFocus);
|
||||
quickAccessWindow.removeEventListener('visibilitychange', onVisibilityChange);
|
||||
};
|
||||
}, []);
|
||||
|
||||
return isVisible;
|
||||
return !isHidden;
|
||||
}
|
||||
|
||||
@@ -8,9 +8,9 @@ export interface ButtonItemProps extends ItemProps {
|
||||
disabled?: boolean;
|
||||
}
|
||||
export const ButtonItem =
|
||||
CommonUIModule.ButtonField ||
|
||||
(Object.values(CommonUIModule).find(
|
||||
(CommonUIModule.ButtonField ||
|
||||
Object.values(CommonUIModule).find(
|
||||
(mod: any) =>
|
||||
mod?.render?.toString()?.includes('"highlightOnFocus","childrenContainerWidth"') ||
|
||||
mod?.render?.toString()?.includes('childrenContainerWidth:"min"'),
|
||||
) as FC<ButtonItemProps>);
|
||||
mod?.render?.toString()?.includes('childrenContainerWidth:"min"'),
|
||||
)) as FC<ButtonItemProps>;
|
||||
|
||||
@@ -41,8 +41,8 @@ export const MenuGroup: FC<MenuGroupProps> = findModuleChild((m) => {
|
||||
|
||||
for (let prop in m) {
|
||||
if (
|
||||
(m[prop]?.toString()?.includes('bInGamepadUI:') &&
|
||||
fakeRenderComponent(() => m[prop]())?.type?.prototype?.RenderSubMenu) ||
|
||||
(m[prop]?.toString()?.includes?.('bInGamepadUI:') &&
|
||||
fakeRenderComponent(() => m[prop]({overview: {appid: 7}}))?.type?.prototype?.RenderSubMenu) ||
|
||||
(m[prop]?.prototype?.RenderSubMenu && m[prop]?.prototype?.ShowSubMenu)
|
||||
) {
|
||||
return m[prop];
|
||||
|
||||
@@ -154,3 +154,33 @@ export const ModalRoot = (Object.values(
|
||||
}
|
||||
}
|
||||
})) as FC<ModalRootProps>;
|
||||
|
||||
interface SimpleModalProps {
|
||||
active?: boolean;
|
||||
children: ReactNode;
|
||||
}
|
||||
|
||||
const ModalModule = findModule((mod: any) => {
|
||||
if (typeof mod !== 'object') return false;
|
||||
for (let prop in mod) {
|
||||
if (Object.keys(mod).length > 4 && mod[prop]?.toString().includes('.ModalPosition,fallback:')) return true;
|
||||
}
|
||||
return false;
|
||||
});
|
||||
// findModule((mod) => {
|
||||
// if (typeof mod !== 'object' || !mod.__esModule) return undefined;
|
||||
// if (mod.SimpleModal && mod.ModalPosition) return mod;
|
||||
// })
|
||||
|
||||
const ModalModuleProps = ModalModule ? Object.values(ModalModule) : [];
|
||||
|
||||
|
||||
// export const SimpleModal = ModalModule.SimpleModal as FC<SimpleModalProps>;
|
||||
// export const ModalPosition = ModalModule.ModalPosition as FC<SimpleModalProps>;
|
||||
|
||||
export const SimpleModal = ModalModuleProps.find(prop => {
|
||||
const string = prop?.toString()
|
||||
return string?.includes(".ShowPortalModal()") && string?.includes(".OnElementReadyCallbacks.Register(")
|
||||
}) as FC<SimpleModalProps>;
|
||||
|
||||
export const ModalPosition = ModalModuleProps.find(prop => prop?.toString().includes(".ModalPosition,fallback:")) as FC<SimpleModalProps>;
|
||||
|
||||
@@ -2,6 +2,11 @@ import { FC, ReactNode } from 'react';
|
||||
|
||||
import { findModuleChild } from '../webpack';
|
||||
|
||||
export const Panel: FC<{ children?: ReactNode; }> = findModuleChild((mod) => {
|
||||
if (typeof mod !== 'object' || !mod.__esModule) return undefined;
|
||||
return mod.Panel;
|
||||
})
|
||||
|
||||
export interface PanelSectionProps {
|
||||
title?: string;
|
||||
spinner?: boolean;
|
||||
@@ -24,5 +29,5 @@ export interface PanelSectionRowProps {
|
||||
}
|
||||
// New as of Feb 22 2023 Beta || Old
|
||||
export const PanelSectionRow =
|
||||
mod.PanelSectionRow ||
|
||||
(Object.values(mod).filter((exp: any) => !exp?.toString()?.includes('.PanelSection'))[0] as FC<PanelSectionRowProps>);
|
||||
(mod.PanelSectionRow ||
|
||||
Object.values(mod).filter((exp: any) => !exp?.toString()?.includes('.PanelSection'))[0]) as FC<PanelSectionRowProps>;
|
||||
|
||||
@@ -15,7 +15,8 @@ export enum QuickAccessTab {
|
||||
Settings,
|
||||
Perf,
|
||||
Help,
|
||||
Decky,
|
||||
Music,
|
||||
Decky = 999,
|
||||
}
|
||||
|
||||
export enum DisplayStatus {
|
||||
@@ -135,7 +136,7 @@ try {
|
||||
InternalNavigators = findModuleChild((m: any) => {
|
||||
if (typeof m !== 'object') return undefined;
|
||||
for (let prop in m) {
|
||||
if (m[prop]?.GetNavigator) {
|
||||
if (m[prop]?.GetNavigator && m[prop]?.SetNavigator) {
|
||||
return m[prop];
|
||||
}
|
||||
}
|
||||
@@ -147,7 +148,7 @@ try {
|
||||
initInternalNavigators();
|
||||
while (!InternalNavigators?.AppProperties) {
|
||||
console.log('[DFL:Router]: Trying to init internal navigators again');
|
||||
await sleep(100);
|
||||
await sleep(2000);
|
||||
initInternalNavigators();
|
||||
}
|
||||
}
|
||||
@@ -159,7 +160,7 @@ try {
|
||||
NavigateToAppProperties: InternalNavigators?.AppProperties || Router.NavigateToAppProperties?.bind(Router),
|
||||
NavigateToExternalWeb: InternalNavigators?.ExternalWeb || Router.NavigateToExternalWeb?.bind(Router),
|
||||
NavigateToInvites: InternalNavigators?.Invites || Router.NavigateToInvites?.bind(Router),
|
||||
NavigateToChat: Router.NavigateToChat?.bind(Router),
|
||||
NavigateToChat: InternalNavigators?.Chat || Router.NavigateToChat?.bind(Router),
|
||||
NavigateToLibraryTab: InternalNavigators?.LibraryTab || Router.NavigateToLibraryTab?.bind(Router),
|
||||
NavigateToLayoutPreview: Router.NavigateToLayoutPreview?.bind(Router),
|
||||
NavigateToSteamWeb: Router.WindowStore?.GamepadUIMainWindowInstance?.NavigateToSteamWeb?.bind(
|
||||
|
||||
22
src/deck-components/Scroll.tsx
Normal file
22
src/deck-components/Scroll.tsx
Normal file
@@ -0,0 +1,22 @@
|
||||
import { FC, ReactNode } from 'react';
|
||||
|
||||
import { findModule, findModuleChild } from '../webpack';
|
||||
|
||||
const ScrollingModule = findModule((mod) => {
|
||||
if (typeof mod !== 'object') return false;
|
||||
for (let prop in mod) {
|
||||
if (mod[prop]?.render?.toString?.().includes("{case\"x\":")) return true;
|
||||
}
|
||||
return false;
|
||||
});
|
||||
|
||||
const ScrollingModuleProps = ScrollingModule ? Object.values(ScrollingModule) : [];
|
||||
|
||||
export const ScrollPanel = ScrollingModuleProps.find((prop: any) => prop?.render?.toString?.().includes("{case\"x\":")) as FC<{ children?: ReactNode }>;
|
||||
|
||||
export const ScrollPanelGroup: FC<{ children?: ReactNode }> = findModuleChild((mod) => {
|
||||
if (typeof mod !== 'object') return undefined;
|
||||
for (let prop in mod) {
|
||||
if (mod[prop]?.render?.toString().includes(".FocusVisibleChild()),[])")) return mod[prop];
|
||||
}
|
||||
});
|
||||
@@ -3,7 +3,7 @@ import { ReactNode, VFC } from 'react';
|
||||
import { Module, findModuleChild } from '../webpack';
|
||||
|
||||
export interface SidebarNavigationPage {
|
||||
title: string;
|
||||
title: ReactNode;
|
||||
content: ReactNode;
|
||||
icon?: ReactNode;
|
||||
visible?: boolean;
|
||||
|
||||
@@ -5,7 +5,9 @@ import { findModuleChild } from '../webpack';
|
||||
export const SteamSpinner = findModuleChild((m) => {
|
||||
if (typeof m !== 'object') return undefined;
|
||||
for (let prop in m) {
|
||||
if (m[prop]?.toString()?.includes('Steam Spinner') && m[prop].toString().includes('PreloadThrobber'))
|
||||
if (
|
||||
m[prop]?.toString?.()?.includes('Steam Spinner') && m[prop]?.toString?.()?.includes('src')
|
||||
)
|
||||
return m[prop];
|
||||
}
|
||||
}) as FC<SVGAttributes<SVGElement>>;
|
||||
|
||||
@@ -112,12 +112,12 @@ try {
|
||||
}
|
||||
|
||||
/**
|
||||
* Tabs component as used in the library and media tabs. See {@link TabsProps}
|
||||
* Tabs component as used in the library and media tabs. See {@link TabsProps}.
|
||||
* Unlike other components in `decky-frontend-lib`, this requires Decky Loader to be running.
|
||||
*/
|
||||
export const Tabs =
|
||||
oldTabs ||
|
||||
(((props: TabsProps) => {
|
||||
(oldTabs ||
|
||||
((props: TabsProps) => {
|
||||
const found = tabsComponent;
|
||||
const [tc, setTC] = useState<FC<TabsProps>>(found);
|
||||
useEffect(() => {
|
||||
@@ -131,4 +131,4 @@ export const Tabs =
|
||||
}, []);
|
||||
console.log('tc', tc);
|
||||
return tc ? createElement(tc, props) : <SteamSpinner />;
|
||||
}) as FC<TabsProps>);
|
||||
})) as FC<TabsProps>;
|
||||
|
||||
@@ -25,6 +25,7 @@ export * from './TextField';
|
||||
export * from './Toggle';
|
||||
export * from './ToggleField';
|
||||
export * from './SteamClient';
|
||||
export * from './Scroll';
|
||||
|
||||
import { AppDetails, LogoPosition, SteamAppOverview, SteamClient } from './SteamClient';
|
||||
|
||||
|
||||
@@ -441,6 +441,258 @@ type AppDetailsClasses = Record<
|
||||
string
|
||||
>;
|
||||
|
||||
type GamepadUIClasses = Record<
|
||||
| 'duration-app-launch'
|
||||
| 'TransitionMenuDelay'
|
||||
| 'PanelSection'
|
||||
| 'PanelSectionTitle'
|
||||
| 'Text'
|
||||
| 'PanelSectionRow'
|
||||
| 'Label'
|
||||
| 'ComingSoon'
|
||||
| 'LowBattery'
|
||||
| 'ReallyLow'
|
||||
| 'LowBatteryGauge'
|
||||
| 'Remaining'
|
||||
| 'EmptyNotifications'
|
||||
| 'BatterySectionContainer'
|
||||
| 'BatteryIcon'
|
||||
| 'BatteryPercentageLabel'
|
||||
| 'BatteryDetailsLabels'
|
||||
| 'BatteryProjectedValue'
|
||||
| 'BatteryProjectedLabel'
|
||||
| 'ViewPlaceholder'
|
||||
| 'FullHeight'
|
||||
| 'Title'
|
||||
| 'Container'
|
||||
| 'Open'
|
||||
| 'QuickAccessMenu'
|
||||
| 'HeaderContainer'
|
||||
| 'Menu'
|
||||
| 'HeaderAndFooterVisible'
|
||||
| 'TabContentColumn'
|
||||
| 'Tabs'
|
||||
| 'Tab'
|
||||
| 'Selected'
|
||||
| 'ItemFocusAnim-darkerGrey'
|
||||
| 'ItemFocusAnim-darkerGrey-nocolor'
|
||||
| 'VoiceTab'
|
||||
| 'ItemFocusAnim-green'
|
||||
| 'Blocked'
|
||||
| 'TabPanelHidden'
|
||||
| 'FriendsTitle'
|
||||
| 'FriendsListTabPanel'
|
||||
| 'PanelOuterNav'
|
||||
| 'PanelExitAnchor'
|
||||
| 'TabGroupPanel'
|
||||
| 'FooterBoxShadow'
|
||||
| 'AllTabContents'
|
||||
| 'ContentTransition'
|
||||
| 'ActiveTab'
|
||||
| 'Up'
|
||||
| 'Enter'
|
||||
| 'EnterActive'
|
||||
| 'Exit'
|
||||
| 'ExitActive'
|
||||
| 'Down'
|
||||
| 'KeyboardButton'
|
||||
| 'ItemFocusAnim-darkGrey'
|
||||
| 'ItemFocusAnim-grey'
|
||||
| 'ItemFocusAnimBorder-darkGrey'
|
||||
| 'focusAnimation'
|
||||
| 'hoverAnimation',
|
||||
string
|
||||
>;
|
||||
|
||||
type GamepadTabbedPageClasses = Record<
|
||||
| 'duration-app-launch'
|
||||
| 'headerHeight'
|
||||
| 'contentPadding'
|
||||
| 'GamepadTabbedPage'
|
||||
| 'TabHeaderRowWrapper'
|
||||
| 'Floating'
|
||||
| 'TabRow'
|
||||
| 'TabRowTabs'
|
||||
| 'BleedGlyphs'
|
||||
| 'TabsRowScroll'
|
||||
| 'FixCenterAlignScroll'
|
||||
| 'Tab'
|
||||
| 'Selected'
|
||||
| 'HasAddon'
|
||||
| 'RightAddon'
|
||||
| 'TabTitle'
|
||||
| 'LeftAddon'
|
||||
| 'TabCount'
|
||||
| 'Active'
|
||||
| 'TabBadge'
|
||||
| 'TabCountBadge'
|
||||
| 'TabRowSpacer'
|
||||
| 'Glyphs'
|
||||
| 'Show'
|
||||
| 'TabContents'
|
||||
| 'ContentTransition'
|
||||
| 'TabContentsScroll'
|
||||
| 'Right'
|
||||
| 'Enter'
|
||||
| 'EnterActive'
|
||||
| 'Exit'
|
||||
| 'ExitActive'
|
||||
| 'Left'
|
||||
| 'TabIcon',
|
||||
string
|
||||
>;
|
||||
|
||||
type GamepadContextMenuClasses = Record<
|
||||
| "duration-app-launch"
|
||||
| "BasicContextMenuModal"
|
||||
| "BasicContextMenuHeader"
|
||||
| "BasicContextMenuHeaderShrinkableSpacing"
|
||||
| "BasicContextMenuContainer"
|
||||
| "slideInAnimation"
|
||||
| "contextMenu"
|
||||
| "contextMenuContents"
|
||||
| "hasSubMenu"
|
||||
| "contextMenuFade"
|
||||
| "contextMenuItem"
|
||||
| "active"
|
||||
| "Selected"
|
||||
| "Focused"
|
||||
| "Positive"
|
||||
| "Emphasis"
|
||||
| "Destructive"
|
||||
| "Capitalized"
|
||||
| "MenuSectionHeader"
|
||||
| "UpperCase"
|
||||
| "SubMenu"
|
||||
| "ContextMenuSeparator"
|
||||
| "Label"
|
||||
| "Arrow"
|
||||
| "ItemFocusAnim-darkerGrey-nocolor"
|
||||
| "ItemFocusAnim-darkerGrey"
|
||||
| "ItemFocusAnim-darkGrey"
|
||||
| "ItemFocusAnim-grey"
|
||||
| "ItemFocusAnimBorder-darkGrey"
|
||||
| "ItemFocusAnim-green"
|
||||
| "focusAnimation"
|
||||
| "hoverAnimation",
|
||||
string
|
||||
>;
|
||||
|
||||
type AchievementClasses = Record<
|
||||
| "nAchievementHeight"
|
||||
| "nGlobalAchievementHeight"
|
||||
| "nAchievementsListTitleHeight"
|
||||
| "nAchievementGap"
|
||||
| "AchievementList"
|
||||
| "ListTitle"
|
||||
| "AchievementListItemBase"
|
||||
| "Container"
|
||||
| "Content"
|
||||
| "Right"
|
||||
| "Footer"
|
||||
| "AchievementTitle"
|
||||
| "AchievementDescription"
|
||||
| "AchievementGlobalPercentage"
|
||||
| "InBody"
|
||||
| "VerticalContent"
|
||||
| "UnlockDate"
|
||||
| "AlignEnd"
|
||||
| "ProgressBar"
|
||||
| "ProgressCount"
|
||||
| "AchievementContent"
|
||||
| "HiddenAchievementContent"
|
||||
| "FriendAchievementFooter"
|
||||
| "GlobalPercentage"
|
||||
| "UserUnlockDateTime"
|
||||
| "GlobalAchievementsListHeader"
|
||||
| "SearchField"
|
||||
| "Avatar"
|
||||
| "HeaderText"
|
||||
| "GlobalAchievementListItem"
|
||||
| "UnlockContainer"
|
||||
| "Info"
|
||||
| "Title"
|
||||
| "Description"
|
||||
| "Percent"
|
||||
| "ImageContainer"
|
||||
| "ProgressFill"
|
||||
| "SpoilerWarning"
|
||||
| "Hidden"
|
||||
| "ComparisonAchieverColumn"
|
||||
| "ComparisonAchieverInfo"
|
||||
| "ProgressContainer"
|
||||
| "ProgressLabel"
|
||||
| "Secondary"
|
||||
| "AvatarContainer"
|
||||
| "Unachieved",
|
||||
string
|
||||
>;
|
||||
|
||||
type MainMenuAppRunningClasses = Record<
|
||||
| "duration-app-launch"
|
||||
| "ScrollMask"
|
||||
| "HideMask"
|
||||
| "MainMenuAppRunning"
|
||||
| "MenuOpen"
|
||||
| "NavigationColumn"
|
||||
| "ControllerColumnFocused"
|
||||
| "NavColumnFocused"
|
||||
| "NavigationBox"
|
||||
| "NavigationMenuItem"
|
||||
| "ItemFocusAnim-darkerGrey"
|
||||
| "Active"
|
||||
| "Disabled"
|
||||
| "SwitchAppsTitle"
|
||||
| "SelectableAppWindow"
|
||||
| "ActiveDot"
|
||||
| "NavigationMenuItemSeparator"
|
||||
| "AppColumn"
|
||||
| "FocusedColumn"
|
||||
| "AppColumnContent"
|
||||
| "ActiveContent"
|
||||
| "CurrentGameBackground"
|
||||
| "CurrentGameLogo"
|
||||
| "OverlayAchievements"
|
||||
| "Container"
|
||||
| "OverlayGuides"
|
||||
| "OverlayNotes"
|
||||
| "OverlayInplaceBrowser"
|
||||
| "ItemFocusAnim-darkerGrey-nocolor"
|
||||
| "ItemFocusAnim-darkGrey"
|
||||
| "ItemFocusAnim-grey"
|
||||
| "ItemFocusAnimBorder-darkGrey"
|
||||
| "ItemFocusAnim-green"
|
||||
| "focusAnimation"
|
||||
| "hoverAnimation",
|
||||
string
|
||||
>;
|
||||
|
||||
type BasicAppDetailsSectionStylerClasses = Record<
|
||||
| "duration-app-launch"
|
||||
| "headerPadding"
|
||||
| "Header"
|
||||
| "AppDetailsContent"
|
||||
| "AppDetailsContainer"
|
||||
| "AppDetailsRoot"
|
||||
| "GameInfoContainer"
|
||||
| "GameInfoQuickLinks"
|
||||
| "GameInfoCollections"
|
||||
| "CollectionsHeader"
|
||||
| "PlaySection"
|
||||
| "ActionRow"
|
||||
| "AppDetailSectionList"
|
||||
| "AppActionButton"
|
||||
| "ActionButtonAndStatusPanel"
|
||||
| "AppButtons"
|
||||
| "InvertFocusedIcon"
|
||||
| "DeckVerifiedFeedbackContainer"
|
||||
| "DeckVerifiedFeedbackConfirmationContainer"
|
||||
| "DeckVerifiedFeedbackButton"
|
||||
| "DeckVerifiedFeedbackQuestion"
|
||||
| "DeckVerifiedFeedbackConfirmation",
|
||||
string
|
||||
>;
|
||||
|
||||
export const quickAccessMenuClasses: QuickAccessMenuClasses = findModule(
|
||||
(mod) => typeof mod === 'object' && mod?.Title?.includes('quickaccessmenu'),
|
||||
);
|
||||
@@ -459,7 +711,7 @@ export const gamepadDialogClasses: GamepadDialogClasses = findModule(
|
||||
(mod) => typeof mod === 'object' && mod?.GamepadDialogContent?.includes('gamepaddialog'),
|
||||
);
|
||||
export const quickAccessControlsClasses: QuickAccessControlsClasses = findModule(
|
||||
(mod) => typeof mod === 'object' && mod?.PanelSection?.includes('quickaccesscontrols'),
|
||||
(mod) => typeof mod === 'object' && typeof mod?.PanelSection === 'string' && mod?.PanelSection?.includes('quickaccesscontrols'),
|
||||
);
|
||||
export const updaterFieldClasses: UpdaterFieldClasses = findModule(
|
||||
(mod) => typeof mod === 'object' && mod?.OOBEUpdateStatusContainer?.includes('updaterfield'),
|
||||
@@ -476,3 +728,21 @@ export const appDetailsHeaderClasses: AppDetailsHeaderClasses = findModule(
|
||||
export const appDetailsClasses: AppDetailsClasses = findModule(
|
||||
(mod) => typeof mod === 'object' && mod?.HeaderLoaded?.includes('appdetails_'),
|
||||
);
|
||||
export const gamepadUIClasses: GamepadUIClasses = findModule(
|
||||
(mod) => typeof mod === 'object' && mod?.BasicUiRoot?.includes('gamepadui_'),
|
||||
);
|
||||
export const gamepadTabbedPageClasses: GamepadTabbedPageClasses = findModule(
|
||||
(mod) => typeof mod === 'object' && mod?.GamepadTabbedPage?.includes('gamepadtabbedpage_')
|
||||
);
|
||||
export const gamepadContextMenuClasses: GamepadContextMenuClasses = findModule(
|
||||
(mod) => typeof mod === 'object' && mod?.BasicContextMenuModal?.includes('gamepadcontextmenu')
|
||||
);
|
||||
export const achievementClasses: AchievementClasses = findModule(
|
||||
(mod) => typeof mod === 'object' && mod?.AchievementListItemBase?.includes('achievementslist')
|
||||
);
|
||||
export const mainMenuAppRunningClasses: MainMenuAppRunningClasses = findModule(
|
||||
(mod) => typeof mod === 'object' && mod?.MainMenuAppRunning?.includes('mainmenuapprunning')
|
||||
);
|
||||
export const basicAppDetailsSectionStylerClasses: BasicAppDetailsSectionStylerClasses = findModule(
|
||||
(mod) => typeof mod === 'object' && mod?.AppDetailsRoot?.includes('basicappdetailssectionstyler_')
|
||||
);
|
||||
|
||||
@@ -57,10 +57,26 @@ export interface FilePickerRes {
|
||||
realpath: string;
|
||||
}
|
||||
|
||||
export const enum FileSelectionType {
|
||||
FILE,
|
||||
FOLDER,
|
||||
}
|
||||
|
||||
export interface ServerAPI {
|
||||
routerHook: RouterHook;
|
||||
toaster: Toaster;
|
||||
openFilePicker(startPath: string, includeFiles?: boolean, regex?: RegExp): Promise<FilePickerRes>;
|
||||
openFilePickerV2(
|
||||
select: FileSelectionType,
|
||||
startPath: string,
|
||||
includeFiles?: boolean,
|
||||
includeFolders?: boolean,
|
||||
filter?: RegExp | ((file: File) => boolean),
|
||||
extensions?: string[],
|
||||
showHiddenFiles?: boolean,
|
||||
allowAllFiles?: boolean,
|
||||
max?: number,
|
||||
): Promise<FilePickerRes>;
|
||||
callPluginMethod<TArgs = {}, TRes = {}>(methodName: string, args: TArgs): Promise<ServerResponse<TRes>>;
|
||||
callServerMethod<TArgs = {}, TRes = {}>(methodName: string, args: TArgs): Promise<ServerResponse<TRes>>;
|
||||
fetchNoCors<TRes = {}>(url: RequestInfo, request?: RequestInit): Promise<ServerResponse<TRes>>;
|
||||
|
||||
@@ -22,7 +22,7 @@ export function findSP(): Window {
|
||||
if (document.title == 'SP') return window;
|
||||
// new (SP as popup)
|
||||
const navTrees = getGamepadNavigationTrees();
|
||||
return navTrees.find((x: any) => x.m_ID == 'root_1_').Root.Element.ownerDocument.defaultView;
|
||||
return navTrees?.find((x: any) => x.m_ID == 'root_1_').Root.Element.ownerDocument.defaultView;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -38,5 +38,5 @@ export function getFocusNavController(): any {
|
||||
export function getGamepadNavigationTrees(): any {
|
||||
const focusNav = getFocusNavController();
|
||||
const context = focusNav.m_ActiveContext || focusNav.m_LastActiveContext;
|
||||
return context.m_rgGamepadNavigationTrees;
|
||||
return context?.m_rgGamepadNavigationTrees;
|
||||
}
|
||||
|
||||
@@ -46,17 +46,37 @@ export function fakeRenderComponent(fun: Function, customHooks: any = {}): any {
|
||||
}
|
||||
|
||||
export function wrapReactType(node: any, prop: any = 'type') {
|
||||
return (node[prop] = { ...node[prop] });
|
||||
if (node[prop]?.__DECKY_WRAPPED) {
|
||||
return node[prop];
|
||||
} else {
|
||||
return (node[prop] = { ...node[prop], __DECKY_WRAPPED: true });
|
||||
}
|
||||
}
|
||||
|
||||
export function wrapReactClass(node: any, prop: any = 'type') {
|
||||
const cls = node[prop];
|
||||
const wrappedCls = class extends cls {};
|
||||
return (node[prop] = wrappedCls);
|
||||
if (node[prop]?.__DECKY_WRAPPED) {
|
||||
return node[prop];
|
||||
} else {
|
||||
const cls = node[prop];
|
||||
const wrappedCls = class extends cls {
|
||||
static __DECKY_WRAPPED = true;
|
||||
};
|
||||
return (node[prop] = wrappedCls);
|
||||
}
|
||||
}
|
||||
|
||||
export function getReactRoot(o: HTMLElement | Element | Node) {
|
||||
return (
|
||||
o[Object.keys(o).find((k) => k.startsWith('__reactContainer$')) as string] ||
|
||||
o['_reactRootContainer']?._internalRoot?.current
|
||||
);
|
||||
}
|
||||
|
||||
export function getReactInstance(o: HTMLElement | Element | Node) {
|
||||
return o[Object.keys(o).find((k) => k.startsWith('__reactInternalInstance')) as string];
|
||||
return (
|
||||
o[Object.keys(o).find((k) => k.startsWith('__reactFiber')) as string] ||
|
||||
o[Object.keys(o).find((k) => k.startsWith('__reactInternalInstance')) as string]
|
||||
);
|
||||
}
|
||||
|
||||
// Based on https://github.com/GooseMod/GooseMod/blob/9ef146515a9e59ed4e25665ed365fd72fc0dcf23/src/util/react.js#L20
|
||||
|
||||
@@ -37,7 +37,11 @@ if (window.webpackJsonp && !window.webpackJsonp.deckyShimmed) {
|
||||
},
|
||||
]);
|
||||
for (let i of Object.keys(initReq.m)) {
|
||||
webpackCache[i] = initReq(i);
|
||||
try {
|
||||
webpackCache[i] = initReq(i);
|
||||
} catch (e) {
|
||||
console.debug("[DFL:Webpack]: Ignoring require error for module", i, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user