diff --git a/site_mcknight_tech/__main__.py b/site_mcknight_tech/__main__.py index 85c85fe..cc51e6f 100755 --- a/site_mcknight_tech/__main__.py +++ b/site_mcknight_tech/__main__.py @@ -3,6 +3,7 @@ from os.path import isfile, join, dirname from nicegui import ui +# TODO: Read from configuration _tab_to_content = { "Home": "page_content/home.md", "Portfolio": "page_content/portfolio.md", @@ -11,6 +12,8 @@ _tab_to_content = { } _error_page = "page_content/404.md" +_footer_block = "page_content/footer.html" + def _get_content_from_file(file_name: str) -> str: """ @@ -25,23 +28,30 @@ def _get_content_from_file(file_name: str) -> str: def render_tab(tab_name: str): file_name = _tab_to_content.get(tab_name, _error_page) - ui.markdown(_get_content_from_file(file_name), extras=['cuddled-lists', 'fenced-code-blocks', 'tables']) + with ui.scroll_area().classes('w-full h-screen no-wrap'): + ui.markdown(_get_content_from_file(file_name), extras=['cuddled-lists', 'fenced-code-blocks', 'tables']) -def render_header() -> ui.tab_panels: +def render_main() -> ui.tab_panels: """ Render sticky page header with navigation """ tab_names = _tab_to_content.keys() with ui.tabs().classes('w-full') as tabs: tab_list = {name: ui.tab(name) for name in tab_names} - with ui.tab_panels(tabs).classes('w-full') as header: + with ui.tab_panels(tabs).classes('w-full h-screen no-wrap') as header: for name, t in tab_list.items(): with ui.tab_panel(t): render_tab(name) return header def main(): - header = render_header() + header = render_main() header.set_value(list(_tab_to_content.keys())[0]) + ui.query('.nicegui-content').classes('h-screen no-wrap') + ui.html(_get_content_from_file(_footer_block), tag="footer").classes("rounded-lg shadow-sm m-4 w-full text-center") ui.run(dark=None, reload=False, title="Daniel McKnight") + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/site_mcknight_tech/page_content/footer.html b/site_mcknight_tech/page_content/footer.html new file mode 100644 index 0000000..e091239 --- /dev/null +++ b/site_mcknight_tech/page_content/footer.html @@ -0,0 +1,3 @@ + + © 2025 Daniel McKnight. All Rights Reserved. + diff --git a/site_mcknight_tech/page_content/home.md b/site_mcknight_tech/page_content/home.md index 2a6e145..da71a32 100644 --- a/site_mcknight_tech/page_content/home.md +++ b/site_mcknight_tech/page_content/home.md @@ -2,3 +2,5 @@ ## Coder, Sysadmin, Manager I work in the design and implementation of voice assistants, LLMs, infrastructure, and plenty more. +I built this site using [NiceGUI](https://nicegui.io/), with the source code available +[on Forgejo](https://forge.mcknight.tech/d_mcknight/website-mcknight-tech). diff --git a/site_mcknight_tech/page_content/portfolio.md b/site_mcknight_tech/page_content/portfolio.md index 5a42ab8..9c5c828 100644 --- a/site_mcknight_tech/page_content/portfolio.md +++ b/site_mcknight_tech/page_content/portfolio.md @@ -2,49 +2,49 @@ I have developed and contributed to hundreds of open source repositories on GitHub (as well as some Private ones that I cannot share here). This is just a selection of some of my favorite projects and what I like about them. -## Neon Core +## [Neon Core](https://github.com/neongeckocom/NeonCore) This is the primary project I contribute to as part of my work at NeonGecko. It started as work with the (now defunct) open source Mycroft AI project, turned into a proprietary fork, and then we ended up open sourcing that fork. Working on this project, I learned a lot about contributing to open source and managing open source projects. At the start, I learned how to be a helpful individual contributor, and later I was on the other side, learning how to interface with the community to balance internal goals with community feedback. -## `neon-data-models` +## [`neon-data-models`](https://github.com/neongeckocom/neon-data-models) This repository contains barely any functional code, but it was an exercise in careful planning. It is structured into a logical hierarchy with documentation and unit tests. This project was not fully integrated to the extent I planned, but it proved invaluable in defining/validating messages sent between modules. The use of Pydantic also means that validator methods can be used to adapt an old-style input into a new one when an API changes. -## `neon-users-service` +## [`neon-users-service`](https://github.com/neongeckocom/neon-users-service) This project defines a service for managing a user database with a flexible backend; initially, it supports SQLite for a standalone system (and easy development/testing) and MongoDb, which is what we used for production at NeonGecko. I implemented a very simple CRUD (Create/Read/Update/Delete) design, with RBAC (Role-Based Access Controls) to enable easy integration with applications. The design enables the service to be easily adapted to any user database and to allow other services to easily operate on user entries (with the proper permissions, of course). -## `neon-hana` +## [`neon-hana`](https://github.com/neongeckocom/neon-hana) This is primarily a RESTful API used to access other services. This is one of the more complex FastAPI applications I have written; it implements JWT authentication and Pydantic models to validate requests/responses. -## `neon-diana` +## [`neon-diana`](https://github.com/neongeckocom/neon-diana-utils) This isn't the prettiest project, but it is my first foray into writing Helm charts. The module provides some developer-oriented CLI tools for generating Helm charts to deploy the same services NeonGecko uses in production systems. -## `neon-debos` +## [`neon-debos`](https://github.com/neongeckocom/neon_debos) This project was my first exposure to Go templates. It started as a fork of another similar project which I adapted to our needs. As part of this project, I used squashfs/overlayfs to enable safe OS updates with methods to roll back or reset an installation in case of any errors. To support this, I compiled custom kernels and implemented a customized initramfs. -## `.github` +## [`.github`](https://github.com/neongeckocom/.github) This repository contains a number of shared GitHub Actions, in addition to the standard issue templates and other special files GitHub supports here. Creating this repository was part of an effort to consolidate code and make sprawling repositories more manageable. -## `neon-docs` +## [`neon-docs`](https://neongeckocom.github.io/neon-docs/) Just what it says, this is all documentation. -## This Site -I fully defined this site using [nicegui](https://nicegui.io/)! +## [This Site](https://forge.mcknight.tech/d_mcknight/website-mcknight-tech) +I built this site using [nicegui](https://nicegui.io/)!