building a drupal 8 theme with new-fangled awesomeness

85
Building a Drupal 8 Theme with new-fangled awesomeness

Upload: marc-drummond

Post on 07-Nov-2014

329 views

Category:

Technology


1 download

DESCRIPTION

About a year ago, I started feeling overwhelmed with all the changes to front-end development. I understood HTML and CSS, responsive design made sense, but then everybody started grunting and gulping, and frankly I got a little scared. Wasn't Bower the arch-enemy of Mario and Luigi? Combine that with all the changes to Drupal 8, and it's pretty easy to feel overwhelmed. Everybody else knows what all these new things are, right? I'm the only one in the dark? What made me most nervous was not even knowing what all these terms mean. Once I had a basic grasp of a concept, it felt a lot less intimidating. So what I'd like to share with you is a Drupal 8 base theme I'm developing that uses some of these new techniques. I'm not going to explain to you the details of how to implement every single new technique out there, but will try to explain what some of these new tools are without making too many assumptions of what you might know. I will walk you through the structure of a Drupal 8 theme that makes use of new front end techniques, so you can see what does what and get some ideas of what you'd like to learn next. My goal with this theme is to make use of Brad Frost's atomic design principles: essentially component based design. I'm setting up this theme to integrate with Pattern Lab, a prototyping tool that we'll also set up to work as a living style guide. Styles are managed with Sass and synced with Pattern Lab using Grunt, a task manager. The theme makes use of a number of great Sass tools like Breakpoint and the Susy grid framework. We'll also take a look at the Twig templates new to Drupal 8, as well as some of the other theme files specific to Drupal 8. I hope that I'll learn from you too. If we have time during Q and A, you can share some modern techniques you'd like to see in a new Drupal theme. There's a good chance I'll be working on the theme during sprints, so if you'd like to help pitch in, I'd be glad for the assistance. This theme will be featured in my upcoming book: Drupal 8 Responsive Web Design. My goal is for us all to leave the session feeling that while we may have to learn, we have a handle on what front end techniques look interesting and useful to investigate further. When my session finishes, my goal is for attendees to leave the room more familiar with the files they are likely to see in a Drupal 8 theme, and what each of them does. Similarly, attendees should have a greater familiar with the some of the newer techniques and tools they might encounter in a Drupal 8 base theme.

TRANSCRIPT

Page 1: Building a Drupal 8 theme with new-fangled awesomeness

B u i l d i n g a D r u p a l 8 T h e m ew i t h n e w - f a n g l e d a w e s o m e n e s s

Page 2: Building a Drupal 8 theme with new-fangled awesomeness

M a r c D r u m m o n d ( & I z z y )@ M a r c D r u m m o n d m d r u m m o n d

I R C & d r u p a l . o r gm a r c d r u m m o n d . c o m

Page 3: Building a Drupal 8 theme with new-fangled awesomeness

P a c k t P u b l i s h i n g

I’m writing a book!Drupal 8 Responsive Web Design

P h o t o b y J a l a l H a m e e d B h a t t i , F l i c k r

Page 4: Building a Drupal 8 theme with new-fangled awesomeness

S u r p r i s e !T h e r e a r e n e w t h i n g s i n D r u p a l 8 ( a n d f r o n t - e n d i n g e n e r a l )

P h o t o b y M i c h e l l e Tr i b e , F l i c k r

Page 5: Building a Drupal 8 theme with new-fangled awesomeness

– M e . ( A n d e v e r y o n e e l s e )

“I get totally overwhelmed by all the new things. I feel like I know nothing.”

P h o t o b y A n d r é s Þó r, F l i c k r

Page 6: Building a Drupal 8 theme with new-fangled awesomeness

A r e a n y o f t h e s e t h i n g s u n f a m i l i a r ?• i n f o . y m l • G i t • C o m p o s e r • D r u s h • Tw i g • H a n d l e b a r s • M u s t a c h e • W e b

c o m p o n e n t s • H A M L • l i b r a r i e s . y m l • A s s e t i c • c o n f i g . r b • B o o t s t r a p • F o u n d a t i o n • W e b S t a r t e r

K i t • Z e n G r i d s • S i n g u l a r i t y • S u s y • r e q u i r e . j s • C o f f e e S c r i p t

• A M D • C o m m o n J S • B a c k b o n e • U n d e r s c o r e . j s • E m b e r • A n g u l a r • R u b y • R V M • B u n d l e r • G e m f i l e • G e m f i l e . l o c k • B o w e r • b o w e r. j s o n • N o d e • n p m • p a c k a g e . j s o n • C o m p o s e r • c o m p o s e r. j s o n • A c q u i a D e v

D e s k t o p • M A M P • H o m e b r e w

• Va g r a n t • D o c k e r • C h e f • P u p p e t • Ye o m a n • G r u n t • G r u n t f i l e . j s • G u l p • G u l p f i l e . j s • L i n t • c s s l i n t • j s h i n t • e s l i n t • u g l i f y j s • A u t o p r e f i x e r • i m a g e o p t i m • G r u n t i c o n • S t y l e

P r o t o t y p e s • P a t t e r n L a b • K S S • T D D

• B D D • B e h a t • C a s p e r. j s • B r o w s e r S t a c k • W r a i t h • P a g e r e s • S e l e n i u m • P h a n t o m J S • S l i m e r J S • J e n k i n s • Tr a v i s C I

I t ’s o k .

Page 7: Building a Drupal 8 theme with new-fangled awesomeness

L e t ’s s t a r t w i t h t h e m e s .S o w h a t i s a t h e m e ?

P h o t o b y B o a - F r a n c , F l i c k r

Page 8: Building a Drupal 8 theme with new-fangled awesomeness

I s t h a t y o u r f i n a l a n s w e r ?

Yo u r t h e m e

• H T M L • C S S • J S • M e d i a ( i m a g e s )

