This commit is contained in:
tree 2022-04-11 21:31:12 +02:00
rodič b3db1527b8
revize fe4bfb670b
16 změnil soubory, kde provedl 1321 přidání a 740 odebrání

40
package-lock.json vygenerováno
Zobrazit soubor

@ -22,6 +22,8 @@
"@sveltejs/kit": "next", "@sveltejs/kit": "next",
"autoprefixer": "^10.4.4", "autoprefixer": "^10.4.4",
"postcss": "^8.4.12", "postcss": "^8.4.12",
"prettier": "^2.6.2",
"prettier-plugin-svelte": "^2.7.0",
"svelte": "^3.46.0", "svelte": "^3.46.0",
"svelte-markdown": "^0.2.2", "svelte-markdown": "^0.2.2",
"tailwindcss": "^3.0.23" "tailwindcss": "^3.0.23"
@ -1571,6 +1573,31 @@
"integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
"dev": true "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": { "node_modules/queue-microtask": {
"version": "1.2.3", "version": "1.2.3",
"resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
@ -2895,6 +2922,19 @@
"integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
"dev": true "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": { "queue-microtask": {
"version": "1.2.3", "version": "1.2.3",
"resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",

Zobrazit soubor

@ -6,7 +6,9 @@
"build": "svelte-kit build", "build": "svelte-kit build",
"package": "svelte-kit package", "package": "svelte-kit package",
"preview": "svelte-kit preview", "preview": "svelte-kit preview",
"prepare": "svelte-kit sync" "prepare": "svelte-kit sync",
"prettier": "prettier --write --plugin-search-dir=. ./**/*.svelte"
}, },
"devDependencies": { "devDependencies": {
"@faker-js/faker": "^6.1.2", "@faker-js/faker": "^6.1.2",
@ -15,6 +17,8 @@
"@sveltejs/kit": "next", "@sveltejs/kit": "next",
"autoprefixer": "^10.4.4", "autoprefixer": "^10.4.4",
"postcss": "^8.4.12", "postcss": "^8.4.12",
"prettier": "^2.6.2",
"prettier-plugin-svelte": "^2.7.0",
"svelte": "^3.46.0", "svelte": "^3.46.0",
"svelte-markdown": "^0.2.2", "svelte-markdown": "^0.2.2",
"tailwindcss": "^3.0.23" "tailwindcss": "^3.0.23"

Zobrazit soubor

@ -1,112 +1,150 @@
<script> <script>
export let speaker; export let speaker;
export let col = 'speakers'; export let col = "speakers";
export let size = 'normal'; export let size = "normal";
export let customSize = null; export let customSize = null;
import SvelteMarkdown from 'svelte-markdown'; import SvelteMarkdown from "svelte-markdown";
import Link from '$lib/Link.svelte'; import Link from "$lib/Link.svelte";
import { page } from '$app/stores'; 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') { /*if ($page.url.hostname === 'localhost') {
imagesRoot = 'http://localhost:8000/22/photos' 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) $: photos = getPhotos(speaker);
$: speakerImg = photos[0] $: speakerImg = photos[0];
$: speakerImgAlt = photos[1] $: speakerImgAlt = photos[1];
function getPhotos (sp) { function getPhotos(sp) {
const output = [] const output = [];
if (speaker.photos && speaker.photos.length > 0) { if (speaker.photos && speaker.photos.length > 0) {
for (const prio of priority) { for (const prio of priority) {
if (speaker.photos.includes(prio)) { if (speaker.photos.includes(prio)) {
const [ ext, format ] = prio.split(':') const [ext, format] = prio.split(":");
const fn = `${imagesRoot}/${col}/${speaker.id}-${ext}.${format}` const fn = `${imagesRoot}/${col}/${speaker.id}-${ext}.${format}`;
if (output[0]) { if (output[0]) {
output.push(fn) output.push(fn);
break break;
} }
output.push(fn) output.push(fn);
} }
} }
} }
return output return output;
} }
if (!speakerImg) { if (!speakerImg) {
speakerImg = '/img/twitter-avatar.png' speakerImg = "/img/twitter-avatar.png";
} }
function getFlagEmoji(countryCode) { function getFlagEmoji(countryCode) {
const codePoints = countryCode const codePoints = countryCode
.toUpperCase() .toUpperCase()
.split('') .split("")
.map(char => 127397 + char.charCodeAt()); .map((char) => 127397 + char.charCodeAt());
return String.fromCodePoint(...codePoints); return String.fromCodePoint(...codePoints);
} }
$: country = speaker.country ? getFlagEmoji(speaker.country) : '' $: country = speaker.country ? getFlagEmoji(speaker.country) : "";
$: currentImg = speakerImg $: currentImg = speakerImg;
function mouseOver () { function mouseOver() {
if (speakerImgAlt) { if (speakerImgAlt) {
$: currentImg = speakerImgAlt $: currentImg = speakerImgAlt;
} }
} }
function mouseLeave () { function mouseLeave() {
$: currentImg = speakerImg $: currentImg = speakerImg;
} }
</script> </script>
{#if size === 'custom'} {#if size === "custom"}
<div class="customSize} text-center pb-4 m-auto"> <div class="customSize} text-center pb-4 m-auto">
<img src={currentImg} class="{customSize} rounded-full m-auto" alt={speaker.name} /> <img
</div> src={currentImg}
class="{customSize} rounded-full m-auto"
alt={speaker.name}
/>
</div>
{/if} {/if}
{#if size === 'big'} {#if size === "big"}
<div class="w-64 text-center pb-4 m-auto"> <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} /> <img
</div> src={currentImg}
class="w-64 rounded-full m-auto shadow-xl"
alt={speaker.name}
on:mouseover={mouseOver}
on:mouseleave={mouseLeave}
/>
</div>
{/if} {/if}
{#if size === 'normal'} {#if size === "normal"}
<div class="w-36 sm:w-44 text-center pb-4"> <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> <a
<div class="mt-4 text-sm text-blue-web uppercase font-bold"><a href="/lide?id={speaker.id}">{speaker.name}</a> {country}</div> href="/lide?id={speaker.id}"
{#if speaker.bio || speaker.orgs} on:mouseover={mouseOver}
<div class="mt-1 text-xs text-blue-web italic"><SvelteMarkdown source={speaker.bio || speaker.orgs} renderers={renderers}/></div> on:mouseleave={mouseLeave}
{/if} ><img
</div> 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}
{#if size === 'small'} {#if size === "small"}
<div class="w-16 text-center"> <div class="w-16 text-center">
<img src={currentImg} class="w-16 rounded-full m-auto" alt="{speaker.name}" /> <img src={currentImg} class="w-16 rounded-full m-auto" alt={speaker.name} />
</div> </div>
{/if} {/if}
{#if size === 'semi-small'} {#if size === "semi-small"}
<div class="w-10 text-center"> <div class="w-10 text-center">
<img src={currentImg} class="w-10 rounded-full m-auto shadow-md" alt="{speaker.name}" /> <img
</div> src={currentImg}
class="w-10 rounded-full m-auto shadow-md"
alt={speaker.name}
/>
</div>
{/if} {/if}
{#if size === 'extra-small'} {#if size === "extra-small"}
<div class="w-6 h-6 text-center"> <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> <a href="/lide?id={speaker.id}"
</div> ><img
src={currentImg}
class="w-6 rounded-full m-auto"
alt={speaker.name}
/></a
>
</div>
{/if} {/if}
{#if size === 'micro'} {#if size === "micro"}
<div class="w-4 h-4 text-center"> <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> <a href="/lide?id={speaker.id}"
</div> ><img
src={currentImg}
class="w-4 rounded-full m-auto"
alt={speaker.name}
/></a
>
</div>
{/if} {/if}

Zobrazit soubor

@ -3,53 +3,70 @@
const e = event; const e = event;
import Avatar from '$lib/Avatar.svelte'; import Avatar from "$lib/Avatar.svelte";
import EventTypeLabel from '$lib/EventTypeLabel.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; if (!arr) return;
return arr.map(sId => { return arr.map((sId) => {
return $bundle.spec.speakers.find(sp => sp.id === sId) return $bundle.spec.speakers.find((sp) => sp.id === sId);
}) });
} }
function trackRender (trackId) { function trackRender(trackId) {
const track = $bundle.spec.tracks.find(t => t.id === trackId) const track = $bundle.spec.tracks.find((t) => t.id === trackId);
return track.shortname || track.name return track.shortname || track.name;
} }
function getParents (e) { function getParents(e) {
return $bundle.spec.events.filter(i => i.parent === e.id) return $bundle.spec.events.filter((i) => i.parent === e.id);
} }
function handleFavorite (el) { function handleFavorite(el) {
const t = el.target.getAttribute('utxo-event-id') const t = el.target.getAttribute("utxo-event-id");
userData.update(data => { userData.update((data) => {
const fe = data.favoriteEvents const fe = data.favoriteEvents;
let output = null let output = null;
if (fe.includes(t)) { 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 { } else {
fe.push(t) fe.push(t);
output = Object.assign($userData, { favoriteEvents: fe }) output = Object.assign($userData, { favoriteEvents: fe });
} }
//localStorage.setItem('userData', JSON.stringify(output)) //localStorage.setItem('userData', JSON.stringify(output))
return output return output;
}) });
} }
</script> </script>
<div
<div class="transition-all mb-4 border px-3 py-2 rounded-md shadow {$userData.favoriteEvents.includes(e.id) ? 'bg-yellow-100' : '' }" > class="transition-all mb-4 border px-3 py-2 rounded-md shadow {$userData.favoriteEvents.includes(
<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> e.id
<div class="text-lg font-semibold"><a href="/udalosti?id={e.id}">{e.name}</a></div> )
? '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} {#if e.speakers && e.speakers.length > 0}
<div class="mt-1 mb-2 flex flex-wrap gap-2"> <div class="mt-1 mb-2 flex flex-wrap gap-2">
{#each speakersMap(e.speakers) as s} {#each speakersMap(e.speakers) as s}
<div class="flex gap-1.5"> <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 class="m-auto"><a href="/lide?id={s.id}">{s.name}</a></div>
</div> </div>
{/each} {/each}
@ -65,13 +82,18 @@
<div class="flex flex-wrap gap-2" cellpadding="5"> <div class="flex flex-wrap gap-2" cellpadding="5">
{#each getParents(e) as pe} {#each getParents(e) as pe}
<div class="border rounded py-1.5 px-2.5 bg-gray-100 text-sm"> <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"> <div class="mt-1">
{#if pe.speakers.length === 0} {#if pe.speakers.length === 0}
<div>TBA</div> <div>TBA</div>
{:else} {:else}
{#each speakersMap(pe.speakers) as s} {#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} {/each}
{/if} {/if}
</div> </div>

Zobrazit soubor

@ -3,19 +3,23 @@
export let size = null; export let size = null;
const config = { const config = {
panel: { title: 'Panelová debata', style: 'bg-custom-red text-white' }, panel: { title: "Panelová debata", style: "bg-custom-red text-white" },
talk: { title: 'Přednáška', style: 'bg-custom-green text-white' }, talk: { title: "Přednáška", style: "bg-custom-green text-white" },
workshop: { title: 'Workshop', style: 'bg-custom-blue text-white' }, workshop: { title: "Workshop", style: "bg-custom-blue text-white" },
other: { title: 'Ostatní', style: 'bg-custom-yellow' }, other: { title: "Ostatní", style: "bg-custom-yellow" },
lightning: { title: 'Lightning talk', style: 'bg-pink-400' }, lightning: { title: "Lightning talk", style: "bg-pink-400" },
} };
const current = config[event.type]; const current = config[event.type];
</script> </script>
<div class="flex { size === 'big' ? 'h-6 text-sm' : 'h-5 text-xs' }"> <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="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
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> </div>

Zobrazit soubor

@ -1,38 +1,63 @@
<script> <script>
import { bundle } from '$lib/stores'; import { bundle } from "$lib/stores";
import SocialButtons from '$lib/SocialButtons.svelte'; import SocialButtons from "$lib/SocialButtons.svelte";
</script> </script>
{#if $bundle} {#if $bundle}
<div class="bg-blue-web-bg text-white"> <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
<div class="flex-1"> 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" />&nbsp; 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> <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>
<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" />&nbsp; Dokumentace</a>
</div>
</div>
<div class="sm:mt-0 mt-6 sm:w-1/3 mr-2">
<SocialButtons size="normal" />
</div> </div>
</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} {/if}

Zobrazit soubor

@ -1,6 +1,8 @@
<script> <script>
export let href = '' export let href = "";
export let title = undefined export let title = undefined;
</script> </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
>

Zobrazit soubor

@ -1,34 +1,42 @@
<script> <script>
export let size = 'small'; export let size = "small";
import { bundle } from '$lib/stores'; import { bundle } from "$lib/stores";
import { page } from '$app/stores'; import { page } from "$app/stores";
const socials = [ const socials = [
{ link: 'twitter', ico: 'fa-brands fa-twitter', name: 'Twitter' }, { link: "twitter", ico: "fa-brands fa-twitter", name: "Twitter" },
{ link: 'instagram', ico: 'fab fa-instagram', name: 'Instagram' }, { link: "instagram", ico: "fab fa-instagram", name: "Instagram" },
{ link: 'fbevent', ico: 'fab fa-facebook', name: 'Facebook' }, { link: "fbevent", ico: "fab fa-facebook", name: "Facebook" },
{ link: 'substack', ico: 'fa-solid fa-envelope', name: 'Newsletter' }, { link: "substack", ico: "fa-solid fa-envelope", name: "Newsletter" },
{ link: 'discord', ico: 'fab fa-discord', name: 'Discord' }, { link: "discord", ico: "fab fa-discord", name: "Discord" },
{ link: 'telegram', ico: 'fab fa-telegram', name: 'Telegram' }, { link: "telegram", ico: "fab fa-telegram", name: "Telegram" },
] ];
</script> </script>
{#if $bundle} {#if $bundle}
{#if size === 'small'} {#if size === "small"}
<div class="flex block space-x-2 m-auto w-full justify-end"> <div class="flex block space-x-2 m-auto w-full justify-end">
{#each socials as soc} {#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"> <a
<i class="{soc.ico}" /> 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> </a>
{/each} {/each}
</div> </div>
{/if} {/if}
{#if size === 'normal'} {#if size === "normal"}
<div class="w-auto"> <div class="w-auto">
<div class="sm:flex flex-wrap gap-3 justify-end"> <div class="sm:flex flex-wrap gap-3 justify-end">
{#each socials as soc} {#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} {/each}
</div> </div>
</div> </div>

Zobrazit soubor

@ -1,36 +1,66 @@
<script> <script>
import { page } from '$app/stores'; import { page } from "$app/stores";
import { bundle, userData, userDataLocal } from '$lib/stores'; import { bundle, userData, userDataLocal } from "$lib/stores";
import SocialButtons from '$lib/SocialButtons.svelte'; import SocialButtons from "$lib/SocialButtons.svelte";
function logoClick () { function logoClick() {
userData.update(ud => { userData.update((ud) => {
ud.hpTrack = 'top' ud.hpTrack = "top";
return ud return ud;
}) });
} }
</script> </script>
<header class="relative" style="background-color: #32375C;"> <header class="relative" style="background-color: #32375C;">
<!-- <li class:active={$page.url.pathname === '/'}><a sveltekit:prefetch href="/">Home</a></li> --> <!-- <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="">
<div class="lg:flex lg:flex-wrap lg:space-x-10"> <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
<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> 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>
<div class="flex lg:space-x-10 uppercase text-sm font-bold text-white"> <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
<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> sveltekit:prefetch
<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}&nbsp;({$userDataLocal.tickets.length}){/if}</div></a> 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}&nbsp;({$userDataLocal
.tickets.length}){/if}
</div></a
>
</div> </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 /> <SocialButtons />
</div> </div>
</div> </div>
</div> </div>
</nav> </nav>
</header> </header>
<style> <style>

Zobrazit soubor

@ -1,53 +1,50 @@
<script> <script>
import Header from '$lib/header/Header.svelte'; import Header from "$lib/header/Header.svelte";
import Footer from '$lib/Footer.svelte'; import Footer from "$lib/Footer.svelte";
import '../app.css'; import "../app.css";
import api from '$lib/api.js'; import api from "$lib/api.js";
import { page } from '$app/stores'; import { page } from "$app/stores";
import { userData, userDataLocal, apiStatus } from '$lib/stores'; import { userData, userDataLocal, apiStatus } from "$lib/stores";
import { loadOrders, loadApiStatus } from '$lib/orders'; import { loadOrders, loadApiStatus } from "$lib/orders";
import { onMount, onDestroy } from 'svelte'; import { onMount, onDestroy } from "svelte";
let bundle = null let bundle = null;
let uds = null let uds = null;
onMount(async () => { 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) { if (userDataLS) {
userData.set(JSON.parse(userDataLS)) userData.set(JSON.parse(userDataLS));
} }
uds = userData.subscribe(ud => { uds = userData.subscribe((ud) => {
localStorage.setItem('userData', JSON.stringify(ud)) localStorage.setItem("userData", JSON.stringify(ud));
}) });
await loadApiStatus() await loadApiStatus();
await loadOrders($userData) await loadOrders($userData);
}) });
onDestroy(() => { onDestroy(() => {
//userData.unsubscribe(uds) //userData.unsubscribe(uds)
}) });
// load orders // load orders
</script> </script>
{#if bundle} {#if bundle}
<div class="layout min-h-screen bg-gray-900"> <div class="layout min-h-screen bg-gray-900">
<div class="inset-0 bg-white"> <div class="inset-0 bg-white">
<Header /> <Header />
<main> <main>
<slot /> <slot />
</main> </main>
</div>
<Footer />
</div> </div>
<Footer />
</div>
{/if} {/if}
<style> <style>

Zobrazit soubor

@ -1,5 +1,5 @@
<script context="module"> <script context="module">
export const prerender = true; export const prerender = true;
</script> </script>
<script> <script>
@ -7,11 +7,41 @@
<section class="relative mx-auto py-6 sm:py-10 px-6 max-w-6xl text-blue-web"> <section class="relative mx-auto py-6 sm:py-10 px-6 max-w-6xl text-blue-web">
<div class=""> <div class="">
<div class="text-3xl lg:text-4xl text-center">🎉 Gratulujeme k nákupu vstupenek!</div> <div class="text-3xl lg:text-4xl text-center">
<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> 🎉 Gratulujeme k nákupu vstupenek!
<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>
<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="mt-4 text-lg text-center">
<div class="text-xl text-center mt-6">Prohlédni si <a href="/program" class="underline hover:no-underline">aktuální program</a></div> Najdeš je v mailu nebo na stránce <a
<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>&nbsp;<i class="fa-brands fa-twitter"></i></div> 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
>&nbsp;<i class="fa-brands fa-twitter" />
</div>
</div> </div>
</section> </section>

Zobrazit soubor

@ -1,61 +1,94 @@
<script context="module"> <script context="module">
export const prerender = true; export const prerender = true;
</script> </script>
<script> <script>
import { bundle, userData } from '$lib/stores.js'; import { bundle, userData } from "$lib/stores.js";
import Avatar from '$lib/Avatar.svelte'; import Avatar from "$lib/Avatar.svelte";
import SvelteMarkdown from 'svelte-markdown'; import SvelteMarkdown from "svelte-markdown";
import Link from '$lib/Link.svelte'; import Link from "$lib/Link.svelte";
const renderers = { link: Link } const renderers = { link: Link };
let onlyLead = true let onlyLead = true;
let onlyLeadPreview = false let onlyLeadPreview = false;
$: currentBundle = $bundle; $: currentBundle = $bundle;
$: leadSpeakersCount = currentBundle ? currentBundle.spec.speakers.filter(s => !!s.lead).length : 0 $: leadSpeakersCount = currentBundle
$: tracks = currentBundle ? [{ name: 'Hlavní přednášející ('+leadSpeakersCount+')', id: 'top' }, { name: 'Vše', id: null }].concat(currentBundle.spec.tracks) : null ? 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 () { return function () {
userData.update(ud => { ud.hpTrack = tId; return ud; }) userData.update((ud) => {
onlyLead = !tId ud.hpTrack = tId;
} return ud;
});
onlyLead = !tId;
};
} }
function handleShowFull () { function handleShowFull() {
userData.update(ud => { ud.hpTrack = null; return ud }) userData.update((ud) => {
ud.hpTrack = null;
return ud;
});
} }
</script> </script>
<svelte:head> <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> </svelte:head>
<section class="relative mx-auto py-6 sm:py-10 px-6 max-w-6xl"> <section class="relative mx-auto py-6 sm:py-10 px-6 max-w-6xl">
{#if $bundle} {#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} {#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} {/each}
</div> </div>
<div class="flex flex-wrap gap-6 mt-6 sm:mt-14 justify-center"> <div class="flex flex-wrap gap-6 mt-6 sm:mt-14 justify-center">
{#each $bundle.spec.speakers as speaker} {#each $bundle.spec.speakers as speaker}
{#if ($userData.hpTrack === 'top' && speaker.lead === true) || $userData.hpTrack !== 'top'} {#if ($userData.hpTrack === "top" && speaker.lead === true) || $userData.hpTrack !== "top"}
{#if (!$userData.hpTrack || speaker.tracks.includes($userData.hpTrack)) || $userData.hpTrack === 'top'} {#if !$userData.hpTrack || speaker.tracks.includes($userData.hpTrack) || $userData.hpTrack === "top"}
<Avatar speaker={speaker} /> <Avatar {speaker} />
{/if} {/if}
{/if} {/if}
{/each} {/each}
</div> </div>
{#if $userData.hpTrack === 'top'} {#if $userData.hpTrack === "top"}
<div class="relative cursor-pointer mb-10"> <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"> <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} {#each $bundle.spec.speakers
<Avatar speaker={speaker} size="small" /> .filter((s) => !s.lead)
.sort(() => 0.5 - Math.random())
.slice(0, 27) as speaker}
<Avatar {speaker} size="small" />
{/each} {/each}
</div> </div>
</div> </div>
@ -67,24 +100,57 @@
<div class="relative mx-auto py-6 px-6 max-w-6xl"> <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="py-6 md:py-10 md:flex gap-12">
<div class="block flex-1"> <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="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">
<div class="w-1/2"><img src="/photos/knihovna.jpeg" class="rounded-lg shadow-lg" alt="Gabriel Loci - Knihovna" /></div> <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> </div>
<div class="text-white md:w-1/2 md:pt-0 pt-6"> <div class="text-white md:w-1/2 md:pt-0 pt-6">
<div class="uppercase">Místo</div> <div class="uppercase">Místo</div>
<div class="uppercase mt-3 text-4xl font-bold">Gabriel Loci</div> <div class="uppercase mt-3 text-4xl font-bold">Gabriel Loci</div>
<div class="mt-4 font-bold"> <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>
<div class="mt-4"> <div class="mt-4">
Benediktinky. Kulturní památka. Česká Pošta. Poštovní muzeum. Benediktinky. Kulturní památka. Česká Pošta. Poštovní muzeum. Na první
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. pohled nesouvisející názvy, které jsou ale neodmyslitelnou součástí
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ů. unikátního komplexu Gabriel Loci na pražském Smíchově doslova pár
Dnes komplex využívají hlavně natáčecí studia jako HBO, Netflix nebo i ČT. No a my! 💪<br/><br/> minut od centra. Na konci 19.století v klášteře sídlily řeholnice,
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 👌😀 ž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> </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="text-2xl uppercase font-bold">Partneři</div>
<div class="mt-6">Sponzoři</div> <div class="mt-6">Sponzoři</div>
<div class="mt-6 flex flex-wrap gap-8 justify-left"> <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"> <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 class="text-center text-sm uppercase font-bold">{p.name}</div>
</div> </div>
{/each} {/each}
</div> </div>
<div class="mt-10">Komunity</div> <div class="mt-10">Komunity</div>
<div class="mt-6 flex flex-wrap gap-6 justify-left"> <div class="mt-6 flex flex-wrap gap-6 justify-left">
{#each $bundle.spec.partners.filter(p => p.type === 'community') as p} {#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> <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} {/each}
</div> </div>
<div class="mt-10">Mediální partneři</div> <div class="mt-10">Mediální partneři</div>
<div class="mt-6 flex flex-wrap gap-4 justify-left"> <div class="mt-6 flex flex-wrap gap-4 justify-left">
{#each $bundle.spec.partners.filter(p => p.type === 'medium') as p} {#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> <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} {/each}
</div> </div>
</div> </div>
</section> </section>
{#if $bundle} {#if $bundle}
<section class="relative mx-auto py-10 px-6 max-w-6xl"> <section class="relative mx-auto py-10 px-6 max-w-6xl">
<div class="text-blue-web"> <div class="text-blue-web">
<h2 class="uppercase pt-5" id="faq">Často kladené dotazy (FAQ)</h2> <h2 class="uppercase pt-5" id="faq">Často kladené dotazy (FAQ)</h2>
<div class="md:columns-2 columns-1 mt-8 h-auto"> <div class="md:columns-2 columns-1 mt-8 h-auto">
{#each $bundle.spec.faqs as item} {#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
<div class="mb-4 font-bold">{item.question}</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"
<SvelteMarkdown source={item.answer} renderers={renderers} /> >
</div> <div class="mb-4 font-bold">{item.question}</div>
{/each} <SvelteMarkdown source={item.answer} {renderers} />
</div>
{/each}
</div>
</div> </div>
</div> </section>
</section>
{/if} {/if}
<style> <style>

Zobrazit soubor

@ -1,49 +1,51 @@
<script context="module"> <script context="module">
export const prerender = true; export const prerender = true;
</script> </script>
<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'; $: id = getId($page.url.search);
import Avatar from '$lib/Avatar.svelte'; $: s = $bundle ? $bundle.spec.speakers.find((s) => s.id === id) : null;
import Event from '$lib/Event.svelte'; $: events = s
import { onMount, beforeUpdate } from 'svelte'; ? $bundle.spec.events.filter(
import { page } from '$app/stores'; (ev) => ev.speakers && ev.speakers.includes(s.id)
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) function getId(search) {
$: s = $bundle ? $bundle.spec.speakers.find(s => s.id === id) : null const searchParams = new URLSearchParams(search);
$: events = s ? $bundle.spec.events.filter(ev => ev.speakers && ev.speakers.includes(s.id)) : [] const cid = searchParams.get("id");
if (!$bundle.spec.speakers.find((s) => s.id === cid)) {
function getId (search) { goto("/");
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) { function trackRender(trackId) {
const track = $bundle.spec.tracks.find(t => t.id === trackId) const track = $bundle.spec.tracks.find((t) => t.id === trackId);
return track.shortname || track.name return track.shortname || track.name;
} }
function getFlagEmoji(countryCode) { function getFlagEmoji(countryCode) {
const codePoints = countryCode const codePoints = countryCode
.toUpperCase() .toUpperCase()
.split('') .split("")
.map(char => 127397 + char.charCodeAt()); .map((char) => 127397 + char.charCodeAt());
return String.fromCodePoint(...codePoints); return String.fromCodePoint(...codePoints);
} }
</script> </script>
<svelte:head> <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> </svelte:head>
<section class="relative mx-auto py-6 sm:py-10 px-6 max-w-6xl text-blue-web"> <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> <div class="mb-4 text-md uppercase">Přednášející</div>
<h1 class="text-2xl font-bold">{s.name} {getFlagEmoji(s.country)}</h1> <h1 class="text-2xl font-bold">{s.name} {getFlagEmoji(s.country)}</h1>
{#if s.nickname} {#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}
{#if s.bio} {#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}
{#if s.orgs} {#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} {/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} {#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}
{#if s.linkedin} {#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}
{#if s.web && s.web.url} {#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} {/if}
</div> </div>
</div> </div>
{#if s.desc} {#if s.desc}
<div class="mt-6"> <div class="mt-6">
<SvelteMarkdown source={s.desc} renderers={renderers} /> <SvelteMarkdown source={s.desc} {renderers} />
</div> </div>
{/if} {/if}
<div class="mt-6"> <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> <div>
{#if events.length > 0} {#if events.length > 0}
{#each events as e} {#each events as e}

Zobrazit soubor

@ -1,24 +1,25 @@
<script context="module"> <script context="module">
export const prerender = true; export const prerender = true;
</script> </script>
<script> <script>
import Event from '$lib/Event.svelte'; import Event from "$lib/Event.svelte";
import { bundle, userData } from '$lib/stores.js'; import { bundle, userData } from "$lib/stores.js";
</script> </script>
<svelte:head> <svelte:head>
<title>Program | UTXO.22</title> <title>Program | UTXO.22</title>
</svelte:head> </svelte:head>
<section class="relative mx-auto py-6 sm:py-10 px-6 max-w-6xl text-blue-web"> <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> <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"> <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} /> <Event event={e} />
{/each} {/each}
</div> </div>

Zobrazit soubor

@ -1,47 +1,48 @@
<script context="module"> <script context="module">
export const prerender = true; export const prerender = true;
</script> </script>
<script> <script>
import { page } from '$app/stores'; import { page } from "$app/stores";
import { goto } from '$app/navigation'; import { goto } from "$app/navigation";
import { onMount } from 'svelte'; import { onMount } from "svelte";
import { bundle, userData } from '$lib/stores.js'; import { bundle, userData } from "$lib/stores.js";
import EventTypeLabel from '$lib/EventTypeLabel.svelte'; import EventTypeLabel from "$lib/EventTypeLabel.svelte";
import Avatar from '$lib/Avatar.svelte'; import Avatar from "$lib/Avatar.svelte";
import SvelteMarkdown from 'svelte-markdown'; import SvelteMarkdown from "svelte-markdown";
import Link from '$lib/Link.svelte'; import Link from "$lib/Link.svelte";
const renderers = { link: Link } const renderers = { link: Link };
$: id = getId($page.url.search) $: id = getId($page.url.search);
$: e = $bundle ? $bundle.spec.events.find(ev => ev.id === id) : null $: e = $bundle ? $bundle.spec.events.find((ev) => ev.id === id) : null;
function getId (search) { function getId(search) {
const searchParams = new URLSearchParams(search) const searchParams = new URLSearchParams(search);
const cid = searchParams.get('id') const cid = searchParams.get("id");
if (!$bundle.spec.events.find(s => s.id === cid)) { if (!$bundle.spec.events.find((s) => s.id === cid)) {
goto('/') goto("/");
} }
return cid return cid;
} }
function speakersMap (arr) { function speakersMap(arr) {
if (!arr) return; if (!arr) return;
return arr.map(sId => { return arr.map((sId) => {
return $bundle.spec.speakers.find(sp => sp.id === sId) return $bundle.spec.speakers.find((sp) => sp.id === sId);
}) });
} }
function trackRender (trackId) { function trackRender(trackId) {
const track = $bundle.spec.tracks.find(t => t.id === trackId) const track = $bundle.spec.tracks.find((t) => t.id === trackId);
return track.shortname || track.name return track.shortname || track.name;
} }
</script> </script>
<svelte:head> <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> </svelte:head>
<section class="relative mx-auto py-6 sm:py-10 px-6 max-w-6xl text-blue-web"> <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"> <div class="mt-4 mb-2 flex flex-wrap gap-4">
{#each speakersMap(e.speakers) as s} {#each speakersMap(e.speakers) as s}
<div class="flex gap-2"> <div class="flex gap-2">
<Avatar speaker={s} size='semi-small' /> <Avatar speaker={s} size="semi-small" />
<div class="m-auto"><a href="/lide?id={s.id}" class="text-xl">{s.name}</a></div> <div class="m-auto">
<a href="/lide?id={s.id}" class="text-xl">{s.name}</a>
</div>
</div> </div>
{/each} {/each}
</div> </div>
{/if} {/if}
<div class="mt-8"> <div class="mt-8">
{#if e.description} {#if e.description}
<SvelteMarkdown source={e.description} renderers={renderers}/> <SvelteMarkdown source={e.description} {renderers} />
{/if} {/if}
</div> </div>
{/if} {/if}

Rozdílový obsah nebyl zobrazen, protože je příliš veliký Načíst rozdílové porovnání