# coalFeeding.vue Motor Grid Alignment Refinement ## Overview This design refines the already approved block-based right-panel layout in `src/views/coalFeeding.vue`. It does not change the overall removal of ``. Instead, it adjusts the motor areas so they better match the desired visual structure. The refinement introduces two requirements: - both `中间侧` and `回车侧` motor areas should render motors two per row instead of one per row - the left-side label blocks for those motor areas must stay height-aligned with the corresponding right-side motor blocks ## Goals - Render motor items in a 2-column layout for both motor sections - Keep odd motor counts left-aligned on the final row - Keep the left label block height aligned with the right motor block height - Preserve all existing drag-and-drop, click, and status-display logic - Avoid reworking the surrounding block layout ## Non-Goals - Do not change the current block layout order - Do not change time-field rendering - Do not change temperature or car-number sections - Do not switch to a new backend data structure - Do not introduce DOM measurement logic unless strictly necessary ## Chosen Approach Use a CSS grid for motor layout plus shared computed heights for label and motor sections. Why this approach: - It preserves the current block-based layout structure - It keeps the change small and local to the motor sections - It avoids fragile DOM measurement code - It guarantees left/right alignment by making both sides use the same computed height source ## Motor Layout Rules Both `中间侧` and `回车侧` motor groups will render with: - two columns per row - consistent gaps between motor items - left-aligned final item when the count is odd Implementation shape: - wrap each motor list in a dedicated grid container - use `grid-template-columns: repeat(2, minmax(0, 1fr))` - allow each motor item to occupy one cell - do not center or span the final odd item Expected examples: - 2 motors -> 1 row of 2 - 3 motors -> 2 rows, with the last item on the left of the second row - 4 motors -> 2 rows of 2 ## Height Alignment Rules The left labels for `中间侧` and `回车侧` must visually align with the height of their corresponding motor blocks across all unit columns. To achieve this, compute two shared height values: - `middleMotorHeight` - `returnMotorHeight` These values will be derived from the largest motor-group row count in the current data. Row count formula: - `Math.ceil(motorCount / 2)` Height formula: - `sectionPaddingTop + sectionPaddingBottom + rows * itemHeight + (rows - 1) * rowGap` Also enforce a minimum height so single-row sections do not become too short. Both the left label block and the right motor block must use the same computed height source for each section. ## Rendering Changes Keep the existing right-panel block structure. Only refine the motor section internals and the matching left labels. Changes: - `中间侧` label gets `:style="{ minHeight: middleMotorHeight }"` - `回车侧` label gets `:style="{ minHeight: returnMotorHeight }"` - upper motor section gets `:style="{ minHeight: middleMotorHeight }"` - lower motor section gets `:style="{ minHeight: returnMotorHeight }"` - motor items render inside a `control-panel__motor-grid` container The individual motor cards keep their current: - drag-and-drop handlers - run/stop toggles - local/remote badges - fault/normal text ## Styling Changes Add a motor-grid wrapper class with: - `display: grid` - two equal-width columns - fixed row gap - fixed column gap - left-aligned item flow The motor section wrapper should: - keep the current blue-tinted background - use the shared computed minimum height - align its content to the top instead of stretching awkwardly The left label blocks should: - continue using the current label styling - adopt the same computed minimum height as their corresponding right-side section ## Risks and Mitigations ### Risk 1: heights drift if units have different motor counts Mitigation: - compute height from the maximum row count across all units for each motor section ### Risk 2: odd counts look visually off Mitigation: - keep the final odd item left-aligned and do not stretch it to full width ### Risk 3: click and drag interactions break during markup changes Mitigation: - keep the motor card markup intact - move only the grouping wrapper and layout styles ## Testing Plan After implementation, verify: - `中间侧` motors render two per row - `回车侧` motors render two per row - odd motor counts leave the last motor on the left side - left label heights align with right motor-section heights - motor clicks still toggle state - drag-and-drop still works on motor items - the surrounding right-panel layout remains unchanged ## Open Constraints - The workspace is still not a Git repository, so this design file cannot be committed here. - This refinement assumes the existing block-based right-panel layout remains the baseline for implementation.