P h o t o b y D a v e M a l k o f f , F l i c k r

Page 9: Building a Drupal 8 theme with new-fangled awesomeness

– D r u p a l t h e m e f i l e s

“All your YML and PHP belongs to us.”

Page 10: Building a Drupal 8 theme with new-fangled awesomeness

T h e m e f i l e sT h e m e I ’ m w o r k i n g o n : A t o m i c

a t o m i c . i n f o . y m l a t o m i c . l i b r a r i e s . y m l a t o m i c . t h e m e b o w e r. j s o n c o n f i g i n s t a l l a t o m i c . s e t t i n g s . y m l s c h e m a a t o m i c . s c h e m a . y m l c o n f i g . r b c s s g r u n t f i l e . j s i m a g e s j s p a c k a g e . j s o n s a s s t e m p l a t e s h t m l . h t m l . t w i g t h e m e - s e t t i n g s . p h p !!

Page 11: Building a Drupal 8 theme with new-fangled awesomeness

T H E M E . i n f o . y m lT h e m e i n f o r m a t i o n a n d s e t t i n g s

P h o t o b y C h r i s t i a n O s t ro s k y, F l i c k r

Page 12: Building a Drupal 8 theme with new-fangled awesomeness

T H E M E . i n f o . y m lT h e m e i n f o r m a t i o n a n d s e t t i n g s

n a m e : ' A t o m i c ' t y p e : t h e m e e n g i n e : t w i g d e s c r i p t i o n : ' B a s e t h e m e b a s e d o n a t o m i c d e s i g n p r i n c i p l e s . ' c o r e : 8 . x s t y l e s h e e t s : a l l : - c s s / s t y l e s . c s s r e g i o n s : c o n t e n t : C o n t e n t h e l p : H e l p p a g e _ t o p : ' P a g e t o p ' p a g e _ b o t t o m : ' P a g e b o t t o m ' s i d e b a r _ f i r s t : ' F i r s t s i d e b a r ' s i d e b a r _ s e c o n d : ' S e c o n d s i d e b a r ’ f o o t e r : ‘ f o o t e r ’ s e t t i n g s : a t o m i c _ t y p e k i t _ i d : ' 0 ' a t o m i c _ t y p e k i t _ a d v a n c e d : f a l s e

Page 13: Building a Drupal 8 theme with new-fangled awesomeness

T H E M E . i n f o . y m lT h e m e i n f o r m a t i o n a n d s e t t i n g s

n a m e : ' A t o m i c ' t y p e : t h e m e e n g i n e : t w i g d e s c r i p t i o n : ' B a s e t h e m e b a s e d o n a t o m i c d e s i g n p r i n c i p l e s . ' c o r e : 8 . x r e g i o n s : c o n t e n t : C o n t e n t h e l p : H e l p p a g e _ t o p : ' P a g e t o p ' p a g e _ b o t t o m : ' P a g e b o t t o m ' s i d e b a r _ f i r s t : ' F i r s t s i d e b a r ' s i d e b a r _ s e c o n d : ' S e c o n d s i d e b a r ’ f o o t e r : ‘ f o o t e r ’ b r e a k p o i n t s : n a r r o w : n a m e : n a r r o w l a b e l : n a r r o w m e d i a Q u e r y : ' ( m i n - w i d t h : 5 6 0 p x ) ' w e i g h t : 1 m u l t i p l i e r s : 1 x : 1 x 2 x : 2 x w i d e : n a m e : w i d e l a b e l : w i d e m e d i a Q u e r y : ' ( m i n - w i d t h : 8 5 1 p x ) ' w e i g h t : 2 m u l t i p l i e r s : 1 x : 1 x 2 x : 2 x

Page 14: Building a Drupal 8 theme with new-fangled awesomeness

t h e m e - s e t t i n g s . p h pT h e m e s e t t i n g s

P h o t o b y C h a r l e s R o f f e y, F l i c k r

Page 15: Building a Drupal 8 theme with new-fangled awesomeness

t h e m e - s e t t i n g s . p h pT h e m e s e t t i n g s

< ? p h p / * * * I m p l e m e n t s h o o k _ f o r m _ s y s t e m _ t h e m e _ s e t t i n g s _ a l t e r ( ) f u n c t i o n . * * @ p a r a m $ f o r m * N e s t e d a r r a y o f f o r m e l e m e n t s t h a t c o m p r i s e t h e f o r m . * @ p a r a m $ f o r m _ s t a t e * A k e y e d a r r a y c o n t a i n i n g t h e c u r r e n t s t a t e o f t h e f o r m . * / f u n c t i o n a t o m i c _ f o r m _ s y s t e m _ t h e m e _ s e t t i n g s _ a l t e r ( & $ f o r m , $ f o r m _ s t a t e ) { ! / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / M i s c e l a n e o u s / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / ! $ f o r m [ ' t y p o g r a p h y ' ] = a r r a y ( ' # t y p e ' = > ' f i e l d s e t ' , ' # t i t l e ' = > t ( ' Ty p o g r a p h y ' ) , ' # d e s c r i p t i o n ' = > t ( ' Ty p o g r a p h y s e t t i n g s f o r y o u r t h e m e . ' ) , ' # c o l l a p s i b l e ' = > FA L S E , ' # c o l l a p s e d ' = > FA L S E ) ; !

Page 16: Building a Drupal 8 theme with new-fangled awesomeness

t h e m e - s e t t i n g s . p h pT h e m e s e t t i n g s

! $ f o r m [ ' t y p o g r a p h y ' ] [ ' a t o m i c _ t y p e k i t _ i d ' ] = a r r a y ( ' # t y p e ' = > ' t e x t f i e l d ' , ' # t i t l e ' = > t ( ' Ty p e k i t K i t I D ' ) , ' # d e f a u l t _ v a l u e ' = > t h e m e _ g e t _ s e t t i n g ( ' a t o m i c _ t y p e k i t _ i d ' ) , ' # s i z e ' = > 7 , ' # m a x l e n g t h ' = > 7 , ' # d e s c r i p t i o n ' = > t ( ' I f y o u a r e u s i n g < a h r e f = " ! l i n k " t a r g e t = " _ b l a n k " > Ty p e k i t < /a > t o s e r v e w e b f o n t s , p u t y o u r Ty p e k i t K i t I D h e r e . ' , a r r a y ( ' ! l i n k ' = > ' h t t p s : / /t y p e k i t . c o m / ' ) ) , ) ; ! $ f o r m [ ' t y p o g r a p h y ' ] [ ' a t o m i c _ t y p e k i t _ a d v a n c e d ' ] = a r r a y ( ' # t y p e ' = > ' b o o l e a n ' , ' # t i t l e ' = > t ( ' A d v a n c e d Ty p e k i t E m b e d ' ) , ' # d e f a u l t _ v a l u e ' = > t h e m e _ g e t _ s e t t i n g ( ' a t o m i c _ t y p e k i t _ a d v a n c e d ' ) , ' # d e s c r i p t i o n ' = > t ( ' T h i s t u r n s o n t h e < a h r e f = " ! l i n k " t a r g e t = " _ b l a n k " > a d v a n c e d Ty p e k i t e m b e d < / a > . ' , a r r a y ( ' ! l i n k ' = > ' h t t p : / /h e l p . t y p e k i t . c o m / c u s t o m e r / p o r t a l / a r t i c l e s / 6 4 9 3 3 6 - e m b e d - c o d e ' ) ) , ) ; !}

