mirror of
https://github.com/SteamDeckHomebrew/decky-frontend-lib.git
synced 2026-05-20 18:10:08 +02:00
Compare commits
8 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
734ce33e1b | ||
|
|
9beab5f7e9 | ||
|
|
33aaf56f96 | ||
|
|
dddb703a2e | ||
|
|
ea2e072085 | ||
|
|
6324282b48 | ||
|
|
ace3f95a33 | ||
|
|
4d30efc33b |
28
CHANGELOG.md
28
CHANGELOG.md
@@ -1,3 +1,31 @@
|
||||
# [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)
|
||||
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "decky-frontend-lib",
|
||||
"version": "0.7.2",
|
||||
"version": "0.10.0",
|
||||
"description": "A library for building decky plugins",
|
||||
"main": "dist/index.js",
|
||||
"types": "dist/index.d.ts",
|
||||
|
||||
41
src/custom-components/SuspensefulImage.tsx
Normal file
41
src/custom-components/SuspensefulImage.tsx
Normal 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} />
|
||||
);
|
||||
};
|
||||
1
src/custom-components/index.ts
Normal file
1
src/custom-components/index.ts
Normal file
@@ -0,0 +1 @@
|
||||
export * from './SuspensefulImage';
|
||||
19
src/deck-components/Focusable.tsx
Normal file
19
src/deck-components/Focusable.tsx
Normal file
@@ -0,0 +1,19 @@
|
||||
import { HTMLAttributes, ReactNode, VFC } from "react";
|
||||
import { findModuleChild } from "../webpack";
|
||||
|
||||
export interface FocusableProps extends HTMLAttributes<HTMLDivElement> {
|
||||
children: ReactNode;
|
||||
"flow-children"?: string;
|
||||
focusClassName?: string;
|
||||
focusWithinClassName?: string;
|
||||
onActivate?: () => void;
|
||||
onCancel?: () => 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>;
|
||||
@@ -1,6 +1,7 @@
|
||||
export * from './Button';
|
||||
export * from './ButtonItem';
|
||||
export * from './Dropdown';
|
||||
export * from './Focusable';
|
||||
export * from './Menu';
|
||||
export * from './Modal';
|
||||
export * from './Panel';
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
// export * from './deck-libs';
|
||||
export * from './custom-components';
|
||||
export * from './deck-components';
|
||||
export * from './plugin';
|
||||
export * from './webpack';
|
||||
|
||||
Reference in New Issue
Block a user