Skip to main content

Reusable viewport height measurement utility for FastHTML applications that dynamically fits element height to remaining viewport space with resize and HTMX integration.

Project description

cjm-fasthtml-viewport-fit

Install

pip install cjm_fasthtml_viewport_fit

Project Structure

nbs/
├── components.ipynb # FastHTML component for rendering the viewport-fit measurement script
├── js.ipynb         # JavaScript generation functions for viewport height measurement
└── models.ipynb     # Configuration dataclass for viewport-fit measurement instances

Total: 3 notebooks

Module Dependencies

graph LR
    components[components<br/>components]
    js[js<br/>js]
    models[models<br/>models]

    components --> models
    components --> js
    js --> models

3 cross-module dependencies detected

CLI Reference

No CLI commands found in this project.

Module Overview

Detailed documentation for each module in the project:

components (components.ipynb)

FastHTML component for rendering the viewport-fit measurement script

Import

from cjm_fasthtml_viewport_fit.components import (
    render_viewport_fit_script
)

Functions

def render_viewport_fit_script(
    config: ViewportFitConfig,  # Instance configuration
) -> Any:  # Script element with complete viewport-fit JS
    "Render a Script element with the complete viewport-fit measurement JS."

js (js.ipynb)

JavaScript generation functions for viewport height measurement

Import

from cjm_fasthtml_viewport_fit.js import (
    generate_debug_helpers_js,
    generate_space_below_js,
    generate_calculate_height_js,
    generate_resize_handler_js,
    generate_htmx_settle_js,
    generate_init_js,
    generate_viewport_fit_js
)

Functions

def generate_debug_helpers_js(
    config: ViewportFitConfig,  # Instance configuration
) -> str:  # JS debug helper closures
    "Generate debug logging helpers conditional on a window flag."
def generate_space_below_js(
    config: ViewportFitConfig,  # Instance configuration
) -> str:  # JS function for DOM-walking space measurement
    "Generate JS that walks the DOM tree to measure space below a target element."
def generate_calculate_height_js(
    config: ViewportFitConfig,  # Instance configuration
) -> str:  # JS function for collapse-measure-apply height calculation
    "Generate JS that measures and applies viewport-fitted height to the target element."
def generate_resize_handler_js(
    config: ViewportFitConfig,  # Instance configuration
) -> str:  # JS for debounced resize listener with cleanup
    "Generate debounced window resize handler with HTMX-safe cleanup."
def generate_htmx_settle_js(
    config: ViewportFitConfig,  # Instance configuration
) -> str:  # JS for HTMX afterSettle recalculation (empty if disabled)
    "Generate HTMX afterSettle handler for recalculation on SPA navigation."
def generate_init_js(
    config: ViewportFitConfig,  # Instance configuration
) -> str:  # JS initialization block
    "Generate JS for initial measurement on script execution."
def generate_viewport_fit_js(
    config: ViewportFitConfig,  # Instance configuration
) -> str:  # Complete JS code as a self-contained IIFE
    "Generate the complete viewport-fit JS as a self-contained IIFE."

models (models.ipynb)

Configuration dataclass for viewport-fit measurement instances

Import

from cjm_fasthtml_viewport_fit.models import (
    ViewportFitConfig
)

Classes

@dataclass
class ViewportFitConfig:
    "Configuration for a viewport-fit measurement instance."
    
    namespace: str  # Unique prefix for JS isolation (e.g., "source_select")
    target_id: str  # HTML ID of the element to fit to viewport height
    inner_id: str = ''  # Optional child element that also receives the calculated height
    min_height: int = 200  # Minimum height in pixels
    debounce_ms: int = 100  # Resize debounce delay in milliseconds
    scroll_to_top: bool = True  # Scroll to (0,0) before measuring (for HTMX SPAs)
    enable_htmx_settle: bool = True  # Remeasure on htmx:afterSettle events
    resize_callback: str = ''  # Optional JS expression called after resize
    debug: bool = False  # Enable debug console logging by default
    
    def ns(self) -> str:  # Capitalized namespace for JS function names
            """Capitalized namespace for JS function names."""
            return "".join(p.capitalize() for p in self.namespace.split("_"))
    
        @property
        def handler_key(self) -> str:  # Window-level key for resize handler cleanup
        "Capitalized namespace for JS function names."
    
    def handler_key(self) -> str:  # Window-level key for resize handler cleanup
            """Window-level key for resize handler cleanup."""
            return f"_vfResizeHandler_{self.namespace.replace('-', '_')}"
    
        @property
        def settle_handler_key(self) -> str:  # Window-level key for HTMX settle handler
        "Window-level key for resize handler cleanup."
    
    def settle_handler_key(self) -> str:  # Window-level key for HTMX settle handler
            """Window-level key for HTMX settle handler cleanup."""
            return f"_vfSettleHandler_{self.namespace.replace('-', '_')}"
    
        @property
        def debug_flag(self) -> str:  # JS window debug flag name
        "Window-level key for HTMX settle handler cleanup."
    
    def debug_flag(self) -> str:  # JS window debug flag name
            """Window-level debug flag name."""
            return f"viewportFitDebug_{self.namespace.replace('-', '_')}"
    
        @property
        def log_prefix(self) -> str:  # Console log prefix string
        "Window-level debug flag name."
    
    def log_prefix(self) -> str:  # Console log prefix string
            """Console log prefix string."""
            return f"vf:{self.namespace}"
    
        @property
        def recalc_fn(self) -> str:  # Global function name for manual recalculation
        "Console log prefix string."
    
    def recalc_fn(self) -> str:  # Global function name for manual recalculation
        "Global function name for manual recalculation."

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

cjm_fasthtml_viewport_fit-0.0.1.tar.gz (13.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

cjm_fasthtml_viewport_fit-0.0.1-py3-none-any.whl (13.1 kB view details)

Uploaded Python 3

File details

Details for the file cjm_fasthtml_viewport_fit-0.0.1.tar.gz.

File metadata

File hashes

Hashes for cjm_fasthtml_viewport_fit-0.0.1.tar.gz
Algorithm Hash digest
SHA256 cabc69c0ed75bad9367efed91ee16ae876063b300ea0beac4b4658e8dc942025
MD5 712aee7fa3529f1f007bdfdeae4687e4
BLAKE2b-256 a2fa5136a319f8715617222043313190df9940c4cf4af51669fae55a3c74d867

See more details on using hashes here.

File details

Details for the file cjm_fasthtml_viewport_fit-0.0.1-py3-none-any.whl.

File metadata

File hashes

Hashes for cjm_fasthtml_viewport_fit-0.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 848a432f8a9f250d05d36efaba63db06ff2df4377c1ac73cdb37a0bdf5334dc4
MD5 8b363dd4fa867f7d3e3c48d6437ae920
BLAKE2b-256 644f5b501a8802cd4aa5f72ddb0fca31eb444e0a42abc0d128d3543aef2f6337

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page