Page 17: Building a Drupal 8 theme with new-fangled awesomeness

T H E M E . s e t t i n g s . y m lS e t t i n g s f i l e s

P h o t o b y C h r i s t i a n O s t r o s k y, F l i c k r

Page 18: Building a Drupal 8 theme with new-fangled awesomeness

T H E M E . s e t t i n g s . y m lS e t t i n g s f i l e s

a t o m i c _ t y p e k i t _ i d : ' 0 ' a t o m i c _ t y p e k i t _ a d v a n c e d : f a l s e

Page 19: Building a Drupal 8 theme with new-fangled awesomeness

T H E M E . s c h e m a . y m lS e t t i n g s c h e m a f i l e s

P h o t o b y P e t e r L e e , F l i c k r

Page 20: Building a Drupal 8 theme with new-fangled awesomeness

T H E M E . s c h e m a . y m lS e t t i n g s c h e m a f i l e s

# S c h e m a f o r t h e c o n f i g u r a t i o n f i l e s o f t h e A t o m i c t h e m e . !a t o m i c . s e t t i n g s : t y p e : t h e m e _ s e t t i n g s l a b e l : ' A t o m i c s e t t i n g s ' m a p p i n g : a t o m i c _ t y p e k i t _ i d : t y p e : s t r i n g l a b e l : ' Ty p e k i t I D ' a t o m i c _ t y p e k i t _ a d v a n c e d : t y p e : b o o l e a n l a b e l : ' U s e Ty p e k i t a d v a n c e d e m b e d '

Page 21: Building a Drupal 8 theme with new-fangled awesomeness

o t h e r. s t u f f . y m lT h e m e c o n f i g d e f a u l t s

P h o t o b y J u s t i n d e l a O r n e l l a s , F l i c k r

Page 22: Building a Drupal 8 theme with new-fangled awesomeness

o t h e r. s t u f f . y m lT h e m e c o n f i g d e f a u l t s

i d : t h e m e . b a r t i k . b a r t i k n a m e : b a r t i k l a b e l : B a r t i k b r e a k p o i n t _ i d s : - t h e m e . b a r t i k . m o b i l e - t h e m e . b a r t i k . n a r r o w - t h e m e . b a r t i k . w i d e s o u r c e : b a r t i k s o u r c e Ty p e : t h e m e s t a t u s : t r u e l a n g c o d e : e n

Page 23: Building a Drupal 8 theme with new-fangled awesomeness

H o w d o D r u p a l 8 t h e m e s w o r k w i t h … ?

• H T M L • C S S • J a v a S c r i p t

L e t ’ s l o o k a t …

Page 24: Building a Drupal 8 theme with new-fangled awesomeness

H T M L Tu r n i n g d a t a i n t o m a r k u p

P h o t o b y A d r i a n , F l i c k r

Page 25: Building a Drupal 8 theme with new-fangled awesomeness

T H E M E . t h e m eT h e m e f u n c t i o n s & p r e p r o c e s s

P h o t o b y S u n o v a S u r f b o a rd s , F l i c k r

Page 26: Building a Drupal 8 theme with new-fangled awesomeness

T H E M E . t h e m eT h e m e f u n c t i o n s & p r e p r o c e s s

< ? p h p !/ * * * I m p l e m e n t s h o o k _ p r e p r o c e s s _ h t m l ( ) * / !!f u n c t i o n a t o m i c _ p r e p r o c e s s _ h t m l ( & $ v a r s ) { ! / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / A d d i n Ty p e K i t C o d e . / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / i f ( t h e m e _ g e t _ s e t t i n g ( ' a t o m i c _ t y p e k i t _ i d ' ) ) { $ v a r s [ ' k i t _ i d ' ] = t h e m e _ g e t _ s e t t i n g ( ' a t o m i c _ t y p e k i t _ i d ' ) ; } }

Page 27: Building a Drupal 8 theme with new-fangled awesomeness

T E M P L AT E . h t m l . t w i gTw i g : Te m p l a t e s t h a t m a k e s e n s e

P h o t o b y S c o t t M o o re , F l i c k r

Page 28: Building a Drupal 8 theme with new-fangled awesomeness

Tw i g : Te m p l a t e s t h a t m a k e s e n s e

