Spaces:
Paused
Paused
| """ | |
| Layout Manager - Manage document layout and professional design | |
| """ | |
| from typing import Dict, List, Optional, Tuple | |
| class LayoutManager: | |
| """ | |
| Manage professional document layouts, spacing, and design. | |
| """ | |
| def __init__(self): | |
| """Initialize layout manager.""" | |
| self.page_width = 8.5 # inches (letter size) | |
| self.page_height = 11.0 | |
| self.margin_top = 1.0 | |
| self.margin_bottom = 1.0 | |
| self.margin_left = 1.0 | |
| self.margin_right = 1.0 | |
| def calculate_usable_area(self) -> Tuple[float, float]: | |
| """ | |
| Calculate usable page area (excluding margins). | |
| Returns: | |
| Tuple of (width, height) in inches | |
| """ | |
| width = self.page_width - self.margin_left - self.margin_right | |
| height = self.page_height - self.margin_top - self.margin_bottom | |
| return (width, height) | |
| def create_two_column_layout( | |
| self, left_width_percent: float = 50 | |
| ) -> Dict[str, Dict[str, float]]: | |
| """ | |
| Create two-column layout specification. | |
| Args: | |
| left_width_percent: Width percentage of left column | |
| Returns: | |
| Layout specification dictionary | |
| """ | |
| usable_width, usable_height = self.calculate_usable_area() | |
| left_width = (usable_width * left_width_percent) / 100 | |
| right_width = usable_width - left_width | |
| gutter = 0.25 # Space between columns | |
| return { | |
| "left_column": { | |
| "x": self.margin_left, | |
| "y": self.margin_top, | |
| "width": left_width - gutter / 2, | |
| "height": usable_height, | |
| }, | |
| "right_column": { | |
| "x": self.margin_left + left_width + gutter / 2, | |
| "y": self.margin_top, | |
| "width": right_width - gutter / 2, | |
| "height": usable_height, | |
| }, | |
| } | |
| def create_three_column_layout(self) -> Dict[str, Dict[str, float]]: | |
| """ | |
| Create three-column layout specification. | |
| Returns: | |
| Layout specification dictionary | |
| """ | |
| usable_width, usable_height = self.calculate_usable_area() | |
| col_width = (usable_width - 0.5) / 3 | |
| gutter = 0.25 | |
| return { | |
| "left_column": { | |
| "x": self.margin_left, | |
| "y": self.margin_top, | |
| "width": col_width - gutter / 2, | |
| "height": usable_height, | |
| }, | |
| "center_column": { | |
| "x": self.margin_left + col_width + gutter, | |
| "y": self.margin_top, | |
| "width": col_width - gutter, | |
| "height": usable_height, | |
| }, | |
| "right_column": { | |
| "x": self.margin_left + 2 * col_width + 2 * gutter, | |
| "y": self.margin_top, | |
| "width": col_width - gutter / 2, | |
| "height": usable_height, | |
| }, | |
| } | |
| def get_heading_styles(self) -> Dict[str, Dict]: | |
| """ | |
| Get professional heading styles. | |
| Returns: | |
| Dictionary of heading style specifications | |
| """ | |
| return { | |
| "h1": { | |
| "font_size": 28, | |
| "font_weight": "bold", | |
| "color": "#000000", | |
| "spacing_before": 24, | |
| "spacing_after": 12, | |
| }, | |
| "h2": { | |
| "font_size": 22, | |
| "font_weight": "bold", | |
| "color": "#1a1a1a", | |
| "spacing_before": 18, | |
| "spacing_after": 10, | |
| }, | |
| "h3": { | |
| "font_size": 16, | |
| "font_weight": "bold", | |
| "color": "#333333", | |
| "spacing_before": 12, | |
| "spacing_after": 6, | |
| }, | |
| "body": { | |
| "font_size": 11, | |
| "font_weight": "normal", | |
| "color": "#000000", | |
| "line_height": 1.5, | |
| "spacing_after": 12, | |
| }, | |
| } | |
| def get_color_palette(self, theme: str = "professional") -> Dict[str, str]: | |
| """ | |
| Get color palette for theme. | |
| Args: | |
| theme: Theme name (professional, academic, modern, classic) | |
| Returns: | |
| Dictionary of color definitions | |
| """ | |
| palettes = { | |
| "professional": { | |
| "primary": "#1a73e8", | |
| "secondary": "#34a853", | |
| "accent": "#f57c00", | |
| "text": "#202124", | |
| "light_bg": "#f8f9fa", | |
| "border": "#dadce0", | |
| }, | |
| "academic": { | |
| "primary": "#003366", | |
| "secondary": "#006699", | |
| "accent": "#cc0000", | |
| "text": "#000000", | |
| "light_bg": "#f5f5f5", | |
| "border": "#cccccc", | |
| }, | |
| "modern": { | |
| "primary": "#6200ea", | |
| "secondary": "#03dac6", | |
| "accent": "#ff0266", | |
| "text": "#1f1f1f", | |
| "light_bg": "#fafafa", | |
| "border": "#e0e0e0", | |
| }, | |
| "classic": { | |
| "primary": "#2c3e50", | |
| "secondary": "#3498db", | |
| "accent": "#e74c3c", | |
| "text": "#2c3e50", | |
| "light_bg": "#ecf0f1", | |
| "border": "#bdc3c7", | |
| }, | |
| } | |
| return palettes.get(theme, palettes["professional"]) | |
| def get_spacing_rules(self) -> Dict[str, float]: | |
| """ | |
| Get spacing rules (in inches). | |
| Returns: | |
| Dictionary of spacing values | |
| """ | |
| return { | |
| "extra_small": 0.125, | |
| "small": 0.25, | |
| "medium": 0.5, | |
| "large": 0.75, | |
| "extra_large": 1.0, | |
| "section_break": 1.5, | |
| "page_break": self.page_height, | |
| } | |
| def create_sidebar_layout( | |
| self, sidebar_width_percent: float = 25 | |
| ) -> Dict[str, Dict[str, float]]: | |
| """ | |
| Create sidebar layout specification. | |
| Args: | |
| sidebar_width_percent: Width percentage of sidebar | |
| Returns: | |
| Layout specification dictionary | |
| """ | |
| usable_width, usable_height = self.calculate_usable_area() | |
| sidebar_width = (usable_width * sidebar_width_percent) / 100 | |
| content_width = usable_width - sidebar_width | |
| gutter = 0.25 | |
| return { | |
| "sidebar": { | |
| "x": self.margin_left, | |
| "y": self.margin_top, | |
| "width": sidebar_width - gutter / 2, | |
| "height": usable_height, | |
| }, | |
| "main_content": { | |
| "x": self.margin_left + sidebar_width + gutter, | |
| "y": self.margin_top, | |
| "width": content_width - gutter / 2, | |
| "height": usable_height, | |
| }, | |
| } | |
| def calculate_text_wrap(self, text: str, column_width: float, chars_per_inch: float = 10) -> List[str]: | |
| """ | |
| Calculate text wrapping for column width. | |
| Args: | |
| text: Text to wrap | |
| column_width: Column width in inches | |
| chars_per_inch: Characters per inch (depending on font) | |
| Returns: | |
| List of wrapped lines | |
| """ | |
| max_chars_per_line = int(column_width * chars_per_inch) | |
| words = text.split() | |
| lines = [] | |
| current_line = "" | |
| for word in words: | |
| if len(current_line) + len(word) + 1 <= max_chars_per_line: | |
| current_line += word + " " | |
| else: | |
| if current_line: | |
| lines.append(current_line.strip()) | |
| current_line = word + " " | |
| if current_line: | |
| lines.append(current_line.strip()) | |
| return lines | |
| def get_professional_margins(self, format_type: str = "A4") -> Dict[str, float]: | |
| """ | |
| Get professional margin settings for different formats. | |
| Args: | |
| format_type: Format type (A4, Letter, etc.) | |
| Returns: | |
| Dictionary of margin values | |
| """ | |
| formats = { | |
| "A4": {"top": 1.0, "bottom": 1.0, "left": 1.0, "right": 1.0}, | |
| "Letter": {"top": 1.0, "bottom": 1.0, "left": 1.0, "right": 1.0}, | |
| "Narrow": {"top": 0.5, "bottom": 0.5, "left": 0.5, "right": 0.5}, | |
| "Wide": {"top": 1.5, "bottom": 1.5, "left": 1.5, "right": 1.5}, | |
| } | |
| return formats.get(format_type, formats["A4"]) | |
| def get_typography_settings(self) -> Dict[str, any]: | |
| """ | |
| Get professional typography settings. | |
| Returns: | |
| Dictionary of typography settings | |
| """ | |
| return { | |
| "font_family": "Calibri, Arial, sans-serif", | |
| "base_font_size": 11, | |
| "line_height": 1.5, | |
| "letter_spacing": 0, | |
| "paragraph_spacing": 12, | |
| "heading_font": "Calibri, Arial, sans-serif", | |
| "heading_weight": "bold", | |
| "body_weight": "normal", | |
| "emphasis_style": "italic", | |
| } | |
| def create_title_page_layout(self) -> Dict[str, any]: | |
| """ | |
| Create title page layout specification. | |
| Returns: | |
| Title page layout dictionary | |
| """ | |
| usable_width, usable_height = self.calculate_usable_area() | |
| return { | |
| "title": { | |
| "y": usable_height * 0.25, | |
| "font_size": 36, | |
| "alignment": "center", | |
| "spacing_after": 24, | |
| }, | |
| "subtitle": { | |
| "y": usable_height * 0.35, | |
| "font_size": 18, | |
| "alignment": "center", | |
| "spacing_after": 60, | |
| }, | |
| "author": { | |
| "y": usable_height * 0.6, | |
| "font_size": 12, | |
| "alignment": "center", | |
| "spacing_after": 12, | |
| }, | |
| "date": { | |
| "y": usable_height * 0.65, | |
| "font_size": 12, | |
| "alignment": "center", | |
| "spacing_after": 0, | |
| }, | |
| } | |