Compare commits

..

1 Commits

Author SHA1 Message Date
Marco Rodolfi
21fddeaf03 chore: new release 2023-06-22 10:15:41 +02:00
10 changed files with 38 additions and 321 deletions

View File

@@ -1,72 +1,3 @@
# [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)

View File

@@ -1,6 +1,6 @@
{
"name": "decky-frontend-lib",
"version": "3.23.0",
"version": "3.21.3",
"description": "A library for building decky plugins",
"main": "dist/index.js",
"types": "dist/index.d.ts",
@@ -41,26 +41,26 @@
}
},
"devDependencies": {
"@commitlint/cli": "^17.0.2",
"@commitlint/config-conventional": "^17.0.2",
"@commitlint/cz-commitlint": "^17.0.0",
"@semantic-release/changelog": "^6.0.1",
"@commitlint/cli": "^17.6.5",
"@commitlint/config-conventional": "^17.6.5",
"@commitlint/cz-commitlint": "^17.5.0",
"@semantic-release/changelog": "^6.0.3",
"@semantic-release/git": "^10.0.1",
"@types/jest": "^27.4.1",
"@types/jest": "^27.5.2",
"@types/react": "16.14.0",
"@types/react-router": "5.1.18",
"commitizen": "^4.2.4",
"husky": "^8.0.1",
"commitizen": "^4.3.0",
"husky": "^8.0.3",
"import-sort-style-module": "^6.0.0",
"jest": "^27.5.1",
"minimist": "^1.2.6",
"prettier": "^2.7.1",
"minimist": "^1.2.8",
"prettier": "^2.8.8",
"prettier-plugin-import-sort": "^0.0.7",
"semantic-release": "^19.0.3",
"semantic-release": "^19.0.5",
"shx": "^0.3.4",
"ts-jest": "^27.1.4",
"typedoc": "^0.23.24",
"typedoc-plugin-mdn-links": "^2.0.0",
"ts-jest": "^27.1.5",
"typedoc": "^0.23.28",
"typedoc-plugin-mdn-links": "^2.0.2",
"typedoc-plugin-missing-exports": "^1.0.0",
"typedoc-wikijs-theme": "^1.0.5",
"typescript": "^4.9.5"

View File

@@ -9,7 +9,14 @@ function getQuickAccessWindow(): Window | null {
/**
* Returns state indicating the visibility of quick access menu.
*
* @returns `true` if quick access menu is visible and `false` otherwise.
* @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.
*
* @example
* import { VFC, useEffect } from "react";
@@ -37,10 +44,7 @@ function getQuickAccessWindow(): Window | null {
* };
*/
export function useQuickAccessVisible(): boolean {
// 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);
const [isVisible, setIsVisible] = useState(getQuickAccessWindow()?.document.hasFocus() ?? true);
useEffect(() => {
const quickAccessWindow = getQuickAccessWindow();
@@ -49,12 +53,16 @@ export function useQuickAccessVisible(): boolean {
return;
}
const onVisibilityChange = () => setIsHidden(quickAccessWindow.document.hidden);
quickAccessWindow.addEventListener('visibilitychange', onVisibilityChange);
const onBlur = () => setIsVisible(false);
const onFocus = () => setIsVisible(true);
quickAccessWindow.addEventListener('blur', onBlur);
quickAccessWindow.addEventListener('focus', onFocus);
return () => {
quickAccessWindow.removeEventListener('visibilitychange', onVisibilityChange);
quickAccessWindow.removeEventListener('blur', onBlur);
quickAccessWindow.removeEventListener('focus', onFocus);
};
}, []);
return !isHidden;
return isVisible;
}

View File

@@ -154,16 +154,3 @@ export const ModalRoot = (Object.values(
}
}
})) as FC<ModalRootProps>;
interface SimpleModalProps{
active?: boolean,
children: ReactNode
}
const ModalModule = findModule((mod) => {
if (typeof mod !== 'object' || !mod.__esModule) return undefined;
if (mod.SimpleModal && mod.ModalPosition) return mod;
})
export const SimpleModal = ModalModule.SimpleModal as FC<SimpleModalProps>
export const ModalPosition = ModalModule.ModalPosition as FC<SimpleModalProps>

View File

@@ -2,11 +2,6 @@ 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;

View File

@@ -1,14 +0,0 @@
import { FC, ReactNode } from "react";
import { findModuleChild, findModule } from "../webpack";
const ScrollingModule = findModule((mod) => {
if (typeof mod !== 'object' || !mod.__esModule) return undefined;
if (mod.ScrollPanel) return mod;
});
export const ScrollPanel: FC<{ children?: ReactNode; }> = ScrollingModule.ScrollPanel;
export const ScrollPanelGroup: FC<{ children?: ReactNode; }> = findModuleChild((mod) => {
if (typeof mod !== 'object' || !mod.__esModule) return undefined;
return mod.ScrollPanelGroup;
})

View File

@@ -25,7 +25,6 @@ export * from './TextField';
export * from './Toggle';
export * from './ToggleField';
export * from './SteamClient';
export * from './Scroll';
import { AppDetails, LogoPosition, SteamAppOverview, SteamClient } from './SteamClient';

View File

@@ -504,169 +504,6 @@ type GamepadUIClasses = Record<
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
>;
export const quickAccessMenuClasses: QuickAccessMenuClasses = findModule(
(mod) => typeof mod === 'object' && mod?.Title?.includes('quickaccessmenu'),
);
@@ -704,16 +541,4 @@ export const appDetailsClasses: AppDetailsClasses = findModule(
);
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')
);

View File

@@ -55,23 +55,17 @@ export interface Toaster {
export interface FilePickerRes {
path: string;
realpath: string;
}
export const enum FileSelectionType {
FILE,
FOLDER,
total: number;
}
export interface ServerAPI {
routerHook: RouterHook;
toaster: Toaster;
openFilePicker(startPath: string, includeFiles?: boolean, regex?: RegExp): Promise<FilePickerRes>;
openFilePickerV2(
select: FileSelectionType,
openFilePicker(
startPath: string,
includeFiles?: boolean,
includeFolders?: boolean,
filter?: RegExp | ((file: File) => boolean),
includeFolders?: boolean,
extensions?: string[],
showHiddenFiles?: boolean,
allowAllFiles?: boolean,

View File

@@ -46,21 +46,13 @@ export function fakeRenderComponent(fun: Function, customHooks: any = {}): any {
}
export function wrapReactType(node: any, prop: any = 'type') {
if (node[prop]?.__DECKY_WRAPPED) {
return node[prop];
} else {
return (node[prop] = { ...node[prop], __DECKY_WRAPPED: true });
}
return (node[prop] = { ...node[prop] });
}
export function wrapReactClass(node: any, prop: any = 'type') {
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);
}
const cls = node[prop];
const wrappedCls = class extends cls {};
return (node[prop] = wrappedCls);
}
export function getReactInstance(o: HTMLElement | Element | Node) {