< ! D O C T Y P E h t m l > < h t m l { { h t m l _ a t t r i b u t e s } } > < h e a d > { { p a g e . h e a d } } < t i t l e > { { h e a d _ t i t l e } } < / t i t l e > { { p a g e . s t y l e s } } { { p a g e . s c r i p t s } } < / h e a d > < b o d y { { a t t r i b u t e s } } > < a h r e f = " # m a i n - c o n t e n t " c l a s s = " v i s u a l l y - h i d d e n f o c u s a b l e s k i p - l i n k " > { { ' S k i p t o m a i n c o n t e n t ' | t } } < / a > { { p a g e _ t o p } } { { p a g e . c o n t e n t } } { { p a g e _ b o t t o m } } { { p a g e . s c r i p t s ( ' f o o t e r ' ) } } < / b o d y > < / h t m l >

h t m l . h t m l . t w i g

Page 29: Building a Drupal 8 theme with new-fangled awesomeness

Tw i g : Te m p l a t e s t h a t m a k e s e n s e< ! D O C T Y P E h t m l > < h t m l { { h t m l _ a t t r i b u t e s } } > < h e a d > { % i f k i t _ i d % } { % i f k i t _ a d v a n c e d % } < s c r i p t t y p e = " t e x t / j a v a s c r i p t " > ( f u n c t i o n ( d ) { v a r c o n f i g = { k i t I d : ' { { k i t _ i d } } ' , s c r i p t T i m e o u t : 3 0 0 0 } , h = d . d o c u m e n t E l e m e n t , t = s e t T i m e o u t ( f u n c t i o n ( ){ h . c l a s s N a m e = h . c l a s s N a m e . r e p l a c e ( / \ b w f - l o a d i n g \ b / g , " " ) + " w f -i n a c t i v e " ; } , c o n f i g . s c r i p t T i m e o u t ) , t k = d . c r e a t e E l e m e n t ( " s c r i p t " ) , f = f a l s e , s = d . g e t E l em e n t s B y Ta g N a m e ( " s c r i p t " ) [ 0 ] , a ; h . c l a s s N a m e + = " w f - l o a d i n g " ; t k . s r c = ' / /u s e . t y p e k i t . n e t / ' + c o n f i g . k i t I d+ ' . j s ' ; t k . a s y n c = t r u e ; t k . o n l o a d = t k . o n r e a d y s t a t e c h a n g e = f u n c t i o n ( ){ a = t h i s . r e a d y S t a t e ; i f ( f | | a & & a ! = " c o m p l e t e " & & a != " l o a d e d " ) r e t u r n ; f = t r u e ; c l e a r T i m e o u t ( t ) ; t r y { Ty p e k i t . l o a d ( c o n f i g ) } c a t c h ( e ){ } } ; s . p a r e n t N o d e . i n s e r t B e f o r e ( t k , s ) } ) ( d o c u m e n t ) ; < / s c r i p t > { % e l s e % } < s c r i p t t y p e = " t e x t / j a v a s c r i p t " s r c = " / / u s e . t y p e k i t . n e t / { { k i t _ i d } } . j s " > < /s c r i p t > < s c r i p t t y p e = " t e x t / j a v a s c r i p t " > t r y { Ty p e k i t . l o a d ( ) ; } c a t c h ( e ) { } < / s c r i p t > { % e n d i f % } { % e n d i f % } { { p a g e . h e a d } }

Page 30: Building a Drupal 8 theme with new-fangled awesomeness

Tw i g : Te m p l a t e s t h a t m a k e s e n s e

n o d e . h t m l . t w i g< a r t i c l e { { a t t r i b u t e s } } > ! { { t i t l e _ p r e f i x } } { % i f n o t p a g e % } < h 2 { { t i t l e _ a t t r i b u t e s } } > < a h r e f = " { { u r l } } " r e l = " b o o k m a r k " > { { l a b e l } } < / a > < / h 2 > { % e n d i f % } { { t i t l e _ s u f f i x } } !< / a r t i c l e >

Page 31: Building a Drupal 8 theme with new-fangled awesomeness

Tw i g : Te m p l a t e s t h a t m a k e s e n s e

n o d e . h t m l . t w i g{ % s e t a d d _ c l a s s e s = [ ' n o d e ' , ' n o d e - - t y p e - ' ~ n o d e . b u n d l e , n o d e . p r o m o t e d ? ' n o d e - - p r o m o t e d ' , n o d e . s t i c k y ? ' n o d e - - s t i c k y ' , n o t n o d e . p u b l i s h e d ? ' n o d e - - u n p u b l i s h e d ' , ' n o d e - - v i e w - m o d e - ' ~ v i e w _ m o d e , p r e v i e w ? ' n o d e — p r e v i e w ' ] % } !< a r t i c l e { { a t t r i b u t e s . a d d C l a s s ( a d d _ c l a s s e s ) } } > { { t i t l e _ p r e f i x } } { % i f n o t p a g e % } < h 2 { { t i t l e _ a t t r i b u t e s } } > < a h r e f = " { { u r l } } " r e l = " b o o k m a r k " > { { l a b e l } } < / a > < / h 2 > { % e n d i f % } { { t i t l e _ s u f f i x } } !< / a r t i c l e >

Page 32: Building a Drupal 8 theme with new-fangled awesomeness

O t h e r t e m p l a t i n g t o o l s• H a n d l e b a r s • M u s t a c h e • W e b c o m p o n e n t s • H A M L

P s s t …

Page 33: Building a Drupal 8 theme with new-fangled awesomeness

C S S / J S a s s e t sM a n a g i n g s t y l e s h e e t s a n d s c r i p t s

P h o t o b y R i c y m a r P h o t o g r a p h y, F l i c k r

Page 34: Building a Drupal 8 theme with new-fangled awesomeness

