Compare commits

...

27 Commits

Author SHA1 Message Date
semantic-release-bot
bf52e0761c chore(release): 0.10.3 [CI SKIP] 2022-06-18 15:16:51 +00:00
AAGaming
823a2745f9 fix(ServerAPI): add injectCssIntoTab to serverAPI typings 2022-06-18 11:10:35 -04:00
semantic-release-bot
21f7874cab chore(release): 0.10.2 [CI SKIP] 2022-06-16 21:33:44 +00:00
AAGaming
077334e376 fix(Router): add NavigateBackOrOpenMenu() 2022-06-16 17:32:58 -04:00
semantic-release-bot
02f4c5c518 chore(release): 0.10.1 [CI SKIP] 2022-06-16 21:27:22 +00:00
AAGaming
f1e20cd0b5 fix(Focusable): add ref prop, fix event types 2022-06-16 17:26:31 -04:00
Jonas Dellinger
b5d9265705 chore(release): also include package-lock.json in release assets 2022-06-13 10:53:01 +02:00
semantic-release-bot
734ce33e1b chore(release): 0.10.0 [CI SKIP] 2022-06-10 20:57:30 +00:00
AAGaming
9beab5f7e9 feat(components): remove HorizontalFocus, add Focusable 2022-06-10 16:56:39 -04:00
semantic-release-bot
33aaf56f96 chore(release): 0.9.1 [CI SKIP] 2022-06-09 02:08:28 +00:00
AAGaming
dddb703a2e fix(SuspensefulImage): fix export 2022-06-08 22:07:51 -04:00
semantic-release-bot
ea2e072085 chore(release): 0.9.0 [CI SKIP] 2022-06-09 01:59:56 +00:00
AAGaming
6324282b48 feat(custom-components): add SuspensefulImage 2022-06-08 21:59:12 -04:00
semantic-release-bot
ace3f95a33 chore(release): 0.8.0 [CI SKIP] 2022-06-09 01:41:07 +00:00
AAGaming
4d30efc33b feat(components): add HorizontalFocus 2022-06-08 21:40:19 -04:00
semantic-release-bot
af2d3a29e2 chore(release): 0.7.2 [CI SKIP] 2022-06-08 22:30:10 +00:00
AAGaming
e5e561edd6 fix(package): fix pnpm peer dependencies errors 2022-06-08 18:29:27 -04:00
semantic-release-bot
7111d18667 chore(release): 0.7.1 [CI SKIP] 2022-06-08 21:55:07 +00:00
AAGaming
24244f6e91 fix(spinners): add SVG props 2022-06-08 17:54:20 -04:00
AAGaming
dd5c42c57d fix(Router): add NavigateToStore to interface 2022-06-08 17:53:49 -04:00
semantic-release-bot
09ab2fed4b chore(release): 0.7.0 [CI SKIP] 2022-06-08 17:25:30 +00:00
Jonas Dellinger
4328385391 feat(components): added shared item-props, progressbar, and more types for slider 2022-06-08 19:24:53 +02:00
semantic-release-bot
3fe986aaba chore(release): 0.6.0 [CI SKIP] 2022-06-08 08:00:06 +00:00
Jonas Dellinger
bc2bec4b83 fix(husky): wrong script for husky caused problems when installing 2022-06-08 09:59:20 +02:00
Jonas Dellinger
a99fb4a22d feat(dropdown): add dropdown 2022-06-08 09:59:20 +02:00
Jonas Dellinger
d8794ef4d3 feat(sidebar-navigation): add sidebar navigation component 2022-06-08 09:59:20 +02:00
Jonas Dellinger
23ed5dd157 chore(textfield): remove console.log 2022-06-08 09:59:20 +02:00
21 changed files with 284 additions and 27 deletions

View File

@@ -9,7 +9,7 @@
[
"@semantic-release/git",
{
"assets": ["CHANGELOG.md", "package.json"],
"assets": ["CHANGELOG.md", "package.json", "package-lock.json"],
"message": "chore(release): ${nextRelease.version} [CI SKIP]"
}
]

