-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #176 from Jaewoook/feature/menu-bar-items
Add menubar items
- Loading branch information
Showing
30 changed files
with
391 additions
and
141 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1 +1 @@ | ||
nodejs 18.15.0 | ||
nodejs 18.19.0 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
File renamed without changes.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
File renamed without changes.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,42 @@ | ||
import { style } from "@vanilla-extract/css"; | ||
|
||
const MENU_BORDER_RADIUS = 8; | ||
const MENU_ITEM_BORDER_RADIUS = 6; | ||
|
||
export const menuIndicator = style({ | ||
display: "flex", | ||
flexFlow: "row", | ||
gap: 4, | ||
color: "#fff", | ||
fontSize: 14, | ||
alignItems: "center", | ||
position: "relative", | ||
}); | ||
|
||
export const itemFrame = style({ | ||
position: "absolute", | ||
top: "100%", | ||
left: -8, | ||
// TODO regularize z-index values | ||
zIndex: 20, | ||
}); | ||
|
||
export const itemWrapper = style({ | ||
color: "#fff", | ||
boxShadow: "rgba(0, 0, 0, 0.55) 0px 10px 34px", | ||
backgroundColor: "#333", | ||
border: "1px solid #5c5c5c", | ||
borderRadius: MENU_BORDER_RADIUS, | ||
overflow: "hidden", | ||
padding: "6px", | ||
whiteSpace: "nowrap", | ||
}); | ||
|
||
export const item = style({ | ||
padding: "4px 8px", | ||
borderRadius: MENU_ITEM_BORDER_RADIUS, | ||
userSelect: "none", | ||
":hover": { | ||
backgroundColor: "rgb(22 116 218)", | ||
}, | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,42 @@ | ||
"use client"; | ||
import { useCallback, useContext } from "react"; | ||
|
||
import type { MenuItem } from "../../contexts/MenuBarContext"; | ||
import { menuBarContext } from "../../contexts/MenuBarContext"; | ||
import { useOutsideClick } from "../../hooks"; | ||
import * as css from "./Menu.css"; | ||
|
||
interface Props { | ||
menuId: string; | ||
name: string | React.ReactNode; | ||
menuItems: MenuItem[]; | ||
} | ||
|
||
export const Menu = (props: Props) => { | ||
const { menuId, name, menuItems } = props; | ||
const { openedMenuId, openMenu, closeMenu } = useContext(menuBarContext); | ||
const ref = useOutsideClick<HTMLDivElement>(() => closeMenu()); | ||
|
||
const handleClick = useCallback(() => { | ||
if (openedMenuId !== menuId) { | ||
openMenu(menuId); | ||
} else { | ||
closeMenu(); | ||
} | ||
}, [openedMenuId, menuId, closeMenu, openMenu]); | ||
|
||
return ( | ||
<div className={css.menuIndicator} ref={ref}> | ||
<p onClick={handleClick}>{name}</p> | ||
<div className={css.itemFrame} style={{ visibility: openedMenuId === menuId ? "visible" : "hidden" }}> | ||
<ul className={css.itemWrapper}> | ||
{menuItems.map((menuItem) => ( | ||
<li key={`${menuItem.type}-${menuItem.name}`} className={css.item} onClick={menuItem.onClick}> | ||
{menuItem.name} | ||
</li> | ||
))} | ||
</ul> | ||
</div> | ||
</div> | ||
); | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,21 +1,33 @@ | ||
"use client"; | ||
import { format } from "date-fns"; | ||
import { useMemo } from "react"; | ||
import { useCallback, useState } from "react"; | ||
|
||
import { useClock } from "../../hooks"; | ||
import { menuBarContext } from "../../contexts/MenuBarContext"; | ||
import type { IMenuBarContext } from "../../contexts/MenuBarContext"; | ||
import * as css from "./MenuBar.css"; | ||
|
||
export const MenuBar = () => { | ||
const time = useClock(); | ||
const clock = useMemo(() => format(time, "E MMM d") + "\u00A0\u00A0" + format(time, "h:mm a"), [time]); | ||
interface Props { | ||
leftMenu: React.ReactNode; | ||
rightMenu: React.ReactNode; | ||
} | ||
|
||
export const MenuBar = (props: Props) => { | ||
const { leftMenu, rightMenu } = props; | ||
const [openedMenuId, setOpenedMenuId] = useState<string | null>(null); | ||
|
||
const openMenu = useCallback((menuId: string) => setOpenedMenuId(menuId), []); | ||
const closeMenu = useCallback(() => setOpenedMenuId(null), []); | ||
const value: IMenuBarContext = { openedMenuId, openMenu, closeMenu }; | ||
|
||
return ( | ||
<nav className={css.container}> | ||
<div className={css.menuWrapper}> | ||
</div> | ||
<div className={css.rightMenuWrapper}> | ||
<p className={css.clock}>{clock}</p> | ||
</div> | ||
</nav> | ||
<menuBarContext.Provider value={value}> | ||
<nav className={css.container}> | ||
<div className={css.wrapper}> | ||
{leftMenu} | ||
</div> | ||
<div className={css.rightMenuWrapper}> | ||
{rightMenu} | ||
</div> | ||
</nav> | ||
</menuBarContext.Provider> | ||
); | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
import { style } from "@vanilla-extract/css"; | ||
|
||
import { menuIndicator } from "../Menu/Menu.css"; | ||
|
||
export const batteryIndicator = style([menuIndicator, { | ||
fontSize: 12, | ||
}]); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,78 @@ | ||
"use client"; | ||
import { format } from "date-fns"; | ||
import { useContext, useEffect, useMemo, useState } from "react"; | ||
import { IoBatteryCharging, IoBatteryFull, IoBatteryHalf, IoCodeSlash } from "react-icons/io5"; | ||
|
||
import { LockContext } from "@/contexts/LockContext"; | ||
import { useClock } from "@/hooks"; | ||
|
||
import { Menu } from "../Menu"; | ||
import { menuIndicator } from "../Menu/Menu.css"; | ||
import * as css from "./Menus.css"; | ||
|
||
export const PortfolioMenu = () => { | ||
const { lock } = useContext(LockContext); | ||
return ( | ||
<Menu | ||
menuId="menu-portfolio" | ||
name={<IoCodeSlash size={24} />} | ||
menuItems={[ | ||
{ | ||
id: "about-this-site", | ||
name: "About This Site", | ||
type: "default", | ||
checked: false, | ||
disabled: false, | ||
onClick: () => {}, | ||
}, | ||
{ | ||
id: "lock-screen", | ||
name: "Lock Screen", | ||
type: "default", | ||
checked: false, | ||
disabled: false, | ||
onClick: lock, | ||
} | ||
]} | ||
/> | ||
); | ||
}; | ||
|
||
export const ClockIndicator = () => { | ||
const time = useClock(); | ||
const clock = useMemo(() => format(time, "E MMM d") + "\u00A0\u00A0" + format(time, "h:mm a"), [time]); | ||
|
||
return <p className={menuIndicator}>{clock}</p>; | ||
}; | ||
|
||
export const BatteryIndicator = () => { | ||
const [battery, setBattery] = useState<Battery>({ | ||
charging: false, | ||
chargingTime: 0, | ||
dischargingTime: 0, | ||
level: 1, | ||
}); | ||
const batteryPercent = useMemo(() => (battery.level * 100).toString() + "%", [battery]); | ||
const batteryIcon = useMemo(() => { | ||
if (battery.charging) { | ||
return <IoBatteryCharging size={22} />; | ||
} | ||
|
||
if (battery.level !== 1) { | ||
return <IoBatteryHalf size={22} />; | ||
} | ||
|
||
return <IoBatteryFull size={22} />; | ||
}, [battery]); | ||
|
||
useEffect(() => { | ||
window.navigator.getBattery?.().then((battery) => setBattery(battery)); | ||
}, []); | ||
|
||
return ( | ||
<p className={css.batteryIndicator}> | ||
{batteryPercent} | ||
{batteryIcon} | ||
</p> | ||
); | ||
}; |
File renamed without changes.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
File renamed without changes.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
File renamed without changes.
2 changes: 1 addition & 1 deletion
2
app/home/components/Settings/index.tsx → app/components/Settings/index.tsx
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
"use client"; | ||
import { assignInlineVars } from "@vanilla-extract/dynamic"; | ||
import { useContext, useEffect, useState } from "react"; | ||
|
||
import { LockContext } from "@/contexts/LockContext"; | ||
import { ClockIndicator } from "../ClockIndicator"; | ||
import { LoginProfile } from "../LoginProfile"; | ||
import { Wallpaper } from "../Wallpaper"; | ||
import * as css from "./lock-screen.css"; | ||
|
||
export const LockScreen = () => { | ||
const { isLocked } = useContext(LockContext); | ||
const [isVisible, setVisible] = useState(true); | ||
|
||
useEffect(() => { | ||
if (isLocked && !isVisible) { | ||
setVisible(true); | ||
} | ||
}, [isLocked, isVisible]); | ||
|
||
return ( | ||
<div | ||
className={isLocked ? css.lockAnim : css.unlockAnim} | ||
style={assignInlineVars({ [css.isVisible]: isVisible ? "visible" : "hidden" })} | ||
onAnimationEnd={() => setVisible(false)} | ||
> | ||
<Wallpaper /> | ||
<ClockIndicator /> | ||
<LoginProfile /> | ||
</div> | ||
); | ||
}; |
Oops, something went wrong.