T H E M E . l i b r a r i e s . y m lM a n a g i n g d e p e n d e n c i e s f o r C S S a n d J S

P h o t o b y S a m a n t h a M a r x , F l i c k r

Page 35: Building a Drupal 8 theme with new-fangled awesomeness

a t o m i c . l i b r a r i e s . y m lM a n a g i n g d e p e n d e n c i e s f o r C S S a n d J S

b a s e : v e r s i o n : V E R S I O N c s s : t h e m e : c s s / s t y l e s . c s s : { } c s s / p r i n t . c s s : { m e d i a : p r i n t } m a i n t e n a n c e _ p a g e : v e r s i o n : V E R S I O N c s s : t h e m e : c s s / m a i n t e n a n c e - p a g e . c s s : { } d e p e n d e n c i e s : - s y s t e m / m a i n t e n a n c e

Page 36: Building a Drupal 8 theme with new-fangled awesomeness

A s s e t i cTo o l f o r m a n a g i n g C S S a n d J S

P h o t o b y M o r k i R o , F l i c k r

Page 37: Building a Drupal 8 theme with new-fangled awesomeness

J a v a S c r i p t a l l t h e t h i n g sN o t j u s t j Q u e r y a n y m o r e

Page 38: Building a Drupal 8 theme with new-fangled awesomeness

J S t o o l s• M o d e r n i z r • U n d e r s c o r e • C o f f e e S c r i p t

Page 39: Building a Drupal 8 theme with new-fangled awesomeness

F u n w i t h J S f r a m e w o r k s• B a c k b o n e • E m b e r • A n g u l a r

( M V C f o r J a v a s c r i p t )

Page 40: Building a Drupal 8 theme with new-fangled awesomeness

J S m o d u l e l o a d e r s• A M D • C o m m o n J S

J S s c r i p t l o a d e r s• r e q u i r e . j s • c u r l . j s

Page 41: Building a Drupal 8 theme with new-fangled awesomeness

C S S f o r f u n a n d p r o f i tS a s s , C o m p a s s a n d m o r e

P h o t o b y I s m a e l C e l i s , F l i c k r

Page 42: Building a Drupal 8 theme with new-fangled awesomeness

c o n f i g . r bC o m p a s s c o n f i g u r a t i o n

P h o t o b y S u n o v a S u r f b o a rd s , F l i c k r

Page 43: Building a Drupal 8 theme with new-fangled awesomeness

c o n f i g . r bC o m p a s s c o n f i g u r a t i o n

# R e q u i r e a n y a d d i t i o n a l c o m p a s s p l u g i n s h e r e . r e q u i r e ' c o m p a s s / i m p o r t - o n c e / a c t i v a t e ' r e q u i r e ' c o m p a s s - n o r m a l i z e ' r e q u i r e ' t o o l k i t ' r e q u i r e ' b r e a k p o i n t ' r e q u i r e ' s u s y ' r e q u i r e ' m o d u l a r- s c a l e ' r e q u i r e ' c o l o r- s c h e m e r ' r e q u i r e ' s a s s y - b u t t o n s ' !# D e f a u l t t o d e v e l o p m e n t i f e n v i r o n m e n t i s n o t s e t . s a v e d = e n v i r o n m e n t i f ( e n v i r o n m e n t . n i l ? ) e n v i r o n m e n t = : d e v e l o p m e n t e l s e e n v i r o n m e n t = s a v e d e n d !# I n d e v e l o p m e n t , t u r n o n t h e F i r e S a s s - c o m p a t i b l e d e b u g _ i n f o b y d e f a u l t . f i r e s a s s = ( e n v i r o n m e n t = = : d e v e l o p m e n t ) ? t r u e : f a l s e !# L o c a t i o n o f t h e t h e m e ' s r e s o u r c e s .

Page 44: Building a Drupal 8 theme with new-fangled awesomeness

c o n f i g . r bC o m p a s s c o n f i g u r a t i o n

# L o c a t i o n o f t h e t h e m e ' s r e s o u r c e s . c s s _ d i r = " c s s " s a s s _ d i r = " s a s s " i m a g e s _ d i r = " i m a g e s " j a v a s c r i p t s _ d i r = " j s " !o u t p u t _ s t y l e = ( e n v i r o n m e n t = = : d e v e l o p m e n t ) ? : e x p a n d e d : : c o m p r e s s e d r e l a t i v e _ a s s e t s = t r u e !# C o n d i t i o n a l l y e n a b l e l i n e c o m m e n t s w h e n i n d e v e l o p m e n t m o d e . l i n e _ c o m m e n t s = ( e n v i r o n m e n t = = : d e v e l o p m e n t ) ? t r u e : f a l s e s a s s _ o p t i o n s = ( e n v i r o n m e n t = = : d e v e l o p m e n t & & f i r e s a s s = = t r u e ) ? { : d e b u g _ i n f o = > t r u e } : { }

Page 45: Building a Drupal 8 theme with new-fangled awesomeness

C S S A r c h i t e c t u r e• O O C S S • B E M • S M A C S S

Page 46: Building a Drupal 8 theme with new-fangled awesomeness

C S S A r c h i t e c t u r e/ * * * P r o g r e s s B a r c o m p o n e n t * / . p r o g r e s s { } . p r o g r e s s _ _ t r a c k { } . p r o g r e s s _ _ b a r { } . p r o g r e s s _ _ d e s c r i p t i o n { } . p r o g r e s s _ _ c a n c e l { } . p r o g r e s s _ _ c a n c e l : f o c u s , . p r o g r e s s _ _ c a n c e l : h o v e r { } / * * * P r o g r e s s B a r s m a l l v a r i a n t * / . p r o g r e s s - - s m a l l . p r o g r e s s _ _ t r a c k { } . p r o g r e s s - - s m a l l . p r o g r e s s _ _ b a r { } . p r o g r e s s - - s m a l l . p r o g r e s s _ _ c a n c e l { }

