header.py 3.7 KB

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