lots of tweaks...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
		
							parent
							
								
									f869066082
								
							
						
					
					
						commit
						3c7ed59b26
					
				| @ -10,6 +10,7 @@ | |||||||
| :root { | :root { | ||||||
| 	/* dimensions */ | 	/* dimensions */ | ||||||
| 	--gallery-scrollbar-width: 0.5em; | 	--gallery-scrollbar-width: 0.5em; | ||||||
|  | 	--gallery-image-scroll-margin: 1em; | ||||||
| 
 | 
 | ||||||
| 	--lightbox-frame-size: 5vmin; | 	--lightbox-frame-size: 5vmin; | ||||||
| 	--lightbox-image-margin-top: 0.75; | 	--lightbox-image-margin-top: 0.75; | ||||||
| @ -79,6 +80,7 @@ body { | |||||||
| .gallery .images img { | .gallery .images img { | ||||||
| 	height: 300px; | 	height: 300px; | ||||||
| 	width: auto; | 	width: auto; | ||||||
|  | 	scroll-margin: var(--gallery-image-scroll-margin); | ||||||
| 	image-rendering: crisp-edges; | 	image-rendering: crisp-edges; | ||||||
| 
 | 
 | ||||||
| 	cursor: pointer; | 	cursor: pointer; | ||||||
| @ -87,7 +89,9 @@ body { | |||||||
| /* selection marker... */ | /* selection marker... */ | ||||||
| .gallery .images img.current { | .gallery .images img.current { | ||||||
| 	z-index: 1; | 	z-index: 1; | ||||||
| 	box-shadow: 0px 0px 0px 5px rgba(255,0,0,0.8); | 	box-shadow:  | ||||||
|  | 		0px 0px 0px 0.5em rgba(255,255,255,1), | ||||||
|  | 		0.3em 0.3em 3em 0em rgba(0,0,0,0.8); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| @ -97,9 +101,14 @@ body { | |||||||
| 	z-index: 1; | 	z-index: 1; | ||||||
| 	position: relative; | 	position: relative; | ||||||
| } | } | ||||||
|  | .gallery.lightboxed .images img+.mark { | ||||||
|  | 	z-index: 2; | ||||||
|  | 	position: fixed; | ||||||
|  | 	bottom: 0; | ||||||
|  | 	right: 0; | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
| /* marker: selected */ | /* marker: selected */ | ||||||
| .gallery .lightbox.selected:after, |  | ||||||
| .gallery .images img+.mark.selected:after { | .gallery .images img+.mark.selected:after { | ||||||
| 	content: ""; | 	content: ""; | ||||||
| 	position: absolute; | 	position: absolute; | ||||||
| @ -111,7 +120,10 @@ body { | |||||||
| 	border-radius: 50%; | 	border-radius: 50%; | ||||||
| 
 | 
 | ||||||
| 	background: blue; | 	background: blue; | ||||||
| 	border: solid 1px white; | 
 | ||||||
|  | 	box-shadow: 0em 0em 0em 0.05em rgba(255,255,255,1); | ||||||
|  | 
 | ||||||
|  | 	cursor: pointer; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| @ -132,6 +144,9 @@ body { | |||||||
| 	color: var(--lightbox-text-color); | 	color: var(--lightbox-text-color); | ||||||
| 	background: var(--lightbox-background-color); | 	background: var(--lightbox-background-color); | ||||||
| } | } | ||||||
|  | .gallery.lightboxed .lightbox { | ||||||
|  | 	display: block; | ||||||
|  | } | ||||||
| .gallery .lightbox.show-caption:before { | .gallery .lightbox.show-caption:before { | ||||||
| 	content: attr(caption); | 	content: attr(caption); | ||||||
| 	position: absolute; | 	position: absolute; | ||||||
|  | |||||||
| @ -93,6 +93,7 @@ function(elem) { | |||||||
| 
 | 
 | ||||||
| //---------------------------------------------------------------------
 | //---------------------------------------------------------------------
 | ||||||
| 
 | 
 | ||||||
|  | // XXX add shift+arrow to select...
 | ||||||
| // XXX add home/end, pageup/pagedown...
 | // XXX add home/end, pageup/pagedown...
 | ||||||
| var keyboard = { | var keyboard = { | ||||||
| 	ArrowLeft: function(){ | 	ArrowLeft: function(){ | ||||||
| @ -142,9 +143,12 @@ var keyboard = { | |||||||
| 
 | 
 | ||||||
| var Gallery = { | var Gallery = { | ||||||
| 
 | 
 | ||||||
|  | 	// options...
 | ||||||
|  | 	//
 | ||||||
| 	allow_row_expansion: true, | 	allow_row_expansion: true, | ||||||
| 	click_to_select: true, | 	click_to_select: true, | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| 	code: ` | 	code: ` | ||||||
| 		<div class="gallery"> | 		<div class="gallery"> | ||||||
| 			<!-- gallery: content --> | 			<!-- gallery: content --> | ||||||
| @ -176,9 +180,11 @@ var Gallery = { | |||||||
| 		for(var i of this.dom.querySelectorAll('.images img.current')){ | 		for(var i of this.dom.querySelectorAll('.images img.current')){ | ||||||
| 			i.classList.remove('current') } | 			i.classList.remove('current') } | ||||||
| 		img.classList.add('current')  | 		img.classList.add('current')  | ||||||
|  | 		// XXX add offsets from borders...
 | ||||||
| 		img.scrollIntoView({ | 		img.scrollIntoView({ | ||||||
| 			behavior: 'smooth', | 			behavior: 'smooth', | ||||||
| 			block: 'nearest', | 			block: 'nearest', | ||||||
|  | 			offset: 10, | ||||||
| 		}) }, | 		}) }, | ||||||
| 
 | 
 | ||||||
| 	// XXX should this be writable???
 | 	// XXX should this be writable???
 | ||||||
| @ -339,7 +345,9 @@ var Gallery = { | |||||||
| 		return this.dom.querySelectorAll('.images img.selected') }, | 		return this.dom.querySelectorAll('.images img.selected') }, | ||||||
| 	// NOTE: this is here because we can't use :before / :after directly 
 | 	// NOTE: this is here because we can't use :before / :after directly 
 | ||||||
| 	// 		on the img tag...
 | 	// 		on the img tag...
 | ||||||
|  | 	// XXX make this generic and use a .marks list...
 | ||||||
| 	updateMarkers: function(){ | 	updateMarkers: function(){ | ||||||
|  | 		var that = this | ||||||
| 		// select...
 | 		// select...
 | ||||||
| 		for(var img of this.dom.querySelectorAll('.images img.selected')){ | 		for(var img of this.dom.querySelectorAll('.images img.selected')){ | ||||||
| 			var mark = img.nextElementSibling | 			var mark = img.nextElementSibling | ||||||
| @ -348,21 +356,28 @@ var Gallery = { | |||||||
| 			if(!mark || !mark.classList.contains('mark')){ | 			if(!mark || !mark.classList.contains('mark')){ | ||||||
| 				mark = document.createElement('div') | 				mark = document.createElement('div') | ||||||
| 				mark.classList.add('selected', 'mark') | 				mark.classList.add('selected', 'mark') | ||||||
|  | 				mark.addEventListener('click', function(evt){ | ||||||
|  | 					evt.stopPropagation() | ||||||
|  | 					that.deselect(mark) }) | ||||||
| 				img.after(mark) } } | 				img.after(mark) } } | ||||||
| 		// clear deselected...
 | 		// clear deselected...
 | ||||||
| 		for(var mark of this.dom.querySelectorAll('.images img:not(.selected)+.mark')){ | 		for(var mark of this.dom.querySelectorAll('.images img:not(.selected)+.mark')){ | ||||||
| 			mark.remove() } | 			mark.remove() } | ||||||
| 		// update lightbox...
 | 		// update lightbox...
 | ||||||
| 		this.lightbox.update() | 		this.lightbox.shown | ||||||
|  | 			&& this.lightbox.update() | ||||||
| 		return this }, | 		return this }, | ||||||
| 	select: function(){ | 	select: function(img){ | ||||||
| 		this.current?.classList.add('selected') | 		img = img ?? this.current | ||||||
|  | 		img?.classList.add('selected') | ||||||
| 		return this.updateMarkers() }, | 		return this.updateMarkers() }, | ||||||
| 	deselect: function(){ | 	deselect: function(img){ | ||||||
| 		this.current?.classList.remove('selected') | 		img = img ?? this.current | ||||||
|  | 		img?.classList.remove('selected') | ||||||
| 		return this.updateMarkers() }, | 		return this.updateMarkers() }, | ||||||
| 	toggleSelect: function(){ | 	toggleSelect: function(img){ | ||||||
| 		this.current?.classList.toggle('selected') | 		img = img ?? this.current | ||||||
|  | 		img?.classList.toggle('selected') | ||||||
| 		this.updateMarkers() | 		this.updateMarkers() | ||||||
| 		return this }, | 		return this }, | ||||||
| 	selectAll: function(){ | 	selectAll: function(){ | ||||||
| @ -406,8 +421,11 @@ var Gallery = { | |||||||
| 			.addEventListener('click', function(evt){ | 			.addEventListener('click', function(evt){ | ||||||
| 				var target = evt.target | 				var target = evt.target | ||||||
| 				if(target.tagName == 'IMG'){ | 				if(target.tagName == 'IMG'){ | ||||||
|  | 					// shift+click: toggle selections...
 | ||||||
|  | 					if(evt.shiftKey){ | ||||||
|  | 						that.toggleSelect(target) | ||||||
| 					// first click selects, second shows...
 | 					// first click selects, second shows...
 | ||||||
| 					if(that.click_to_select){ | 					} else if(that.click_to_select){ | ||||||
| 						target.classList.contains('current') ? | 						target.classList.contains('current') ? | ||||||
| 							that.show() | 							that.show() | ||||||
| 							: (that.current = target) | 							: (that.current = target) | ||||||
| @ -451,17 +469,17 @@ var Lightbox = { | |||||||
| 			&& this.cache() }, | 			&& this.cache() }, | ||||||
| 
 | 
 | ||||||
| 	get shown(){ | 	get shown(){ | ||||||
| 		return this.dom.style.display == 'block' }, | 		return this.gallery.dom.classList.contains('lightboxed') }, | ||||||
| 	show: function(url){ | 	show: function(url){ | ||||||
| 		this.url = url  | 		this.url = url  | ||||||
| 			?? (this.gallery.current | 			?? (this.gallery.current | ||||||
| 				?? this.gallery.next().current | 				?? this.gallery.next().current | ||||||
| 				?? {}).src | 				?? {}).src | ||||||
| 		this.update() | 		this.update() | ||||||
| 		this.dom.style.display = 'block' | 		this.gallery.dom.classList.add('lightboxed') | ||||||
| 		return this }, | 		return this }, | ||||||
| 	hide: function(){ | 	hide: function(){ | ||||||
| 		this.dom.style.display = '' | 		this.gallery.dom.classList.remove('lightboxed') | ||||||
| 		return this }, | 		return this }, | ||||||
| 	toggle: function(){ | 	toggle: function(){ | ||||||
| 		return this.shown ? | 		return this.shown ? | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user