Prettier
This commit is contained in:
rodič
b3db1527b8
revize
fe4bfb670b
|
@ -22,6 +22,8 @@
|
|||
"@sveltejs/kit": "next",
|
||||
"autoprefixer": "^10.4.4",
|
||||
"postcss": "^8.4.12",
|
||||
"prettier": "^2.6.2",
|
||||
"prettier-plugin-svelte": "^2.7.0",
|
||||
"svelte": "^3.46.0",
|
||||
"svelte-markdown": "^0.2.2",
|
||||
"tailwindcss": "^3.0.23"
|
||||
|
@ -1571,6 +1573,31 @@
|
|||
"integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/prettier": {
|
||||
"version": "2.6.2",
|
||||
"resolved": "https://registry.npmjs.org/prettier/-/prettier-2.6.2.tgz",
|
||||
"integrity": "sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew==",
|
||||
"dev": true,
|
||||
"bin": {
|
||||
"prettier": "bin-prettier.js"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=10.13.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/prettier/prettier?sponsor=1"
|
||||
}
|
||||
},
|
||||
"node_modules/prettier-plugin-svelte": {
|
||||
"version": "2.7.0",
|
||||
"resolved": "https://registry.npmjs.org/prettier-plugin-svelte/-/prettier-plugin-svelte-2.7.0.tgz",
|
||||
"integrity": "sha512-fQhhZICprZot2IqEyoiUYLTRdumULGRvw0o4dzl5jt0jfzVWdGqeYW27QTWAeXhoupEZJULmNoH3ueJwUWFLIA==",
|
||||
"dev": true,
|
||||
"peerDependencies": {
|
||||
"prettier": "^1.16.4 || ^2.0.0",
|
||||
"svelte": "^3.2.0"
|
||||
}
|
||||
},
|
||||
"node_modules/queue-microtask": {
|
||||
"version": "1.2.3",
|
||||
"resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
|
||||
|
@ -2895,6 +2922,19 @@
|
|||
"integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
|
||||
"dev": true
|
||||
},
|
||||
"prettier": {
|
||||
"version": "2.6.2",
|
||||
"resolved": "https://registry.npmjs.org/prettier/-/prettier-2.6.2.tgz",
|
||||
"integrity": "sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew==",
|
||||
"dev": true
|
||||
},
|
||||
"prettier-plugin-svelte": {
|
||||
"version": "2.7.0",
|
||||
"resolved": "https://registry.npmjs.org/prettier-plugin-svelte/-/prettier-plugin-svelte-2.7.0.tgz",
|
||||
"integrity": "sha512-fQhhZICprZot2IqEyoiUYLTRdumULGRvw0o4dzl5jt0jfzVWdGqeYW27QTWAeXhoupEZJULmNoH3ueJwUWFLIA==",
|
||||
"dev": true,
|
||||
"requires": {}
|
||||
},
|
||||
"queue-microtask": {
|
||||
"version": "1.2.3",
|
||||
"resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
|
||||
|
|
|
@ -6,7 +6,9 @@
|
|||
"build": "svelte-kit build",
|
||||
"package": "svelte-kit package",
|
||||
"preview": "svelte-kit preview",
|
||||
"prepare": "svelte-kit sync"
|
||||
"prepare": "svelte-kit sync",
|
||||
"prettier": "prettier --write --plugin-search-dir=. ./**/*.svelte"
|
||||
|
||||
},
|
||||
"devDependencies": {
|
||||
"@faker-js/faker": "^6.1.2",
|
||||
|
@ -15,6 +17,8 @@
|
|||
"@sveltejs/kit": "next",
|
||||
"autoprefixer": "^10.4.4",
|
||||
"postcss": "^8.4.12",
|
||||
"prettier": "^2.6.2",
|
||||
"prettier-plugin-svelte": "^2.7.0",
|
||||
"svelte": "^3.46.0",
|
||||
"svelte-markdown": "^0.2.2",
|
||||
"tailwindcss": "^3.0.23"
|
||||
|
|
|
@ -1,112 +1,150 @@
|
|||
<script>
|
||||
export let speaker;
|
||||
export let col = 'speakers';
|
||||
export let size = 'normal';
|
||||
export let col = "speakers";
|
||||
export let size = "normal";
|
||||
export let customSize = null;
|
||||
|
||||
import SvelteMarkdown from 'svelte-markdown';
|
||||
import Link from '$lib/Link.svelte';
|
||||
import { page } from '$app/stores';
|
||||
import SvelteMarkdown from "svelte-markdown";
|
||||
import Link from "$lib/Link.svelte";
|
||||
import { page } from "$app/stores";
|
||||
|
||||
const renderers = { link: Link }
|
||||
const renderers = { link: Link };
|
||||
|
||||
let imagesRoot = 'https://spec.utxo.cz/22/photos'
|
||||
let imagesRoot = "https://spec.utxo.cz/22/photos";
|
||||
/*if ($page.url.hostname === 'localhost') {
|
||||
imagesRoot = 'http://localhost:8000/22/photos'
|
||||
}*/
|
||||
const priority = [ 'web:svg', 'web:webp', 'web:png', 'web:jpg', 'twitter:jpg' ]
|
||||
const priority = ["web:svg", "web:webp", "web:png", "web:jpg", "twitter:jpg"];
|
||||
|
||||
$: photos = getPhotos(speaker)
|
||||
$: speakerImg = photos[0]
|
||||
$: speakerImgAlt = photos[1]
|
||||
$: photos = getPhotos(speaker);
|
||||
$: speakerImg = photos[0];
|
||||
$: speakerImgAlt = photos[1];
|
||||
|
||||
function getPhotos (sp) {
|
||||
const output = []
|
||||
function getPhotos(sp) {
|
||||
const output = [];
|
||||
if (speaker.photos && speaker.photos.length > 0) {
|
||||
for (const prio of priority) {
|
||||
if (speaker.photos.includes(prio)) {
|
||||
const [ ext, format ] = prio.split(':')
|
||||
const fn = `${imagesRoot}/${col}/${speaker.id}-${ext}.${format}`
|
||||
const [ext, format] = prio.split(":");
|
||||
const fn = `${imagesRoot}/${col}/${speaker.id}-${ext}.${format}`;
|
||||
if (output[0]) {
|
||||
output.push(fn)
|
||||
break
|
||||
output.push(fn);
|
||||
break;
|
||||
}
|
||||
output.push(fn)
|
||||
output.push(fn);
|
||||
}
|
||||
}
|
||||
}
|
||||
return output
|
||||
return output;
|
||||
}
|
||||
|
||||
if (!speakerImg) {
|
||||
speakerImg = '/img/twitter-avatar.png'
|
||||
speakerImg = "/img/twitter-avatar.png";
|
||||
}
|
||||
|
||||
function getFlagEmoji(countryCode) {
|
||||
const codePoints = countryCode
|
||||
.toUpperCase()
|
||||
.split('')
|
||||
.map(char => 127397 + char.charCodeAt());
|
||||
.split("")
|
||||
.map((char) => 127397 + char.charCodeAt());
|
||||
return String.fromCodePoint(...codePoints);
|
||||
}
|
||||
|
||||
$: country = speaker.country ? getFlagEmoji(speaker.country) : ''
|
||||
$: currentImg = speakerImg
|
||||
$: country = speaker.country ? getFlagEmoji(speaker.country) : "";
|
||||
$: currentImg = speakerImg;
|
||||
|
||||
function mouseOver () {
|
||||
function mouseOver() {
|
||||
if (speakerImgAlt) {
|
||||
$: currentImg = speakerImgAlt
|
||||
$: currentImg = speakerImgAlt;
|
||||
}
|
||||
}
|
||||
function mouseLeave () {
|
||||
$: currentImg = speakerImg
|
||||
function mouseLeave() {
|
||||
$: currentImg = speakerImg;
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
{#if size === 'custom'}
|
||||
<div class="customSize} text-center pb-4 m-auto">
|
||||
<img src={currentImg} class="{customSize} rounded-full m-auto" alt={speaker.name} />
|
||||
</div>
|
||||
{#if size === "custom"}
|
||||
<div class="customSize} text-center pb-4 m-auto">
|
||||
<img
|
||||
src={currentImg}
|
||||
class="{customSize} rounded-full m-auto"
|
||||
alt={speaker.name}
|
||||
/>
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
{#if size === 'big'}
|
||||
<div class="w-64 text-center pb-4 m-auto">
|
||||
<img src={currentImg} class="w-64 rounded-full m-auto shadow-xl" alt={speaker.name} on:mouseover={mouseOver} on:mouseleave={mouseLeave} />
|
||||
</div>
|
||||
{#if size === "big"}
|
||||
<div class="w-64 text-center pb-4 m-auto">
|
||||
<img
|
||||
src={currentImg}
|
||||
class="w-64 rounded-full m-auto shadow-xl"
|
||||
alt={speaker.name}
|
||||
on:mouseover={mouseOver}
|
||||
on:mouseleave={mouseLeave}
|
||||
/>
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
{#if size === 'normal'}
|
||||
<div class="w-36 sm:w-44 text-center pb-4">
|
||||
<a href="/lide?id={speaker.id}" on:mouseover={mouseOver} on:mouseleave={mouseLeave}><img src={currentImg} class="w-36 sm:w-40 rounded-full m-auto shadow-xl" alt={speaker.name} /></a>
|
||||
<div class="mt-4 text-sm text-blue-web uppercase font-bold"><a href="/lide?id={speaker.id}">{speaker.name}</a> {country}</div>
|
||||
{#if speaker.bio || speaker.orgs}
|
||||
<div class="mt-1 text-xs text-blue-web italic"><SvelteMarkdown source={speaker.bio || speaker.orgs} renderers={renderers}/></div>
|
||||
{/if}
|
||||
</div>
|
||||
{#if size === "normal"}
|
||||
<div class="w-36 sm:w-44 text-center pb-4">
|
||||
<a
|
||||
href="/lide?id={speaker.id}"
|
||||
on:mouseover={mouseOver}
|
||||
on:mouseleave={mouseLeave}
|
||||
><img
|
||||
src={currentImg}
|
||||
class="w-36 sm:w-40 rounded-full m-auto shadow-xl"
|
||||
alt={speaker.name}
|
||||
/></a
|
||||
>
|
||||
<div class="mt-4 text-sm text-blue-web uppercase font-bold">
|
||||
<a href="/lide?id={speaker.id}">{speaker.name}</a>
|
||||
{country}
|
||||
</div>
|
||||
{#if speaker.bio || speaker.orgs}
|
||||
<div class="mt-1 text-xs text-blue-web italic">
|
||||
<SvelteMarkdown source={speaker.bio || speaker.orgs} {renderers} />
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
{#if size === 'small'}
|
||||
<div class="w-16 text-center">
|
||||
<img src={currentImg} class="w-16 rounded-full m-auto" alt="{speaker.name}" />
|
||||
</div>
|
||||
{#if size === "small"}
|
||||
<div class="w-16 text-center">
|
||||
<img src={currentImg} class="w-16 rounded-full m-auto" alt={speaker.name} />
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
{#if size === 'semi-small'}
|
||||
<div class="w-10 text-center">
|
||||
<img src={currentImg} class="w-10 rounded-full m-auto shadow-md" alt="{speaker.name}" />
|
||||
</div>
|
||||
{#if size === "semi-small"}
|
||||
<div class="w-10 text-center">
|
||||
<img
|
||||
src={currentImg}
|
||||
class="w-10 rounded-full m-auto shadow-md"
|
||||
alt={speaker.name}
|
||||
/>
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
{#if size === 'extra-small'}
|
||||
<div class="w-6 h-6 text-center">
|
||||
<a href="/lide?id={speaker.id}"><img src={currentImg} class="w-6 rounded-full m-auto" alt="{speaker.name}" /></a>
|
||||
</div>
|
||||
{#if size === "extra-small"}
|
||||
<div class="w-6 h-6 text-center">
|
||||
<a href="/lide?id={speaker.id}"
|
||||
><img
|
||||
src={currentImg}
|
||||
class="w-6 rounded-full m-auto"
|
||||
alt={speaker.name}
|
||||
/></a
|
||||
>
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
{#if size === 'micro'}
|
||||
<div class="w-4 h-4 text-center">
|
||||
<a href="/lide?id={speaker.id}"><img src={currentImg} class="w-4 rounded-full m-auto" alt="{speaker.name}" /></a>
|
||||
</div>
|
||||
{#if size === "micro"}
|
||||
<div class="w-4 h-4 text-center">
|
||||
<a href="/lide?id={speaker.id}"
|
||||
><img
|
||||
src={currentImg}
|
||||
class="w-4 rounded-full m-auto"
|
||||
alt={speaker.name}
|
||||
/></a
|
||||
>
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
|
|
|
@ -3,53 +3,70 @@
|
|||
|
||||
const e = event;
|
||||
|
||||
import Avatar from '$lib/Avatar.svelte';
|
||||
import EventTypeLabel from '$lib/EventTypeLabel.svelte';
|
||||
import Avatar from "$lib/Avatar.svelte";
|
||||
import EventTypeLabel from "$lib/EventTypeLabel.svelte";
|
||||
|
||||
import { bundle, userData } from '$lib/stores.js';
|
||||
import { bundle, userData } from "$lib/stores.js";
|
||||
|
||||
function speakersMap (arr) {
|
||||
function speakersMap(arr) {
|
||||
if (!arr) return;
|
||||
return arr.map(sId => {
|
||||
return $bundle.spec.speakers.find(sp => sp.id === sId)
|
||||
})
|
||||
return arr.map((sId) => {
|
||||
return $bundle.spec.speakers.find((sp) => sp.id === sId);
|
||||
});
|
||||
}
|
||||
|
||||
function trackRender (trackId) {
|
||||
const track = $bundle.spec.tracks.find(t => t.id === trackId)
|
||||
return track.shortname || track.name
|
||||
function trackRender(trackId) {
|
||||
const track = $bundle.spec.tracks.find((t) => t.id === trackId);
|
||||
return track.shortname || track.name;
|
||||
}
|
||||
|
||||
function getParents (e) {
|
||||
return $bundle.spec.events.filter(i => i.parent === e.id)
|
||||
function getParents(e) {
|
||||
return $bundle.spec.events.filter((i) => i.parent === e.id);
|
||||
}
|
||||
|
||||
function handleFavorite (el) {
|
||||
const t = el.target.getAttribute('utxo-event-id')
|
||||
userData.update(data => {
|
||||
const fe = data.favoriteEvents
|
||||
let output = null
|
||||
function handleFavorite(el) {
|
||||
const t = el.target.getAttribute("utxo-event-id");
|
||||
userData.update((data) => {
|
||||
const fe = data.favoriteEvents;
|
||||
let output = null;
|
||||
if (fe.includes(t)) {
|
||||
output = Object.assign($userData, { favoriteEvents: fe.filter(f => f !== t) } )
|
||||
output = Object.assign($userData, {
|
||||
favoriteEvents: fe.filter((f) => f !== t),
|
||||
});
|
||||
} else {
|
||||
fe.push(t)
|
||||
output = Object.assign($userData, { favoriteEvents: fe })
|
||||
fe.push(t);
|
||||
output = Object.assign($userData, { favoriteEvents: fe });
|
||||
}
|
||||
//localStorage.setItem('userData', JSON.stringify(output))
|
||||
return output
|
||||
})
|
||||
return output;
|
||||
});
|
||||
}
|
||||
</script>
|
||||
|
||||
|
||||
<div class="transition-all mb-4 border px-3 py-2 rounded-md shadow {$userData.favoriteEvents.includes(e.id) ? 'bg-yellow-100' : '' }" >
|
||||
<div class="float-right"><i class="fa-star {$userData.favoriteEvents.includes(e.id) ? 'fa-solid' : 'fa-regular'} cursor-pointer" utxo-event-id="{e.id}" on:click={handleFavorite}></i></div>
|
||||
<div class="text-lg font-semibold"><a href="/udalosti?id={e.id}">{e.name}</a></div>
|
||||
<div
|
||||
class="transition-all mb-4 border px-3 py-2 rounded-md shadow {$userData.favoriteEvents.includes(
|
||||
e.id
|
||||
)
|
||||
? 'bg-yellow-100'
|
||||
: ''}"
|
||||
>
|
||||
<div class="float-right">
|
||||
<i
|
||||
class="fa-star {$userData.favoriteEvents.includes(e.id)
|
||||
? 'fa-solid'
|
||||
: 'fa-regular'} cursor-pointer"
|
||||
utxo-event-id={e.id}
|
||||
on:click={handleFavorite}
|
||||
/>
|
||||
</div>
|
||||
<div class="text-lg font-semibold">
|
||||
<a href="/udalosti?id={e.id}">{e.name}</a>
|
||||
</div>
|
||||
{#if e.speakers && e.speakers.length > 0}
|
||||
<div class="mt-1 mb-2 flex flex-wrap gap-2">
|
||||
{#each speakersMap(e.speakers) as s}
|
||||
<div class="flex gap-1.5">
|
||||
<Avatar speaker={s} size='extra-small' />
|
||||
<Avatar speaker={s} size="extra-small" />
|
||||
<div class="m-auto"><a href="/lide?id={s.id}">{s.name}</a></div>
|
||||
</div>
|
||||
{/each}
|
||||
|
@ -65,13 +82,18 @@
|
|||
<div class="flex flex-wrap gap-2" cellpadding="5">
|
||||
{#each getParents(e) as pe}
|
||||
<div class="border rounded py-1.5 px-2.5 bg-gray-100 text-sm">
|
||||
<div class="font-bold"><a href="/udalosti?id={pe.id}">{pe.name}</a></div>
|
||||
<div class="font-bold">
|
||||
<a href="/udalosti?id={pe.id}">{pe.name}</a>
|
||||
</div>
|
||||
<div class="mt-1">
|
||||
{#if pe.speakers.length === 0}
|
||||
<div>TBA</div>
|
||||
{:else}
|
||||
{#each speakersMap(pe.speakers) as s}
|
||||
<div class="flex gap-1"><Avatar speaker={s} size='micro' /><div><a href="/lide?id={s.id}">{s.name}</a></div></div>
|
||||
<div class="flex gap-1">
|
||||
<Avatar speaker={s} size="micro" />
|
||||
<div><a href="/lide?id={s.id}">{s.name}</a></div>
|
||||
</div>
|
||||
{/each}
|
||||
{/if}
|
||||
</div>
|
||||
|
|
|
@ -3,19 +3,23 @@
|
|||
export let size = null;
|
||||
|
||||
const config = {
|
||||
panel: { title: 'Panelová debata', style: 'bg-custom-red text-white' },
|
||||
talk: { title: 'Přednáška', style: 'bg-custom-green text-white' },
|
||||
workshop: { title: 'Workshop', style: 'bg-custom-blue text-white' },
|
||||
other: { title: 'Ostatní', style: 'bg-custom-yellow' },
|
||||
lightning: { title: 'Lightning talk', style: 'bg-pink-400' },
|
||||
}
|
||||
panel: { title: "Panelová debata", style: "bg-custom-red text-white" },
|
||||
talk: { title: "Přednáška", style: "bg-custom-green text-white" },
|
||||
workshop: { title: "Workshop", style: "bg-custom-blue text-white" },
|
||||
other: { title: "Ostatní", style: "bg-custom-yellow" },
|
||||
lightning: { title: "Lightning talk", style: "bg-pink-400" },
|
||||
};
|
||||
|
||||
const current = config[event.type];
|
||||
|
||||
</script>
|
||||
|
||||
<div class="flex { size === 'big' ? 'h-6 text-sm' : 'h-5 text-xs' }">
|
||||
<div class="w-1 rounded-l-sm {current.style}"></div>
|
||||
<div class="{ size === 'big' ? 'px-2 py-0.5' : 'px-1.5 py-0.5' } rounded-r-sm bg-gray-100 uppercase">{current.title}</div>
|
||||
<div class="flex {size === 'big' ? 'h-6 text-sm' : 'h-5 text-xs'}">
|
||||
<div class="w-1 rounded-l-sm {current.style}" />
|
||||
<div
|
||||
class="{size === 'big'
|
||||
? 'px-2 py-0.5'
|
||||
: 'px-1.5 py-0.5'} rounded-r-sm bg-gray-100 uppercase"
|
||||
>
|
||||
{current.title}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
|
|
@ -1,38 +1,63 @@
|
|||
<script>
|
||||
import { bundle } from '$lib/stores';
|
||||
import SocialButtons from '$lib/SocialButtons.svelte';
|
||||
import { bundle } from "$lib/stores";
|
||||
import SocialButtons from "$lib/SocialButtons.svelte";
|
||||
</script>
|
||||
|
||||
{#if $bundle}
|
||||
<div class="bg-blue-web-bg text-white">
|
||||
<div class="relative mx-auto px-6 pt-10 pb-2 sm:pb-6 max-w-6xl sm:flex pr-4">
|
||||
<div class="flex-1">
|
||||
<div class="bg-blue-web-bg text-white">
|
||||
<div
|
||||
class="relative mx-auto px-6 pt-10 pb-2 sm:pb-6 max-w-6xl sm:flex pr-4"
|
||||
>
|
||||
<div class="flex-1">
|
||||
<div>
|
||||
<a href="/"
|
||||
><img src="/img/logo-white.svg" alt="UTXO.22" class="w-24" /></a
|
||||
>
|
||||
</div>
|
||||
<div class="mt-4 font-semibold">
|
||||
4.-5. červen 2022 @ Gabriel Loci, Praha
|
||||
</div>
|
||||
<div class="mt-2 font-thin">
|
||||
Otevřená komunitní kryptoměnová konference
|
||||
</div>
|
||||
<div class="mt-4">
|
||||
<a href={$bundle.links.docs} class="hover:text-red-500"
|
||||
><i class="fas fa-book" /> Dokumentace</a
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sm:mt-0 mt-6 sm:w-1/3 mr-2">
|
||||
<SocialButtons size="normal" />
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
class="relative mx-auto px-6 pt-10 pb-6 max-w-6xl text-xs opacity-50 sm:flex"
|
||||
>
|
||||
<div class="flex-1 mt-2 mb-2">
|
||||
<i class="fas fa-heart text-red-500" /> S láskou organizuje
|
||||
<a
|
||||
href="https://utxo.foundation"
|
||||
class="underline hover:no-underline"
|
||||
target="_blank">UTXO Foundation, z.s.</a
|
||||
>
|
||||
</div>
|
||||
<div>
|
||||
<a href="/"><img src="/img/logo-white.svg" alt="UTXO.22" class="w-24" /></a>
|
||||
<a href="https://github.com/utxo-foundation/utxo22-web" target="_blank"
|
||||
><span class="font-bold">v0.9.1</span></a
|
||||
>
|
||||
| powered by
|
||||
<a href="https://svelte.dev/" class="font-bold" target="_blank"
|
||||
><img src="/img/svelte-logo.svg" class="w-5 inline" alt="Svelte" /> Svelte</a
|
||||
>
|
||||
| grafický návrh
|
||||
<a href="https://www.ppmedia.cz/" target="_blank"
|
||||
><img
|
||||
src="/img/pen-production-logo.svg"
|
||||
class="w-28 inline-block pb-2 ml-1"
|
||||
alt="Pen&Production"
|
||||
/></a
|
||||
>
|
||||
</div>
|
||||
<div class="mt-4 font-semibold">
|
||||
4.-5. červen 2022 @ Gabriel Loci, Praha
|
||||
</div>
|
||||
<div class="mt-2 font-thin">
|
||||
Otevřená komunitní kryptoměnová konference
|
||||
</div>
|
||||
<div class="mt-4">
|
||||
<a href="{$bundle.links.docs}" class="hover:text-red-500"><i class="fas fa-book" /> Dokumentace</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sm:mt-0 mt-6 sm:w-1/3 mr-2">
|
||||
<SocialButtons size="normal" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="relative mx-auto px-6 pt-10 pb-6 max-w-6xl text-xs opacity-50 sm:flex">
|
||||
<div class="flex-1 mt-2 mb-2">
|
||||
<i class="fas fa-heart text-red-500" /> S láskou organizuje <a href="https://utxo.foundation" class="underline hover:no-underline" target="_blank">UTXO Foundation, z.s.</a>
|
||||
</div>
|
||||
<div>
|
||||
<a href="https://github.com/utxo-foundation/utxo22-web" target="_blank"><span class="font-bold">v0.9.1</span></a> | powered by
|
||||
<a href="https://svelte.dev/" class="font-bold" target="_blank" ><img src="/img/svelte-logo.svg" class="w-5 inline" alt="Svelte" /> Svelte</a> |
|
||||
grafický návrh <a href="https://www.ppmedia.cz/" target="_blank"><img src="/img/pen-production-logo.svg" class="w-28 inline-block pb-2 ml-1" alt="Pen&Production" /></a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
<script>
|
||||
export let href = ''
|
||||
export let title = undefined
|
||||
export let href = "";
|
||||
export let title = undefined;
|
||||
</script>
|
||||
|
||||
<a {href} {title} class="underline hover:no-underline" target="_blank"><slot></slot></a>
|
||||
<a {href} {title} class="underline hover:no-underline" target="_blank"
|
||||
><slot /></a
|
||||
>
|
||||
|
|
|
@ -1,34 +1,42 @@
|
|||
<script>
|
||||
export let size = 'small';
|
||||
export let size = "small";
|
||||
|
||||
import { bundle } from '$lib/stores';
|
||||
import { page } from '$app/stores';
|
||||
import { bundle } from "$lib/stores";
|
||||
import { page } from "$app/stores";
|
||||
|
||||
const socials = [
|
||||
{ link: 'twitter', ico: 'fa-brands fa-twitter', name: 'Twitter' },
|
||||
{ link: 'instagram', ico: 'fab fa-instagram', name: 'Instagram' },
|
||||
{ link: 'fbevent', ico: 'fab fa-facebook', name: 'Facebook' },
|
||||
{ link: 'substack', ico: 'fa-solid fa-envelope', name: 'Newsletter' },
|
||||
{ link: 'discord', ico: 'fab fa-discord', name: 'Discord' },
|
||||
{ link: 'telegram', ico: 'fab fa-telegram', name: 'Telegram' },
|
||||
]
|
||||
{ link: "twitter", ico: "fa-brands fa-twitter", name: "Twitter" },
|
||||
{ link: "instagram", ico: "fab fa-instagram", name: "Instagram" },
|
||||
{ link: "fbevent", ico: "fab fa-facebook", name: "Facebook" },
|
||||
{ link: "substack", ico: "fa-solid fa-envelope", name: "Newsletter" },
|
||||
{ link: "discord", ico: "fab fa-discord", name: "Discord" },
|
||||
{ link: "telegram", ico: "fab fa-telegram", name: "Telegram" },
|
||||
];
|
||||
</script>
|
||||
|
||||
{#if $bundle}
|
||||
{#if size === 'small'}
|
||||
{#if size === "small"}
|
||||
<div class="flex block space-x-2 m-auto w-full justify-end">
|
||||
{#each socials as soc}
|
||||
<a href="{$bundle.links[soc.link]}" class="w-6 h-6 bg-white rounded-full hover:bg-utxo-gradient hover:text-white" target="_blank">
|
||||
<i class="{soc.ico}" />
|
||||
<a
|
||||
href={$bundle.links[soc.link]}
|
||||
class="w-6 h-6 bg-white rounded-full hover:bg-utxo-gradient hover:text-white"
|
||||
target="_blank"
|
||||
>
|
||||
<i class={soc.ico} />
|
||||
</a>
|
||||
{/each}
|
||||
</div>
|
||||
{/if}
|
||||
{#if size === 'normal'}
|
||||
{#if size === "normal"}
|
||||
<div class="w-auto">
|
||||
<div class="sm:flex flex-wrap gap-3 justify-end">
|
||||
{#each socials as soc}
|
||||
<div class="mr-4 sm:mr-0 inline-block sm:block hover:text-red-500"><a href="{$bundle.links[soc.link]}" class="block flex" target="_blank"><i class="{soc.ico} mr-2 my-auto" />{soc.name}</a></div>
|
||||
<div class="mr-4 sm:mr-0 inline-block sm:block hover:text-red-500">
|
||||
<a href={$bundle.links[soc.link]} class="block flex" target="_blank"
|
||||
><i class="{soc.ico} mr-2 my-auto" />{soc.name}</a
|
||||
>
|
||||
</div>
|
||||
{/each}
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -1,36 +1,66 @@
|
|||
<script>
|
||||
import { page } from '$app/stores';
|
||||
import { bundle, userData, userDataLocal } from '$lib/stores';
|
||||
import SocialButtons from '$lib/SocialButtons.svelte';
|
||||
import { page } from "$app/stores";
|
||||
import { bundle, userData, userDataLocal } from "$lib/stores";
|
||||
import SocialButtons from "$lib/SocialButtons.svelte";
|
||||
|
||||
function logoClick () {
|
||||
userData.update(ud => {
|
||||
ud.hpTrack = 'top'
|
||||
return ud
|
||||
})
|
||||
function logoClick() {
|
||||
userData.update((ud) => {
|
||||
ud.hpTrack = "top";
|
||||
return ud;
|
||||
});
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
<header class="relative" style="background-color: #32375C;">
|
||||
<!-- <li class:active={$page.url.pathname === '/'}><a sveltekit:prefetch href="/">Home</a></li> -->
|
||||
<nav class="relative mx-auto lg:px-6 px-4 pt-4 sm:pt-6 sm:pb-6 pb-2 max-w-6xl text-center">
|
||||
<nav
|
||||
class="relative mx-auto lg:px-6 px-4 pt-4 sm:pt-6 sm:pb-6 pb-2 max-w-6xl text-center"
|
||||
>
|
||||
<div class="">
|
||||
<div class="lg:flex lg:flex-wrap lg:space-x-10">
|
||||
<div class="block justify-start lg:flex-1 my-auto text-center pb-3 lg:pb-0">
|
||||
<div class="w-36 lg:w-24 inline-block lg:block"><a href="/" on:click={logoClick}><img src="/img/logo-white.svg" class="w-full" alt="UTXO.22" /></a></div>
|
||||
<div
|
||||
class="block justify-start lg:flex-1 my-auto text-center pb-3 lg:pb-0"
|
||||
>
|
||||
<div class="w-36 lg:w-24 inline-block lg:block">
|
||||
<a href="/" on:click={logoClick}
|
||||
><img src="/img/logo-white.svg" class="w-full" alt="UTXO.22" /></a
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex lg:space-x-10 uppercase text-sm font-bold text-white">
|
||||
<a sveltekit:prefetch href="/" class="lg:w-auto w-1/3 m-auto hover:text-[#E16A61]" class:text-blue-400={$page.url.pathname === '/'}>O konferenci</a>
|
||||
<a sveltekit:prefetch href="/program" class="lg:w-auto w-1/3 m-auto hover:text-[#E16A61]" class:text-blue-400={$page.url.pathname === '/program'}>Program</a>
|
||||
<a sveltekit:prefetch href="/vstupenky" class="lg:w-auto w-1/3 m-auto border-solid border border-[#E16A61] rounded-full {$page.url.pathname === '/vstupenky' ? 'border-0 bg-utxo-gradient m-px' : 'hover:border-0 hover:bg-utxo-gradient hover:p-px' }"><div class="py-2 px-1 lg:px-8">Vstupenky{#if $userDataLocal.tickets && $userDataLocal.tickets.length > 0} ({$userDataLocal.tickets.length}){/if}</div></a>
|
||||
<a
|
||||
sveltekit:prefetch
|
||||
href="/"
|
||||
class="lg:w-auto w-1/3 m-auto hover:text-[#E16A61]"
|
||||
class:text-blue-400={$page.url.pathname === "/"}>O konferenci</a
|
||||
>
|
||||
<a
|
||||
sveltekit:prefetch
|
||||
href="/program"
|
||||
class="lg:w-auto w-1/3 m-auto hover:text-[#E16A61]"
|
||||
class:text-blue-400={$page.url.pathname === "/program"}>Program</a
|
||||
>
|
||||
<a
|
||||
sveltekit:prefetch
|
||||
href="/vstupenky"
|
||||
class="lg:w-auto w-1/3 m-auto border-solid border border-[#E16A61] rounded-full {$page
|
||||
.url.pathname === '/vstupenky'
|
||||
? 'border-0 bg-utxo-gradient m-px'
|
||||
: 'hover:border-0 hover:bg-utxo-gradient hover:p-px'}"
|
||||
><div class="py-2 px-1 lg:px-8">
|
||||
Vstupenky{#if $userDataLocal.tickets && $userDataLocal.tickets.length > 0} ({$userDataLocal
|
||||
.tickets.length}){/if}
|
||||
</div></a
|
||||
>
|
||||
</div>
|
||||
<div class="hidden lg:block my-auto lg:flex-1 lg:pt-0 pt-4 lg:justify-end justify-center">
|
||||
<div
|
||||
class="hidden lg:block my-auto lg:flex-1 lg:pt-0 pt-4 lg:justify-end justify-center"
|
||||
>
|
||||
<SocialButtons />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
</nav>
|
||||
</header>
|
||||
|
||||
<style>
|
||||
|
|
|
@ -1,53 +1,50 @@
|
|||
<script>
|
||||
import Header from '$lib/header/Header.svelte';
|
||||
import Footer from '$lib/Footer.svelte';
|
||||
import '../app.css';
|
||||
import api from '$lib/api.js';
|
||||
import { page } from '$app/stores';
|
||||
import { userData, userDataLocal, apiStatus } from '$lib/stores';
|
||||
import { loadOrders, loadApiStatus } from '$lib/orders';
|
||||
import { onMount, onDestroy } from 'svelte';
|
||||
import Header from "$lib/header/Header.svelte";
|
||||
import Footer from "$lib/Footer.svelte";
|
||||
import "../app.css";
|
||||
import api from "$lib/api.js";
|
||||
import { page } from "$app/stores";
|
||||
import { userData, userDataLocal, apiStatus } from "$lib/stores";
|
||||
import { loadOrders, loadApiStatus } from "$lib/orders";
|
||||
import { onMount, onDestroy } from "svelte";
|
||||
|
||||
let bundle = null
|
||||
let uds = null
|
||||
let bundle = null;
|
||||
let uds = null;
|
||||
|
||||
onMount(async () => {
|
||||
bundle = await api.loadBundle($page.url.hostname === 'localhost')
|
||||
bundle = await api.loadBundle($page.url.hostname === "localhost");
|
||||
|
||||
const userDataLS = localStorage.getItem('userData')
|
||||
const userDataLS = localStorage.getItem("userData");
|
||||
if (userDataLS) {
|
||||
userData.set(JSON.parse(userDataLS))
|
||||
userData.set(JSON.parse(userDataLS));
|
||||
}
|
||||
|
||||
uds = userData.subscribe(ud => {
|
||||
localStorage.setItem('userData', JSON.stringify(ud))
|
||||
})
|
||||
uds = userData.subscribe((ud) => {
|
||||
localStorage.setItem("userData", JSON.stringify(ud));
|
||||
});
|
||||
|
||||
await loadApiStatus()
|
||||
await loadOrders($userData)
|
||||
})
|
||||
await loadApiStatus();
|
||||
await loadOrders($userData);
|
||||
});
|
||||
|
||||
onDestroy(() => {
|
||||
//userData.unsubscribe(uds)
|
||||
})
|
||||
|
||||
|
||||
});
|
||||
|
||||
// load orders
|
||||
|
||||
</script>
|
||||
|
||||
{#if bundle}
|
||||
<div class="layout min-h-screen bg-gray-900">
|
||||
<div class="inset-0 bg-white">
|
||||
<Header />
|
||||
<div class="layout min-h-screen bg-gray-900">
|
||||
<div class="inset-0 bg-white">
|
||||
<Header />
|
||||
|
||||
<main>
|
||||
<slot />
|
||||
</main>
|
||||
<main>
|
||||
<slot />
|
||||
</main>
|
||||
</div>
|
||||
<Footer />
|
||||
</div>
|
||||
<Footer />
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
<style>
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
<script context="module">
|
||||
export const prerender = true;
|
||||
export const prerender = true;
|
||||
</script>
|
||||
|
||||
<script>
|
||||
|
@ -7,11 +7,41 @@
|
|||
|
||||
<section class="relative mx-auto py-6 sm:py-10 px-6 max-w-6xl text-blue-web">
|
||||
<div class="">
|
||||
<div class="text-3xl lg:text-4xl text-center">🎉 Gratulujeme k nákupu vstupenek!</div>
|
||||
<div class="mt-4 text-lg text-center">Najdeš je v mailu nebo na stránce <a href="/vstupenky" class="underline hover:no-underline">vstupenky</a></div>
|
||||
<div class="flex mt-6"><img class="m-auto w-auto lg:max-w-3xl" src="/gifs/funny-celebrate-{Math.round((Math.random() * (9 - 1) + 1))}.gif" /></div>
|
||||
<div class="mt-10 text-xl text-center mt-6">Co teď? Poděl se o tu radost s ostatními <a href="https://twitter.com/intent/tweet?text=M%C3%A1m%20l%C3%ADstek%20na%20%40utxoprague%20%F0%9F%8E%89%20Poj%C4%8F%20taky%21%0A%20%23utxo22" class="underline hover:no-underline" target="_blank">tweetem</a></div>
|
||||
<div class="text-xl text-center mt-6">Prohlédni si <a href="/program" class="underline hover:no-underline">aktuální program</a></div>
|
||||
<div class="text-xl text-center mt-6">Sleduj novinky na <a href="https://twitter.com/utxoprague" class="underline hover:no-underline" target="_blank">Twitteru</a> <i class="fa-brands fa-twitter"></i></div>
|
||||
<div class="text-3xl lg:text-4xl text-center">
|
||||
🎉 Gratulujeme k nákupu vstupenek!
|
||||
</div>
|
||||
<div class="mt-4 text-lg text-center">
|
||||
Najdeš je v mailu nebo na stránce <a
|
||||
href="/vstupenky"
|
||||
class="underline hover:no-underline">vstupenky</a
|
||||
>
|
||||
</div>
|
||||
<div class="flex mt-6">
|
||||
<img
|
||||
class="m-auto w-auto lg:max-w-3xl"
|
||||
src="/gifs/funny-celebrate-{Math.round(
|
||||
Math.random() * (9 - 1) + 1
|
||||
)}.gif"
|
||||
/>
|
||||
</div>
|
||||
<div class="mt-10 text-xl text-center mt-6">
|
||||
Co teď? Poděl se o tu radost s ostatními <a
|
||||
href="https://twitter.com/intent/tweet?text=M%C3%A1m%20l%C3%ADstek%20na%20%40utxoprague%20%F0%9F%8E%89%20Poj%C4%8F%20taky%21%0A%20%23utxo22"
|
||||
class="underline hover:no-underline"
|
||||
target="_blank">tweetem</a
|
||||
>
|
||||
</div>
|
||||
<div class="text-xl text-center mt-6">
|
||||
Prohlédni si <a href="/program" class="underline hover:no-underline"
|
||||
>aktuální program</a
|
||||
>
|
||||
</div>
|
||||
<div class="text-xl text-center mt-6">
|
||||
Sleduj novinky na <a
|
||||
href="https://twitter.com/utxoprague"
|
||||
class="underline hover:no-underline"
|
||||
target="_blank">Twitteru</a
|
||||
> <i class="fa-brands fa-twitter" />
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
|
|
@ -1,61 +1,94 @@
|
|||
<script context="module">
|
||||
export const prerender = true;
|
||||
export const prerender = true;
|
||||
</script>
|
||||
|
||||
<script>
|
||||
import { bundle, userData } from '$lib/stores.js';
|
||||
import Avatar from '$lib/Avatar.svelte';
|
||||
import SvelteMarkdown from 'svelte-markdown';
|
||||
import Link from '$lib/Link.svelte';
|
||||
const renderers = { link: Link }
|
||||
import { bundle, userData } from "$lib/stores.js";
|
||||
import Avatar from "$lib/Avatar.svelte";
|
||||
import SvelteMarkdown from "svelte-markdown";
|
||||
import Link from "$lib/Link.svelte";
|
||||
const renderers = { link: Link };
|
||||
|
||||
let onlyLead = true
|
||||
let onlyLeadPreview = false
|
||||
let onlyLead = true;
|
||||
let onlyLeadPreview = false;
|
||||
|
||||
$: currentBundle = $bundle;
|
||||
$: leadSpeakersCount = currentBundle ? currentBundle.spec.speakers.filter(s => !!s.lead).length : 0
|
||||
$: tracks = currentBundle ? [{ name: 'Hlavní přednášející ('+leadSpeakersCount+')', id: 'top' }, { name: 'Vše', id: null }].concat(currentBundle.spec.tracks) : null
|
||||
$: leadSpeakersCount = currentBundle
|
||||
? currentBundle.spec.speakers.filter((s) => !!s.lead).length
|
||||
: 0;
|
||||
$: tracks = currentBundle
|
||||
? [
|
||||
{ name: "Hlavní přednášející (" + leadSpeakersCount + ")", id: "top" },
|
||||
{ name: "Vše", id: null },
|
||||
].concat(currentBundle.spec.tracks)
|
||||
: null;
|
||||
|
||||
function changeTrack (tId) {
|
||||
function changeTrack(tId) {
|
||||
return function () {
|
||||
userData.update(ud => { ud.hpTrack = tId; return ud; })
|
||||
onlyLead = !tId
|
||||
}
|
||||
userData.update((ud) => {
|
||||
ud.hpTrack = tId;
|
||||
return ud;
|
||||
});
|
||||
onlyLead = !tId;
|
||||
};
|
||||
}
|
||||
|
||||
function handleShowFull () {
|
||||
userData.update(ud => { ud.hpTrack = null; return ud })
|
||||
function handleShowFull() {
|
||||
userData.update((ud) => {
|
||||
ud.hpTrack = null;
|
||||
return ud;
|
||||
});
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
<svelte:head>
|
||||
<title>UTXO.22 - 4-5. červen 2022 {$bundle ? '- '+$bundle.description : ''}</title>
|
||||
<title
|
||||
>UTXO.22 - 4-5. červen 2022 {$bundle
|
||||
? "- " + $bundle.description
|
||||
: ""}</title
|
||||
>
|
||||
</svelte:head>
|
||||
|
||||
<section class="relative mx-auto py-6 sm:py-10 px-6 max-w-6xl">
|
||||
{#if $bundle}
|
||||
<div class="flex flex-wrap gap-1.5 sm:gap-3 text-xs uppercase font-bold text-blue-web justify-left">
|
||||
<div
|
||||
class="flex flex-wrap gap-1.5 sm:gap-3 text-xs uppercase font-bold text-blue-web justify-left"
|
||||
>
|
||||
{#each tracks as track}
|
||||
<div class="py-1.5 sm:py-2 px-2.5 sm:px-8 rounded-full shadow border border-solid {$userData.hpTrack === track.id ? 'bg-utxo-gradient border-0 text-white' : 'border-blue-web hover:bg-blue-web hover:text-white hover:border-transparent cursor-pointer'}" on:click={changeTrack(track.id)}>{track.shortname || track.name} {#if !track.id}({$bundle.spec.speakers.length}){/if}</div>
|
||||
<div
|
||||
class="py-1.5 sm:py-2 px-2.5 sm:px-8 rounded-full shadow border border-solid {$userData.hpTrack ===
|
||||
track.id
|
||||
? 'bg-utxo-gradient border-0 text-white'
|
||||
: 'border-blue-web hover:bg-blue-web hover:text-white hover:border-transparent cursor-pointer'}"
|
||||
on:click={changeTrack(track.id)}
|
||||
>
|
||||
{track.shortname || track.name}
|
||||
{#if !track.id}({$bundle.spec.speakers.length}){/if}
|
||||
</div>
|
||||
{/each}
|
||||
</div>
|
||||
|
||||
<div class="flex flex-wrap gap-6 mt-6 sm:mt-14 justify-center">
|
||||
{#each $bundle.spec.speakers as speaker}
|
||||
{#if ($userData.hpTrack === 'top' && speaker.lead === true) || $userData.hpTrack !== 'top'}
|
||||
{#if (!$userData.hpTrack || speaker.tracks.includes($userData.hpTrack)) || $userData.hpTrack === 'top'}
|
||||
<Avatar speaker={speaker} />
|
||||
{#if ($userData.hpTrack === "top" && speaker.lead === true) || $userData.hpTrack !== "top"}
|
||||
{#if !$userData.hpTrack || speaker.tracks.includes($userData.hpTrack) || $userData.hpTrack === "top"}
|
||||
<Avatar {speaker} />
|
||||
{/if}
|
||||
{/if}
|
||||
{/each}
|
||||
</div>
|
||||
{#if $userData.hpTrack === 'top'}
|
||||
{#if $userData.hpTrack === "top"}
|
||||
<div class="relative cursor-pointer mb-10">
|
||||
<div class="absolute inset-0 bg-gradient-to-b from-transparent to-white flex" on:click={handleShowFull}></div>
|
||||
<div
|
||||
class="absolute inset-0 bg-gradient-to-b from-transparent to-white flex"
|
||||
on:click={handleShowFull}
|
||||
/>
|
||||
<div class="flex flex-wrap gap-3 mt-10 justify-center">
|
||||
{#each $bundle.spec.speakers.filter(s => !s.lead).sort(() => .5 - Math.random()).slice(0,27) as speaker}
|
||||
<Avatar speaker={speaker} size="small" />
|
||||
{#each $bundle.spec.speakers
|
||||
.filter((s) => !s.lead)
|
||||
.sort(() => 0.5 - Math.random())
|
||||
.slice(0, 27) as speaker}
|
||||
<Avatar {speaker} size="small" />
|
||||
{/each}
|
||||
</div>
|
||||
</div>
|
||||
|
@ -67,24 +100,57 @@
|
|||
<div class="relative mx-auto py-6 px-6 max-w-6xl">
|
||||
<div class="py-6 md:py-10 md:flex gap-12">
|
||||
<div class="block flex-1">
|
||||
<img src="/photos/gabriel-loci.jpeg" class="flex rounded-xl shadow-xl" alt="Gabriel Loci" />
|
||||
<img
|
||||
src="/photos/gabriel-loci.jpeg"
|
||||
class="flex rounded-xl shadow-xl"
|
||||
alt="Gabriel Loci"
|
||||
/>
|
||||
<div class="flex mt-3 gap-3">
|
||||
<div class="w-1/2"><img src="/photos/rajska-zahrada.jpeg" class="rounded-lg shadow-lg" alt="Gabriel Loci - Rajská zahrada" /></div>
|
||||
<div class="w-1/2"><img src="/photos/knihovna.jpeg" class="rounded-lg shadow-lg" alt="Gabriel Loci - Knihovna" /></div>
|
||||
<div class="w-1/2">
|
||||
<img
|
||||
src="/photos/rajska-zahrada.jpeg"
|
||||
class="rounded-lg shadow-lg"
|
||||
alt="Gabriel Loci - Rajská zahrada"
|
||||
/>
|
||||
</div>
|
||||
<div class="w-1/2">
|
||||
<img
|
||||
src="/photos/knihovna.jpeg"
|
||||
class="rounded-lg shadow-lg"
|
||||
alt="Gabriel Loci - Knihovna"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="text-white md:w-1/2 md:pt-0 pt-6">
|
||||
<div class="uppercase">Místo</div>
|
||||
<div class="uppercase mt-3 text-4xl font-bold">Gabriel Loci</div>
|
||||
<div class="mt-4 font-bold">
|
||||
Holečkova 106/10, 150 00 Praha 5 - Smíchov 🇨🇿<br/><span class="font-normal"><a href="https://goo.gl/maps/u1aY4RxXMgcm889V7" class="underline hover:no-underline" target="_blank">Google Maps</a>, <a href="https://mapy.cz/s/cuvetubafo" class="underline hover:no-underline" target="_blank">Mapy.cz</a></span>
|
||||
Holečkova 106/10, 150 00 Praha 5 - Smíchov 🇨🇿<br /><span
|
||||
class="font-normal"
|
||||
><a
|
||||
href="https://goo.gl/maps/u1aY4RxXMgcm889V7"
|
||||
class="underline hover:no-underline"
|
||||
target="_blank">Google Maps</a
|
||||
>,
|
||||
<a
|
||||
href="https://mapy.cz/s/cuvetubafo"
|
||||
class="underline hover:no-underline"
|
||||
target="_blank">Mapy.cz</a
|
||||
></span
|
||||
>
|
||||
</div>
|
||||
<div class="mt-4">
|
||||
Benediktinky. Kulturní památka. Česká Pošta. Poštovní muzeum.
|
||||
Na první pohled nesouvisející názvy, které jsou ale neodmyslitelnou součástí unikátního komplexu Gabriel Loci na pražském Smíchově doslova pár minut od centra.
|
||||
Na konci 19.století v klášteře sídlily řeholnice, ženské opatství řádu benediktinek beuronské kongregace. Později prostory spravovalo československé Ministerstvo pošt a telegrafů.
|
||||
Dnes komplex využívají hlavně natáčecí studia jako HBO, Netflix nebo i ČT. No a my! 💪<br/><br/>
|
||||
Zažijte mysteriózní atmosféru komplexu na 1.ročníku konference UTXO.22. Část after-party si užijete doslova v pitevně ze seriálu Devadesátky 👌😀
|
||||
Benediktinky. Kulturní památka. Česká Pošta. Poštovní muzeum. Na první
|
||||
pohled nesouvisející názvy, které jsou ale neodmyslitelnou součástí
|
||||
unikátního komplexu Gabriel Loci na pražském Smíchově doslova pár
|
||||
minut od centra. Na konci 19.století v klášteře sídlily řeholnice,
|
||||
ženské opatství řádu benediktinek beuronské kongregace. Později
|
||||
prostory spravovalo československé Ministerstvo pošt a telegrafů. Dnes
|
||||
komplex využívají hlavně natáčecí studia jako HBO, Netflix nebo i ČT.
|
||||
No a my! 💪<br /><br />
|
||||
Zažijte mysteriózní atmosféru komplexu na 1.ročníku konference UTXO.22.
|
||||
Část after-party si užijete doslova v pitevně ze seriálu Devadesátky 👌😀
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -96,42 +162,81 @@ Zažijte mysteriózní atmosféru komplexu na 1.ročníku konference UTXO.22. Č
|
|||
<div class="text-2xl uppercase font-bold">Partneři</div>
|
||||
<div class="mt-6">Sponzoři</div>
|
||||
<div class="mt-6 flex flex-wrap gap-8 justify-left">
|
||||
{#each $bundle.spec.partners.filter(p => p.type === 'sponsor') as p}
|
||||
{#each $bundle.spec.partners.filter((p) => p.type === "sponsor") as p}
|
||||
<div class="w-28">
|
||||
<a href={p.web.url} target="_blank"><Avatar speaker={p} col="partners" size="custom" customSize="w-24 shadow-xl" /></a>
|
||||
<a href={p.web.url} target="_blank"
|
||||
><Avatar
|
||||
speaker={p}
|
||||
col="partners"
|
||||
size="custom"
|
||||
customSize="w-24 shadow-xl"
|
||||
/></a
|
||||
>
|
||||
<div class="text-center text-sm uppercase font-bold">{p.name}</div>
|
||||
</div>
|
||||
{/each}
|
||||
</div>
|
||||
<div class="mt-10">Komunity</div>
|
||||
<div class="mt-6 flex flex-wrap gap-6 justify-left">
|
||||
{#each $bundle.spec.partners.filter(p => p.type === 'community') as p}
|
||||
<div><a href={p.web ? p.web.url : (p.twitter ? `https://twitter.com/${p.twitter}` : '')} target="_blank"><Avatar speaker={p} col="partners" size="custom" customSize="w-20 shadow-lg" /></a></div>
|
||||
{#each $bundle.spec.partners.filter((p) => p.type === "community") as p}
|
||||
<div>
|
||||
<a
|
||||
href={p.web
|
||||
? p.web.url
|
||||
: p.twitter
|
||||
? `https://twitter.com/${p.twitter}`
|
||||
: ""}
|
||||
target="_blank"
|
||||
><Avatar
|
||||
speaker={p}
|
||||
col="partners"
|
||||
size="custom"
|
||||
customSize="w-20 shadow-lg"
|
||||
/></a
|
||||
>
|
||||
</div>
|
||||
{/each}
|
||||
</div>
|
||||
<div class="mt-10">Mediální partneři</div>
|
||||
<div class="mt-6 flex flex-wrap gap-4 justify-left">
|
||||
{#each $bundle.spec.partners.filter(p => p.type === 'medium') as p}
|
||||
<div><a href={p.web ? p.web.url : (p.twitter ? `https://twitter.com/${p.twitter}` : '')} target="_blank"><Avatar speaker={p} col="partners" size="custom" customSize="w-16 shadow-lg" /></a></div>
|
||||
{#each $bundle.spec.partners.filter((p) => p.type === "medium") as p}
|
||||
<div>
|
||||
<a
|
||||
href={p.web
|
||||
? p.web.url
|
||||
: p.twitter
|
||||
? `https://twitter.com/${p.twitter}`
|
||||
: ""}
|
||||
target="_blank"
|
||||
><Avatar
|
||||
speaker={p}
|
||||
col="partners"
|
||||
size="custom"
|
||||
customSize="w-16 shadow-lg"
|
||||
/></a
|
||||
>
|
||||
</div>
|
||||
{/each}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{#if $bundle}
|
||||
<section class="relative mx-auto py-10 px-6 max-w-6xl">
|
||||
<div class="text-blue-web">
|
||||
<h2 class="uppercase pt-5" id="faq">Často kladené dotazy (FAQ)</h2>
|
||||
<div class="md:columns-2 columns-1 mt-8 h-auto">
|
||||
{#each $bundle.spec.faqs as item}
|
||||
<div class="mb-5 break-inside-avoid-column bg-blue-100/60 rounded-xl px-8 py-6 text-left transition-all box-shadow-light overflow-visible">
|
||||
<div class="mb-4 font-bold">{item.question}</div>
|
||||
<SvelteMarkdown source={item.answer} renderers={renderers} />
|
||||
</div>
|
||||
{/each}
|
||||
<section class="relative mx-auto py-10 px-6 max-w-6xl">
|
||||
<div class="text-blue-web">
|
||||
<h2 class="uppercase pt-5" id="faq">Často kladené dotazy (FAQ)</h2>
|
||||
<div class="md:columns-2 columns-1 mt-8 h-auto">
|
||||
{#each $bundle.spec.faqs as item}
|
||||
<div
|
||||
class="mb-5 break-inside-avoid-column bg-blue-100/60 rounded-xl px-8 py-6 text-left transition-all box-shadow-light overflow-visible"
|
||||
>
|
||||
<div class="mb-4 font-bold">{item.question}</div>
|
||||
<SvelteMarkdown source={item.answer} {renderers} />
|
||||
</div>
|
||||
{/each}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</section>
|
||||
{/if}
|
||||
|
||||
<style>
|
||||
|
|
|
@ -1,49 +1,51 @@
|
|||
<script context="module">
|
||||
export const prerender = true;
|
||||
export const prerender = true;
|
||||
</script>
|
||||
|
||||
<script>
|
||||
import { goto } from "$app/navigation";
|
||||
import Avatar from "$lib/Avatar.svelte";
|
||||
import Event from "$lib/Event.svelte";
|
||||
import { onMount, beforeUpdate } from "svelte";
|
||||
import { page } from "$app/stores";
|
||||
import { bundle } from "$lib/stores.js";
|
||||
import SvelteMarkdown from "svelte-markdown";
|
||||
import Link from "$lib/Link.svelte";
|
||||
const renderers = { link: Link };
|
||||
|
||||
import { goto } from '$app/navigation';
|
||||
import Avatar from '$lib/Avatar.svelte';
|
||||
import Event from '$lib/Event.svelte';
|
||||
import { onMount, beforeUpdate } from 'svelte';
|
||||
import { page } from '$app/stores';
|
||||
import { bundle } from '$lib/stores.js';
|
||||
import SvelteMarkdown from 'svelte-markdown';
|
||||
import Link from '$lib/Link.svelte';
|
||||
const renderers = { link: Link }
|
||||
$: id = getId($page.url.search);
|
||||
$: s = $bundle ? $bundle.spec.speakers.find((s) => s.id === id) : null;
|
||||
$: events = s
|
||||
? $bundle.spec.events.filter(
|
||||
(ev) => ev.speakers && ev.speakers.includes(s.id)
|
||||
)
|
||||
: [];
|
||||
|
||||
$: id = getId($page.url.search)
|
||||
$: s = $bundle ? $bundle.spec.speakers.find(s => s.id === id) : null
|
||||
$: events = s ? $bundle.spec.events.filter(ev => ev.speakers && ev.speakers.includes(s.id)) : []
|
||||
|
||||
function getId (search) {
|
||||
const searchParams = new URLSearchParams(search)
|
||||
const cid = searchParams.get('id')
|
||||
if (!$bundle.spec.speakers.find(s => s.id === cid)) {
|
||||
goto('/')
|
||||
function getId(search) {
|
||||
const searchParams = new URLSearchParams(search);
|
||||
const cid = searchParams.get("id");
|
||||
if (!$bundle.spec.speakers.find((s) => s.id === cid)) {
|
||||
goto("/");
|
||||
}
|
||||
return cid
|
||||
return cid;
|
||||
}
|
||||
|
||||
function trackRender (trackId) {
|
||||
const track = $bundle.spec.tracks.find(t => t.id === trackId)
|
||||
return track.shortname || track.name
|
||||
function trackRender(trackId) {
|
||||
const track = $bundle.spec.tracks.find((t) => t.id === trackId);
|
||||
return track.shortname || track.name;
|
||||
}
|
||||
|
||||
function getFlagEmoji(countryCode) {
|
||||
const codePoints = countryCode
|
||||
.toUpperCase()
|
||||
.split('')
|
||||
.map(char => 127397 + char.charCodeAt());
|
||||
.split("")
|
||||
.map((char) => 127397 + char.charCodeAt());
|
||||
return String.fromCodePoint(...codePoints);
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
<svelte:head>
|
||||
<title>{s ? s.name : ''} | Lidé | {$bundle ? $bundle.name : 'UTXO.22'}</title>
|
||||
<title>{s ? s.name : ""} | Lidé | {$bundle ? $bundle.name : "UTXO.22"}</title>
|
||||
</svelte:head>
|
||||
|
||||
<section class="relative mx-auto py-6 sm:py-10 px-6 max-w-6xl text-blue-web">
|
||||
|
@ -54,33 +56,58 @@
|
|||
<div class="mb-4 text-md uppercase">Přednášející</div>
|
||||
<h1 class="text-2xl font-bold">{s.name} {getFlagEmoji(s.country)}</h1>
|
||||
{#if s.nickname}
|
||||
<div class="mt-1"><span class="text-xs">aka</span> <span class="font-bold">{s.nickname}</span></div>
|
||||
<div class="mt-1">
|
||||
<span class="text-xs">aka</span>
|
||||
<span class="font-bold">{s.nickname}</span>
|
||||
</div>
|
||||
{/if}
|
||||
{#if s.bio}
|
||||
<div class="mt-4 text-blue-web italic"><SvelteMarkdown source={s.bio} renderers={renderers} /></div>
|
||||
<div class="mt-4 text-blue-web italic">
|
||||
<SvelteMarkdown source={s.bio} {renderers} />
|
||||
</div>
|
||||
{/if}
|
||||
{#if s.orgs}
|
||||
<div class="mt-4 text-blue-web links"><SvelteMarkdown source={s.orgs} renderers={renderers} /></div>
|
||||
<div class="mt-4 text-blue-web links">
|
||||
<SvelteMarkdown source={s.orgs} {renderers} />
|
||||
</div>
|
||||
{/if}
|
||||
<div class="mt-4">Sekce: {s.tracks.map(t => trackRender(t)).join(', ')}</div>
|
||||
<div class="mt-4">
|
||||
Sekce: {s.tracks.map((t) => trackRender(t)).join(", ")}
|
||||
</div>
|
||||
{#if s.twitter}
|
||||
<div class="mt-2">Twitter: <a href="https://twitter.com/{s.twitter}" target="_blank" class="font-bold">@{s.twitter}</a></div>
|
||||
<div class="mt-2">
|
||||
Twitter: <a
|
||||
href="https://twitter.com/{s.twitter}"
|
||||
target="_blank"
|
||||
class="font-bold">@{s.twitter}</a
|
||||
>
|
||||
</div>
|
||||
{/if}
|
||||
{#if s.linkedin}
|
||||
<div class="mt-2">LinkedIn: <a href="https://linkedin.com/in/{s.twitter}" target="_blank" class="font-bold">@{s.linkedin}</a></div>
|
||||
<div class="mt-2">
|
||||
LinkedIn: <a
|
||||
href="https://linkedin.com/in/{s.twitter}"
|
||||
target="_blank"
|
||||
class="font-bold">@{s.linkedin}</a
|
||||
>
|
||||
</div>
|
||||
{/if}
|
||||
{#if s.web && s.web.url}
|
||||
<div class="mt-2">Web: <a href="{s.web.url}" target="_blank" class="font-bold">{s.web.name || s.web.url.replace(/^https?:\/\//, '')}</a></div>
|
||||
<div class="mt-2">
|
||||
Web: <a href={s.web.url} target="_blank" class="font-bold"
|
||||
>{s.web.name || s.web.url.replace(/^https?:\/\//, "")}</a
|
||||
>
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
{#if s.desc}
|
||||
<div class="mt-6">
|
||||
<SvelteMarkdown source={s.desc} renderers={renderers} />
|
||||
<SvelteMarkdown source={s.desc} {renderers} />
|
||||
</div>
|
||||
{/if}
|
||||
<div class="mt-6">
|
||||
<h2 class="uppercase mb-4 text-md">Události ({ events.length })</h2>
|
||||
<h2 class="uppercase mb-4 text-md">Události ({events.length})</h2>
|
||||
<div>
|
||||
{#if events.length > 0}
|
||||
{#each events as e}
|
||||
|
|
|
@ -1,24 +1,25 @@
|
|||
<script context="module">
|
||||
export const prerender = true;
|
||||
export const prerender = true;
|
||||
</script>
|
||||
|
||||
<script>
|
||||
import Event from '$lib/Event.svelte';
|
||||
import { bundle, userData } from '$lib/stores.js';
|
||||
|
||||
import Event from "$lib/Event.svelte";
|
||||
import { bundle, userData } from "$lib/stores.js";
|
||||
</script>
|
||||
|
||||
<svelte:head>
|
||||
<title>Program | UTXO.22</title>
|
||||
</svelte:head>
|
||||
|
||||
|
||||
<section class="relative mx-auto py-6 sm:py-10 px-6 max-w-6xl text-blue-web">
|
||||
<h1 class="uppercase text-2xl font-bold">Program</h1>
|
||||
<div class="mt-2 text-sm">Program stále připravujeme. Jeho konečná podoba bude zveřejněna pár týdnů před konferencí.</div>
|
||||
<div class="mt-2 text-sm">
|
||||
Program stále připravujeme. Jeho konečná podoba bude zveřejněna pár týdnů
|
||||
před konferencí.
|
||||
</div>
|
||||
|
||||
<div class="mt-6">
|
||||
{#each $bundle.spec.events.filter(e => !e.parent) as e}
|
||||
{#each $bundle.spec.events.filter((e) => !e.parent) as e}
|
||||
<Event event={e} />
|
||||
{/each}
|
||||
</div>
|
||||
|
|
|
@ -1,47 +1,48 @@
|
|||
<script context="module">
|
||||
export const prerender = true;
|
||||
export const prerender = true;
|
||||
</script>
|
||||
|
||||
<script>
|
||||
import { page } from '$app/stores';
|
||||
import { goto } from '$app/navigation';
|
||||
import { onMount } from 'svelte';
|
||||
import { bundle, userData } from '$lib/stores.js';
|
||||
import EventTypeLabel from '$lib/EventTypeLabel.svelte';
|
||||
import Avatar from '$lib/Avatar.svelte';
|
||||
import SvelteMarkdown from 'svelte-markdown';
|
||||
import Link from '$lib/Link.svelte';
|
||||
import { page } from "$app/stores";
|
||||
import { goto } from "$app/navigation";
|
||||
import { onMount } from "svelte";
|
||||
import { bundle, userData } from "$lib/stores.js";
|
||||
import EventTypeLabel from "$lib/EventTypeLabel.svelte";
|
||||
import Avatar from "$lib/Avatar.svelte";
|
||||
import SvelteMarkdown from "svelte-markdown";
|
||||
import Link from "$lib/Link.svelte";
|
||||
|
||||
const renderers = { link: Link }
|
||||
const renderers = { link: Link };
|
||||
|
||||
$: id = getId($page.url.search)
|
||||
$: e = $bundle ? $bundle.spec.events.find(ev => ev.id === id) : null
|
||||
|
||||
function getId (search) {
|
||||
const searchParams = new URLSearchParams(search)
|
||||
const cid = searchParams.get('id')
|
||||
if (!$bundle.spec.events.find(s => s.id === cid)) {
|
||||
goto('/')
|
||||
$: id = getId($page.url.search);
|
||||
$: e = $bundle ? $bundle.spec.events.find((ev) => ev.id === id) : null;
|
||||
|
||||
function getId(search) {
|
||||
const searchParams = new URLSearchParams(search);
|
||||
const cid = searchParams.get("id");
|
||||
if (!$bundle.spec.events.find((s) => s.id === cid)) {
|
||||
goto("/");
|
||||
}
|
||||
return cid
|
||||
return cid;
|
||||
}
|
||||
|
||||
function speakersMap (arr) {
|
||||
function speakersMap(arr) {
|
||||
if (!arr) return;
|
||||
return arr.map(sId => {
|
||||
return $bundle.spec.speakers.find(sp => sp.id === sId)
|
||||
})
|
||||
return arr.map((sId) => {
|
||||
return $bundle.spec.speakers.find((sp) => sp.id === sId);
|
||||
});
|
||||
}
|
||||
|
||||
function trackRender (trackId) {
|
||||
const track = $bundle.spec.tracks.find(t => t.id === trackId)
|
||||
return track.shortname || track.name
|
||||
function trackRender(trackId) {
|
||||
const track = $bundle.spec.tracks.find((t) => t.id === trackId);
|
||||
return track.shortname || track.name;
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
<svelte:head>
|
||||
<title>{e ? e.name : ''} | Události | {$bundle ? $bundle.name : 'UTXO.22'}</title>
|
||||
<title
|
||||
>{e ? e.name : ""} | Události | {$bundle ? $bundle.name : "UTXO.22"}</title
|
||||
>
|
||||
</svelte:head>
|
||||
|
||||
<section class="relative mx-auto py-6 sm:py-10 px-6 max-w-6xl text-blue-web">
|
||||
|
@ -56,15 +57,17 @@
|
|||
<div class="mt-4 mb-2 flex flex-wrap gap-4">
|
||||
{#each speakersMap(e.speakers) as s}
|
||||
<div class="flex gap-2">
|
||||
<Avatar speaker={s} size='semi-small' />
|
||||
<div class="m-auto"><a href="/lide?id={s.id}" class="text-xl">{s.name}</a></div>
|
||||
<Avatar speaker={s} size="semi-small" />
|
||||
<div class="m-auto">
|
||||
<a href="/lide?id={s.id}" class="text-xl">{s.name}</a>
|
||||
</div>
|
||||
</div>
|
||||
{/each}
|
||||
</div>
|
||||
{/if}
|
||||
<div class="mt-8">
|
||||
{#if e.description}
|
||||
<SvelteMarkdown source={e.description} renderers={renderers}/>
|
||||
<SvelteMarkdown source={e.description} {renderers} />
|
||||
{/if}
|
||||
</div>
|
||||
{/if}
|
||||
|
|
Rozdílový obsah nebyl zobrazen, protože je příliš veliký
Načíst rozdílové porovnání
Načítá se…
Odkázat v novém úkolu