|
2 | 2 | from fasthtml.common import *
|
3 | 3 | from functools import partial
|
4 | 4 | from monsterui.all import *
|
5 |
| -from fasthtml.components import Uk_theme_switcher |
| 5 | +import fasthtml.common as fh |
| 6 | +from monsterui.foundations import * |
| 7 | + |
6 | 8 | _A = partial(A, target='_blank')
|
7 | 9 | def Markdown(s, **kw): return Div(render_md(s, class_map_mods={'ul':'uk-list uk-list-bullet space-y-2 mb-6 ml-6 text-lg'}), **kw)
|
8 | 10 |
|
9 | 11 | ghurl = 'https://github.com/AnswerDotAI/fasthtml'
|
10 | 12 | fhurl = 'https://fastht.ml'
|
11 | 13 | docs = 'https://docs.fastht.ml'
|
12 | 14 |
|
| 15 | +def NavBar(*c, # Component for right side of navbar (Often A tag links) |
| 16 | + brand=None, # Brand/logo component for left side |
| 17 | + right_items=None, |
| 18 | + right_cls='items-center space-x-4', # Spacing for desktop links |
| 19 | + mobile_cls='space-y-4', # Spacing for mobile links |
| 20 | + cls='p-4', # Classes for navbar |
| 21 | + )->FT: # Responsive NavBar |
| 22 | + "Creates a responsive navigation bar with mobile menu support" |
| 23 | + menu_id = fh.unqid() |
| 24 | + mobile_icon = A(UkIcon("menu", width=30, height=30), cls="md:hidden", data_uk_toggle=f"target: #{menu_id}; cls: hidden") |
| 25 | + return Div( |
| 26 | + Div(DivFullySpaced( |
| 27 | + DivLAligned(brand, Div(*c, cls='hidden md:flex space-x-4')), # Brand/logo component for left side |
| 28 | + mobile_icon, # Hamburger menu icon |
| 29 | + Div(*right_items,cls=(stringify(right_cls),'hidden md:flex'))), # Desktop Navbar |
| 30 | + cls=('monster-navbar', stringify(cls))), |
| 31 | + DivCentered(*c, *right_items, |
| 32 | + cls=(stringify(mobile_cls),stringify(cls),'hidden md:hidden monster-navbar'), |
| 33 | + id=menu_id)) |
| 34 | + |
| 35 | + |
| 36 | +def NavLink(*args, cls='', target='_blank', **kw): |
| 37 | + return fh.A(*args, cls=(cls,TextT.lg), target=target, **kw) |
| 38 | + |
13 | 39 | def BstPage(selidx, title, h2s, *c):
|
14 | 40 | navitems = [('About', '/'), ('Vision', '/vision'), ('Foundations', '/foundation'),
|
15 | 41 | ('Technology', '/tech'), ('Components', '/components'), ('Limits', '#', {'disabled':True})]
|
16 | 42 | logo = 'assets/logo.svg'
|
17 |
| - _NavBarP = partial(P, cls=TextT.lg) |
18 | 43 | return (
|
19 | 44 | Title(title),
|
20 | 45 | Container(
|
21 | 46 | # NavBar
|
22 |
| - NavBarContainer( |
23 |
| - NavBarLSide( |
24 |
| - NavBarNav( |
25 |
| - Li(A(Img(src=logo), href=fhurl)), |
26 |
| - *[Li(A(_NavBarP(k), href=v), cls='uk-active' if selidx==i else '') for i, (k,v) in enumerate(navitems[:-1])], |
27 |
| - Li(A(_NavBarP('Limits', href='#'), disabled=True, uk_tooltip='No limits!')))), |
28 |
| - NavBarRSide( |
29 |
| - NavBarNav( |
30 |
| - Li(A(_NavBarP("Theme"))),DropDownNavContainer(Div(Uk_theme_switcher(), cls='p-6 uk-drop-close'), cls='w-96'), |
31 |
| - Li(_A(_NavBarP('Docs'), href=docs)), |
32 |
| - Li(_A(_NavBarP(UkIcon('github')), href=ghurl)))), |
33 |
| - cls='bg-green-400/70 rounded-lg rounded-tl-3xl shadow-md p-2 px-4'), |
| 47 | + NavBar( |
| 48 | + *[NavLink(k, href=v, target=None, cls=TextT.bold if selidx==i else '') for i, (k,v) in enumerate(navitems[:-1])], |
| 49 | + NavLink('Limits', href='#', disabled=True, uk_tooltip='No limits!', cls=TextT.gray), |
| 50 | + brand=A(Img(src=logo), href=fhurl), |
| 51 | + right_items=[ |
| 52 | + NavLink("Theme"), DropDownNavContainer(Div(ThemePicker(font=False, shadows=False, radii=False), cls='p-6 uk-drop-close'), cls='w-96'), |
| 53 | + NavLink('Docs', href=docs), |
| 54 | + NavLink(UkIcon('github'), href=ghurl), |
| 55 | + ], |
| 56 | + cls='bg-green-400/70 rounded-lg rounded-tl-3xl shadow-md p-2 px-4' |
| 57 | + ), |
| 58 | + |
34 | 59 | # Main Content
|
35 | 60 | Container(
|
36 | 61 | Grid(
|
|
0 commit comments