diff --git a/front/apps/web/src/pages/_app.tsx b/front/apps/web/src/pages/_app.tsx index d6a54c45..97d5fd94 100755 --- a/front/apps/web/src/pages/_app.tsx +++ b/front/apps/web/src/pages/_app.tsx @@ -24,7 +24,7 @@ import { ReactNode, useState } from "react"; import NextApp, { AppContext, type AppProps } from "next/app"; import { createTheme, ThemeProvider as MTheme } from "@mui/material"; import { Hydrate, QueryClientProvider } from "@tanstack/react-query"; -import { SkeletonCss, ThemeSelector as KThemeSelector, WebTooltip } from "@kyoo/primitives"; +import { HiddenIfNoJs, SkeletonCss, ThemeSelector as KThemeSelector, WebTooltip } from "@kyoo/primitives"; import { createQueryClient, fetchQuery, QueryIdentifier, QueryPage } from "@kyoo/models"; import { useTheme, useMobileHover } from "yoshiki/web"; import superjson from "superjson"; @@ -69,6 +69,7 @@ const GlobalCssTheme = () => { `} + ); }; diff --git a/front/packages/primitives/src/index.ts b/front/packages/primitives/src/index.ts index b9c9d3d9..aa619786 100644 --- a/front/packages/primitives/src/index.ts +++ b/front/packages/primitives/src/index.ts @@ -28,6 +28,8 @@ export * from "./image"; export * from "./skeleton"; export * from "./tooltip"; +export * from "./utils/nojs"; + import { px } from "yoshiki/native"; export const ts = (spacing: number) => { diff --git a/front/packages/primitives/src/skeleton.tsx b/front/packages/primitives/src/skeleton.tsx index e318adf4..7c4dcaba 100644 --- a/front/packages/primitives/src/skeleton.tsx +++ b/front/packages/primitives/src/skeleton.tsx @@ -19,10 +19,11 @@ */ import { LinearGradient as LG } from "expo-linear-gradient"; -import { motify } from "moti"; +import { AnimatePresence, motify, MotiView } from "moti"; import { useState } from "react"; import { Platform, View, ViewProps } from "react-native"; import { px, rem, useYoshiki, percent } from "yoshiki/native"; +import { hiddenIfNoJs } from "./utils/nojs"; const LinearGradient = motify(LG)(); @@ -44,25 +45,25 @@ export const SkeletonCss = () => ( export const Skeleton = ({ children, + show, variant = "text", ...props }: Omit & { children?: JSX.Element | boolean | null; + show?: boolean; variant?: "text" | "round" | "custom"; }) => { const { css, theme } = useYoshiki(); const [width, setWidth] = useState(undefined); const perc = (v: number) => (v / 100) * width!; - if (children && children !== true) return children; + if (show === undefined && children && children !== true) return children; return ( setWidth(e.nativeEvent.layout.width)} {...css( [ { - bg: (theme) => theme.overlay0, margin: px(2), position: "relative", overflow: "hidden", @@ -79,34 +80,58 @@ export const Skeleton = ({ props, )} > - + + {children} + {show && ( + setWidth(e.nativeEvent.layout.width)} + {...css( + { + bg: (theme) => theme.overlay0, + position: "absolute", + top: 0, + bottom: 0, + left: 0, + right: 0, + }, + hiddenIfNoJs, + )} + > + + + )} + ); }; diff --git a/front/packages/primitives/src/utils/nojs.tsx b/front/packages/primitives/src/utils/nojs.tsx new file mode 100644 index 00000000..7a001771 --- /dev/null +++ b/front/packages/primitives/src/utils/nojs.tsx @@ -0,0 +1,35 @@ +/* + * Kyoo - A portable and vast media library solution. + * Copyright (c) Kyoo. + * + * See AUTHORS.md and LICENSE file in the project root for full license information. + * + * Kyoo is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * Kyoo is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Kyoo. If not, see . + */ + +import { ViewProps } from "react-native"; + +export const hiddenIfNoJs: ViewProps = { style: { $$css: true, noJs: "noJsHidden" } as any }; + +export const HiddenIfNoJs = () => ( + +);