pub(crate) fn render_frame(
        frame: &mut Frame,
        area: Rect,
        app_info: &mut Data,
        labels: &LabelHandler,
        window: &dyn KeyHandler,
        comp_layouts: &ComponentLayouts,
    ) {
        // Check if terminal is large enough
        if area.width < 50 || area.height < 15 {
            let dimension_notification = Paragraph::new("Terminal dimensions must be larger!")
                .block(Block::default())
                .alignment(Alignment::Center);
            let vertical_center = Layout::default()
                .direction(Direction::Vertical)
                .constraints([
                    Constraint::Percentage(40),
                    Constraint::Percentage(20),
                    Constraint::Percentage(40),
                ])
                .split(area);
            frame.render_widget(dimension_notification, vertical_center[1]);
            return;
        }

        let (address_text, hex_text, ascii_text) = Self::generate_text(
            app_info,
            comp_layouts.bytes_per_line,
            comp_layouts.lines_per_screen,
        );

        // Render Line Numbers
        frame.render_widget(
            Paragraph::new(address_text)
                .block(Block::default().borders(Borders::ALL).title("Address")),
            comp_layouts.line_numbers,
        );

        // Render Hex
        frame.render_widget(
            Paragraph::new(hex_text).block(
                Block::default().borders(Borders::ALL).title("Hex").style(
                    if window.is_focusing(Window::Hex) {
                        Style::default().fg(Color::Yellow)
                    } else {
                        Style::default()
                    },
                ),
            ),
            comp_layouts.hex,
        );

        // Render ASCII
        frame.render_widget(
            Paragraph::new(ascii_text).block(
                Block::default().borders(Borders::ALL).title("ASCII").style(
                    if window.is_focusing(Window::Ascii) {
                        Style::default().fg(Color::Yellow)
                    } else {
                        Style::default()
                    },
                ),
            ),
            comp_layouts.ascii,
        );

        // Render Info
        for (i, label) in comp_layouts.labels.iter().enumerate() {
            frame.render_widget(
                Paragraph::new(labels[LABEL_TITLES[i]].clone())
                    .block(Block::default().borders(Borders::ALL).title(LABEL_TITLES[i])),
                *label,
            );
        }

        // Render Popup
        if !window.is_focusing(Window::Hex) && !window.is_focusing(Window::Ascii) {
            frame.render_widget(Clear, comp_layouts.popup);
            frame.render_widget(window.widget(), comp_layouts.popup);
        }
    }
Display the addresses, editors, labels, and popups based off of the specifications of
[`ComponentLayouts`], defined by
[`calculate_dimensions`](Self::calculate_dimensions).
src/screen.rs