This commit is contained in:
Tomas Mirchev 2025-04-06 00:48:29 +00:00
parent 218cfb2f70
commit 54becc8fb3
2 changed files with 39 additions and 4 deletions

View File

@ -5,6 +5,7 @@ import {
MenuBookIcon, MenuBookIcon,
MyLocationIcon, MyLocationIcon,
TitleIcon, TitleIcon,
WidthIcon,
} from "./icons/Icons"; } from "./icons/Icons";
import structureOriginal from "./structure.json"; import structureOriginal from "./structure.json";
@ -91,7 +92,7 @@ export default function App() {
const [selectedIndex, setSelectedIndex] = useState(null); const [selectedIndex, setSelectedIndex] = useState(null);
const [versions, setVersions] = useState(Array.from({ length: structure.length }, () => 0)); const [versions, setVersions] = useState(Array.from({ length: structure.length }, () => 0));
const [displayTitle, setDisplayTitle] = useState(true); const [displayTitle, setDisplayTitle] = useState(true);
const [isWideMode, setIsWideMode] = useState(false);
function handleChange(i) { function handleChange(i) {
setSelectedIndex(i); setSelectedIndex(i);
setIsMenuOpen(false); setIsMenuOpen(false);
@ -111,7 +112,10 @@ export default function App() {
displayTitle={displayTitle} displayTitle={displayTitle}
> >
<div className="flex-1"> <div className="flex-1">
<Reader file={structure[selectedIndex].files[versions[selectedIndex]]} /> <Reader
file={structure[selectedIndex].files[versions[selectedIndex]]}
compact={!isWideMode}
/>
<div className="absolute bottom-10 flex justify-between px-4 py-2 w-full z-999"> <div className="absolute bottom-10 flex justify-between px-4 py-2 w-full z-999">
<div className="flex space-x-2"> <div className="flex space-x-2">
<button <button
@ -130,6 +134,16 @@ export default function App() {
> >
<TitleIcon className="fill-gray-600" /> <TitleIcon className="fill-gray-600" />
</button> </button>
{window.innerWidth > 576 && (
<button
className={`cursor-pointer p-2 rounded-full text-white border ${!isWideMode ? "bg-blue-100 border-blue-400" : "bg-gray-100 border-gray-400"}`}
onClick={() => {
setIsWideMode((prev) => !prev);
}}
>
<WidthIcon className="fill-gray-600" />
</button>
)}
</div> </div>
{structure[selectedIndex].files.length > 1 && ( {structure[selectedIndex].files.length > 1 && (
<div className="flex space-x-1"> <div className="flex space-x-1">
@ -190,7 +204,7 @@ export default function App() {
); );
} }
export function Reader({ file }) { export function Reader({ file, compact }) {
const [content, setContent] = useState(null); const [content, setContent] = useState(null);
const [isLoading, setIsLoading] = useState(true); const [isLoading, setIsLoading] = useState(true);
const [error, setError] = useState(null); const [error, setError] = useState(null);
@ -257,7 +271,7 @@ export function Reader({ file }) {
} }
return ( return (
<div className="w-full h-full overflow-hidden"> <div className={`w-full h-full overflow-hidden ${compact ? "max-w-xl mx-auto" : ""}`}>
<iframe <iframe
srcDoc={content} srcDoc={content}
title={`File: ${file}`} title={`File: ${file}`}

View File

@ -30,6 +30,27 @@ export function TitleIcon({ className }) {
); );
} }
export function WidthIcon({ className }) {
return (
<svg
className={className}
xmlns="http://www.w3.org/2000/svg"
enableBackground="new 0 0 24 24"
height="24px"
viewBox="0 0 24 24"
width="24px"
fill="inherit"
>
<g>
<rect fill="none" height="24" width="24" />
</g>
<g>
<path d="M20,4H4C2.9,4,2,4.9,2,6v12c0,1.1,0.9,2,2,2h16c1.1,0,2-0.9,2-2V6C22,4.9,21.1,4,20,4z M4,18V6h2v12H4z M8,18V6h8v12H8z M20,18h-2V6h2V18z" />
</g>
</svg>
);
}
export function MenuBookIcon({ className }) { export function MenuBookIcon({ className }) {
return ( return (
<svg <svg