Merge 2019/master
6
2019/.gitignore
vendored
Normal file
|
@ -0,0 +1,6 @@
|
|||
/mix-manifest.json
|
||||
/node_modules/
|
||||
/output_*/
|
||||
/source/dist/
|
||||
/vendor/
|
||||
/*.cache
|
14
2019/.php_cs.dist
Normal file
|
@ -0,0 +1,14 @@
|
|||
<?php
|
||||
|
||||
use PhpCsFixer\Config;
|
||||
use Symfony\Component\Finder\Finder;
|
||||
|
||||
$finder = new Finder();
|
||||
$finder->files()->in('src')->in('src');
|
||||
|
||||
return Config::create()
|
||||
->setRules([
|
||||
'@PSR2' => true,
|
||||
'array_syntax' => ['syntax' => 'short'],
|
||||
])
|
||||
->setFinder($finder);
|
21
2019/LICENSE
Normal file
|
@ -0,0 +1,21 @@
|
|||
MIT License
|
||||
|
||||
Copyright (c) 2017 Oliver Davies
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
20
2019/app/SculpinKernel.php
Normal file
|
@ -0,0 +1,20 @@
|
|||
<?php
|
||||
|
||||
use App\Schedule\SculpinScheduleBundle;
|
||||
use App\Speakers\SculpinSpeakersBundle;
|
||||
use App\Sponsors\SculpinSponsorsBundle;
|
||||
use Opdavies\Sculpin\Bundle\TwigMarkdownBundle\SculpinTwigMarkdownBundle;
|
||||
use Sculpin\Bundle\SculpinBundle\HttpKernel\AbstractKernel;
|
||||
|
||||
class SculpinKernel extends AbstractKernel
|
||||
{
|
||||
protected function getAdditionalSculpinBundles(): array
|
||||
{
|
||||
return [
|
||||
SculpinScheduleBundle::class,
|
||||
SculpinSpeakersBundle::class,
|
||||
SculpinSponsorsBundle::class,
|
||||
SculpinTwigMarkdownBundle::class,
|
||||
];
|
||||
}
|
||||
}
|
7
2019/app/config/sculpin_kernel.yml
Normal file
|
@ -0,0 +1,7 @@
|
|||
sculpin_content_types:
|
||||
sessions:
|
||||
permalink: /sessions/:basename/
|
||||
speakers:
|
||||
permalink: /speakers/:title/
|
||||
posts:
|
||||
enabled: false
|
118
2019/app/config/sculpin_site.yml
Normal file
|
@ -0,0 +1,118 @@
|
|||
title: DrupalCamp Bristol 2019
|
||||
date: 2019-07-28
|
||||
email: info@drupalcampbristol.co.uk
|
||||
|
||||
cfp:
|
||||
open: false
|
||||
url: '%papercall.url%'
|
||||
|
||||
eventbrite:
|
||||
url: https://www.eventbrite.co.uk/e/drupalcamp-bristol-2019-tickets-58986869314
|
||||
|
||||
papercall:
|
||||
url: https://www.papercall.io/drupalcamp-bristol-2019
|
||||
|
||||
schedule:
|
||||
slots:
|
||||
- id: 1
|
||||
time: 8:30 am
|
||||
label: Registration and refreshments
|
||||
|
||||
- id: 2
|
||||
time: 9:00 am
|
||||
label: Welcome
|
||||
|
||||
- id: 3
|
||||
time: 9:10 am
|
||||
|
||||
- id: 4
|
||||
time: 10:00 am
|
||||
|
||||
- id: 5
|
||||
time: 10:30 am
|
||||
label: Refreshments
|
||||
|
||||
- id: 6
|
||||
time: 10:50 am
|
||||
|
||||
- id: 7
|
||||
time: 11:40 am
|
||||
|
||||
- id: 8
|
||||
time: 12:10 pm
|
||||
label: Lunch
|
||||
|
||||
- id: 9
|
||||
time: 1:10 pm
|
||||
|
||||
- id: 10
|
||||
time: 2:00 pm
|
||||
|
||||
- id: 12
|
||||
time: 2:30 pm
|
||||
label: Refreshments
|
||||
|
||||
- id: 13
|
||||
time: 2:50 pm
|
||||
|
||||
- id: 14
|
||||
time: 3:05 pm
|
||||
|
||||
- id: 15
|
||||
time: 3:20 pm
|
||||
|
||||
- id: 16
|
||||
time: 4:10 pm
|
||||
label: Closing remarks
|
||||
|
||||
- id: 17
|
||||
time: 4:40 pm
|
||||
label: Drinks reception
|
||||
|
||||
tickets:
|
||||
available: false
|
||||
url: '%eventbrite.url%'
|
||||
|
||||
sponsorship_levels:
|
||||
- gold
|
||||
- silver
|
||||
- bronze
|
||||
|
||||
sponsors:
|
||||
gold:
|
||||
- name: Acquia
|
||||
description: |
|
||||
We provide the world’s most ambitious brands with technology that allows them to embrace innovation and create customer moments that matter. At Acquia, we believe in the power of community — giving our customers the freedom to build tomorrow on their terms.
|
||||
|
||||
Acquia is helping some of the world’s leading brands succeed, including Twitter, Mercedes Benz, Warner Music Group, and Stanford University. More than 4,000 organizations are using Acquia’s solutions for content, community and commerce.
|
||||
logo: acquia.png
|
||||
url: https://www.acquia.com
|
||||
confirmed: true
|
||||
|
||||
- name: Microserve
|
||||
description: ~
|
||||
logo: microserve.png
|
||||
url: https://microserve.io
|
||||
confirmed: true
|
||||
|
||||
- name: Proctor + Stevenson
|
||||
description: ~
|
||||
logo: proctors.jpg
|
||||
url: https://www.proctors.co.uk
|
||||
confirmed: true
|
||||
|
||||
silver:
|
||||
- name: Drupalize.me
|
||||
logo: drupalize-me.png
|
||||
url: https://drupalize.me
|
||||
confirmed: false
|
||||
|
||||
bronze:
|
||||
- name: Manifesto
|
||||
logo: tpx-manifesto.svg
|
||||
url: https://manifesto.co.uk
|
||||
confirmed: true
|
||||
|
||||
twitter:
|
||||
url: https://twitter.com/drupalcampbris
|
||||
user: DrupalCampBris
|
51
2019/composer.json
Normal file
|
@ -0,0 +1,51 @@
|
|||
{
|
||||
"name": "opdavies/sculpin-skeleton",
|
||||
"description": "A skeleton Sculpin site.",
|
||||
"license": "MIT",
|
||||
"authors": [
|
||||
{
|
||||
"name": "Oliver Davies",
|
||||
"email": "oliver@oliverdavies.uk",
|
||||
"homepage": "https://www.oliverdavies.uk"
|
||||
}
|
||||
],
|
||||
"require": {
|
||||
"php": "^7.1",
|
||||
"josephlavin/tap": "^1.0",
|
||||
"opdavies/sculpin-twig-markdown-bundle": "^0.1.1",
|
||||
"sculpin/sculpin": "^3",
|
||||
"tightenco/collect": "^5.8"
|
||||
},
|
||||
"require-dev": {
|
||||
"friendsofphp/php-cs-fixer": "^2.15",
|
||||
"phpunit/phpunit": "^8.1"
|
||||
},
|
||||
"scripts": {
|
||||
"dev": "composer run-script generate",
|
||||
"generate": "sculpin generate --clean --no-interaction",
|
||||
"lint": "php-cs-fixer fix",
|
||||
"prod": "composer run-script generate -- --env prod",
|
||||
"test": [
|
||||
"composer run test:unit",
|
||||
"composer run lint -- --dry-run"
|
||||
],
|
||||
"test:unit": "phpunit",
|
||||
"watch": "composer run-script --timeout=0 generate -- --server --watch"
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"App\\Speakers\\": "src/Speakers/src",
|
||||
"App\\Schedule\\": "src/Schedule/src",
|
||||
"App\\Sponsors\\": "src/Sponsors/src"
|
||||
}
|
||||
},
|
||||
"autoload-dev": {
|
||||
"psr-4": {
|
||||
"App\\Tests\\Speakers\\": "src/Speakers/tests",
|
||||
"App\\Tests\\Sponsors\\": "src/Sponsors/tests"
|
||||
}
|
||||
},
|
||||
"config": {
|
||||
"sort-packages": true
|
||||
}
|
||||
}
|
4755
2019/composer.lock
generated
Normal file
9
2019/netlify.toml
Normal file
|
@ -0,0 +1,9 @@
|
|||
[build]
|
||||
command = """
|
||||
composer test
|
||||
composer prod
|
||||
yarn prod
|
||||
cp -R source/dist output_prod
|
||||
"""
|
||||
publish = "output_prod"
|
||||
environment = { PHP_VERSION = "7.2" }
|
24
2019/package.json
Normal file
|
@ -0,0 +1,24 @@
|
|||
{
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "npm run development",
|
||||
"development": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
|
||||
"watch": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --watch --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
|
||||
"prod": "npm run production",
|
||||
"production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js"
|
||||
},
|
||||
"devDependencies": {
|
||||
"browser-sync": "^2.26.3",
|
||||
"browser-sync-webpack-plugin": "2.0.1",
|
||||
"cross-env": "^5.2.0",
|
||||
"laravel-mix": "^4.0.14",
|
||||
"laravel-mix-purgecss": "^4.1.0",
|
||||
"postcss-nested": "^4.1.2",
|
||||
"tailwindcss": "^1.0.1",
|
||||
"tailwindcss-interaction-variants": "^2.0.0-beta.1",
|
||||
"tailwindcss-list-reset": "^1.0.0",
|
||||
"tailwindcss-spaced-items": "^0.1.0",
|
||||
"tailwindcss-transitions": "^2.0.0",
|
||||
"tailwindcss-visuallyhidden": "^1.0.2"
|
||||
}
|
||||
}
|
15
2019/phpunit.xml.dist
Normal file
|
@ -0,0 +1,15 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<phpunit bootstrap="./vendor/autoload.php"
|
||||
colors="true"
|
||||
convertErrorsToExceptions="true"
|
||||
convertNoticesToExceptions="true"
|
||||
convertWarningsToExceptions="true"
|
||||
stopOnFailure="true"
|
||||
verbose="true">
|
||||
<testsuites>
|
||||
<testsuite name="Bundles">
|
||||
<directory suffix="Test.php">src/Speakers/tests</directory>
|
||||
<directory suffix="Test.php">src/Sponsors/tests</directory>
|
||||
</testsuite>
|
||||
</testsuites>
|
||||
</phpunit>
|
32
2019/resources/css/app.css
Normal file
|
@ -0,0 +1,32 @@
|
|||
@tailwind base;
|
||||
|
||||
@media (min-height: theme('screens.md')) {
|
||||
main {
|
||||
@apply flex flex-col justify-center h-full
|
||||
}
|
||||
}
|
||||
|
||||
@tailwind components;
|
||||
|
||||
.tw-bg-balloon {
|
||||
background-image: url(/themes/dcb2017/images/dcb-bg.jpg)
|
||||
}
|
||||
|
||||
.tw-button {
|
||||
@apply block uppercase font-bold text-lg py-3 px-5 text-white no-underline bg-black !important;
|
||||
|
||||
@screen md {
|
||||
@apply w-1/2 inline-flex items-center justify-center mx-2 !important
|
||||
}
|
||||
|
||||
&:hover,
|
||||
&:focus {
|
||||
@apply bg-green-600 text-white !important
|
||||
}
|
||||
}
|
||||
|
||||
.markup {
|
||||
@apply leading-relaxed
|
||||
}
|
||||
|
||||
@tailwind utilities;
|
7
2019/resources/css/components/markup.css
Normal file
|
@ -0,0 +1,7 @@
|
|||
.markup {
|
||||
@apply leading-relaxed;
|
||||
|
||||
p:first-child {
|
||||
@apply mt-0
|
||||
}
|
||||
}
|
11
2019/source/_includes/banner.html.twig
Normal file
|
@ -0,0 +1,11 @@
|
|||
<header role="banner">
|
||||
<div class="region region-header tw-max-w-6xl tw-px-6 sm:tw-flex sm:tw-justify-between sm:tw-items-center">
|
||||
<div id="block-dcb2017-branding" class="block block-system block-system-branding-block tw-mx-auto tw-my-2 sm:tw-mx-0">
|
||||
<a href="/" title="Home" rel="home" class="site-logo">
|
||||
<img src="/themes/dcb2017/logo.svg" alt="Home" />
|
||||
</a>
|
||||
</div>
|
||||
|
||||
{% include 'nav' %}
|
||||
</div>
|
||||
</header>
|
15
2019/source/_includes/footer.html.twig
Normal file
|
@ -0,0 +1,15 @@
|
|||
<footer role="contentinfo" class="tw-bg-balloon tw-bg-center tw-bg-cover">
|
||||
<div class="region region-footer">
|
||||
<div id="block-footerinfo" class="block block-block-content block-block-content1df4705d-991d-45d4-8c83-fa337eec6a69">
|
||||
<nav class="tw-mt-2 tw-mb-6 tw--ml-8">
|
||||
<a class="tw-uppercase tw-no-underline hocus:tw-text-green-600 tw-ml-8" href="http://2017.drupalcampbristol.co.uk" title="DrupalCamp Bristol 2017">2017</a>
|
||||
<a class="tw-uppercase tw-no-underline hocus:tw-text-green-600 tw-ml-8" href="{{ page.twitter.url }}" title="DrupalCamp Bristol on Twitter">Twitter</a>
|
||||
<a class="tw-uppercase tw-no-underline hocus:tw-text-green-600 tw-ml-8" href="https://www.youtube.com/channel/UCoHlMzj9iT4xOlpgYOg_rjw" title="View previous videos on YouTube">YouTube</a>
|
||||
</nav>
|
||||
|
||||
<div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item">
|
||||
<p><span>DrupalCamp Bristol is a non-profit event brought to you by a team of volunteers from the<span> </span></span><a href="https://www.drupalbristol.co.uk">Bristol Drupal community</a></p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
50
2019/source/_includes/nav.html.twig
Normal file
|
@ -0,0 +1,50 @@
|
|||
{% set links = [
|
||||
{
|
||||
title: 'Tickets',
|
||||
href: site['tickets']['url'],
|
||||
active: false,
|
||||
enabled: site['tickets']['available'],
|
||||
},
|
||||
{
|
||||
title: 'Submit a session',
|
||||
href: site['cfp']['url'],
|
||||
active: false,
|
||||
enabled: site['cfp']['open'],
|
||||
},
|
||||
{
|
||||
title: 'Speakers',
|
||||
href: '/#speakers',
|
||||
active: page.layout == 'speaker',
|
||||
enabled: true,
|
||||
},
|
||||
{
|
||||
title: 'Schedule',
|
||||
href: '/#schedule',
|
||||
active: page.url == '/schedule' or page.layout == 'session',
|
||||
enabled: true,
|
||||
},
|
||||
{
|
||||
title: 'Sponsors',
|
||||
href: '/sponsors',
|
||||
active: page.url == '/sponsors',
|
||||
enabled: true,
|
||||
},
|
||||
{
|
||||
title: 'Sponsor us',
|
||||
href: '/sponsor-us',
|
||||
active: page.url == '/sponsor-us',
|
||||
enabled: now|date('U') < site['date'],
|
||||
}
|
||||
] %}
|
||||
<nav role="navigation" aria-labelledby="block-dcb2017-main-menu-menu" id="block-dcb2017-main-menu" class="block block-menu navigation menu--main">
|
||||
<h2 class="visually-hidden" id="block-dcb2017-main-menu-menu">Main navigation</h2>
|
||||
<ul class="tw-list-reset tw-flex tw-flex-wrap tw-justify-center tw--ml-8">
|
||||
{% for link in links if link.enabled %}
|
||||
<li class="tw-mb-2 tw-mx-4 md:tw-m-0 md:tw-ml-8">
|
||||
<a class="tw-uppercase tw-no-underline hocus:tw-text-green-600 {{ link.active ? 'tw-text-green-600' : 'tw-text-black' }}" href="{{ link.href|raw }}">
|
||||
{{ link.title }}
|
||||
</a>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</nav>
|
22
2019/source/_includes/schedule.html.twig
Normal file
|
@ -0,0 +1,22 @@
|
|||
<section id="schedule" class="tw-bg-purple-800 tw-text-white tw-py-16">
|
||||
<div class="tw-max-w-xl tw-mx-auto tw-px-4 tw-text-center">
|
||||
<h2 class="tw-text-3xl md:tw-text-4xl">The Schedule</h2>
|
||||
|
||||
<ul class="tw-list-reset tw-overflow-hidden">
|
||||
{% for slot in slots %}
|
||||
{% set session = sessionInSlot(slot.id, sessions) %}
|
||||
<li class="tw-pt-4 lg:tw-pt-6 {{ loop.last ?: 'tw-pb-4 lg:tw-pb-6 tw-border-solid tw-border-0 tw-border-b tw-border-purple-400' }}">
|
||||
<span class="tw-flex tw-items-center tw-justify-between tw--mx-6">
|
||||
<span class="tw-px-6 tw-text-gray-200 tw-flex-1 tw-text-left">
|
||||
<span class="tw-block">{{ session.title|default(slot.label)|default('TBA') }}</span>
|
||||
{% if session.speakers %}
|
||||
<span class="tw-block tw-mt-1">{{ session.speakers|join(', ') }}</span>
|
||||
{% endif %}
|
||||
</span>
|
||||
<span class="tw-px-6 tw-font-semibold">{{ slot.time }}</span>
|
||||
</span>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</div>
|
||||
</section>
|
11
2019/source/_includes/session-speakers.html.twig
Normal file
|
@ -0,0 +1,11 @@
|
|||
<h2>Speakers</h2>
|
||||
|
||||
<ul>
|
||||
{% for speaker in speakers %}
|
||||
<li>
|
||||
<a href="{{ speaker.url }}">
|
||||
{{ speaker.title }}
|
||||
</a>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
3
2019/source/_includes/speaker-role.html.twig
Normal file
|
@ -0,0 +1,3 @@
|
|||
{{ speaker.role }}
|
||||
{%- if speaker.role and speaker.organisation %}, {% endif %}
|
||||
{{ speaker.organisation }}
|
9
2019/source/_includes/speaker-session.html.twig
Normal file
|
@ -0,0 +1,9 @@
|
|||
{% for session in sessions %}
|
||||
{% if loop.first %}
|
||||
<h2 class="tw-mt-8">Session</h2>
|
||||
{% endif %}
|
||||
|
||||
<a href="{{ session.url }}">
|
||||
{{ session.title }}
|
||||
</a>
|
||||
{% endfor %}
|
38
2019/source/_includes/speakers.html.twig
Normal file
|
@ -0,0 +1,38 @@
|
|||
<section id="speakers" class="tw-w-full sm:tw-max-w-5xl tw-mx-auto tw-text-center tw-my-12 md:tw-my-24">
|
||||
<div class="tw-px-4">
|
||||
<h2 class="tw-text-3xl md:tw-text-4xl tw-font-bold tw-mb-10">The Speakers</h2>
|
||||
|
||||
<div class="text-left sm:tw-px-12">
|
||||
<ul class="tw-list-reset tw-flex tw-flex-wrap tw--mx-4 tw--mb-10">
|
||||
{% for speaker in speakers %}
|
||||
<li class="tw-w-full lg:tw-w-1/2 tw-flex tw-text-left tw-mb-10">
|
||||
<a href="{{ speaker.url }}" class="group tw-px-4 tw-flex-1 tw-flex tw-flex-row-reverse tw-justify-center tw-no-underline focus:tw-outline-none tw-py-2">
|
||||
<span class="tw-flex-1 tw-flex tw-flex-col tw-justify-center">
|
||||
<span class="tw-block tw-font-bold tw-text-xl tw-text-gray-900 group-hocus:tw-underline">{{ speaker.title }}</span>
|
||||
<span class="tw-block tw-text-gray-800">
|
||||
{% include 'speaker-role' with { speaker: speaker } %}
|
||||
</span>
|
||||
</span>
|
||||
|
||||
{% if speaker.image %}
|
||||
<span class="tw-w-24 md:tw-w-32 tw-mr-6">
|
||||
<span class="tw-rounded-full tw-overflow-hidden tw-block tw-border-4 tw-border-solid tw-border-purple-500 group-hocus:tw-border-pink-500 tw-transition-border tw-transition-100">
|
||||
<img class="tw-block tw-w-full" src="/images/speakers/{{ speaker.image }}" alt="Photo of {{ speaker.name }}">
|
||||
</span>
|
||||
</span>
|
||||
{% endif %}
|
||||
</a>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="tw-mt-12 tw-leading-relaxed">
|
||||
<p class="tw-text-lg">
|
||||
We’re currently in the process of announcing speakers.
|
||||
<br class="tw-hidden md:tw-inline">
|
||||
Check back soon to see who else has been added or <a class="tw-text-purple-600 hocus:tw-text-purple-700 hocus:tw-no-underline" href="{{ site.twitter.url }}">follow us on Twitter</a>.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
26
2019/source/_includes/sponsors-block.html.twig
Normal file
|
@ -0,0 +1,26 @@
|
|||
<section class="tw-text-center tw-max-w-5xl md:tw-w-full tw-mx-auto tw-p-8">
|
||||
<h2 class="tw-font-bold tw-text-4xl tw-mb-8">Our Sponsors</h2>
|
||||
|
||||
{% for level in sponsorshipLevels %}
|
||||
{% set sponsors = getSponsors(sponsorData, level) %}
|
||||
{% if sponsors %}
|
||||
<section class="tw-block tw-max-w-3xl tw-mx-auto">
|
||||
<h3 class="tw-visuallyhidden">{{ level|capitalize }} Sponsors</h3>
|
||||
|
||||
<ul class="tw-list-reset tw-flex tw-flex-wrap tw-items-center tw-justify-center tw--mx-4">
|
||||
{% for sponsor in sponsors %}
|
||||
<li class="tw-mb-6 {{ level == 'gold' ? 'tw-w-3/5 md:tw-w-1/3' : 'tw-w-1/2 md:tw-w-1/4' }}">
|
||||
<div class="tw-px-4 tw-mb-4">
|
||||
<img src="/images/sponsors/{{ sponsor.logo }}" alt="{{ sponsor.name }} logo" class="tw-inline-block tw-max-w-full">
|
||||
</div>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</section>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
|
||||
<footer class="tw-mt-4">
|
||||
<a class="tw-button tw-w-auto tw-py-2 tw-text-base tw-bg-green-600 hocus:tw-bg-pink-600" href="/sponsors">See all sponsors</a>
|
||||
</footer>
|
||||
</section>
|
25
2019/source/_includes/sponsors/full.html.twig
Normal file
|
@ -0,0 +1,25 @@
|
|||
<div class="tw-mb-4">
|
||||
<h3 class="tw-mb-5">{{ name }}</h3>
|
||||
|
||||
<div class="tw-flex tw-flex-col-reverse md:tw-flex-row-reverse tw--mx-4">
|
||||
<div class="tw-flex-1 tw-px-4">
|
||||
{% if description %}
|
||||
<div>
|
||||
{{ description|markdown }}
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% if url %}
|
||||
<a href="{{ url }}" class="tw-button tw-inline-block tw-w-auto tw-bg-purple-600 hocus:tw-bg-green-600 tw-text-base tw-px-4 tw-py-2 tw-mx-0 tw-mt-2">
|
||||
Visit <span class="tw-visuallyhidden">{{ name }}’s</span> website
|
||||
</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
{% if logo %}
|
||||
<div class="tw-flex-none tw-px-4 tw-mb-3 md:tw-mb-0 tw-w-full md:tw-w-1/4">
|
||||
<img src="/images/sponsors/{{ logo }}" alt="{{ name }} logo" class="tw-block tw-w-48 md:tw-w-auto tw-max-w-full">
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
9
2019/source/_includes/sponsors/teaser.html.twig
Normal file
|
@ -0,0 +1,9 @@
|
|||
<div class="tw-flex tw-flex-col tw-items-center tw-justify-center">
|
||||
<div>
|
||||
<img src="/images/sponsors/{{ logo }}" alt="{{ name }} logo" class="tw-max-w-full tw-w-full">
|
||||
</div>
|
||||
|
||||
<div class="tw-mt-1">
|
||||
<a href="{{ url }}">{{ name }}</a>
|
||||
</div>
|
||||
</div>
|
3
2019/source/_includes/update-text.html.twig
Normal file
|
@ -0,0 +1,3 @@
|
|||
<div class="tw-bg-black tw-font-bold tw-text-lg tw-text-white tw-text-center tw-p-4 tw-uppercase tw-mt-auto">
|
||||
{{ page.update_text }}
|
||||
</div>
|
24
2019/source/_layouts/app.html.twig
Normal file
|
@ -0,0 +1,24 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en" dir="ltr" prefix="content: http://purl.org/rss/1.0/modules/content/ dc: http://purl.org/dc/terms/ foaf: http://xmlns.com/foaf/0.1/ og: http://ogp.me/ns# rdfs: http://www.w3.org/2000/01/rdf-schema# schema: http://schema.org/ sioc: http://rdfs.org/sioc/ns# sioct: http://rdfs.org/sioc/types# skos: http://www.w3.org/2004/02/skos/core# xsd: http://www.w3.org/2001/XMLSchema# ">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="Generator" content="Drupal 8 (https://www.drupal.org)" />
|
||||
<meta name="MobileOptimized" content="width" />
|
||||
<meta name="HandheldFriendly" content="true" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<link rel="shortcut icon" href="/core/misc/favicon.ico" type="image/vnd.microsoft.icon" />
|
||||
<title>{% if page.title %}{{ page.title }} | {% endif %}{{ site.title }}</title>
|
||||
<link rel="stylesheet" href="/sites/default/files/css/css_3lBjB9LxWGvT5F_MnCGazkuov6eT9QNhKr0hGqtNWTk.css?osicsv" media="all" />
|
||||
<link rel="stylesheet" href="/sites/default/files/css/css_Vn8-2iqzJuEPqXgw0OVLQPx82pcc6QVkRoP0hW2MEWs.css?osicsv" media="all" />
|
||||
<link rel="stylesheet" href="/dist/app.css" media="all" />
|
||||
<link rel="stylesheet" href="//fonts.googleapis.com/css?family=Poppins:400,600,700" media="all" />
|
||||
<!--[if lte IE 8]>
|
||||
<script src="/sites/default/files/js/js_VtafjXmRvoUgAzqzYTA3Wrjkx9wcWhjP0G4ZnnqRamA.js"></script>
|
||||
<![endif]-->
|
||||
</head>
|
||||
<body class="path-frontpage">
|
||||
<div id="app">
|
||||
{% block body %}{% endblock %}
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
29
2019/source/_layouts/base.html.twig
Normal file
|
@ -0,0 +1,29 @@
|
|||
{% extends 'app' %}
|
||||
|
||||
{% block body %}
|
||||
<a href="#main-content" class="visually-hidden focusable skip-link">
|
||||
Skip to main content
|
||||
</a>
|
||||
<div class="tw-min-h-screen tw-flex tw-flex-col">
|
||||
{% include 'banner' %}
|
||||
|
||||
<div class="tw-flex tw-flex-col tw-flex-1">
|
||||
{% block content_wrapper %}
|
||||
{% block content %}{% endblock %}
|
||||
{% endblock %}
|
||||
|
||||
{% block content_botton %}{% endblock %}
|
||||
|
||||
{% if page.update_text %}
|
||||
{% include 'update-text' %}
|
||||
{% endif %}
|
||||
|
||||
{% block content_bottom %}{% endblock %}
|
||||
</div>
|
||||
|
||||
<div>
|
||||
{% block footer_top %}{% endblock %}
|
||||
{% include 'footer' %}
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
1
2019/source/_layouts/default.html.twig
Normal file
|
@ -0,0 +1 @@
|
|||
{% extends 'base' %}
|
21
2019/source/_layouts/page.html.twig
Normal file
|
@ -0,0 +1,21 @@
|
|||
{% extends 'base' %}
|
||||
|
||||
{% block content_wrapper %}
|
||||
<main class="tw-justify-start">
|
||||
<div class="tw-w-full tw-max-w-4xl tw-mx-auto tw-my-10">
|
||||
<div class="tw-px-4 xl:tw-px-0">
|
||||
<h1 class="tw-mt-0">
|
||||
{% block title %}{{ page.title }}{% endblock %}
|
||||
</h1>
|
||||
|
||||
{% block content_wrapper_inner %}
|
||||
<div class="markup">
|
||||
{% block content %}{% endblock %}
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
{% block content_bottom %}{% endblock %}
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
{% endblock %}
|
7
2019/source/_layouts/session.html.twig
Normal file
|
@ -0,0 +1,7 @@
|
|||
{% extends 'page' %}
|
||||
|
||||
{% block content_bottom %}
|
||||
{% include 'session-speakers' with {
|
||||
speakers: speakersForSession(page, data.speakers),
|
||||
} %}
|
||||
{% endblock %}
|
53
2019/source/_layouts/speaker.html.twig
Normal file
|
@ -0,0 +1,53 @@
|
|||
{% extends 'page' %}
|
||||
|
||||
{% block title %}{{ page.title }}{% endblock %}
|
||||
|
||||
{% block content_wrapper_inner %}
|
||||
<div class="md:tw-flex tw--mx-4">
|
||||
{% if page.image or page.links.twitter or page.links.drupalorg %}
|
||||
<div class="tw-px-4 tw-flex-0 tw-w-32 md:tw-w-48 tw-mb-4">
|
||||
{% if page.image %}
|
||||
<div class="tw-mb-4">
|
||||
<img class="tw-max-w-full tw-block tw-rounded-full tw-overflow-hidden tw-border-4 tw-border-solid tw-border-purple-500" src="/images/speakers/{{ page.image }}" alt="{{ page.name }}">
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% if page.links %}
|
||||
<div class="tw--mb-1">
|
||||
{% if page.links.drupalorg %}
|
||||
<div class="tw-pl-6 tw-mr-4 tw-bg-no-repeat tw-bg-left tw-mb-1" style="background-image: url(/themes/dcb2017/images/drop-1.png)">
|
||||
<a href="https://www.drupal.org/u/{{ page.links.drupalorg }}">{{ page.links.drupalorg }}</a>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% if page.links.twitter %}
|
||||
<div class="tw-pl-6 tw-mr-4 tw-bg-no-repeat tw-bg-left tw-mb-1" style="background-image: url(/themes/dcb2017/images/twitter-1.png)">
|
||||
<a href="https://twitter.com/{{ page.links.twitter }}">{{ page.links.twitter }}</a>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<div class="tw-px-4 tw-flex-1">
|
||||
<div class="markup">
|
||||
<div class="tw-font-bold tw-text-xl">
|
||||
{% include 'speaker-role' with { speaker: page } %}
|
||||
</div>
|
||||
|
||||
{% block content %}{% endblock %}
|
||||
|
||||
<div class="tw-mt-8 tw-block">
|
||||
<a class="tw-text-purple-500 hocus:tw-text-pink-600 tw-no-underline hocus:tw-underline" href="/#speakers">View all speakers →</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<aside>
|
||||
{% include 'speaker-session' with {
|
||||
sessions: sessionsForSpeaker(page, data.sessions),
|
||||
} %}
|
||||
</aside>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
8
2019/source/_redirects.html.twig
Normal file
|
@ -0,0 +1,8 @@
|
|||
---
|
||||
permalink: /_redirects
|
||||
---
|
||||
/cfp {{ site.cfp.url }}
|
||||
/speakers /#speakers
|
||||
/sponsorship /sponsor-us
|
||||
/submit-session {{ site.cfp.url }}
|
||||
/tickets {{ site.tickets.url }}
|
17
2019/source/_sessions/automate-repetitive-tasks-ansible.md
Normal file
|
@ -0,0 +1,17 @@
|
|||
---
|
||||
title: Automate to manage repetitive tasks with Ansible
|
||||
slot: 13
|
||||
speakers: [Daniel Pickering]
|
||||
use: [speakers]
|
||||
---
|
||||
Many people now blog as a keep safe of knowledge and to share. With Ansible you can automate these processes and still share the files. You can build custom command libraries I like to think of as a CLI for your specific use case with a set of commands to save time and being more productive.
|
||||
|
||||
Ansible is designed to be a quick and effective tool to help remove repetitive tasks.
|
||||
|
||||
If you have to do the same task more than once a year I’d recommend you create a script for it.
|
||||
|
||||
I feel that Ansible is really undered used by the drupal community and many tasks can be aided in completion by adding a little Ansible where needed.
|
||||
|
||||
Why repeat when you can automate.
|
||||
|
||||
I will give an overview of the ways it can be used and if we have time demonstrate some functionality of Ansible and why more people should use it.
|
9
2019/source/_sessions/dev-with-ddev.md
Normal file
|
@ -0,0 +1,9 @@
|
|||
---
|
||||
title: Dev with DDEV
|
||||
slot: 6
|
||||
speakers: [Alex Burrows]
|
||||
use: [speakers]
|
||||
---
|
||||
Local development is always tricky and complicated. Theres so many, from vagrant, docker or even just native. This session will show how to use ddev and get building in seconds not minutes.
|
||||
|
||||
Step by step setup and instruction on how, why and when to use ddev.
|
9
2019/source/_sessions/doing-good-with-drupal.md
Normal file
|
@ -0,0 +1,9 @@
|
|||
---
|
||||
title: Doing good with Drupal
|
||||
slot: 15
|
||||
speakers: [Matt Haworth]
|
||||
use: [speakers]
|
||||
---
|
||||
More and more charities and campaigners are choosing Drupal to create websites that raise funds, find supporters and deliver content and services to those who need it most.
|
||||
|
||||
This session covers two real world case studies that make a difference with Drupal with a high profile fundraising campaign and national charity. We’ll look at what to think about if you’re creating a website that does good, and some tips and tricks for using Drupal to do it along the way.
|
13
2019/source/_sessions/drupal-microservice-architecture.md
Normal file
|
@ -0,0 +1,13 @@
|
|||
---
|
||||
title: Drupal in a microservice architecture
|
||||
slot: 9
|
||||
speakers: [Phil Thomas, Ross Gratton]
|
||||
use: [speakers]
|
||||
---
|
||||
Migrating a monolithic Drupal 7 site to Drupal 8 was always going to be a tough project. Tough to sell to a client and tough to deliver. However, migrating from a monolithic architecture to a microservice architecture allowed us to upgrade from D7 to D8 and add significant value at the same time.
|
||||
|
||||
In this talk we will review the design decisions we made and the value we added to a specific project we delivered for one of our main clients. Specifically, we review how Drupal can be used as a 100% decoupled backend with an Angular frontend.
|
||||
|
||||
We will talk about the challenges and cover the specific role Drupal plays in a microservice environment, and how it interacts with the other applications sitting alongside it.
|
||||
|
||||
Finally we will describe the benefits of such an approach, and why that’s important to us.
|
11
2019/source/_sessions/real-state-of-drupal.md
Normal file
|
@ -0,0 +1,11 @@
|
|||
---
|
||||
title: The Real State of Drupal
|
||||
slot: 3
|
||||
speakers: [Dan McNamara]
|
||||
use: [speakers]
|
||||
---
|
||||
An honest account of the future of Drupal CMS.
|
||||
|
||||
The landscape in which Drupal operates is changing faster than ever: client expectations are changing; new technologies are emerging and new ways of working are being adopted. Drupal itself is adapting too.
|
||||
|
||||
I’ll be looking at the challenges ahead for Drupal and the community that supports it, but more excitingly, the opportunities that this new landscape will bring.
|
|
@ -0,0 +1,20 @@
|
|||
---
|
||||
title: How Microserve Used Story Point Estimation to Improve Profitability and Successfully Hit Project Deadlines
|
||||
slot: 7
|
||||
speakers: [Rick Donohoe]
|
||||
use: [speakers]
|
||||
---
|
||||
As the Head of Operations at Microserve, a key focus in my role is to improve agency profitability and project success.
|
||||
|
||||
In this talk I’ll dive into how we adopted “Story Point” estimation to achieve this, and show you how you can implement a better estimation process to see similar benefits.
|
||||
|
||||
The talk will go over:
|
||||
|
||||
- A slight bit of background to how this came about at Microserve
|
||||
- Explanation of Man Hours vs Story Points, and gauging how the audience understands and uses those already
|
||||
- Why Man Hours doesn’t work!
|
||||
- A walk through of how we use Story Points and how they can be used to determine what the teams ‘Sprint Velocity’ is, which can then be used to create actual monetary estimates based on science.
|
||||
- How we create Baseline Estimates at the start of the project when we have nothing to base it on
|
||||
- How we can use this technique to put better estimates to a whole large project
|
||||
- What to avoid for those who already have some understanding of the technique
|
||||
- Questions!
|
15
2019/source/_sessions/umami-demo-update.md
Normal file
|
@ -0,0 +1,15 @@
|
|||
---
|
||||
title: Drupal out of the box! The Umami Demo update.
|
||||
slot: 4
|
||||
speakers: [Keith Jay]
|
||||
use: [speakers]
|
||||
---
|
||||
The Umami Demo is now one of the installation options available to anyone taking Drupal for a test drive. The demo is a great example of the Drupal community working together to improve the user experience for those wanting to discover more about Drupal core’s capabilities and features. Join one of the initiative leads Keith Jay (kjay) to learn about the demo, our recent successes and some of our plans for the future.
|
||||
|
||||
This talk will cover:
|
||||
|
||||
- A little background on the initiative
|
||||
- A demo of the demo
|
||||
- Key features and challenges
|
||||
- New features for Drupal 8.7
|
||||
- Future plans
|
13
2019/source/_speakers/1-dan-mcnamara.md
Normal file
|
@ -0,0 +1,13 @@
|
|||
---
|
||||
title: Dan McNamara
|
||||
role: Managing Director
|
||||
organisation: Microserve
|
||||
image: dan-mcnamara.jpg
|
||||
links:
|
||||
drupalorg: danmcn
|
||||
twitter: DanMcN
|
||||
use: [sessions]
|
||||
---
|
||||
Dan has worked in strategic client service roles for some of the biggest and best digital agencies in London and Bristol.
|
||||
|
||||
Outside of work Dan mostly spends his time trying to keep up with his two young daughters, with varying degrees of success. He enjoys playing cricket and golf, despite being decidedly average at both.
|
9
2019/source/_speakers/2-matt-haworth.md
Normal file
|
@ -0,0 +1,9 @@
|
|||
---
|
||||
title: Matt Haworth
|
||||
role: Co-Founder
|
||||
organisation: Reason Digital
|
||||
image: matt-haworth.jpg
|
||||
links:
|
||||
twitter: acrim
|
||||
use: [sessions]
|
||||
---
|
10
2019/source/_speakers/3-daniel-pickering.md
Normal file
|
@ -0,0 +1,10 @@
|
|||
---
|
||||
title: Daniel Pickering
|
||||
role: Full Stack Developer
|
||||
organisation: Annertech
|
||||
image: daniel-pickering.jpg
|
||||
links:
|
||||
drupalorg: ikit-claw
|
||||
twitter: dclpuk
|
||||
use: [sessions]
|
||||
---
|
15
2019/source/_speakers/4-keith-jay.md
Normal file
|
@ -0,0 +1,15 @@
|
|||
---
|
||||
title: Keith Jay
|
||||
role: Managing Director
|
||||
organisation: Five Mile
|
||||
image: keith-jay.jpg
|
||||
links:
|
||||
drupalorg: kjay
|
||||
twitter: keithjay
|
||||
use: [sessions]
|
||||
---
|
||||
Keith runs a Drupal-focused agency based in Hampshire that has more than 10 years experience in using Drupal to deliver a broad range of client projects.
|
||||
|
||||
Inspired to join the work of the Drupal User Experience Initiative, the Five Mile team has been extensively involved in contributing to work on the Drupal core demo Umami, with Keith taking the up the role of Design Lead for the initiative.
|
||||
|
||||
Keith continues to co-maintain the Umami demo and in those rare moments when he’s not working on a Drupal project, you’ll find him fixing up something on his family’s 1977 VW camper.
|
15
2019/source/_speakers/5-rick-donohoe.md
Normal file
|
@ -0,0 +1,15 @@
|
|||
---
|
||||
title: Rick Donohoe
|
||||
role: Head of Operations
|
||||
organisation: Microserve
|
||||
image: rick.jpg
|
||||
links:
|
||||
drupalorg: rickdonohoe
|
||||
twitter: ~
|
||||
use: [sessions]
|
||||
---
|
||||
Rick is the Head of Operations at Microserve, a role which requires him to shape the agencies project processes and lead the project managing team. Rick started his career as web developer and is certified as both an Agile Scrum Master and an Acquia certified Drupal Site-Builder.
|
||||
|
||||
Rick also played a pivotal role in bringing Drupal Camp to Bristol, acting as Chair for the first two camps in 2015 and 2016.
|
||||
|
||||
Outside or work, he’s very active and loves all things outdoors - bonus points if it offers a few beers afterwards too! He’s a man of the seasons so in the summer, you can find him surfing and in the winter, he’ll be snowboarding in the Alps.
|
11
2019/source/_speakers/6-phil-thomas.md
Normal file
|
@ -0,0 +1,11 @@
|
|||
---
|
||||
title: Phil Thomas
|
||||
role: Head of Development
|
||||
organisation: Proctor + Stevenson
|
||||
image: phil-thomas.jpg
|
||||
links:
|
||||
drupalorg: ~
|
||||
twitter: pkht
|
||||
use: [sessions]
|
||||
---
|
||||
Currently Head of Development at Proctor + Stevenson in Bristol. With over 14 years’ industry experience for agencies in Australia and the UK, I have worked with a whole host of sectors and a varied range of clients – from small startups to global giants. I get particularly excited about APIs. Father of two, (very) amateur brewer and keen ultra-distance cyclist.
|
10
2019/source/_speakers/7-ross-gratton.md
Normal file
|
@ -0,0 +1,10 @@
|
|||
---
|
||||
title: Ross Gratton
|
||||
role: Head of Front End Development
|
||||
organisation: Proctor + Stevenson
|
||||
image: ross-gratton.jpg
|
||||
links:
|
||||
drupalorg: ~
|
||||
twitter: ~
|
||||
use: [sessions]
|
||||
---
|
15
2019/source/_speakers/8-alex-burrows.md
Normal file
|
@ -0,0 +1,15 @@
|
|||
---
|
||||
title: Alex Burrows
|
||||
role: Co-founder
|
||||
organisation: Digidrop
|
||||
image: alex-burrows.jpg
|
||||
links:
|
||||
drupalorg: aburrows
|
||||
twitter: aburrows
|
||||
use: [sessions]
|
||||
---
|
||||
Co-founder of Digidrop and we offer Drupal development, theming, consultation, server configuration, deployments and more.
|
||||
|
||||
Regularly I can be seen talking at Drupal events and attending them as well as London pub meets and sprints. As well as this I am a main organiser of Drupalcamp London since it began in 2013 and I’m now a Director of the Drupalcamp London CIC.
|
||||
|
||||
I am also the author of “Drupal 8 Blueprints” - <https://www.packtpub.com/web-development/drupal-8-blueprints>
|
BIN
2019/source/core/misc/favicon.ico
Normal file
After Width: | Height: | Size: 5.3 KiB |
BIN
2019/source/images/speakers/alex-burrows.jpg
Normal file
After Width: | Height: | Size: 24 KiB |
BIN
2019/source/images/speakers/dan-mcnamara.jpg
Normal file
After Width: | Height: | Size: 25 KiB |
BIN
2019/source/images/speakers/daniel-pickering.jpg
Normal file
After Width: | Height: | Size: 31 KiB |
BIN
2019/source/images/speakers/keith-jay.jpg
Normal file
After Width: | Height: | Size: 75 KiB |
BIN
2019/source/images/speakers/matt-haworth.jpg
Normal file
After Width: | Height: | Size: 36 KiB |
BIN
2019/source/images/speakers/phil-thomas.jpg
Normal file
After Width: | Height: | Size: 58 KiB |
BIN
2019/source/images/speakers/rick.jpg
Normal file
After Width: | Height: | Size: 19 KiB |
BIN
2019/source/images/speakers/ross-gratton.jpg
Normal file
After Width: | Height: | Size: 44 KiB |
BIN
2019/source/images/speakers/tom.jpg
Normal file
After Width: | Height: | Size: 14 KiB |
BIN
2019/source/images/sponsors/acquia.png
Normal file
After Width: | Height: | Size: 34 KiB |
BIN
2019/source/images/sponsors/drupalize-me.png
Normal file
After Width: | Height: | Size: 39 KiB |
BIN
2019/source/images/sponsors/microserve.png
Normal file
After Width: | Height: | Size: 6.9 KiB |
BIN
2019/source/images/sponsors/proctors.jpg
Normal file
After Width: | Height: | Size: 83 KiB |
1
2019/source/images/sponsors/tpx-manifesto.svg
Normal file
|
@ -0,0 +1 @@
|
|||
<svg viewBox="0 0 673 134" xmlns="http://www.w3.org/2000/svg"><title>Manifesto logo</title><g fill="none" fill-rule="evenodd" transform=""><path d="m106.5255 118.8477-45.203-45.203 45.203-45.203z" fill="#ff5e4d"></path><path d="m89.7435-.0004v45.203l22.602-22.601z" fill="#000a4a"></path><path d="m75.7611 133.295 22.603-22.602-22.603-22.601z" fill="#ffe000"></path><path d="m17.0923 37.9397v-23.81h9.014v-6.463h-26.106v6.463h9.014v23.81zm11.394 0h7.994v-11.82h6.42c3.401 0 6.065-.836 7.993-2.509 1.928-1.672 2.892-3.911 2.892-6.718 0-2.834-.95-5.08-2.849-6.739-1.9-1.658-4.578-2.487-8.036-2.487h-14.414zm7.994-17.773v-6.462h5.357c1.558 0 2.7.276 3.423.829.722.552 1.084 1.368 1.084 2.445 0 2.125-1.503 3.188-4.507 3.188zm46.897-12.5h-9.269l-6.675 9.184-6.548-9.184h-9.226l11.267 14.966-11.522 15.307h9.269l6.803-9.439 6.76 9.439h9.311l-11.565-15.307z" fill="#1d1d1b"></path><path d="m151.923 117.727h520.283v-19.202h-520.283z" fill="#575756"></path><g fill="#1d1d1b"><g transform="translate(151 17.295)"><path d="m52.9087 1.1681-18.951 38.148-19.04-38.148h-13.995v70.53h14.209v-41.099l14.03 26.738h9.61l13.923-26.738v41.099h14.209v-70.53zm133.744 0v43.188l-28.881-43.188h-12.675v70.53h14.208v-43.291l28.881 43.291h12.676v-70.53zm27.116 70.53h14.209v-70.53h-14.209zm75.091-58.257v-12.273h-47.975v70.53h14.209v-28.636h28.756v-12.273h-28.756v-17.348zm56.282 0v-12.273h-47.974v70.53h47.974v-12.272h-33.765v-17.158h28.756v-12.273h-28.756v-16.554zm64.894-12.273v12.273h19.022v58.257h14.227v-58.257h19.022v-12.273zm103.847 7.129c-5.099-4.954-11.357-7.733-19.647-7.733s-14.636 2.779-19.735 7.733c-7.363 7.129-7.167 15.949-7.167 28.136s-.196 21.008 7.167 28.137c5.099 4.954 11.445 7.715 19.735 7.715s14.548-2.761 19.647-7.715c7.363-7.129 7.273-15.95 7.273-28.137s.09-21.007-7.273-28.136zm-10.537 47.952c-2.032 2.279-5.205 3.764-9.11 3.764-3.886 0-7.166-1.485-9.216-3.764-2.764-2.969-3.477-6.248-3.477-19.816 0-13.585.713-16.847 3.477-19.816 2.05-2.279 5.33-3.78 9.216-3.78 3.905 0 7.078 1.501 9.11 3.78 2.764 2.969 3.584 6.231 3.584 19.816 0 13.568-.82 16.847-3.584 19.816z"></path><path d="m405.1992 50.9008c0-6.243-1.738-11.398-5.623-14.966-3.066-2.774-7.259-4.559-13.913-5.449l-8.6-1.19c-2.97-.397-5.325-1.488-6.758-2.775-1.535-1.388-2.15-3.271-2.15-5.054 0-4.856 3.686-8.921 11.263-8.921 4.812 0 10.34.595 14.944 4.857l8.997-8.617c-6.236-5.839-13.497-8.216-23.531-8.216-15.761 0-25.372 8.81-25.372 21.392 0 5.947 1.738 10.505 5.214 13.875 3.272 3.072 7.871 4.956 14.116 5.846l8.806 1.19c3.378.495 5.016 1.189 6.45 2.478 1.537 1.386 2.253 3.468 2.253 5.947 0 5.648-4.505 8.72-12.9 8.72-6.759 0-13-1.486-17.601-5.946l-9.203 8.915c7.159 7.029 15.542 9.304 26.599 9.304 15.252 0 27.009-7.719 27.009-21.39"></path></g><path d="m262.5266 18.4631h-11.142l-26.51 70.53h14.832l5.527-15.621h23.568v-.466l5.491 16.087h14.851zm-13.193 43.361 7.987-22.561 7.702 22.561z"></path></g></g></svg>
|
After Width: | Height: | Size: 2.8 KiB |
24
2019/source/index.md
Normal file
|
@ -0,0 +1,24 @@
|
|||
---
|
||||
layout: default
|
||||
twitter:
|
||||
url: https://twitter.com/drupalcampbris
|
||||
update_text: ~
|
||||
use: [sessions, speakers]
|
||||
---
|
||||
{% block content %}
|
||||
<div class="markup tw-w-full tw-max-w-2xl tw-mx-auto tw-my-12 tw-px-4" markdown="1">
|
||||
## DrupalCamp Bristol 2019 Cancelled
|
||||
|
||||
We’re incredibly sad to have to announce that we (the DrupalCamp Bristol organisational committee) have decided to cancel DrupalCamp Bristol 2019.
|
||||
|
||||
Our aim as a conference is to represent and appeal to the whole of the Drupal community. We set ourselves a high bar this year, in terms of attendee numbers and in the range and diversity of speakers and talks, and unfortunately we failed to reach that bar.
|
||||
|
||||
We have not taken this decision lightly, but we felt that cancelling rather than proceeding well below our own self-imposed standards was the right thing to do.
|
||||
|
||||
We want to say thank you to everyone who has been involved in DrupalCamp Bristol this year, especially to our sponsors - Acquia, Microserve, Proctor + Stevenson, Manifesto, and Drupalize.me, and to all of the speakers and volunteers who have given up their own time to be a part of DrupalCamp Bristol. We are extremely grateful for all your support and hard work.
|
||||
|
||||
We will be having a retrospective in the coming weeks to help us reflect on what we can learn from this year and what the future may hold for DrupalCamp Bristol.
|
||||
|
||||
If you have any questions, comments or feedback, please get in touch via {{ site.email }} or on Twitter <a href="{{ site.twitter.url }}">@{{ site.twitter.user }}</a>.
|
||||
</div>
|
||||
{% endblock %}
|
BIN
2019/source/sites/default/files/DCB 2019 - Sponsorship.pdf
Normal file
|
@ -0,0 +1,24 @@
|
|||
html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;}body{margin:0;}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block;}audio,canvas,progress,video{display:inline-block;vertical-align:baseline;}audio:not([controls]){display:none;height:0;}[hidden],template{display:none;}a{background-color:transparent;}a:active,a:hover{outline:0;}abbr[title]{border-bottom:1px dotted;}b,strong{font-weight:bold;}dfn{font-style:italic;}h1{font-size:2em;margin:0.67em 0;}mark{background:#ff0;color:#000;}small{font-size:80%;}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline;}sup{top:-0.5em;}sub{bottom:-0.25em;}img{border:0;}svg:not(:root){overflow:hidden;}figure{margin:1em 40px;}hr{box-sizing:content-box;height:0;}pre{overflow:auto;}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em;}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0;}button{overflow:visible;}button,select{text-transform:none;}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer;}button[disabled],html input[disabled]{cursor:default;}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0;}input{line-height:normal;}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0;}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto;}input[type="search"]{-webkit-appearance:textfield;box-sizing:content-box;}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none;}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em;}legend{border:0;padding:0;}textarea{overflow:auto;}optgroup{font-weight:bold;}table{border-collapse:collapse;border-spacing:0;}td,th{padding:0;}
|
||||
.ajax-progress{display:inline-block;padding:1px 5px 2px 5px;}[dir="rtl"] .ajax-progress{float:right;}.ajax-progress-throbber .throbber{background:transparent url(/core/themes/stable/images/core/throbber-active.gif) no-repeat 0px center;display:inline;padding:1px 5px 2px;}.ajax-progress-throbber .message{display:inline;padding:1px 5px 2px;}tr .ajax-progress-throbber .throbber{margin:0 2px;}.ajax-progress-bar{width:16em;}.ajax-progress-fullscreen{left:49%;position:fixed;top:48.5%;z-index:1000;background-color:#232323;background-image:url(/core/themes/stable/images/core/loading-small.gif);background-position:center center;background-repeat:no-repeat;border-radius:7px;height:24px;opacity:0.9;padding:4px;width:24px;}[dir="rtl"] .ajax-progress-fullscreen{left:auto;right:49%;}
|
||||
.text-align-left{text-align:left;}.text-align-right{text-align:right;}.text-align-center{text-align:center;}.text-align-justify{text-align:justify;}.align-left{float:left;}.align-right{float:right;}.align-center{display:block;margin-left:auto;margin-right:auto;}
|
||||
.js input.form-autocomplete{background-image:url(/core/themes/stable/images/core/throbber-inactive.png);background-position:100% center;background-repeat:no-repeat;}.js[dir="rtl"] input.form-autocomplete{background-position:0% center;}.js input.form-autocomplete.ui-autocomplete-loading{background-image:url(/core/themes/stable/images/core/throbber-active.gif);background-position:100% center;}.js[dir="rtl"] input.form-autocomplete.ui-autocomplete-loading{background-position:0% center;}
|
||||
.fieldgroup{border-width:0;padding:0;}
|
||||
.container-inline div,.container-inline label{display:inline;}.container-inline .details-wrapper{display:block;}
|
||||
.clearfix:after{content:"";display:table;clear:both;}
|
||||
.js details:not([open]) .details-wrapper{display:none;}
|
||||
.hidden{display:none;}.visually-hidden{position:absolute !important;clip:rect(1px,1px,1px,1px);overflow:hidden;height:1px;width:1px;word-wrap:normal;}.visually-hidden.focusable:active,.visually-hidden.focusable:focus{position:static !important;clip:auto;overflow:visible;height:auto;width:auto;}.invisible{visibility:hidden;}
|
||||
.item-list__comma-list,.item-list__comma-list li{display:inline;}.item-list__comma-list{margin:0;padding:0;}.item-list__comma-list li:after{content:", ";}.item-list__comma-list li:last-child:after{content:"";}
|
||||
.js .js-hide{display:none;}.js-show{display:none;}.js .js-show{display:block;}
|
||||
.nowrap{white-space:nowrap;}
|
||||
.position-container{position:relative;}
|
||||
.progress{position:relative;}.progress__track{background-color:#fff;border:1px solid;margin-top:5px;max-width:100%;min-width:100px;height:16px;}.progress__bar{background-color:#000;height:1.5em;width:3%;min-width:3%;max-width:100%;}.progress__description,.progress__percentage{color:#555;overflow:hidden;font-size:.875em;margin-top:0.2em;}.progress__description{float:left;}[dir="rtl"] .progress__description{float:right;}.progress__percentage{float:right;}[dir="rtl"] .progress__percentage{float:left;}.progress--small .progress__track{height:7px;}.progress--small .progress__bar{height:7px;background-size:20px 20px;}
|
||||
.reset-appearance{-webkit-appearance:none;-moz-appearance:none;appearance:none;border:0 none;background:transparent;padding:0;margin:0;line-height:inherit;}
|
||||
.resize-none{resize:none;}.resize-vertical{resize:vertical;min-height:2em;}.resize-horizontal{resize:horizontal;max-width:100%;}.resize-both{resize:both;max-width:100%;min-height:2em;}
|
||||
table.sticky-header{background-color:#fff;margin-top:0;z-index:500;top:0;}
|
||||
.system-status-counter__status-icon{display:inline-block;height:25px;width:25px;vertical-align:middle;}.system-status-counter__status-icon:before{content:"";background-size:20px;background-position:center 2px;background-repeat:no-repeat;display:block;}.system-status-counter__status-icon--error:before{background-image:url(/core/themes/stable/images/core/icons/e32700/error.svg);}.system-status-counter__status-icon--warning:before{background-image:url(/core/themes/stable/images/core/icons/e29700/warning.svg);}.system-status-counter__status-icon--checked:before{background-image:url(/core/themes/stable/images/core/icons/73b355/check.svg);}
|
||||
.system-status-report-counters__item{width:100%;padding:.5em 0;text-align:center;white-space:nowrap;background-color:rgba(0,0,0,0.063);margin-bottom:.5em;}@media screen and (min-width:60em){.system-status-report-counters{flex-wrap:wrap;display:flex;justify-content:space-between;}.system-status-report-counters__item--half-width{width:49%;}.system-status-report-counters__item--third-width{width:33%;}}
|
||||
.system-status-general-info__item{border:1px solid #ccc;margin-top:1em;padding:0 1em 1em;}.system-status-general-info__item-title{border-bottom:1px solid #ccc;}
|
||||
body.drag{cursor:move;}tr.region-title{font-weight:bold;}tr.region-message{color:#999;}tr.region-populated{display:none;}tr.add-new .tabledrag-changed{display:none;}.draggable a.tabledrag-handle{cursor:move;float:left;height:1.7em;margin-left:-1em;overflow:hidden;text-decoration:none;}[dir="rtl"] .draggable a.tabledrag-handle{float:right;margin-right:-1em;margin-left:0;}a.tabledrag-handle:hover{text-decoration:none;}a.tabledrag-handle .handle{background:url(/core/themes/stable/images/core/icons/787878/move.svg) no-repeat 6px 7px;height:14px;margin:-0.4em 0.5em 0;padding:0.42em 0.5em;width:14px;}a.tabledrag-handle:hover .handle,a.tabledrag-handle:focus .handle{background-image:url(/core/themes/stable/images/core/icons/000000/move.svg);}.touchevents .draggable td{padding:0 10px;}.touchevents .draggable .menu-item__link{display:inline-block;padding:10px 0;}.touchevents a.tabledrag-handle{height:44px;width:40px;}.touchevents a.tabledrag-handle .handle{background-position:40% 19px;height:21px;}[dir="rtl"] .touch a.tabledrag-handle .handle{background-position:right 40% top 19px;}.touchevents .draggable.drag a.tabledrag-handle .handle{background-position:50% -32px;}.tabledrag-toggle-weight-wrapper{text-align:right;}[dir="rtl"] .tabledrag-toggle-weight-wrapper{text-align:left;}.indentation{float:left;height:1.7em;margin:-0.4em 0.2em -0.4em -0.4em;padding:0.42em 0 0.42em 0.6em;width:20px;}[dir="rtl"] .indentation{float:right;margin:-0.4em -0.4em -0.4em 0.2em;padding:0.42em 0.6em 0.42em 0;}
|
||||
.tablesort{width:16px;height:16px;display:inline-block;background-size:100%;}.tablesort--asc{background-image:url(/core/themes/stable/images/core/icons/787878/twistie-down.svg);}.tablesort--desc{background-image:url(/core/themes/stable/images/core/icons/787878/twistie-up.svg);}
|
||||
div.tree-child{background:url(/core/themes/stable/images/core/tree.png) no-repeat 11px center;}div.tree-child-last{background:url(/core/themes/stable/images/core/tree-bottom.png) no-repeat 11px center;}[dir="rtl"] div.tree-child,[dir="rtl"] div.tree-child-last{background-position:-65px center;}div.tree-child-horizontal{background:url(/core/themes/stable/images/core/tree.png) no-repeat -11px center;}
|
||||
.views-align-left{text-align:left;}.views-align-right{text-align:right;}.views-align-center{text-align:center;}.views-view-grid .views-col{float:left;}.views-view-grid .views-row{clear:both;float:left;width:100%;}
|
|
@ -0,0 +1,4 @@
|
|||
/**
|
||||
* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed
|
||||
*/
|
||||
!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x<style>"+b+"</style>",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="<xyz></xyz>",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document);;
|
37
2019/source/sponsor-us.md
Normal file
|
@ -0,0 +1,37 @@
|
|||
---
|
||||
layout: page
|
||||
title: Sponsor Us
|
||||
---
|
||||
|
||||
## About DrupalCamp Bristol
|
||||
Following a fallow year in 2018, DrupalCamp Bristol is back, in a new one day format on the 28th June 2019.
|
||||
|
||||
2017’s Camp saw over a hundred people gather to hear industry leaders speak on a range of topics, ranging from beginners’ talks on how to find your way with Drupal 8 all the way up to scaling the platform to be suitable for large charities. The event received praise from delegates and impressive social media coverage.
|
||||
|
||||
With Drupal 8 adoption soaring, Drupal is being widely discussed and is high on the digital agenda. Simultaneously, Drupal developers’ skillsets are becoming more marketable as the core initiative takes advantage of exciting new web technologies. Drupal - and its community - has never been better-placed in the digital marketplace.
|
||||
|
||||
## Benefits of sponsoring
|
||||
By sponsoring DrupalCamp Bristol, your company will be recognised nationally as a supporter of Drupal and the wider open source community.
|
||||
|
||||
At every tier, you will enjoy high profile media exposure, marketing and advertising, as well as constant social media coverage, from the moment sponsorship is confirmed all the way to post-event thanks.
|
||||
|
||||
By sponsoring you can secure tickets to the conference, as recognition of your support for the community. You will have the chance to add your logo to merchandise and ensure your brand is seen by as many people as possible across the weekend.
|
||||
You will gain extensive exposure from various aspects of the DrupalCamp Bristol marketing activities, and will be positioned as leading organisations and supporters of the event and the Drupal community.
|
||||
|
||||
Sponsorship is an excellent way of boosting your company’s profile and marketing yourselves as pioneers in and supporters of the digital marketplace.
|
||||
|
||||
## Diversity ticketing
|
||||
Part of the sponsorship funds raised will go to securing tickets for underrepresented groups in tech.
|
||||
|
||||
## Sponsor document
|
||||
To see the full set of sponsorship tiers and benefits see the sponsor document here:
|
||||
|
||||
[Sponsor document](/sites/default/files/DCB%202019%20-%20Sponsorship.pdf)
|
||||
|
||||
|
||||
## Contact
|
||||
If you are interested in sponsoring this event, or if you have any questions regarding the sponsorship packages, please contact one of the DCB team:
|
||||
|
||||
Tom Metcalfe - main contact<br>
|
||||
Email: [tom@drupalcampbristol.co.uk](mailto:tom@drupalcampbristol.co.uk)<br>
|
||||
Phone: 07964 059 160
|
32
2019/source/sponsors.html.twig
Normal file
|
@ -0,0 +1,32 @@
|
|||
---
|
||||
layout: page
|
||||
title: Our Sponsors
|
||||
---
|
||||
<div>
|
||||
<p>DrupalCamp Bristol would like to say a massive <strong>THANK YOU!</strong> to all of our incredible sponsors. Without your support, this event would never have been possible.</p>
|
||||
<p>If you'd like to get involved with sponsorship, head over to our <a href="/sponsorship">Sponsorship</a> page. We'll be on the lookout for new sponsors up until the day of the event.</p>
|
||||
</div>
|
||||
|
||||
<div class="tw--mb-20">
|
||||
{% for level in site.sponsorship_levels %}
|
||||
{% set sponsors = getSponsors(site.sponsors, level) %}
|
||||
{% if sponsors %}
|
||||
<section class="tw-block tw-mb-24">
|
||||
<h2 class="tw-mb-6">{{ level ~ ' Sponsors'|capitalize }}</h2>
|
||||
<div class="tw--mb-8 {{ level == 'gold' ? '' : 'tw-flex tw-flex-wrap tw--mx-2' }}">
|
||||
{% for sponsor in sponsors %}
|
||||
<article class="tw-mb-12 {{ level == 'gold' ? 'tw-w-full' : 'tw-w-1/2 md:tw-w-1/4 lg:tw-w-1/6 tw-px-2' }}">
|
||||
{% set template = (level == 'gold') ? 'sponsors/full' : 'sponsors/teaser' %}
|
||||
{% include template with {
|
||||
description: sponsor.description,
|
||||
logo: sponsor.logo,
|
||||
name: sponsor.name,
|
||||
url: sponsor.url,
|
||||
} %}
|
||||
</article>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</section>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</div>
|
BIN
2019/source/themes/dcb2017/images/dcb-bg.jpg
Normal file
After Width: | Height: | Size: 52 KiB |
BIN
2019/source/themes/dcb2017/images/drop-1.png
Normal file
After Width: | Height: | Size: 922 B |
75
2019/source/themes/dcb2017/images/logo-with-dates.svg
Normal file
After Width: | Height: | Size: 22 KiB |
BIN
2019/source/themes/dcb2017/images/twitter-1.png
Normal file
After Width: | Height: | Size: 858 B |
73
2019/source/themes/dcb2017/logo.svg
Normal file
After Width: | Height: | Size: 14 KiB |
4
2019/src/Schedule/services.yml
Normal file
|
@ -0,0 +1,4 @@
|
|||
services:
|
||||
App\Schedule\TwigExtension\ScheduleExtension:
|
||||
tags:
|
||||
- { name: twig.extension }
|
|
@ -0,0 +1,17 @@
|
|||
<?php
|
||||
|
||||
namespace App\Schedule\DependencyInjection;
|
||||
|
||||
use Symfony\Component\DependencyInjection\ContainerBuilder;
|
||||
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
|
||||
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
|
||||
use Symfony\Component\Config\FileLocator;
|
||||
|
||||
class SculpinScheduleExtension extends Extension
|
||||
{
|
||||
public function load(array $configs, ContainerBuilder $container)
|
||||
{
|
||||
$loader = new YamlFileLoader($container, new FileLocator(__DIR__ . '/../../'));
|
||||
$loader->load('services.yml');
|
||||
}
|
||||
}
|
30
2019/src/Schedule/src/Model/Session.php
Normal file
|
@ -0,0 +1,30 @@
|
|||
<?php
|
||||
|
||||
namespace App\Schedule\Model;
|
||||
|
||||
use Tightenco\Collect\Support\Collection;
|
||||
|
||||
class Session
|
||||
{
|
||||
private $data;
|
||||
|
||||
public function __construct($data)
|
||||
{
|
||||
$this->data = $data;
|
||||
}
|
||||
|
||||
public function getSlot(): int
|
||||
{
|
||||
return (int) $this->data['slot'];
|
||||
}
|
||||
|
||||
public function getTitle(): string
|
||||
{
|
||||
return $this->data['title'];
|
||||
}
|
||||
|
||||
public function getSpeakers(): Collection
|
||||
{
|
||||
return collect($this->data['speakers']);
|
||||
}
|
||||
}
|
9
2019/src/Schedule/src/SculpinScheduleBundle.php
Normal file
|
@ -0,0 +1,9 @@
|
|||
<?php
|
||||
|
||||
namespace App\Schedule;
|
||||
|
||||
use Symfony\Component\HttpKernel\Bundle\Bundle;
|
||||
|
||||
class SculpinScheduleBundle extends Bundle
|
||||
{
|
||||
}
|
29
2019/src/Schedule/src/TwigExtension/ScheduleExtension.php
Normal file
|
@ -0,0 +1,29 @@
|
|||
<?php
|
||||
|
||||
namespace App\Schedule\TwigExtension;
|
||||
|
||||
use App\Schedule\Model\Session;
|
||||
use Twig\Extension\AbstractExtension;
|
||||
use Twig\TwigFunction;
|
||||
|
||||
class ScheduleExtension extends AbstractExtension
|
||||
{
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getFunctions()
|
||||
{
|
||||
return [
|
||||
new TwigFunction('sessionInSlot', [$this, 'getSessionInSlot']),
|
||||
];
|
||||
}
|
||||
|
||||
public function getSessionInSlot(int $slotId, array $sessions): ?Session
|
||||
{
|
||||
return collect($sessions)->map(function ($session): ?Session {
|
||||
return new Session($session);
|
||||
})->first(function (?Session $session) use ($slotId): bool {
|
||||
return $session->getSlot() == $slotId;
|
||||
});
|
||||
}
|
||||
}
|
38
2019/src/Schedule/tests/ScheduleTest.php
Normal file
|
@ -0,0 +1,38 @@
|
|||
<?php
|
||||
|
||||
namespace App\Tests\Schedule;
|
||||
|
||||
use App\Schedule\Model\Session;
|
||||
use App\Schedule\TwigExtension\ScheduleExtension;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
class ScheduleTest extends TestCase
|
||||
{
|
||||
/**
|
||||
* @var \App\Schedule\TwigExtension\ScheduleExtension
|
||||
*/
|
||||
private $extension;
|
||||
|
||||
protected function setUp(): void
|
||||
{
|
||||
parent::setUp();
|
||||
|
||||
$this->extension = new ScheduleExtension();
|
||||
}
|
||||
|
||||
/** @test */
|
||||
public function get_a_session_for_a_slot()
|
||||
{
|
||||
$sessions = [
|
||||
['title' => 'The Real State of Drupal', 'slot' => 4],
|
||||
['title' => 'Using Ansible for automation', 'slot' => 1],
|
||||
['title' => 'Introduction to Views', 'slot' => 3],
|
||||
['title' => 'Doing Good with Drupal', 'slot' => 2],
|
||||
];
|
||||
|
||||
$session = $this->extension->getSessionInSlot(3, $sessions);
|
||||
|
||||
$this->assertInstanceOf(Session::class, $session);
|
||||
$this->assertSame('Introduction to Views', $session->getTitle());
|
||||
}
|
||||
}
|
4
2019/src/Speakers/services.yml
Normal file
|
@ -0,0 +1,4 @@
|
|||
services:
|
||||
App\Speakers\TwigExtension\SpeakersExtension:
|
||||
tags:
|
||||
- { name: twig.extension }
|
|
@ -0,0 +1,17 @@
|
|||
<?php
|
||||
|
||||
namespace App\Speakers\DependencyInjection;
|
||||
|
||||
use Symfony\Component\DependencyInjection\ContainerBuilder;
|
||||
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
|
||||
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
|
||||
use Symfony\Component\Config\FileLocator;
|
||||
|
||||
class SculpinSpeakersExtension extends Extension
|
||||
{
|
||||
public function load(array $configs, ContainerBuilder $container)
|
||||
{
|
||||
$loader = new YamlFileLoader($container, new FileLocator(__DIR__ . '/../../'));
|
||||
$loader->load('services.yml');
|
||||
}
|
||||
}
|
9
2019/src/Speakers/src/SculpinSpeakersBundle.php
Normal file
|
@ -0,0 +1,9 @@
|
|||
<?php
|
||||
|
||||
namespace App\Speakers;
|
||||
|
||||
use Symfony\Component\HttpKernel\Bundle\Bundle;
|
||||
|
||||
class SculpinSpeakersBundle extends Bundle
|
||||
{
|
||||
}
|
56
2019/src/Speakers/src/TwigExtension/SpeakersExtension.php
Normal file
|
@ -0,0 +1,56 @@
|
|||
<?php
|
||||
|
||||
namespace App\Speakers\TwigExtension;
|
||||
|
||||
use Twig\Extension\AbstractExtension;
|
||||
use Twig\TwigFunction;
|
||||
|
||||
class SpeakersExtension extends AbstractExtension
|
||||
{
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getFunctions()
|
||||
{
|
||||
return [
|
||||
new TwigFunction('speakersForSession', [$this, 'getSessionSpeakers']),
|
||||
new TwigFunction('sessionsForSpeaker', [$this, 'getSpeakerSessions']),
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the speakers for a session.
|
||||
*
|
||||
* @param array|object $session
|
||||
* @param array $speakers
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getSessionSpeakers($session, array $speakers): array
|
||||
{
|
||||
return collect($speakers)
|
||||
->filter(function ($speaker) use ($session): bool {
|
||||
return collect($session['speakers'])->contains($speaker['title']);
|
||||
})
|
||||
->values()
|
||||
->toArray();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the sessions for a speaker.
|
||||
*
|
||||
* @param array|object $speaker
|
||||
* @param array $sessions
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getSpeakerSessions($speaker, array $sessions): array
|
||||
{
|
||||
return collect($sessions)
|
||||
->filter(function ($session) use ($speaker): bool {
|
||||
return collect($session['speakers'])->contains($speaker['title']);
|
||||
})
|
||||
->values()
|
||||
->toArray();
|
||||
}
|
||||
}
|
73
2019/src/Speakers/tests/SpeakerTest.php
Normal file
|
@ -0,0 +1,73 @@
|
|||
<?php
|
||||
|
||||
namespace App\Tests\Speakers;
|
||||
|
||||
use App\Speakers\TwigExtension\SpeakersExtension;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
class SpeakerTest extends TestCase
|
||||
{
|
||||
/**
|
||||
* @var \App\Speakers\TwigExtension\SpeakersExtension
|
||||
*/
|
||||
private $extension;
|
||||
|
||||
protected function setUp(): void
|
||||
{
|
||||
parent::setUp();
|
||||
|
||||
$this->extension = new SpeakersExtension();
|
||||
}
|
||||
|
||||
/** @test */
|
||||
public function get_sessions_for_a_speaker()
|
||||
{
|
||||
$speaker = ['title' => 'Oliver Davies'];
|
||||
|
||||
$sessions = [
|
||||
['title' => 'Introduction to Views', 'speakers' => ['Tom Metcalfe']],
|
||||
['title' => 'Test Driven Drupal', 'speakers' => ['Oliver Davies']],
|
||||
];
|
||||
|
||||
$sessions = $this->extension->getSpeakerSessions($speaker, $sessions);
|
||||
|
||||
$this->assertCount(1, $sessions);
|
||||
$this->assertSame('Test Driven Drupal', $sessions[0]['title']);
|
||||
}
|
||||
|
||||
/** @test */
|
||||
public function get_speakers_for_a_session()
|
||||
{
|
||||
$speakers = [
|
||||
['title' => 'Oliver Davies'],
|
||||
['title' => 'Phil Thomas'],
|
||||
['title' => 'Tom Metcalfe'],
|
||||
['title' => 'Ross Gratton'],
|
||||
['title' => 'Dan McNamara'],
|
||||
];
|
||||
|
||||
$session1 = [
|
||||
'title' => 'Drupal in a microservice savannah',
|
||||
'speakers' => [
|
||||
'Phil Thomas',
|
||||
'Ross Gratton',
|
||||
],
|
||||
];
|
||||
|
||||
$session2 = [
|
||||
'title' => 'The Real State of Drupal',
|
||||
'speakers' => ['Dan McNamara'],
|
||||
];
|
||||
|
||||
tap($this->extension->getSessionSpeakers($session1, $speakers), function (array $speakers) {
|
||||
$this->assertCount(2, $speakers);
|
||||
$this->assertSame('Phil Thomas', $speakers[0]['title']);
|
||||
$this->assertSame('Ross Gratton', $speakers[1]['title']);
|
||||
});
|
||||
|
||||
tap($this->extension->getSessionSpeakers($session2, $speakers), function (array $speakers) {
|
||||
$this->assertCount(1, $speakers);
|
||||
$this->assertSame('Dan McNamara', $speakers[0]['title']);
|
||||
});
|
||||
}
|
||||
}
|
4
2019/src/Sponsors/services.yml
Normal file
|
@ -0,0 +1,4 @@
|
|||
services:
|
||||
App\Sponsors\TwigExtension\SponsorsExtension:
|
||||
tags:
|
||||
- { name: twig.extension }
|
|
@ -0,0 +1,20 @@
|
|||
<?php
|
||||
|
||||
namespace App\Sponsors\DependencyInjection;
|
||||
|
||||
use Symfony\Component\DependencyInjection\ContainerBuilder;
|
||||
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
|
||||
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
|
||||
use Symfony\Component\Config\FileLocator;
|
||||
|
||||
class SculpinSponsorsExtension extends Extension
|
||||
{
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function load(array $configs, ContainerBuilder $container)
|
||||
{
|
||||
$loader = new YamlFileLoader($container, new FileLocator(__DIR__ . '/../../'));
|
||||
$loader->load('services.yml');
|
||||
}
|
||||
}
|
33
2019/src/Sponsors/src/Model/Sponsor.php
Normal file
|
@ -0,0 +1,33 @@
|
|||
<?php
|
||||
|
||||
namespace App\Sponsors\Model;
|
||||
|
||||
class Sponsor
|
||||
{
|
||||
const LEVEL_GOLD = 'gold';
|
||||
const LEVEL_SILVER = 'silver';
|
||||
const LEVEL_BRONZE = 'bronze';
|
||||
|
||||
/** @var array */
|
||||
private $data = [];
|
||||
|
||||
private function __construct(array $sponsorData)
|
||||
{
|
||||
$this->data = $sponsorData;
|
||||
}
|
||||
|
||||
public static function create(array $sponsorData): self
|
||||
{
|
||||
return new static($sponsorData);
|
||||
}
|
||||
|
||||
public function isConfirmed(): bool
|
||||
{
|
||||
return $this->data['confirmed'] ?? false;
|
||||
}
|
||||
|
||||
public function getData(): array
|
||||
{
|
||||
return $this->data;
|
||||
}
|
||||
}
|
9
2019/src/Sponsors/src/SculpinSponsorsBundle.php
Normal file
|
@ -0,0 +1,9 @@
|
|||
<?php
|
||||
|
||||
namespace App\Sponsors;
|
||||
|
||||
use Symfony\Component\HttpKernel\Bundle\Bundle;
|
||||
|
||||
class SculpinSponsorsBundle extends Bundle
|
||||
{
|
||||
}
|
34
2019/src/Sponsors/src/TwigExtension/SponsorsExtension.php
Normal file
|
@ -0,0 +1,34 @@
|
|||
<?php
|
||||
|
||||
namespace App\Sponsors\TwigExtension;
|
||||
|
||||
use App\Sponsors\Model\Sponsor;
|
||||
use Twig\Extension\AbstractExtension;
|
||||
use Twig\TwigFunction;
|
||||
|
||||
class SponsorsExtension extends AbstractExtension
|
||||
{
|
||||
public function getName()
|
||||
{
|
||||
return 'app.sponsors';
|
||||
}
|
||||
|
||||
public function getFunctions()
|
||||
{
|
||||
return [
|
||||
new TwigFunction('getSponsors', [$this, 'getSponsors'])
|
||||
];
|
||||
}
|
||||
|
||||
public function getSponsors(array $sponsorData, string $level): array
|
||||
{
|
||||
return collect($sponsorData[$level])
|
||||
->map(function ($sponsor) {
|
||||
return Sponsor::create($sponsor);
|
||||
})
|
||||
->filter->isConfirmed()
|
||||
->map->getData()
|
||||
->values()
|
||||
->toArray();
|
||||
}
|
||||
}
|
54
2019/src/Sponsors/tests/SponsorsTest.php
Normal file
|
@ -0,0 +1,54 @@
|
|||
<?php
|
||||
|
||||
namespace App\Tests\Sponsors;
|
||||
|
||||
use App\Sponsors\Model\Sponsor;
|
||||
use App\Sponsors\TwigExtension\SponsorsExtension;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
class SponsorsTest extends TestCase
|
||||
{
|
||||
/** @var SponsorsExtension */
|
||||
private $extension;
|
||||
|
||||
protected function setUp(): void
|
||||
{
|
||||
parent::setUp();
|
||||
|
||||
$this->extension = new SponsorsExtension();
|
||||
}
|
||||
|
||||
/** @test */
|
||||
public function get_sponsors_by_level()
|
||||
{
|
||||
$data = [
|
||||
Sponsor::LEVEL_GOLD => [
|
||||
['name' => 'Microserve', 'confirmed' => true],
|
||||
],
|
||||
Sponsor::LEVEL_SILVER => [
|
||||
['name' => 'Drupalize.me', 'confirmed' => true],
|
||||
],
|
||||
];
|
||||
|
||||
$sponsors = $this->extension->getSponsors($data, Sponsor::LEVEL_SILVER);
|
||||
|
||||
$this->assertCount(1, $sponsors);
|
||||
$this->assertSame('Drupalize.me', $sponsors[0]['name']);
|
||||
}
|
||||
|
||||
/** @test */
|
||||
public function only_confirmed_sponsors_are_returned()
|
||||
{
|
||||
$data = [
|
||||
Sponsor::LEVEL_GOLD => [
|
||||
['name' => 'Acquia', 'confirmed' => false],
|
||||
['name' => 'Microserve', 'confirmed' => true],
|
||||
],
|
||||
];
|
||||
|
||||
$sponsors = $this->extension->getSponsors($data, Sponsor::LEVEL_GOLD);
|
||||
|
||||
$this->assertCount(1, $sponsors);
|
||||
$this->assertSame('Microserve', $sponsors[0]['name']);
|
||||
}
|
||||
}
|
34
2019/tailwind.config.js
Normal file
|
@ -0,0 +1,34 @@
|
|||
const { variants } = require('tailwindcss/defaultConfig')
|
||||
const { spacing } = require('tailwindcss/defaultTheme')
|
||||
|
||||
module.exports = {
|
||||
prefix: 'tw-',
|
||||
important: true,
|
||||
theme: {
|
||||
extend: {
|
||||
colors: {
|
||||
black: '#000',
|
||||
'green-600': '#0fa877',
|
||||
'pink-600': '#ec16a8',
|
||||
'purple-600': '#b33ee9'
|
||||
}
|
||||
}
|
||||
},
|
||||
variants: {
|
||||
backgroundColor: [...variants.backgroundColor, 'hocus'],
|
||||
borderColor: [...variants.textColor, 'hocus', 'group-hocus'],
|
||||
fontStyle: [...variants.fontStyle, 'hocus'],
|
||||
textColor: [...variants.textColor, 'hocus'],
|
||||
textDecoration: [...variants.textColor, 'hocus', 'group-hocus']
|
||||
},
|
||||
corePlugins: {
|
||||
preflight: false
|
||||
},
|
||||
plugins: [
|
||||
require('tailwindcss-interaction-variants')(),
|
||||
require('tailwindcss-list-reset')(),
|
||||
require('tailwindcss-spaced-items')({ values: spacing }),
|
||||
require('tailwindcss-transitions')(),
|
||||
require('tailwindcss-visuallyhidden')()
|
||||
]
|
||||
}
|
20
2019/webpack.mix.js
Normal file
|
@ -0,0 +1,20 @@
|
|||
let mix = require('laravel-mix')
|
||||
|
||||
require('laravel-mix-purgecss')
|
||||
|
||||
mix.disableNotifications()
|
||||
.postCss('resources/css/app.css', 'source/dist', [
|
||||
require('tailwindcss')(),
|
||||
require('postcss-nested')(),
|
||||
])
|
||||
.browserSync({
|
||||
proxy: 'localhost:8000',
|
||||
notify: false,
|
||||
open: false,
|
||||
files: [
|
||||
'output_*/**/*'
|
||||
]
|
||||
})
|
||||
.purgeCss({
|
||||
folders: ['output_*', 'resources']
|
||||
})
|