organizadores (#2)
Ya permite incluir logos de organizadores e incluso darles un caption por si no tienen nombre y hay que ponerlo. Co-authored-by: Borja Robert <borja@brobert.net> Reviewed-on: #2pull/3/head
							parent
							
								
									76464a61ea
								
							
						
					
					
						commit
						41afe44c51
					
				@ -1,107 +0,0 @@
 | 
				
			|||||||
<script>
 | 
					 | 
				
			||||||
	import { spring } from 'svelte/motion';
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	let count = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	const displayed_count = spring();
 | 
					 | 
				
			||||||
	$: displayed_count.set(count);
 | 
					 | 
				
			||||||
	$: offset = modulo($displayed_count, 1);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/**
 | 
					 | 
				
			||||||
	 * @param {number} n
 | 
					 | 
				
			||||||
	 * @param {number} m
 | 
					 | 
				
			||||||
	 */
 | 
					 | 
				
			||||||
	function modulo(n, m) {
 | 
					 | 
				
			||||||
		// handle negative numbers
 | 
					 | 
				
			||||||
		return ((n % m) + m) % m;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
</script>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
<div class="counter">
 | 
					 | 
				
			||||||
	<button on:click={() => (count -= 1)} aria-label="Decrease the counter by one">
 | 
					 | 
				
			||||||
		<svg aria-hidden="true" viewBox="0 0 1 1">
 | 
					 | 
				
			||||||
			<path d="M0,0.5 L1,0.5" />
 | 
					 | 
				
			||||||
		</svg>
 | 
					 | 
				
			||||||
	</button>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	<div class="counter-viewport">
 | 
					 | 
				
			||||||
		<div class="counter-digits" style="transform: translate(0, {100 * offset}%)">
 | 
					 | 
				
			||||||
			<strong class="hidden" aria-hidden="true">{Math.floor($displayed_count + 1)}</strong>
 | 
					 | 
				
			||||||
			<strong>{Math.floor($displayed_count)}</strong>
 | 
					 | 
				
			||||||
		</div>
 | 
					 | 
				
			||||||
	</div>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	<button on:click={() => (count += 1)} aria-label="Increase the counter by one">
 | 
					 | 
				
			||||||
		<svg aria-hidden="true" viewBox="0 0 1 1">
 | 
					 | 
				
			||||||
			<path d="M0,0.5 L1,0.5 M0.5,0 L0.5,1" />
 | 
					 | 
				
			||||||
		</svg>
 | 
					 | 
				
			||||||
	</button>
 | 
					 | 
				
			||||||
</div>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
<style>
 | 
					 | 
				
			||||||
	.counter {
 | 
					 | 
				
			||||||
		display: flex;
 | 
					 | 
				
			||||||
		border-top: 1px solid rgba(0, 0, 0, 0.1);
 | 
					 | 
				
			||||||
		border-bottom: 1px solid rgba(0, 0, 0, 0.1);
 | 
					 | 
				
			||||||
		margin: 1rem 0;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	.counter button {
 | 
					 | 
				
			||||||
		width: 2em;
 | 
					 | 
				
			||||||
		padding: 0;
 | 
					 | 
				
			||||||
		display: flex;
 | 
					 | 
				
			||||||
		align-items: center;
 | 
					 | 
				
			||||||
		justify-content: center;
 | 
					 | 
				
			||||||
		border: 0;
 | 
					 | 
				
			||||||
		background-color: transparent;
 | 
					 | 
				
			||||||
		touch-action: manipulation;
 | 
					 | 
				
			||||||
		color: var(--text-color);
 | 
					 | 
				
			||||||
		font-size: 2rem;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	.counter button:hover {
 | 
					 | 
				
			||||||
		background-color: var(--secondary-color);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	svg {
 | 
					 | 
				
			||||||
		width: 25%;
 | 
					 | 
				
			||||||
		height: 25%;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	path {
 | 
					 | 
				
			||||||
		vector-effect: non-scaling-stroke;
 | 
					 | 
				
			||||||
		stroke-width: 2px;
 | 
					 | 
				
			||||||
		stroke: var(--text-color);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	.counter-viewport {
 | 
					 | 
				
			||||||
		width: 8em;
 | 
					 | 
				
			||||||
		height: 4em;
 | 
					 | 
				
			||||||
		overflow: hidden;
 | 
					 | 
				
			||||||
		text-align: center;
 | 
					 | 
				
			||||||
		position: relative;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	.counter-viewport strong {
 | 
					 | 
				
			||||||
		position: absolute;
 | 
					 | 
				
			||||||
		display: flex;
 | 
					 | 
				
			||||||
		width: 100%;
 | 
					 | 
				
			||||||
		height: 100%;
 | 
					 | 
				
			||||||
		font-weight: 400;
 | 
					 | 
				
			||||||
		color: var(--accent-color);
 | 
					 | 
				
			||||||
		font-size: 4rem;
 | 
					 | 
				
			||||||
		align-items: center;
 | 
					 | 
				
			||||||
		justify-content: center;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	.counter-digits {
 | 
					 | 
				
			||||||
		position: absolute;
 | 
					 | 
				
			||||||
		width: 100%;
 | 
					 | 
				
			||||||
		height: 100%;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	.hidden {
 | 
					 | 
				
			||||||
		top: -100%;
 | 
					 | 
				
			||||||
		user-select: none;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
</style>
 | 
					 | 
				
			||||||
@ -0,0 +1,104 @@
 | 
				
			|||||||
 | 
					<script>
 | 
				
			||||||
 | 
						import {
 | 
				
			||||||
 | 
							title,
 | 
				
			||||||
 | 
							heading,
 | 
				
			||||||
 | 
							subtitle,
 | 
				
			||||||
 | 
							content,
 | 
				
			||||||
 | 
							date,
 | 
				
			||||||
 | 
							address,
 | 
				
			||||||
 | 
							organizedBy,
 | 
				
			||||||
 | 
							collabs,
 | 
				
			||||||
 | 
							canvas
 | 
				
			||||||
 | 
						} from '$lib/stores/store';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						let fileinput, avatar;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						const onFileSelected = (e) => {
 | 
				
			||||||
 | 
							let image = e.target.files[0];
 | 
				
			||||||
 | 
							let reader = new FileReader();
 | 
				
			||||||
 | 
							reader.readAsDataURL(image);
 | 
				
			||||||
 | 
							reader.onload = (e) => {
 | 
				
			||||||
 | 
								$organizedBy = [...$organizedBy, { image: e.target.result, text: '' }];
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						const removeOrganizer = (index) => {
 | 
				
			||||||
 | 
							if (index > -1) {
 | 
				
			||||||
 | 
								$organizedBy.splice(index, 1);
 | 
				
			||||||
 | 
								$organizedBy = $organizedBy;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div class="organized-by">
 | 
				
			||||||
 | 
						{#if $organizedBy[0]}
 | 
				
			||||||
 | 
							{#each $organizedBy as organization, i}
 | 
				
			||||||
 | 
								<div class="organization">
 | 
				
			||||||
 | 
									<div
 | 
				
			||||||
 | 
										class="remove"
 | 
				
			||||||
 | 
										on:click|preventDefault={() => {
 | 
				
			||||||
 | 
											removeOrganizer(i);
 | 
				
			||||||
 | 
										}}
 | 
				
			||||||
 | 
									>
 | 
				
			||||||
 | 
										x
 | 
				
			||||||
 | 
									</div>
 | 
				
			||||||
 | 
									<img class="organized-logo" src={organization.image} alt={organization.text} />
 | 
				
			||||||
 | 
									<input class="logo-title" type="text" bind:value={organization.text} />
 | 
				
			||||||
 | 
								</div>
 | 
				
			||||||
 | 
							{/each}
 | 
				
			||||||
 | 
						{/if}
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<button
 | 
				
			||||||
 | 
						on:click|preventDefault={() => {
 | 
				
			||||||
 | 
							fileinput.click();
 | 
				
			||||||
 | 
						}}>Añadir logo</button
 | 
				
			||||||
 | 
					>
 | 
				
			||||||
 | 
					<input
 | 
				
			||||||
 | 
						style="display:none;"
 | 
				
			||||||
 | 
						type="file"
 | 
				
			||||||
 | 
						accept=".jpg, .jpeg, .png"
 | 
				
			||||||
 | 
						on:change={(e) => onFileSelected(e)}
 | 
				
			||||||
 | 
						bind:this={fileinput}
 | 
				
			||||||
 | 
					/>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<style>
 | 
				
			||||||
 | 
						.organized-by {
 | 
				
			||||||
 | 
							display: grid;
 | 
				
			||||||
 | 
							grid-template-columns: 1fr 1fr 1fr;
 | 
				
			||||||
 | 
							align-items: center;
 | 
				
			||||||
 | 
							justify-content: center;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						.organization {
 | 
				
			||||||
 | 
							position: relative;
 | 
				
			||||||
 | 
							display: grid;
 | 
				
			||||||
 | 
							grid-template-rows: min-content min-content;
 | 
				
			||||||
 | 
							grid-gap: 0.5rem;
 | 
				
			||||||
 | 
							align-items: center;
 | 
				
			||||||
 | 
							justify-content: center;
 | 
				
			||||||
 | 
							margin: 1rem;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						.organized-logo {
 | 
				
			||||||
 | 
							max-height: 64px;
 | 
				
			||||||
 | 
							max-width: 100px;
 | 
				
			||||||
 | 
							margin: 0 auto;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						.remove {
 | 
				
			||||||
 | 
							position: absolute;
 | 
				
			||||||
 | 
							top: 0px;
 | 
				
			||||||
 | 
							right: 0px;
 | 
				
			||||||
 | 
							color: red;
 | 
				
			||||||
 | 
							cursor: pointer;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						input {
 | 
				
			||||||
 | 
							display: block;
 | 
				
			||||||
 | 
							max-width: 100px;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						button {
 | 
				
			||||||
 | 
							display: block;
 | 
				
			||||||
 | 
							padding: 0.5rem;
 | 
				
			||||||
 | 
							cursor: pointer;
 | 
				
			||||||
 | 
							margin: 1rem;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					</style>
 | 
				
			||||||
					Loading…
					
					
				
		Reference in New Issue