header.py 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. from pathlib import Path
  2. from typing import Optional
  3. from nicegui import app, ui
  4. from . import svg
  5. from .search import Search
  6. from .star import add_star
  7. def add_head_html() -> None:
  8. """Add the code from header.html and reference style.css."""
  9. ui.add_head_html((Path(__file__).parent / 'static' / 'header.html').read_text())
  10. ui.add_head_html(f"<style>{(Path(__file__).parent / 'static' / 'style.css').read_text()}</style>")
  11. def add_header(menu: Optional[ui.left_drawer] = None) -> None:
  12. """Create the page header."""
  13. menu_items = {
  14. 'Installation': '/#installation',
  15. 'Features': '/#features',
  16. 'Demos': '/#demos',
  17. 'Documentation': '/documentation',
  18. 'Examples': '/#examples',
  19. 'Why?': '/#why',
  20. }
  21. dark_mode = ui.dark_mode(value=app.storage.browser.get('dark_mode'), on_change=lambda e: ui.run_javascript(f'''
  22. fetch('/dark_mode', {{
  23. method: 'POST',
  24. headers: {{'Content-Type': 'application/json'}},
  25. body: JSON.stringify({{value: {e.value}}}),
  26. }});
  27. '''))
  28. with ui.header() \
  29. .classes('items-center duration-200 p-0 px-4 no-wrap') \
  30. .style('box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1)'):
  31. if menu:
  32. ui.button(on_click=menu.toggle, icon='menu').props('flat color=white round').classes('lg:hidden')
  33. with ui.link(target='/').classes('row gap-4 items-center no-wrap mr-auto'):
  34. svg.face().classes('w-8 stroke-white stroke-2 max-[550px]:hidden')
  35. svg.word().classes('w-24')
  36. with ui.row().classes('max-[1050px]:hidden'):
  37. for title_, target in menu_items.items():
  38. ui.link(title_, target).classes(replace='text-lg text-white')
  39. search = Search()
  40. search.create_button()
  41. with ui.element().classes('max-[360px]:hidden'):
  42. ui.button(icon='dark_mode', on_click=lambda: dark_mode.set_value(None)) \
  43. .props('flat fab-mini color=white').bind_visibility_from(dark_mode, 'value', value=True)
  44. ui.button(icon='light_mode', on_click=lambda: dark_mode.set_value(True)) \
  45. .props('flat fab-mini color=white').bind_visibility_from(dark_mode, 'value', value=False)
  46. ui.button(icon='brightness_auto', on_click=lambda: dark_mode.set_value(False)) \
  47. .props('flat fab-mini color=white').bind_visibility_from(dark_mode, 'value', lambda mode: mode is None)
  48. with ui.link(target='https://discord.gg/TEpFeAaF4f').classes('max-[455px]:hidden').tooltip('Discord'):
  49. svg.discord().classes('fill-white scale-125 m-1')
  50. with ui.link(target='https://www.reddit.com/r/nicegui/').classes('max-[405px]:hidden').tooltip('Reddit'):
  51. svg.reddit().classes('fill-white scale-125 m-1')
  52. with ui.link(target='https://github.com/zauberzeug/nicegui/').classes('max-[305px]:hidden').tooltip('GitHub'):
  53. svg.github().classes('fill-white scale-125 m-1')
  54. add_star().classes('max-[490px]:hidden')
  55. with ui.row().classes('min-[1051px]:hidden'):
  56. with ui.button(icon='more_vert').props('flat color=white round'):
  57. with ui.menu().classes('bg-primary text-white text-lg'):
  58. for title_, target in menu_items.items():
  59. ui.menu_item(title_, on_click=lambda target=target: ui.open(target))