✨ Bottom Navigation
This commit is contained in:
		| @@ -36,20 +36,23 @@ export default function RootLayout(props: any) { | ||||
|  | ||||
|   const mainContentStyles = createMemo(() => { | ||||
|     if (!searchParams["embedded"]) { | ||||
|       return "h-[calc(100vh-64px)] mt-[64px]"; | ||||
|       return "h-[calc(100vh-64px)] max-md:mb-[64px] md:mt-[64px]"; | ||||
|     } else { | ||||
|       return "h-[100vh]"; | ||||
|     } | ||||
|   }); | ||||
|  | ||||
|   return ( | ||||
|     <Show when={ready()} fallback={ | ||||
|       <div class="h-screen w-screen flex justify-center items-center"> | ||||
|         <div> | ||||
|           <span class="loading loading-lg loading-infinity"></span> | ||||
|     <Show | ||||
|       when={ready()} | ||||
|       fallback={ | ||||
|         <div class="h-screen w-screen flex justify-center items-center"> | ||||
|           <div> | ||||
|             <span class="loading loading-lg loading-infinity"></span> | ||||
|           </div> | ||||
|         </div> | ||||
|       </div> | ||||
|     }> | ||||
|       } | ||||
|     > | ||||
|       <Show when={!searchParams["embedded"]}> | ||||
|         <Navbar /> | ||||
|       </Show> | ||||
| @@ -57,4 +60,4 @@ export default function RootLayout(props: any) { | ||||
|       <main class={`${mainContentStyles()} scrollbar-hidden`}>{props.children}</main> | ||||
|     </Show> | ||||
|   ); | ||||
| } | ||||
| } | ||||
|   | ||||
| @@ -4,6 +4,7 @@ import { useNavigate } from "@solidjs/router"; | ||||
| import { useWellKnown } from "../../stores/wellKnown.tsx"; | ||||
|  | ||||
| interface MenuItem { | ||||
|   icon: string; | ||||
|   label: string; | ||||
|   href?: string; | ||||
|   children?: MenuItem[]; | ||||
| @@ -11,9 +12,9 @@ interface MenuItem { | ||||
|  | ||||
| export default function Navbar() { | ||||
|   const nav: MenuItem[] = [ | ||||
|     { label: "Creators", href: "/creators" }, | ||||
|     { label: "Feed", href: "/" }, | ||||
|     { label: "Realms", href: "/realms" } | ||||
|     { icon: "fa-solid fa-pen-nib", label: "Creators", href: "/creators" }, | ||||
|     { icon: "fa-solid fa-newspaper", label: "Feed", href: "/" }, | ||||
|     { icon: "fa-solid fa-people-group", label: "Realms", href: "/realms" }, | ||||
|   ]; | ||||
|  | ||||
|   const wellKnown = useWellKnown(); | ||||
| @@ -26,89 +27,97 @@ export default function Navbar() { | ||||
|   } | ||||
|  | ||||
|   return ( | ||||
|     <div class="navbar bg-base-100 shadow-md px-5 z-[100] fixed top-0"> | ||||
|       <div class="navbar-start"> | ||||
|         <div class="dropdown"> | ||||
|           <div tabIndex={0} role="button" class="btn btn-ghost lg:hidden"> | ||||
|             <svg | ||||
|               xmlns="http://www.w3.org/2000/svg" | ||||
|               class="h-5 w-5" | ||||
|               fill="none" | ||||
|               viewBox="0 0 24 24" | ||||
|               stroke="currentColor" | ||||
|             > | ||||
|               <path | ||||
|                 stroke-linecap="round" | ||||
|                 stroke-linejoin="round" | ||||
|                 stroke-width="2" | ||||
|                 d="M4 6h16M4 12h8m-8 6h16" | ||||
|               /> | ||||
|             </svg> | ||||
|     <> | ||||
|       <div class="max-md:hidden navbar bg-base-100 shadow-md px-5 z-10 h-[64px] fixed top-0"> | ||||
|         <div class="navbar-start"> | ||||
|           <div class="dropdown"> | ||||
|             <div tabIndex={0} role="button" class="btn btn-ghost lg:hidden"> | ||||
|               <svg | ||||
|                 xmlns="http://www.w3.org/2000/svg" | ||||
|                 class="h-5 w-5" | ||||
|                 fill="none" | ||||
|                 viewBox="0 0 24 24" | ||||
|                 stroke="currentColor" | ||||
|               > | ||||
|                 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h8m-8 6h16" /> | ||||
|               </svg> | ||||
|             </div> | ||||
|             <ul tabIndex={0} class="menu menu-sm dropdown-content mt-3 z-[1] p-2 shadow bg-base-100 rounded-box w-52"> | ||||
|               <For each={nav}> | ||||
|                 {(item) => ( | ||||
|                   <li> | ||||
|                     <a href={item.href}>{item.label}</a> | ||||
|                     <Show when={item.children}> | ||||
|                       <ul class="p-2"> | ||||
|                         <For each={item.children}> | ||||
|                           {(item) => ( | ||||
|                             <li> | ||||
|                               <a href={item.href}>{item.label}</a> | ||||
|                             </li> | ||||
|                           )} | ||||
|                         </For> | ||||
|                       </ul> | ||||
|                     </Show> | ||||
|                   </li> | ||||
|                 )} | ||||
|               </For> | ||||
|             </ul> | ||||
|           </div> | ||||
|           <ul | ||||
|             tabIndex={0} | ||||
|             class="menu menu-sm dropdown-content mt-3 z-[1] p-2 shadow bg-base-100 rounded-box w-52" | ||||
|           > | ||||
|           <a href="/" class="btn btn-ghost text-xl"> | ||||
|             {wellKnown?.name ?? "Interactive"} | ||||
|           </a> | ||||
|         </div> | ||||
|         <div class="navbar-center hidden lg:flex"> | ||||
|           <ul class="menu menu-horizontal px-1"> | ||||
|             <For each={nav}> | ||||
|               {(item) => ( | ||||
|                 <li> | ||||
|                   <a href={item.href}>{item.label}</a> | ||||
|                   <Show when={item.children}> | ||||
|                     <ul class="p-2"> | ||||
|                       <For each={item.children}> | ||||
|                         {(item) => | ||||
|                           <li> | ||||
|                             <a href={item.href}>{item.label}</a> | ||||
|                           </li> | ||||
|                         } | ||||
|                       </For> | ||||
|                     </ul> | ||||
|                   <Show when={item.children} fallback={<a href={item.href}>{item.label}</a>}> | ||||
|                     <details> | ||||
|                       <summary> | ||||
|                         <a href={item.href}>{item.label}</a> | ||||
|                       </summary> | ||||
|                       <ul class="p-2"> | ||||
|                         <For each={item.children}> | ||||
|                           {(item) => ( | ||||
|                             <li> | ||||
|                               <a href={item.href}>{item.label}</a> | ||||
|                             </li> | ||||
|                           )} | ||||
|                         </For> | ||||
|                       </ul> | ||||
|                     </details> | ||||
|                   </Show> | ||||
|                 </li> | ||||
|               )} | ||||
|             </For> | ||||
|           </ul> | ||||
|         </div> | ||||
|         <a href="/" class="btn btn-ghost text-xl"> | ||||
|           {wellKnown?.name ?? "Interactive"} | ||||
|         </a> | ||||
|         <div class="navbar-end pe-5"> | ||||
|           <Switch> | ||||
|             <Match when={userinfo?.isLoggedIn}> | ||||
|               <button type="button" class="btn btn-sm btn-ghost" onClick={() => logout()}> | ||||
|                 Logout | ||||
|               </button> | ||||
|             </Match> | ||||
|             <Match when={!userinfo?.isLoggedIn}> | ||||
|               <a href="/auth" class="btn btn-sm btn-primary"> | ||||
|                 Login | ||||
|               </a> | ||||
|             </Match> | ||||
|           </Switch> | ||||
|         </div> | ||||
|       </div> | ||||
|       <div class="navbar-center hidden lg:flex"> | ||||
|         <ul class="menu menu-horizontal px-1"> | ||||
|           <For each={nav}> | ||||
|             {(item) => ( | ||||
|               <li> | ||||
|                 <Show when={item.children} fallback={<a href={item.href}>{item.label}</a>}> | ||||
|                   <details> | ||||
|                     <summary> | ||||
|                       <a href={item.href}>{item.label}</a> | ||||
|                     </summary> | ||||
|                     <ul class="p-2"> | ||||
|                       <For each={item.children}> | ||||
|                         {(item) => | ||||
|                           <li> | ||||
|                             <a href={item.href}>{item.label}</a> | ||||
|                           </li> | ||||
|                         } | ||||
|                       </For> | ||||
|                     </ul> | ||||
|                   </details> | ||||
|                 </Show> | ||||
|               </li> | ||||
|             )} | ||||
|           </For> | ||||
|         </ul> | ||||
|  | ||||
|       <div class="md:hidden btm-nav fixed bottom-0 bg-base-100 border-t border-base-200 z-10 h-[64px]"> | ||||
|         <For each={nav}> | ||||
|           {(item) => ( | ||||
|             <a href={item.href}> | ||||
|               <i class={item.icon}></i> | ||||
|             </a> | ||||
|           )} | ||||
|         </For> | ||||
|       </div> | ||||
|       <div class="navbar-end pe-5"> | ||||
|         <Switch> | ||||
|           <Match when={userinfo?.isLoggedIn}> | ||||
|             <button type="button" class="btn btn-sm btn-ghost" onClick={() => logout()}>Logout</button> | ||||
|           </Match> | ||||
|           <Match when={!userinfo?.isLoggedIn}> | ||||
|             <a href="/auth" class="btn btn-sm btn-primary">Login</a> | ||||
|           </Match> | ||||
|         </Switch> | ||||
|       </div> | ||||
|     </div> | ||||
|     </> | ||||
|   ); | ||||
| } | ||||
|   | ||||
| @@ -1,16 +1,28 @@ | ||||
| import { createMemo } from "solid-js"; | ||||
| import { useSearchParams } from "@solidjs/router"; | ||||
|  | ||||
| import styles from "./view.module.css"; | ||||
|  | ||||
| export default function CreatorView(props: any) { | ||||
|   const [searchParams] = useSearchParams(); | ||||
|  | ||||
|   const scrollContentStyles = createMemo(() => { | ||||
|     if (!searchParams["embedded"]) { | ||||
|       return "max-md:mb-[64px] md:mt-[64px]"; | ||||
|     } else { | ||||
|       return "h-[100vh]"; | ||||
|     } | ||||
|   }); | ||||
|  | ||||
|   return ( | ||||
|     <div class={`${styles.wrapper} container mx-auto`}> | ||||
|       <div id="nav" class="card shadow-xl h-fit"> | ||||
|         <h2 class="text-xl font-bold mt-1 py-5 px-7">Creator Hub</h2> | ||||
|       </div> | ||||
|  | ||||
|       <div id="content" class="card shadow-xl"> | ||||
|       <div id="content" class={`${scrollContentStyles()} card shadow-xl`}> | ||||
|         {props.children} | ||||
|       </div> | ||||
|  | ||||
|     </div> | ||||
|   ); | ||||
| } | ||||
| } | ||||
|   | ||||
| @@ -1,13 +1,11 @@ | ||||
| .wrapper { | ||||
|     display: grid; | ||||
|     grid-template-columns: 1fr; | ||||
|     column-gap: 20px; | ||||
|  | ||||
|     max-height: calc(100vh - 64px); | ||||
|   display: grid; | ||||
|   grid-template-columns: 1fr; | ||||
|   column-gap: 20px; | ||||
| } | ||||
|  | ||||
| @media (min-width: 1024px) { | ||||
|     .wrapper { | ||||
|         grid-template-columns: 1fr 2fr 1fr; | ||||
|     } | ||||
| } | ||||
|   .wrapper { | ||||
|     grid-template-columns: 1fr 2fr 1fr; | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -1,16 +1,28 @@ | ||||
| import { createMemo } from "solid-js"; | ||||
| import { useSearchParams } from "@solidjs/router"; | ||||
|  | ||||
| import styles from "./view.module.css"; | ||||
|  | ||||
| export default function FeedView(props: any) { | ||||
|   const [searchParams] = useSearchParams(); | ||||
|  | ||||
|   const scrollContentStyles = createMemo(() => { | ||||
|     if (!searchParams["embedded"]) { | ||||
|       return "max-md:mb-[64px] md:mt-[64px]"; | ||||
|     } else { | ||||
|       return "h-[100vh]"; | ||||
|     } | ||||
|   }); | ||||
|  | ||||
|   return ( | ||||
|     <div class={`${styles.wrapper} container mx-auto`}> | ||||
|       <div id="trending" class="card shadow-xl h-fit"></div> | ||||
|  | ||||
|       <div id="content" class="card shadow-xl"> | ||||
|       <div id="content" class={`${scrollContentStyles()} card shadow-xl`}> | ||||
|         {props.children} | ||||
|       </div> | ||||
|  | ||||
|       <div id="well-known" class="card shadow-xl h-fit"></div> | ||||
|  | ||||
|     </div> | ||||
|   ); | ||||
| } | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user