View File

@@ -1,3 +1,87 @@
## [0.10.3](https://github.com/SteamDeckHomebrew/decky-frontend-lib/compare/v0.10.2...v0.10.3) (2022-06-18)
### Bug Fixes
* **ServerAPI:** add injectCssIntoTab to serverAPI typings ([823a274](https://github.com/SteamDeckHomebrew/decky-frontend-lib/commit/823a2745f9717ed2d2a5d95e2ef25739bffc18c9))
## [0.10.2](https://github.com/SteamDeckHomebrew/decky-frontend-lib/compare/v0.10.1...v0.10.2) (2022-06-16)
### Bug Fixes
* **Router:** add NavigateBackOrOpenMenu() ([077334e](https://github.com/SteamDeckHomebrew/decky-frontend-lib/commit/077334e376fb42283e094f0b57c818c580c6f7ba))
## [0.10.1](https://github.com/SteamDeckHomebrew/decky-frontend-lib/compare/v0.10.0...v0.10.1) (2022-06-16)
### Bug Fixes
* **Focusable:** add ref prop, fix event types ([f1e20cd](https://github.com/SteamDeckHomebrew/decky-frontend-lib/commit/f1e20cd0b54622d634202c85cca920323e4df336))
# [0.10.0](https://github.com/SteamDeckHomebrew/decky-frontend-lib/compare/v0.9.1...v0.10.0) (2022-06-10)
### Features
* **components:** remove HorizontalFocus, add Focusable ([9beab5f](https://github.com/SteamDeckHomebrew/decky-frontend-lib/commit/9beab5f7e913f2ef2a8a3047046a524d3007c3b8))
## [0.9.1](https://github.com/SteamDeckHomebrew/decky-frontend-lib/compare/v0.9.0...v0.9.1) (2022-06-09)
### Bug Fixes
* **SuspensefulImage:** fix export ([dddb703](https://github.com/SteamDeckHomebrew/decky-frontend-lib/commit/dddb703a2e712bf2e9d7e172a414c63ffd6a1cc9))
# [0.9.0](https://github.com/SteamDeckHomebrew/decky-frontend-lib/compare/v0.8.0...v0.9.0) (2022-06-09)
### Features
* **custom-components:** add SuspensefulImage ([6324282](https://github.com/SteamDeckHomebrew/decky-frontend-lib/commit/6324282b480f358a3d5936ab6d08ab239d640997))
# [0.8.0](https://github.com/SteamDeckHomebrew/decky-frontend-lib/compare/v0.7.2...v0.8.0) (2022-06-09)
### Features
* **components:** add HorizontalFocus ([4d30efc](https://github.com/SteamDeckHomebrew/decky-frontend-lib/commit/4d30efc33b5398b91e756695fefa91cc37f83ff1))
## [0.7.2](https://github.com/SteamDeckHomebrew/decky-frontend-lib/compare/v0.7.1...v0.7.2) (2022-06-08)
### Bug Fixes
* **package:** fix pnpm peer dependencies errors ([e5e561e](https://github.com/SteamDeckHomebrew/decky-frontend-lib/commit/e5e561edd67994b8c55f99c1228e47d77b1c2ee2))
## [0.7.1](https://github.com/SteamDeckHomebrew/decky-frontend-lib/compare/v0.7.0...v0.7.1) (2022-06-08)
### Bug Fixes
* **Router:** add NavigateToStore to interface ([dd5c42c](https://github.com/SteamDeckHomebrew/decky-frontend-lib/commit/dd5c42c57d9ce6266f56237607bf37d8b5bd3b4c))
* **spinners:** add SVG props ([24244f6](https://github.com/SteamDeckHomebrew/decky-frontend-lib/commit/24244f6e91e39a11bb964ee2779662084dcd0fd0))
# [0.7.0](https://github.com/SteamDeckHomebrew/decky-frontend-lib/compare/v0.6.0...v0.7.0) (2022-06-08)
### Features
* **components:** added shared item-props, progressbar, and more types for slider ([4328385](https://github.com/SteamDeckHomebrew/decky-frontend-lib/commit/43283853916f3993d92f6841b12f7ee47667e75b))
# [0.6.0](https://github.com/SteamDeckHomebrew/decky-frontend-lib/compare/v0.5.1...v0.6.0) (2022-06-08)
### Bug Fixes
* **husky:** wrong script for husky caused problems when installing ([bc2bec4](https://github.com/SteamDeckHomebrew/decky-frontend-lib/commit/bc2bec4b839d691e20beb090327a359c9e93f1cc))
### Features
* **dropdown:** add dropdown ([a99fb4a](https://github.com/SteamDeckHomebrew/decky-frontend-lib/commit/a99fb4a22dcea3b6cd2a52f0dbd274d9a10f2e35))
* **sidebar-navigation:** add sidebar navigation component ([d8794ef](https://github.com/SteamDeckHomebrew/decky-frontend-lib/commit/d8794ef4d36b25e600123d41696b0d5cc10dc2af))
## [0.5.1](https://github.com/SteamDeckHomebrew/decky-frontend-lib/compare/v0.5.0...v0.5.1) (2022-06-06)

4
package-lock.json generated
View File

@@ -1,12 +1,12 @@
{
"name": "decky-frontend-lib",
"version": "0.0.6",
"version": "0.10.3",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "decky-frontend-lib",
"version": "0.0.6",
"version": "0.10.3",
"hasInstallScript": true,
"license": "GPL-2.0-or-later",
"devDependencies": {

View File

@@ -1,6 +1,6 @@
{
"name": "decky-frontend-lib",
"version": "0.5.1",
"version": "0.10.3",
"description": "A library for building decky plugins",
"main": "dist/index.js",
"types": "dist/index.d.ts",
@@ -10,7 +10,7 @@
"dev": "tsc -b -w",
"prepack": "npm run build",
"test": "echo 'No tests for now!'",
"postinstall": "husky install",
"prepare": "husky install",
"commit": "git-cz"
},
"files": [
@@ -58,6 +58,14 @@
"ts-jest": "^27.1.4",
"typescript": "^4.6.3"
},
"pnpm": {
"peerDependencyRules": {
"ignoreMissing": [
"react",
"react-dom"
]
}
},
"importSort": {
".js, .jsx, .ts, .tsx": {
"style": "module",

View File

@@ -0,0 +1,41 @@
import { Spinner } from '../deck-components';
import { useEffect } from 'react';
import { FC, ImgHTMLAttributes, useState } from 'react';
interface SuspensefulImageProps extends ImgHTMLAttributes<HTMLImageElement> {
suspenseWidth?: string | number;
suspenseHeight?: string | number;
}
export const SuspensefulImage: FC<SuspensefulImageProps> = (props) => {
const [loading, setLoading] = useState(true);
const [error, setError] = useState(false);
useEffect(() => {
const img = new Image();
img.src = props.src || '';
img.addEventListener('load', () => {
setLoading(false);
});
img.addEventListener('error', () => {
setError(true);
});
}, []);
return loading ? (
<div
style={{
width: props.suspenseWidth || props.style?.width,
height: props.suspenseHeight || props.style?.height,
background: 'rgba(255, 255, 255, 0.2)',
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
}}
>
{error ? 'Missing image' : <Spinner style={{ height: '48px' }} />}
</div>
) : (
<img {...props} />
);
};

View File

@@ -0,0 +1 @@
export * from './SuspensefulImage';

View File

@@ -1,15 +1,11 @@
import { FC } from 'react';
import { CommonUIModule } from '../webpack';
import { ItemProps } from './Item';
export interface ButtonItemProps {
label?: string;
description?: string;
layout?: 'below';
icon?: JSX.Element;
export interface ButtonItemProps extends ItemProps {
onClick?(e: MouseEvent): void;
disabled?: boolean;
bottomSeparator?: boolean;
}
export const ButtonItem = Object.values(CommonUIModule).find((mod: any) =>

View File

@@ -0,0 +1,44 @@
import { ReactNode, VFC } from 'react';
import { CommonUIModule } from '../webpack';
import { ItemProps } from './Item';
export interface SingleDropdownOption {
data: number;
label: string;
options?: never;
}
export interface MultiDropdownOption {
label: string;
options: DropdownOption[];
data?: never;
}
export type DropdownOption = SingleDropdownOption | MultiDropdownOption;
export interface DropdownProps {
rgOptions: DropdownOption[];
selectedOption: number | null;
disabled?: boolean;
onMenuWillOpen?(showMenu: () => void): void;
onMenuOpened?(): void;
onChange?(data: SingleDropdownOption): void;
contextMenuPositionOptions?: any;
menuLabel?: string;
strDefaultLabel?: string;
renderButtonValue?(element: ReactNode): ReactNode;
focusable?: boolean;
}
export const Dropdown = Object.values(CommonUIModule).find(
(mod: any) => mod?.prototype?.SetSelectedOption && mod?.prototype?.BuildMenu,
) as VFC<DropdownProps>;
export interface DropdownItemProps extends DropdownProps, ItemProps {}
export const DropdownItem = Object.values(CommonUIModule).find((mod: any) =>
mod?.toString()?.includes('"dropDownControlRef","description"'),
) as VFC<DropdownItemProps>;

View File

@@ -0,0 +1,19 @@
import { HTMLAttributes, ReactNode, RefAttributes, VFC } from "react";
import { findModuleChild } from "../webpack";
export interface FocusableProps extends HTMLAttributes<HTMLDivElement> {
children: ReactNode;
"flow-children"?: string;
focusClassName?: string;
focusWithinClassName?: string;
onActivate?: (e: CustomEvent) => void;
onCancel?: (e: CustomEvent) => void;
}
export const Focusable = findModuleChild((m) => {
if (typeof m !== 'object') return undefined;
for (let prop in m) {
if (m[prop]?.render?.toString()?.includes('["flow-children","onActivate","onCancel","focusClassName",'))
return m[prop];
}
}) as VFC<FocusableProps & RefAttributes<HTMLDivElement>>;

View File

@@ -0,0 +1,11 @@
import { ReactNode } from 'react';
export interface ItemProps {
label?: string;
description?: string;
layout?: 'below' | 'inline';
icon?: ReactNode;
bottomSeparator?: boolean;
indentLevel?: number;
tooltip?: string;
}

View File

@@ -0,0 +1,18 @@
import { VFC } from 'react';
import { findModuleChild } from '../webpack';
import { ItemProps } from './Item';
export interface ProgressBarItem extends ItemProps {
indeterminate?: boolean;
nTransitionSec?: number;
nProgress?: number;
focusable?: boolean;
}
export const ProgressBarItem = findModuleChild((m) => {
if (typeof m !== 'object') return undefined;
for (let prop in m) {
if (m[prop]?.toString()?.includes('"indeterminate","nTransitionSec"')) return m[prop];
}
}) as VFC<ProgressBarItem>;

View File

@@ -22,7 +22,9 @@ export interface Router {
OpenQuickAccessMenu(quickAccessTab: QuickAccessTab): void;
GetQuickAccessTab(): QuickAccessTab;
Navigate(path: string): void;
NavigateBackOrOpenMenu(): void;
NavigateToExternalWeb(url: string): void;
NavigateToStore(): void;
ToggleSideMenu(sideMenu: SideMenu): void;
CloseSideMenus(): void;
OpenSideMenu(sideMenu: SideMenu): void;

View File

@@ -0,0 +1,25 @@
import { ReactNode, VFC } from 'react';
import { Module, findModuleChild } from '../webpack';
export interface SidebarNavigationPages {
title: string;
route: string;
content: ReactNode;
}
export interface SidebarNavigationProps {
title?: string;
pages: SidebarNavigationPages[];
showTitle?: boolean;
disableRouteReporting?: boolean;
}
export const SidebarNavigation = findModuleChild((mod: Module) => {
for (let prop in mod) {
if (mod[prop]?.toString()?.includes('"disableRouteReporting"')) {
return mod[prop];
}
}
return null;
}) as VFC<SidebarNavigationProps>;

View File

@@ -1,26 +1,32 @@
import { FC } from 'react';
import { CommonUIModule } from '../webpack';
import { ItemProps } from './Item';
export interface NotchLabel {
notchIndex: number;
label: string;
value: number;
value?: number;
}
export interface SliderProps {
label?: string;
export interface SliderProps extends ItemProps {
value: number;
layout?: 'below';
icon?: JSX.Element;
min?: number;
max?: number;
step?: number;
notchCount?: number;
notchLabels?: NotchLabel[];
notchTicksVisible?: boolean;
showValue?: boolean;
resetValue?: number;
disabled?: boolean;
editableValue?: boolean;
validValues?: 'steps' | 'range' | ((value: number) => boolean);
valueSuffix?: string;
minimumDpadGranularity?: number;
onChange?(value: number): void;
}
export const Slider = Object.values(CommonUIModule).find((mod: any) =>
mod?.render?.toString()?.includes('SliderField,fallback'),
mod?.toString()?.includes('SliderField,fallback'),
) as FC<SliderProps>;

View File

@@ -1,8 +1,8 @@
import { FC } from 'react';
import { FC, SVGAttributes } from 'react';
import { IconsModule } from '../webpack';
// TODO type this and other icons?
export const Spinner = Object.values(IconsModule).find((mod: any) =>
mod?.toString && /Spinner\)}\),.\.createElement\(\"path\",{d:\"M18 /.test(mod.toString())
) as FC<{}>;
) as FC<SVGAttributes<SVGElement>>;

View File

@@ -1,4 +1,4 @@
import { FC } from 'react';
import { FC, SVGAttributes } from 'react';
import { findModuleChild } from '../webpack';
export const SteamSpinner = findModuleChild((m) => {
@@ -6,4 +6,4 @@ export const SteamSpinner = findModuleChild((m) => {
for (let prop in m) {
if (m[prop]?.toString()?.includes("Steam Spinner") && m[prop].toString().includes("PreloadThrobber")) return m[prop]
}
}) as FC<{}>;
}) as FC<SVGAttributes<SVGElement>>;

View File

@@ -25,5 +25,3 @@ export interface TextFieldProps {
export const TextField = Object.values(CommonUIModule).find(
(mod: Module) => mod?.validateUrl && mod?.validateEmail,
) as VFC<TextFieldProps>;
console.log(TextField);

View File

@@ -1,12 +1,10 @@
import { FC } from 'react';
import { CommonUIModule } from '../webpack';
import { ItemProps } from './Item';
export interface ToggleProps {
label?: string;
description?: string;
export interface ToggleProps extends ItemProps {
checked: boolean;
icon?: JSX.Element;
disabled?: boolean;
onChange?(checked: boolean): void;
}

View File

@@ -1,9 +1,13 @@
export * from './Button';
export * from './ButtonItem';
export * from './Dropdown';
export * from './Focusable';
export * from './Menu';
export * from './Modal';
export * from './Panel';
export * from './ProgressBar';
export * from './Router';
export * from './SidebarNavigation';
export * from './Slider';
export * from './Spinner';
export * from './static-classes';

View File

@@ -1,4 +1,5 @@
// export * from './deck-libs';
export * from './custom-components';
export * from './deck-components';
export * from './plugin';
export * from './webpack';

View File

@@ -31,6 +31,7 @@ export interface ServerAPI {
callServerMethod<TArgs = {}, TRes = {}>(methodName: string, args: TArgs): Promise<ServerResponse<TRes>>;
fetchNoCors<TRes = {}>(url: string, request: RequestInfo): Promise<ServerResponse<TRes>>;
executeInTab(tab: string, runAsync: boolean, code: string): Promise<unknown>;
injectCssIntoTab<TRes = boolean>(tab: string, style: string): Promise<ServerResponse<TRes>>;
removeCssFromTab(tab: string, cssId: string): Promise<unknown>;
}