Page 47: Building a Drupal 8 theme with new-fangled awesomeness

C S S F r a m e w o r k s• B o o t s t r a p • F o u n d a t i o n • G u m b y • W e b S t a r t e r K i t

Page 48: Building a Drupal 8 theme with new-fangled awesomeness

G r i d F r a m e w o r k s• Z e n G r i d s • S u s y • S i n g u l a r i t y

N e w C S S l a y o u t t o o l s• F l e x b o x • R e g i o n s • G r i d s

Page 49: Building a Drupal 8 theme with new-fangled awesomeness

S a s s y G e m s• B r e a k p o i n t • To o l k i t • M o d u l a r S c a l e • C o l o r S c h e m e r • S a s s y b u t t o n s

Page 50: Building a Drupal 8 theme with new-fangled awesomeness

L e t ’s t a l k t o o l sB u t w a i t , t h e r e ’s m o r e !

P h o t o b y O Z i n O H , F l i c k r

Page 51: Building a Drupal 8 theme with new-fangled awesomeness

To o l s y o u p r o b a b l y w a n t t o u s e

• C o m m a n d l i n e • G i t • C o m p o s e r • D r u s h

( I t ’ s n o t a l l t h a t s c a r y. R e a l l y. )

Page 52: Building a Drupal 8 theme with new-fangled awesomeness

L e a n o n m e …M a n a g i n g d e p e n d e n c i e s a n d p a c k a g e s

P h o t o b y M a r i n , F l i c k r

Page 53: Building a Drupal 8 theme with new-fangled awesomeness

C o m p o s e r• c o m p o s e r. j s o n

P H P

Page 54: Building a Drupal 8 theme with new-fangled awesomeness

