1
0
Fork 0
mirror of https://github.com/sussy-code/smov.git synced 2024-12-29 16:07:40 +01:00

Some RTL fixes

Co-authored-by: mrjvs <mistrjvs@gmail.com>
This commit is contained in:
Jip Fr 2023-12-16 16:21:50 +01:00
parent 4813d9dbfe
commit cf4cb6f300
10 changed files with 56 additions and 82 deletions

View file

@ -222,3 +222,8 @@ input[type=range].styled-slider.slider-progress::-ms-fill-lower {
outline: 2px solid theme('colors.themePreview.primary');
box-shadow: 0 0 10px theme('colors.themePreview.secondary');
}
[dir="rtl"] .transform {
/* Invert horizontal X offset on transform (Tailwind RTL plugin does the rest) */
transform: translate(calc(var(--tw-translate-x) * -1), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)) !important;
}

View file

@ -1,3 +1,4 @@
import classNames from "classnames";
import { memo, useEffect, useRef } from "react";
export enum Icons {
@ -150,10 +151,18 @@ export const Icon = memo((props: IconProps) => {
return <ChromeCastButton />;
}
const flipClass =
props.icon === Icons.ARROW_LEFT ||
props.icon === Icons.ARROW_RIGHT ||
props.icon === Icons.CHEVRON_LEFT ||
props.icon === Icons.CHEVRON_RIGHT
? "rtl:-scale-x-100"
: "";
return (
<span
dangerouslySetInnerHTML={{ __html: iconList[props.icon] }} // eslint-disable-line react/no-danger
className={props.className}
className={classNames(props.className, flipClass)}
/>
);
});

View file

@ -64,7 +64,7 @@ export function OverlayAnchorPosition(props: AnchorPositionProps) {
transform: `translateX(${left}px) translateY(${top}px)`,
}}
className={classNames([
"pointer-events-auto z-10 inline-block origin-top-left touch-none",
"[&>*]:pointer-events-auto z-10 flex dir-neutral:items-start justify-start dir-neutral:origin-top-left touch-none",
props.className,
])}
>

View file

