80 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
		
		
			
		
	
	
			80 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| 
								 | 
							
								import { BaseBlockHandler, type IBlockEventHandlers } from '../block.base.js';
							 | 
						||
| 
								 | 
							
								import type { IBlock } from '../../wysiwyg.types.js';
							 | 
						||
| 
								 | 
							
								import { cssManager } from '@design.estate/dees-element';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								export class DividerBlockHandler extends BaseBlockHandler {
							 | 
						||
| 
								 | 
							
								  type = 'divider';
							 | 
						||
| 
								 | 
							
								  
							 | 
						||
| 
								 | 
							
								  render(block: IBlock, isSelected: boolean): string {
							 | 
						||
| 
								 | 
							
								    const selectedClass = isSelected ? ' selected' : '';
							 | 
						||
| 
								 | 
							
								    return `
							 | 
						||
| 
								 | 
							
								      <div class="block divider${selectedClass}" data-block-id="${block.id}" data-block-type="${block.type}" tabindex="0">
							 | 
						||
| 
								 | 
							
								        <hr>
							 | 
						||
| 
								 | 
							
								      </div>
							 | 
						||
| 
								 | 
							
								    `;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  
							 | 
						||
| 
								 | 
							
								  setup(element: HTMLElement, block: IBlock, handlers: IBlockEventHandlers): void {
							 | 
						||
| 
								 | 
							
								    const dividerBlock = element.querySelector('.block.divider') as HTMLDivElement;
							 | 
						||
| 
								 | 
							
								    if (!dividerBlock) return;
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								    // Handle click to select
							 | 
						||
| 
								 | 
							
								    dividerBlock.addEventListener('click', (e) => {
							 | 
						||
| 
								 | 
							
								      e.stopPropagation();
							 | 
						||
| 
								 | 
							
								      // Focus will trigger the selection
							 | 
						||
| 
								 | 
							
								      dividerBlock.focus();
							 | 
						||
| 
								 | 
							
								      // Ensure focus handler is called immediately
							 | 
						||
| 
								 | 
							
								      handlers.onFocus?.();
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								    // Handle focus/blur
							 | 
						||
| 
								 | 
							
								    dividerBlock.addEventListener('focus', () => {
							 | 
						||
| 
								 | 
							
								      handlers.onFocus?.();
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								    dividerBlock.addEventListener('blur', () => {
							 | 
						||
| 
								 | 
							
								      handlers.onBlur?.();
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								    // Handle keyboard events
							 | 
						||
| 
								 | 
							
								    dividerBlock.addEventListener('keydown', (e) => {
							 | 
						||
| 
								 | 
							
								      if (e.key === 'Backspace' || e.key === 'Delete') {
							 | 
						||
| 
								 | 
							
								        e.preventDefault();
							 | 
						||
| 
								 | 
							
								        // Let the keyboard handler in the parent component handle the deletion
							 | 
						||
| 
								 | 
							
								        handlers.onKeyDown?.(e);
							 | 
						||
| 
								 | 
							
								      } else {
							 | 
						||
| 
								 | 
							
								        // Handle navigation keys
							 | 
						||
| 
								 | 
							
								        handlers.onKeyDown?.(e);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  
							 | 
						||
| 
								 | 
							
								  getStyles(): string {
							 | 
						||
| 
								 | 
							
								    return `
							 | 
						||
| 
								 | 
							
								      .block.divider {
							 | 
						||
| 
								 | 
							
								        padding: 8px 0;
							 | 
						||
| 
								 | 
							
								        margin: 16px 0;
							 | 
						||
| 
								 | 
							
								        cursor: pointer;
							 | 
						||
| 
								 | 
							
								        position: relative;
							 | 
						||
| 
								 | 
							
								        border-radius: 4px;
							 | 
						||
| 
								 | 
							
								        transition: all 0.15s ease;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      .block.divider:focus {
							 | 
						||
| 
								 | 
							
								        outline: none;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      .block.divider.selected {
							 | 
						||
| 
								 | 
							
								        background: ${cssManager.bdTheme('rgba(0, 102, 204, 0.05)', 'rgba(77, 148, 255, 0.08)')};
							 | 
						||
| 
								 | 
							
								        box-shadow: inset 0 0 0 2px ${cssManager.bdTheme('rgba(0, 102, 204, 0.2)', 'rgba(77, 148, 255, 0.2)')};
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      .block.divider hr {
							 | 
						||
| 
								 | 
							
								        border: none;
							 | 
						||
| 
								 | 
							
								        border-top: 1px solid ${cssManager.bdTheme('#e0e0e0', '#333')};
							 | 
						||
| 
								 | 
							
								        margin: 0;
							 | 
						||
| 
								 | 
							
								        pointer-events: none;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    `;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 |