{ " n a m e " : " d r u p a l / d r u p a l " , " d e s c r i p t i o n " : " D r u p a l i s a n o p e n s o u r c e c o n t e n t m a n a g e m e n t p l a t f o r m p o w e r i n g m i l l i o n s o f w e b s i t e s a n d a p p l i c a t i o n s . " , " t y p e " : " d r u p a l - c o r e " , " l i c e n s e " : " G P L - 2 . 0 + " , " r e q u i r e " : { " p h p " : " > = 5 . 4 . 2 " , " s d b o y e r / g l i p h " : " 0 . 1 . * " , " s y m f o n y / c l a s s - l o a d e r " : " 2 . 4 . * " , " s y m f o n y / c s s - s e l e c t o r " : " 2 . 4 . * " , " s y m f o n y / d e p e n d e n c y - i n j e c t i o n " : " 2 . 4 . * " , " s y m f o n y / e v e n t - d i s p a t c h e r " : " 2 . 4 . * " , " s y m f o n y / h t t p - f o u n d a t i o n " : " 2 . 4 . * " , " s y m f o n y / h t t p - k e r n e l " : " 2 . 4 . * " , " s y m f o n y / r o u t i n g " : " 2 . 4 . * " , " s y m f o n y / s e r i a l i z e r " : " 2 . 4 . * " , " s y m f o n y / v a l i d a t o r " : " 2 . 4 . * " , " s y m f o n y / y a m l " : " d e v -m a s t e r # e 4 9 a 4 7 d 6 0 3 4 8 6 6 5 2 6 1 f 6 e 2 7 9 b a 3 8 3 2 4 1 d e b 7 3 c a b " , " t w i g / t w i g " : " 1 . 1 5 . * " , " d o c t r i n e / c o m m o n " : " d e v -

c o m p o s e r. j s o n

Page 55: Building a Drupal 8 theme with new-fangled awesomeness

m a s t e r # a 4 5 d 1 1 0 f 7 1 c 3 2 3 e 2 9 f 4 1 e b 0 6 9 6 f a 2 3 0 e 3 f a 1 b 1 b 5 " , " d o c t r i n e / a n n o t a t i o n s " : " d e v -m a s t e r # 4 6 3 d 9 2 6 a 8 d c c 4 9 2 7 1 c b 7 d b 5 a 0 8 3 6 4 a 7 0 e d 6 e 3 c d 3 " , " g u z z l e h t t p / g u z z l e " : " 4 . 1 . * " , " k r i s w a l l s m i t h / a s s e t i c " : " 1 . 1 . * @ a l p h a " , " s y m f o n y - c m f / r o u t i n g " : " 1 . 1 . * @ a l p h a " , " e a s y r d f / e a s y r d f " : " 0 . 8 . * " , " p h p u n i t / p h p u n i t " : " 4 . 1 . * " , " p h p u n i t / p h p u n i t - m o c k - o b j e c t s " : " d e v -m a s t e r # e 6 0 b b 9 2 9 c 5 0 a e 4 2 3 7 a a f 6 8 0 a 4 f 6 7 7 3 f 4 e e 1 7 f 0 a 2 " , " z e n d f r a m e w o r k / z e n d - f e e d " : " 2 . 2 . * " } , " a u t o l o a d " : { " p s r- 4 " : { " D r u p a l \ \ C o r e \ \ " : " c o r e / l i b / D r u p a l / C o r e " , " D r u p a l \ \ C o m p o n e n t \ \ " : " c o r e / l i b / D r u p a l / C o m p o n e n t " , " D r u p a l \ \ D r i v e r \ \ " : " d r i v e r s / l i b / D r u p a l / D r i v e r " } , " f i l e s " : [ " c o r e / l i b / D r u p a l . p h p " ] } ,

c o m p o s e r. j s o n

Page 56: Building a Drupal 8 theme with new-fangled awesomeness

B o w e r• b o w e r. j s o n

F r o n t - e n d

Page 57: Building a Drupal 8 theme with new-fangled awesomeness

{ " n a m e " : " a t o m i c " , " v e r s i o n " : " 0 . 0 . 0 " , " i g n o r e " : [ " * * / . * " , " n o d e _ m o d u l e s " , " b o w e r _ c o m p o n e n t s " ] , " d e p e n d e n c i e s " : { " e q . j s " : " ~ 1 . 4 . 1 " , " f o r m a l i z e " : " g i t : / / g i t h u b . c o m / n a t h a n s m i t h / f o r m a l i z e " } }

b o w e r. j s o n

Page 58: Building a Drupal 8 theme with new-fangled awesomeness

n p m• p a c k a g e . j s o n

N o d e

Page 59: Building a Drupal 8 theme with new-fangled awesomeness

{ " n a m e " : " d e p o t " , " v e r s i o n " : " 0 . 0 . 0 " , " d e p e n d e n c i e s " : { } , " d e v D e p e n d e n c i e s " : { " c o m p a s s - o p t i o n s " : " ^ 0 . 1 . 1 " , " g r u n t " : " ~ 0 . 4 . 0 " , " g r u n t - c o n t r i b - w a t c h " : " ~ 0 . 4 . 3 " , " g r u n t - c o n t r i b - c o m p a s s " : " ~ 0 . 2 . 0 " , " g r u n t - c o n t r i b - j s h i n t " : " ^ 0 . 1 0 . 0 " , " g r u n t - c o n t r i b - u g l i f y " : " ~ 0 . 2 . 0 " , " g r u n t - c o n t r i b - i m a g e m i n " : " ~ 0 . 1 . 4 " , " g r u n t - p a r a l l e l " : " ~ 0 . 1 . 0 " , " g r u n t - s v g m i n " : " ~ 0 . 1 . 0 " , " g r u n t - c o n t r i b - c o p y " : " ~ 0 . 4 . 1 " , " g r u n t - s h e l l " : " ^ 0 . 7 . 0 " }

p a c k a g e . j s o n

Page 60: Building a Drupal 8 theme with new-fangled awesomeness

R u b y e n v i r o n m e n t• R V M • r b e n v

B u n d l e r : R u b y g e m s• G e m f i l e • G e m f i l e . l o c k

R u b y

Page 61: Building a Drupal 8 theme with new-fangled awesomeness

s o u r c e ' h t t p : / / r u b y g e m s . o r g ' !g e m ' s a s s ' , ' ~ > 3 . 3 . 0 ' g e m ' b r e a k p o i n t ' , ' ~ > 2 . 4 . 0 ' g e m ' s u s y ' , ' ~ > 2 . 1 . 2 ' g e m ' t o o l k i t ' , ' ~ > 2 . 5 . 0 ' g e m ' m o d u l a r- s c a l e ' , ' ~ > 2 . 0 . 4 ' g e m ' c o l o r- s c h e m e r ' , ' ~ > 0 . 2 . 8 ' g e m ' c o m p a s s ' , ' ~ > 1 . 0 . 0 . a l p h a . 1 7 ' g e m ' c o m p a s s - n o r m a l i z e ' , ' ~ > 1 . 5 ' g e m ' s a s s y - b u t t o n s ' , ' ~ > 0 . 2 . 6 '

G e m f i l e

Page 62: Building a Drupal 8 theme with new-fangled awesomeness

D e v e n v i r o n m e n t t o o l sS e t t i n g u p a l o c a l s e r v e r, m a n a g e l a n g u a g e s , e t c .

P h o t o b y G re y l o c h , F l i c k r

Page 63: Building a Drupal 8 theme with new-fangled awesomeness

D e v e n v i r o n m e n t t o o l s• M A M P / W A M P / L A M P / X A M P P • A c q u i a D e v D e s k t o p • H o m e b r e w • Va g r a n t a n d D o c k e r • C h e f a n d P u p p e t

Page 64: Building a Drupal 8 theme with new-fangled awesomeness

Ye o m a nS c a f f o l d i n g t o o l t o b u i l d f i l e s f o r t h e m e s o r m o d u l e s

P h o t o b y To m F r a n c i s , F l i c k r

Page 65: Building a Drupal 8 theme with new-fangled awesomeness

Ta s k r u n n e r sM u l t i p l e c o m m a n d l i n e t a s k s w i t h o n e c o m m a n d

P h o t o b y K y l e S t e e d , F l i c k r

Page 66: Building a Drupal 8 theme with new-fangled awesomeness

G r u n t• g r u n t f i l e . j s

G u l p• g u l p f i l e . j s

Ta s k r u n n e r s

N o d e - b a s e d : n p m i n s t a l l

Page 67: Building a Drupal 8 theme with new-fangled awesomeness

F u n w i t h t a s k sW h a t ’s a t a s k r u n n e r w i t h o u t t a s k s ?

P h o t o b y D a n C o u l t e r, F l i c k r

Page 68: Building a Drupal 8 theme with new-fangled awesomeness

L i n t s• c s s l i n t • j s l i n t • e s l i n t

M i n i f i e r s• u g l i f y j s

A u t o p r e f i x e r

Page 69: Building a Drupal 8 theme with new-fangled awesomeness

I m a g e t o o l s• i m a g e o p t i m • g r u n t i c o n

O t h e r t a s k s• s h e l l • c o n t r i b - c o p y

Page 70: Building a Drupal 8 theme with new-fangled awesomeness

' u s e s t r i c t ' ; !v a r g u l p = r e q u i r e ( ' g u l p ' ) ; v a r j s h i n t = r e q u i r e ( ' g u l p - j s h i n t ' ) ; v a r s t y l i s h = r e q u i r e ( ' j s h i n t - s t y l i s h ' ) ; v a r p a t h s = r e q u i r e ( ' c o m p a s s - o p t i o n s ' ) . p a t h s ( ) ; v a r b r o w s e r S y n c = r e q u i r e ( ' b r o w s e r- s y n c ' ) ; v a r s h e l l = r e q u i r e ( ' g u l p - s h e l l ' ) ; !/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / B e g i n G u l p Ta s k s / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / g u l p . t a s k ( ' l i n t ' , f u n c t i o n ( ) { r e t u r n g u l p . s r c ( [ p a t h s . j s + ' / * * / * . j s ' , ' ! ' + p a t h s . j s + ' / * * / * . j s ' ] ) . p i p e ( j s h i n t ( ) ) . p i p e ( j s h i n t . r e p o r t e r ( s t y l i s h ) ) } ) ; !

g u l p f i l e . j s

Page 71: Building a Drupal 8 theme with new-fangled awesomeness

/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / C o m p a s s Ta s k / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / g u l p . t a s k ( ' c o m p a s s ' , f u n c t i o n ( ) { r e t u r n g u l p . s r c ( p a t h s . s a s s + ' / * * / * ' ) . p i p e ( s h e l l ( [ ' b u n d l e e x e c c o m p a s s w a t c h - - t i m e ' ] ) ) ; } ) ; !/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / Wa t c h / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / g u l p . t a s k ( ' w a t c h ' , f u n c t i o n ( ) { g u l p . w a t c h ( p a t h s . j s + ' / * * / * . j s ' , [ ' l i n t ' ] ) ; } ) ; !

g u l p f i l e . j s

Page 72: Building a Drupal 8 theme with new-fangled awesomeness

/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / B r o w s e r S y n c Ta s k / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / g u l p . t a s k ( ' b r o w s e r S y n c ' , f u n c t i o n ( ) { b r o w s e r S y n c . i n i t ( [ p a t h s . c s s + ' / * * / * . c s s ' , p a t h s . j s + ' / * * / * . j s ' , p a t h s . i m g + ' / * * / * ' , p a t h s . f o n t s + ' / * * / * ' , p a t h s . h t m l + ' / * * / * . h t m l ' , ] ) ; } ) ; !/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / S e r v e r Ta s k s / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / g u l p . t a s k ( ' s e r v e r ' , [ ' w a t c h ' , ' c o m p a s s ' , ' b r o w s e r S y n c ' ] ) ; g u l p . t a s k ( ' s e r v e ' , [ ' s e r v e r ' ] ) ;

g u l p f i l e . j s

Page 73: Building a Drupal 8 theme with new-fangled awesomeness

P r o t o t y p i n g t o o l sB u i l d i n g i n t h e b r o w s e r w i t h c o m p o n e n t - b a s e d d e s i g n

P i x e l p e r f e c t i o n i s t h e e n e m y o f t h e g o o d .

P h o t o b y E n i g m a B a d g e r, F l i c k r

Page 74: Building a Drupal 8 theme with new-fangled awesomeness

S t y l e g u i d e g e n e r a t o r s• S t y l e P r o t o t y p e s • P a t t e r n L a b • K S S

S t a t i c p r o t o t y p e s• S t y l e t i l e s • E l e m e n t c o l l a g e s • V i s u a l i n v e n t o r i e s

Page 75: Building a Drupal 8 theme with new-fangled awesomeness

Te s t i n g & D e p l o y m e n tTo o l s f o r m a k i n g s u r e y o u r s i t e w o r k s b e f o r e d e p l o y i n g c h a n g e s

P h o t o b y P a s c a l , F l i c k r

Page 76: Building a Drupal 8 theme with new-fangled awesomeness

C r o s s - b r o w s e r t e s t i n g• B r o w s e r S t a c k

S c r e e n s h o t t o o l s• W r a i t h • P a g e r e s

H e a d l e s s b r o w s e r s• P h a n t o m J S • S l i m e r J S

Page 77: Building a Drupal 8 theme with new-fangled awesomeness

B D D• B e h a t • C a s p e r J S

A u t o m a t e d r e g r e s s i o n t e s t i n g

• S e l e n i u m

C o n t i n u o u s i n t e g r a t i o n• J e n k i n s • Tr a v i s C I

Page 78: Building a Drupal 8 theme with new-fangled awesomeness

W h y d o y o u v e x m e s o ?A r e y o u i n s a n e ? A m I i n s a n e ? A r e w e i n s a n e ?

P h o t o b y R o b e r t M c G o l d r i c k , F l i c k r

Page 79: Building a Drupal 8 theme with new-fangled awesomeness

W h y s o c o m p l i c a t e d ?• C o l l a b o r a t i o n • C o n s i s t e n c y • C a p a b i l i t i e s • A u t o m a t e m u n d a n e t a s k s • F i n d e r r o r s , i m p r o v e p e r f o r m a n c e

p r i o r t o d e p l o y m e n t

Page 80: Building a Drupal 8 theme with new-fangled awesomeness

C o p i n g w i t h m a d n e s sI ’ m s c a r e d . H o l d m e .

Page 81: Building a Drupal 8 theme with new-fangled awesomeness

Yo u d o n ’ t h a v e t o d o a l l o f t h i s .

• O k t o j u s t u s e H T M L , C S S a n d J S . • Tr y o n e n e w t h i n g w i t h a p r o j e c t . • N e x t p r o j e c t ? Tr y a n o t h e r n e w t h i n g . • O r d o n ’ t .

Page 82: Building a Drupal 8 theme with new-fangled awesomeness

P h o t o b y E r i k M e l d r u m , F l i c k r

Page 83: Building a Drupal 8 theme with new-fangled awesomeness

P h o t o b y L a u r a , F l i c k r

Page 84: Building a Drupal 8 theme with new-fangled awesomeness

P h o t o b y A m b u r n E v e re t t , F l i c k r

Page 85: Building a Drupal 8 theme with new-fangled awesomeness

M a r c D r u m m o n d ( & I z z y )@ M a r c D r u m m o n d m d r u m m o n d

I R C & d r u p a l . o r gm a r c d r u m m o n d . c o m