@ -119,7 +119,7 @@ export function ProgressBar() {
}, [setDraggingTime, duration, dragPercentage]);
return (
<div className="w-full relative">
<div className="w-full relative" dir="ltr">
<div className="top-0 absolute inset-x-0">
<div
className="absolute bottom-0"

View file

@ -22,20 +22,14 @@ export const VideoPlayerButton = forwardRef<
type="button"
onClick={(e) => props.onClick?.(e.currentTarget as HTMLButtonElement)}
className={classNames([
"tabbable p-2 rounded-full hover:bg-video-buttonBackground hover:bg-opacity-50 transition-transform duration-100 flex items-center",
"tabbable p-2 rounded-full hover:bg-video-buttonBackground hover:bg-opacity-50 transition-transform duration-100 flex items-center gap-3",
props.activeClass ??
"active:scale-110 active:bg-opacity-75 active:text-white",
props.className ?? "",
])}
>
{props.icon && (
<Icon
className={classNames(
props.iconSizeClass || "text-2xl",
props.children ? "mr-3" : ""
)}
icon={props.icon}
/>
<Icon className={props.iconSizeClass || "text-2xl"} icon={props.icon} />
)}
{props.children}
</button>

View file

@ -6,7 +6,7 @@
user-select: none;
}
.lightbar {
[dir] .lightbar {
left: 50vw;
transform: translateX(-50%);
}
@ -16,13 +16,14 @@
width: 150vw;
}
.lightbar {
[dir] .lightbar {
left: -25vw;
transform: initial;
}
}
.lightbar {
[dir] .lightbar {
display: flex;
justify-content: center;
align-items: center;
@ -31,7 +32,7 @@
animation: boot var(--d) var(--animation) forwards;
}
.lightbar-visual {
[dir] .lightbar-visual {
left: 0;
--top: theme('colors.background.main');
--bottom: theme('colors.lightBar.light');
@ -57,7 +58,6 @@
@keyframes boot {
from {
opacity: 0.25;
}

View file

@ -88,7 +88,7 @@ export function PlayerPart(props: PlayerPartProps) {
</>
) : null}
</div>
<div className="hidden lg:flex justify-between">
<div className="hidden lg:flex justify-between" dir="ltr">
<Player.LeftSideControls>
{status === playerStatus.PLAYING ? (
<>

View file

@ -60,18 +60,18 @@ export function ScrapingPart(props: ScrapingProps) {
(async () => {
const output = await startScraping(props.media);
if (!isMounted()) return;
props.onResult?.(
resultRef.current.sources,
resultRef.current.sourceOrder
);
report(
scrapePartsToProviderMetric(
props.media,
resultRef.current.sourceOrder,
resultRef.current.sources
)
);
props.onGetStream?.(output);
// props.onResult?.(
// resultRef.current.sources,
// resultRef.current.sourceOrder
// );
// report(
// scrapePartsToProviderMetric(
// props.media,
// resultRef.current.sourceOrder,
// resultRef.current.sources
// )
// );
// props.onGetStream?.(output);
})();
}, [startScraping, props, report, isMounted]);
@ -85,7 +85,10 @@ export function ScrapingPart(props: ScrapingProps) {
currentProviderIndex = sourceOrder.length - 1;
return (
<div className="h-full w-full relative" ref={containerRef}>
<div
className="h-full w-full relative dir-neutral:origin-top-left flex dir-neutral:flex-row dir-neutral:items-start dir-neutral:justify-start"
ref={containerRef}
>
<div
className={classNames({
"absolute transition-[transform,opacity] opacity-0": true,

View file

@ -1,42 +0,0 @@
import { useEffect } from "react";
import { create } from "zustand";
import { persist } from "zustand/middleware";
import { immer } from "zustand/middleware/immer";
import i18n from "@/setup/i18n";
import { rtlLocales } from "@/assets/languages";
export interface LanguageStore {
language: string;
setLanguage(v: string): void;
}
export const useLanguageStore = create(
persist(
immer<LanguageStore>((set) => ({
language: "en",
setLanguage(v) {
set((s) => {
s.language = v;
});
},
})),
{ name: "__MW::locale" }
)
);
export function LanguageProvider() {
const language = useLanguageStore((s) => s.language);
useEffect(() => {
i18n.changeLanguage(language);
}, [language]);
const isRtl = rtlLocales.includes(language);
return (
<Helmet>
<html dir={isRtl ? "rtl" : "ltr"} />
</Helmet>
);
}

View file

@ -1,5 +1,6 @@
import { allThemes, defaultTheme, safeThemeList } from "./themes";
import type { Config } from "tailwindcss"
import type { Config } from "tailwindcss";
import plugin from "tailwindcss/plugin";
const themer = require("tailwindcss-themer");
@ -10,18 +11,18 @@ const config: Config = {
extend: {
/* fonts */
fontFamily: {
"open-sans": "'Open Sans'"
"open-sans": "'Open Sans'",
},
/* animations */
keyframes: {
"loading-pin": {
"0%, 40%, 100%": { height: "0.5em", "background-color": "#282336" },
"20%": { height: "1em", "background-color": "white" }
}
"20%": { height: "1em", "background-color": "white" },
},
},
animation: { "loading-pin": "loading-pin 1.8s ease-in-out infinite" },
},
animation: { "loading-pin": "loading-pin 1.8s ease-in-out infinite" }
}
},
plugins: [
require("tailwind-scrollbar"),
@ -33,9 +34,13 @@ const config: Config = {
selectors: [".theme-default"],
...defaultTheme,
},
...allThemes]
})
]
...allThemes,
],
}),
plugin(({ addVariant }) => {
addVariant("dir-neutral", "[dir] &");
}),
],
};
export default config;