generated from template/astro-simple-template
feat: Update version to 0.0.5 and add fullscreen button to hotkeys app
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@kevisual/hot-api",
|
"name": "@kevisual/hot-api",
|
||||||
"version": "0.0.4",
|
"version": "0.0.5",
|
||||||
"description": "",
|
"description": "",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"basename": "/root/hot-api",
|
"basename": "/root/hot-api",
|
||||||
@@ -8,8 +8,8 @@
|
|||||||
"dev": "astro dev",
|
"dev": "astro dev",
|
||||||
"build": "astro build",
|
"build": "astro build",
|
||||||
"preview": "astro preview",
|
"preview": "astro preview",
|
||||||
"pub": "envision deploy ./dist -k hot-api -v 0.0.4 -u -y y",
|
"pub": "envision deploy ./dist -k hot-api -v 0.0.5 -u -y y",
|
||||||
"pub:docs": "envision deploy ./dist -k hot-api-docs -v 0.0.4 -u",
|
"pub:docs": "envision deploy ./dist -k hot-api-docs -v 0.0.5 -u",
|
||||||
"slide:dev": "slidev --open slides/index.md",
|
"slide:dev": "slidev --open slides/index.md",
|
||||||
"slide:build": "slidev build slides/index.md --base /root/hot-api-slide/",
|
"slide:build": "slidev build slides/index.md --base /root/hot-api-slide/",
|
||||||
"slide:pub": "envision deploy ./slides/dist -k hot-api-slide -v 0.0.4 -u",
|
"slide:pub": "envision deploy ./slides/dist -k hot-api-slide -v 0.0.4 -u",
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import { useState, useEffect } from 'react';
|
||||||
import { wrapBasename } from "@/modules/basename";
|
import { wrapBasename } from "@/modules/basename";
|
||||||
import { useStore } from "../store";
|
import { useStore } from "../store";
|
||||||
export const RefreshButton = () => {
|
export const RefreshButton = () => {
|
||||||
@@ -62,4 +63,61 @@ export const SettingsButton = () => {
|
|||||||
</svg>
|
</svg>
|
||||||
</button>
|
</button>
|
||||||
);
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export const FullscreenButton = () => {
|
||||||
|
const [isFullscreen, setIsFullscreen] = useState(false);
|
||||||
|
|
||||||
|
const toggleFullscreen = () => {
|
||||||
|
if (!document.fullscreenElement) {
|
||||||
|
document.documentElement.requestFullscreen();
|
||||||
|
setIsFullscreen(true);
|
||||||
|
} else {
|
||||||
|
document.exitFullscreen();
|
||||||
|
setIsFullscreen(false);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const handleFullscreenChange = () => {
|
||||||
|
setIsFullscreen(!!document.fullscreenElement);
|
||||||
|
};
|
||||||
|
|
||||||
|
document.addEventListener('fullscreenchange', handleFullscreenChange);
|
||||||
|
return () => {
|
||||||
|
document.removeEventListener('fullscreenchange', handleFullscreenChange);
|
||||||
|
};
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<button
|
||||||
|
onClick={toggleFullscreen}
|
||||||
|
className="
|
||||||
|
group relative p-1 sm:p-1 rounded-full
|
||||||
|
bg-white/10 backdrop-blur-md border border-white/20
|
||||||
|
hover:bg-gradient-to-br hover:from-white/20 hover:to-white/5
|
||||||
|
hover:border-white/40 hover:shadow-[0_0_15px_rgba(255,255,255,0.3)]
|
||||||
|
active:scale-95 transition-all duration-300
|
||||||
|
flex items-center justify-center
|
||||||
|
opacity-10 hover:opacity-100
|
||||||
|
cursor-pointer
|
||||||
|
"
|
||||||
|
aria-label="Toggle fullscreen"
|
||||||
|
>
|
||||||
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
fill="none"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
strokeWidth={1.5}
|
||||||
|
stroke="currentColor"
|
||||||
|
className={`w-5 h-5 sm:w-6 sm:h-6 text-white transition-transform duration-500 ease-in-out ${isFullscreen ? 'scale-75' : 'group-hover:scale-110'}`}
|
||||||
|
>
|
||||||
|
{isFullscreen ? (
|
||||||
|
<path strokeLinecap="round" strokeLinejoin="round" d="M9 9V4.5M9 9H4.5M9 9L3.75 3.75M9 15v4.5M9 15H4.5M9 15l-5.25 5.25M15 9h4.5M15 9V4.5M15 9l5.25-5.25M15 15h4.5M15 15v4.5m0-4.5l5.25 5.25" />
|
||||||
|
) : (
|
||||||
|
<path strokeLinecap="round" strokeLinejoin="round" d="M3.75 3.75v4.5m0-4.5h4.5m-4.5 0L9 9M3.75 20.25v-4.5m0 4.5h4.5m-4.5 0L9 15M20.25 3.75h-4.5m4.5 0v4.5m0-4.5L15 9m5.25 11.25h-4.5m4.5 0v-4.5m0 4.5L15 15" />
|
||||||
|
)}
|
||||||
|
</svg>
|
||||||
|
</button>
|
||||||
|
);
|
||||||
};
|
};
|
||||||
@@ -6,7 +6,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import { useEffect, useState } from 'react';
|
import { useEffect, useState } from 'react';
|
||||||
import { SettingsButton, RefreshButton } from './components/icon';
|
import { SettingsButton, RefreshButton, FullscreenButton } from './components/icon';
|
||||||
import { useStore, CardItem, StoreState } from './store';
|
import { useStore, CardItem, StoreState } from './store';
|
||||||
import { useShallow } from 'zustand/shallow';
|
import { useShallow } from 'zustand/shallow';
|
||||||
import { toast, ToastContainer } from 'react-toastify';
|
import { toast, ToastContainer } from 'react-toastify';
|
||||||
@@ -215,6 +215,11 @@ export const App = () => {
|
|||||||
{/* Overlay for premium look and contrast */}
|
{/* Overlay for premium look and contrast */}
|
||||||
<div className="absolute inset-0 bg-black/30 backdrop-blur-[4px] z-0 pointer-events-none" />
|
<div className="absolute inset-0 bg-black/30 backdrop-blur-[4px] z-0 pointer-events-none" />
|
||||||
|
|
||||||
|
{/* Fullscreen Button - Top Right */}
|
||||||
|
<div className="fixed top-1 right-1 z-50">
|
||||||
|
<FullscreenButton />
|
||||||
|
</div>
|
||||||
|
|
||||||
<div className="max-w-7xl mx-auto relative z-10 h-full flex flex-col">
|
<div className="max-w-7xl mx-auto relative z-10 h-full flex flex-col">
|
||||||
{/* Header Toggle Button */}
|
{/* Header Toggle Button */}
|
||||||
<div
|
<div
|
||||||
@@ -291,6 +296,7 @@ export const App = () => {
|
|||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
<div></div>
|
||||||
<ToastContainer />
|
<ToastContainer />
|
||||||
<ToastContainer
|
<ToastContainer
|
||||||
position="bottom-center"
|
position="bottom-center"
|
||||||
|
|||||||
Reference in New Issue
Block a user