mirror of
				https://github.com/flynx/pWiki.git
				synced 2025-10-30 18:40:08 +00:00 
			
		
		
		
	added outline editor experiment...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
		
							parent
							
								
									8dcff32823
								
							
						
					
					
						commit
						f13505d9fe
					
				
							
								
								
									
										160
									
								
								experiments/outline-editor/index.html
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										160
									
								
								experiments/outline-editor/index.html
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,160 @@ | |||||||
|  | <html> | ||||||
|  | <head> | ||||||
|  | <style> | ||||||
|  | 
 | ||||||
|  | :root { | ||||||
|  | 	font-family: sans-serif; | ||||||
|  | 	font-size: 5mm; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .editor div div { | ||||||
|  | 	margin-left: 2em; | ||||||
|  | } | ||||||
|  | .editor div span { | ||||||
|  | 	display: block; | ||||||
|  | 	padding: 0.2em; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .editor div:focus { | ||||||
|  | 	/*outline: solid 0.2em silver;*/ | ||||||
|  | 	outline: none; | ||||||
|  | } | ||||||
|  | .editor div:focus>span { | ||||||
|  | 	background: silver; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | </style> | ||||||
|  | <script> | ||||||
|  | 
 | ||||||
|  | var getFocused = function(offset=0){ | ||||||
|  | 	var focused = document.querySelector('.editor :focus') | ||||||
|  | 	if(offset == 0){ | ||||||
|  | 		return focused } | ||||||
|  | 
 | ||||||
|  | 	if(offset == 'parent'){ | ||||||
|  | 		if(!focused){ | ||||||
|  | 			return document.querySelector('.editor [tabindex]') } | ||||||
|  | 		var elem = focused.parentElement | ||||||
|  | 		return elem.classList.contains('editor') ? | ||||||
|  | 			undefined | ||||||
|  | 			: elem } | ||||||
|  | 
 | ||||||
|  | 	if(offset == 'child'){ | ||||||
|  | 		if(!focused){ | ||||||
|  | 			return document.querySelector('.editor [tabindex]') } | ||||||
|  | 		return focused.querySelector('div') } | ||||||
|  | 
 | ||||||
|  | 	if(offset == 'children'){ | ||||||
|  | 		if(!focused){ | ||||||
|  | 			return [] } | ||||||
|  | 		return [...focused.children] | ||||||
|  | 			.filter(function(elem){  | ||||||
|  | 				return elem.getAttribute('tabindex') }) } | ||||||
|  | 
 | ||||||
|  | 	if(offset == 'siblings'){ | ||||||
|  | 		if(!focused){ | ||||||
|  | 			return [] } | ||||||
|  | 		return [...focused.parentElement.children] | ||||||
|  | 			.filter(function(elem){  | ||||||
|  | 				return elem.getAttribute('tabindex') }) } | ||||||
|  | 
 | ||||||
|  | 	var focusable = [...document.querySelectorAll('.editor [tabindex]')] | ||||||
|  | 	if(offset == 'all'){ | ||||||
|  | 		return focusable } | ||||||
|  | 
 | ||||||
|  | 	// offset from focused... | ||||||
|  | 	if(focused){ | ||||||
|  | 		var i = focusable.indexOf(focused) + offset | ||||||
|  | 		i = i < 0 ? | ||||||
|  | 			focusable.length + i | ||||||
|  | 			: i % focusable.length | ||||||
|  | 		return focusable[i] | ||||||
|  | 
 | ||||||
|  | 	// nothing focused -> forst/last... | ||||||
|  | 	} else { | ||||||
|  | 		return focusable[offset > 0 ? 0 : focusable.length-1] } } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | var keyboard = { | ||||||
|  | 	ArrowDown: function(evt, offset=1){ | ||||||
|  | 		getFocused(1)?.focus() }, | ||||||
|  | 	ArrowUp: function(evt){ | ||||||
|  | 		getFocused(-1)?.focus() }, | ||||||
|  | 	ArrowLeft: function(evt){ | ||||||
|  | 		getFocused('parent')?.focus() }, | ||||||
|  | 	ArrowRight: function(evt){ | ||||||
|  | 		getFocused('child')?.focus() }, | ||||||
|  | 
 | ||||||
|  | 	Tab: function(evt){ | ||||||
|  | 		evt.preventDefault() | ||||||
|  | 		var cur = getFocused() | ||||||
|  | 		if(!cur){ | ||||||
|  | 			return } | ||||||
|  | 		var siblings = getFocused('siblings') | ||||||
|  | 		// deindent... | ||||||
|  | 		if(evt.shiftKey){ | ||||||
|  | 			var parent = cur.parentElement | ||||||
|  | 			if(!parent.classList.contains('.editor')){ | ||||||
|  | 				var children = siblings.slice(siblings.indexOf(cur)+1) | ||||||
|  | 				parent.after(cur) | ||||||
|  | 				children.length > 0 | ||||||
|  | 					&& cur.append(...children) | ||||||
|  | 				cur.focus() } | ||||||
|  | 		// indent... | ||||||
|  | 		} else { | ||||||
|  | 			var parent = siblings[siblings.indexOf(cur) - 1] | ||||||
|  | 			if(parent){ | ||||||
|  | 				parent.append(cur) | ||||||
|  | 				cur.focus() } } }, | ||||||
|  | } | ||||||
|  | document.addEventListener('keydown',  | ||||||
|  | 	function(evt){ | ||||||
|  | 		evt.key in keyboard  | ||||||
|  | 			&& keyboard[evt.key](evt) }) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | </script> | ||||||
|  | </head> | ||||||
|  | <body> | ||||||
|  | <pre> | ||||||
|  | TODO: | ||||||
|  | - <s>navigation</s> | ||||||
|  | - expand/collapse subtree | ||||||
|  | - <s>shift subtree up/down</s> | ||||||
|  | - edit node | ||||||
|  | - create node | ||||||
|  | 
 | ||||||
|  | Controls: | ||||||
|  | 	up         - focus node above | ||||||
|  | 	down       - focus node below | ||||||
|  | 	left       - focus parent node | ||||||
|  | 	right      - focus first child node | ||||||
|  | 	s-left     - deindent node | ||||||
|  | 	s- right   - indent node | ||||||
|  | </pre> | ||||||
|  | 
 | ||||||
|  | <hr> | ||||||
|  | 
 | ||||||
|  | <div class="editor"> | ||||||
|  | 	<div tabindex=0><span>root</span> | ||||||
|  | 		<div tabindex=0><span>A</span> | ||||||
|  | 			<div tabindex=0><span>a</span> | ||||||
|  | 			</div> | ||||||
|  | 			<div tabindex=0><span>b</span> | ||||||
|  | 			</div> | ||||||
|  | 			<div tabindex=0><span>c</span> | ||||||
|  | 			</div> | ||||||
|  | 		</div> | ||||||
|  | 		<div tabindex=0><span>B</span> | ||||||
|  | 			<div tabindex=0><span>d</span> | ||||||
|  | 			</div> | ||||||
|  | 			<div tabindex=0><span>e</span> | ||||||
|  | 			</div> | ||||||
|  | 		</div> | ||||||
|  | 	</div> | ||||||
|  | </div> | ||||||
|  | 
 | ||||||
|  | </body> | ||||||
|  | </html> | ||||||
|  | <!-- vim:set ts=4 sw=4 : --> | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user