Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
CHUNK-Y TOWN
won’t you take me to…
Component theming

and the future of Drupal
front-end development
Marc Drummond
Photo credit: Dave Emerson, “Trouble”, Flickr Creative Commons
Marc Drummond
@MarcDrummond
mdrummond
IRC, drupal.org
marcd...
C E L E B R A T I O N
S P R I N T
Give this a spin Sunday!
M I D C A M P 2 0 1 6
C h u n k s ?
Ummm… why?
Photo credit: shibuya dee, “Bell Bottoms”, Flickr Creative Commons
How do we make this happen?
Photo credit: Charles Rodstrom, “Andrea’s Go-Go Boots”, Flickr Creative Commons
C ’ E S T CHUNK
Le funk
Components
Understanding
B R E A K I T D OW N
Identify components in a design
BANNER
FEATURES
BODY
RELATED
FOOTER
SOCIAL
COPYRIGHT
BRANDING MENU
BANNER TEXT
FEATURE FEATURE FEATURE
BODY HEADING
BODY TEXT
BODY LINK
B R I C K H O U S E
Defining components
Photo credit: Mark Nicolson, “Lego House”, Flickr Creative Commons
B R I C K 

H O U S E
C O M P O N E N T S …
Contain data
C O M P O N E N T S …
Contain other components
C O M P O N E N T S …
Include related CSS
C O M P O N E N T S …
Include related JS
C O M P O N E N T S …
Include related images
C O M P O N E N T S …
Ideally one template per component
C O M P O N E N T
HTML Template
CSS JS Images
Data ChildContext
Photo credit: Nukamari, “Saturday Night Fever”, Flickr Creative Commons
C O N T E X T
Component
communication
C O M M U N I C A T I O N
Pass data down to child components
C O M M U N I C A T I O N
Specify necessary data (context)
Photo credit: wrme2, “24”, Flickr Creative Commons
C O N T E X T U P
Data down
P RO P S V S S T A T E
Gotta get up to get down
P RO P S
Immutable data
S T A T E
Data depending on outside state
C H A N G E S T A T E ?
Action on component triggers event
C H A N G E S T A T E ?
Event changes state
C H A N G E S T A T E ?
State passed down to component: re-render
S T A T E
Parent
Button
Child
This
S T A T E
Parent
Button
Child
This
S T A T E
Parent
Button
Child
This
S T A T E
Parent
Button
Child
That
B E N E F I T S
Why components?
B E N E F I T S
Encapsulation
B E N E F I T S
Pattern reuse
B E N E F I T S
Great for teams
B E N E F I T S
Performance benefits with http2?
Q U O VA D I S ?
Who benefits?
W H O B E N E F I T S ?
Designers
W H O B E N E F I T S ?
Front-end Developers: Design
B E M
CSS Components
.event-teaser {
}
.event-teaser__name {
}
.event-teaser__date {
}
.event-teaser--fundraiser {
}
S T Y L E G U I D E S
KSS Node
P A T T E R N L I B R A R I E S
Pattern Lab
P A T T E R N L I B R A R I E S
Pattern Lab
P A T T E R N L I B R A R I E S
Pattern Lab
P A T T E R N L I B R A R I E S
Pattern Builder, 

Fractal, Drizzle
W H O B E N E F I T S ?
Front-end Developers: Interaction
J S C O M P O N E N T S
Angular 2, React, Ember
J S C O M P O N E N T S
ES2015 Modules
W E B C O M P O N E N T S
Custom elements + shadow DOM: Polymer
W H O B E N E F I T S ?
Site Builders: Outside In
J U S T Y O U R T Y P E
Kinds of Components
P AG E
Home page, Landing page, Article page
Main section
Footer section
Header section
S E C T I O N
Header, Footer
Menu
Branding Search
I T E M S E R I E S
River of News, Event list
Article teaser
Article teaser
Article teaser
Pager
I T E M
Story teaser, Event teaser, Event details
Teaser text
Tags
Headline
Byline
Image
DA T A S E R I E S
Tag list, Event dates
Tag heading
Tag Tag
Tag Tag
Tag Tag
DA T A I T E M
Image, taxonomy term, event date
Tag link target
Tag link text
C O M B O
Flyout menu
Menu
Social links
Branding Search
Terms
Contact links
L A Y O U T
Generic layout with slots for site builders
Column 1 Column 2
S U R V I V E
I will
Components
&Drupal
T H E G O O D
Component-y things in Drupal
B L O C K S
Blocks understand context!
D I S P L A Y M O D E S
But… tightly tied to nodes
P A N E L S
Custom content panes, mini-panels
S E R I E S
Views list of display modes
S E R I E S
Node queue, entity queue
F I E L D S
Field template = data list of data items
T H E B A D
Component challenges with Drupal
DA T A S T RU C T U R E S
Templates tied tightly to Drupal data
T H E U G L Y
I have to do what now?
T E M P L A T E S G A L O R E
Multiple templates per component
node--teaser--event
field--image--event
image--event
field-...
A N A L O G Y A L E RT
Base styles vs BEM components
A N A L O G Y A L E RT
Base templates vs template suggestions
A N A L O G Y A L E RT
As overrides increase, value of base decreases
D I S C O I N F E R N O
Burn the mother down
Components
off the island
Trouble getting
D R I L L A B I L I T Y
One template per component
I T E M C O M P O N E N T S
Includes Data Series with Data Items
Tag list heading
Article Teaser
Tag Tag
I T E M C O M P O N E N T S
Separate templates for Data Series and Items?
I T E M C O M P O N E N T S
One template: use Data Series/Items attributes?
<div class=“tags”>
<h2 class=“tags__heading”>{...
P R E S E N T E R S
Replacing preprocess functions
P R E P RO C E S S
Raw data > Template variables
P R E P RO C E S S
Tied to PHP
T W I G P R E S E N T E R S
Raw data > Template variables
T W I G P R E S E N T E R
Presenter
Logic
Component
Markup
Raw data
E X T E N S I B I L I T Y ?
Modules, themes register mini-presenters?
E X T E N S I B I L I T Y ?
Include mini-presenters in main presenter?
Presenter
Mini-presenter
Mini-presenter
Mini-presen...
C H I L D C O M P O N E N T S
Self-rendering arrays vs. includes
R E N D E R A R R A Y S
Giant arrays of data: loads of context!
R E N D E R A R R A Y S
Decide how to render themselves
R E N D E R A R R A Y S
Pick their template from suggestions
R E N D E R A R R A Y S
Contain arbitrary elements
E X P L I C I T I N C L U D E S
Specify template and pass in variables
T W I G B L O C K S ?
Wrap render array variable in block?
{%block content %}
{{ content }}
{% endblock
T W I G B L O C K S ?
External sources: explicitly include templates
{%block content %}
{{ include(’field’, {heading: ‘Tag...
C O N F L I C T
Frameworks, style guides don’t have site builders
C O N F L I C T
Site builder flexibility strength of Drupal
A T T R I B U T E S
Unique Drupal data structures
T W I G E X T E N S I O N S
Replicate outside Drupal?
T H E M E T R E E
Inheritance outside Drupal
C O M P L E X O U T P U T
Theme does not contain all output code
C O M P L E X O U T P U T
Output depends on inheritance chain
Theme
Base Theme
Core Modules
Contrib Modules
R E G I S T R Y
Is this needed for templates, inheritance?
T W I G E X T E N D S
Will this work without access to theme tree?
L I B R A R I E S
The when and where of CSS/JS
A T T AC H L I B R A R Y ?
Can attach to templates… sometimes
A T T AC H L I B R A R Y ?
Routes attach libraries
A T T AC H L I B R A R Y ?
Logic in preprocess attaches libraries
C O N T E X T
Can’t we just use blocks?
D E F I N I N G C O N T E X T ?
Specify context needed through YML?
D E F I N I N G C O N T E X T ?
Specify context needed through JSON?
D E F I N I N G C O N T E X T ?
How do we bubble up context?
D E F I N I N G C O N T E X T ?
Block plugins can handle context
D E F I N I N G C O N T E X T ?
Block plugins outside Drupal?
I T ’ S C O M P L I C A T E D
External reuse compelling but hard
D RU P A L F I R S T ?
Focus on component use in Drupal?
E X T E R N A L R E U S E ?
How much complexity does this add?
E X T E R N A L R E U S E ?
This is where the energy is!
W E A R E F A M I L Y
Component
Theming Efforts
You, your chunks and me
C O M P O N E N T L I B R A R I E S
Register component namespaces
https://www.drupal.org/project/components
D RU P A L 8 Z E N
Presenters and namespaces
https://www.drupal.org/project/zen
P A T T E R N L A B 

D RU P A L T W I G
Drupal Twig Extensions
https://github.com/pattern-lab/edition-php-drupal-standard
P A T T E R N L A B 

S T A RT E R 8
Phase2
https://www.phase2technology.com/blog/introducing-pattern-lab-starter-8/
P A T T E R N B U I L D E R
JSON Schemas and Paragraphs
https://github.com/PatternBuilder/pattern-builder-drupal
W I M ’ S P A T C H
Register components with Drupal
https://www.drupal.org/node/2702061
D RU P A L T W I G S L AC K
#Components chat and meetings
https://drupaltwig-slack.herokuapp.com/
C H U N K - Y M U S I C
Component
Vision for
Theming
Play that
D E F I N E O N C E
Reuse inside and outside Drupal
P A T T E R N L I B R A R Y
In sync with prod, default data
E X T E N S I B L E D E F I N I T I O N S
Core and contrib, modules and themes
C L I E N T - S I D E R E U S E
Enhance user experience
W E B C O M P O N E N T S
Improve performance with http2
O U T S I D E I N
Boost site building with components
D E F I N E P AG E S
e.g. Panels/Panels Everywhere
S E C T I O N S A N D C O M B O S
e.g. Mini-Panels
I T E M S E R I E S
e.g. Views and Entity Queues
I T E M S
e.g. Views, Display Modes, Panel Panes
C O M P O N E N T L A Y O U T S
Generic vs custom markup
C O M P O N E N T E X T E N S I O N S
Define base: Inherit defaults in variations
C H U N K S
Components
Help move
forward
It’s raining
T E S T
Try out implementations!
T A L K
Join us on Slack!
S P R I N T
Give this a spin Sunday!
Photo credit: Dread Pirate Jeff, “Disco Steve VS The Cat”, Flickr Creative Commons
Photo credit: Dave Emerson, “Trouble”, Flickr Creative Commons
Marc Drummond
@MarcDrummond
mdrummond
IRC, drupal.org
marcd...
 Won't You Take Me to Chunk-y Town: Component-based theming and the future of Drupal front-end development
Upcoming SlideShare
Loading in …5
×

Won't You Take Me to Chunk-y Town: Component-based theming and the future of Drupal front-end development

421 views

Published on

Gotta make a move to a theme system that's right for me.
Components keep me movin', keep me groovin' with some energy.
At MidCamp we talked about it, talked about it,
talked about it it, talked about it,
At Drupal Con talked about, talked about,
Talked about design components.
Gotta move on,
From data-model templates,
Gotta move on,
From style guide markup duplication,
Gotta move on
A-won't you take me to... Chunky Town?
Won't you take me to... Chunky Town.
Won't you take me to... Chunky Town?
Won't you take me to... Chunky Town.
Chunks,
Mega Chunks,
Chunks,
Super Chunks,
Chunks,
Inside Chunks.
Won't you take me to... Chunky Town?

At DrupalCon New Orleans, Dries Buytaert mentioned component-based theming as a potential future initiative for Drupal. This idea had been discussed at MidCamp, and further hashed out at DrupalCon. Some initial efforts have been made to prototype how we could get started with real component-based markup in Drupal theming.
Currently, Drupal's theme system consists primarily of templates that are tightly tied to Drupal's data structures. While much of front-end development revolves around design components—breaking a design into smaller and smaller chunks—it can often take several template overrides to create the markup for one component. That causes difficulties in integrating Drupal with style guides or pattern libraries based around components, such as Pattern Lab or KSSNode. Markup often needs to be duplicated, once in Drupal's templates, and again in the templates that drive a style guide.
Moving Drupal to a theme system based around components could have numerous benefits, from improving style guide integration to making it easier for site builders to build sites outside-in to making it easier to reuse templates both server-side and client-side.
In this session we'll discuss why component-based theming matters, the current state of this discussion, and how you can help take Drupal's theme system to Chunk-y Town.

Published in: Technology
  • Be the first to comment

Won't You Take Me to Chunk-y Town: Component-based theming and the future of Drupal front-end development

  1. 1. CHUNK-Y TOWN won’t you take me to… Component theming
 and the future of Drupal front-end development Marc Drummond
  2. 2. Photo credit: Dave Emerson, “Trouble”, Flickr Creative Commons Marc Drummond @MarcDrummond mdrummond IRC, drupal.org marcdrummond.com Front-end Developer, Lullabot
  3. 3. C E L E B R A T I O N
  4. 4. S P R I N T Give this a spin Sunday! M I D C A M P 2 0 1 6
  5. 5. C h u n k s ?
  6. 6. Ummm… why? Photo credit: shibuya dee, “Bell Bottoms”, Flickr Creative Commons
  7. 7. How do we make this happen? Photo credit: Charles Rodstrom, “Andrea’s Go-Go Boots”, Flickr Creative Commons
  8. 8. C ’ E S T CHUNK Le funk Components Understanding
  9. 9. B R E A K I T D OW N Identify components in a design
  10. 10. BANNER FEATURES BODY RELATED FOOTER SOCIAL COPYRIGHT
  11. 11. BRANDING MENU BANNER TEXT FEATURE FEATURE FEATURE BODY HEADING BODY TEXT BODY LINK
  12. 12. B R I C K H O U S E Defining components
  13. 13. Photo credit: Mark Nicolson, “Lego House”, Flickr Creative Commons B R I C K 
 H O U S E
  14. 14. C O M P O N E N T S … Contain data
  15. 15. C O M P O N E N T S … Contain other components
  16. 16. C O M P O N E N T S … Include related CSS
  17. 17. C O M P O N E N T S … Include related JS
  18. 18. C O M P O N E N T S … Include related images
  19. 19. C O M P O N E N T S … Ideally one template per component
  20. 20. C O M P O N E N T HTML Template CSS JS Images Data ChildContext
  21. 21. Photo credit: Nukamari, “Saturday Night Fever”, Flickr Creative Commons C O N T E X T Component communication
  22. 22. C O M M U N I C A T I O N Pass data down to child components
  23. 23. C O M M U N I C A T I O N Specify necessary data (context)
  24. 24. Photo credit: wrme2, “24”, Flickr Creative Commons C O N T E X T U P Data down
  25. 25. P RO P S V S S T A T E Gotta get up to get down
  26. 26. P RO P S Immutable data
  27. 27. S T A T E Data depending on outside state
  28. 28. C H A N G E S T A T E ? Action on component triggers event
  29. 29. C H A N G E S T A T E ? Event changes state
  30. 30. C H A N G E S T A T E ? State passed down to component: re-render
  31. 31. S T A T E Parent Button Child This
  32. 32. S T A T E Parent Button Child This
  33. 33. S T A T E Parent Button Child This
  34. 34. S T A T E Parent Button Child That
  35. 35. B E N E F I T S Why components?
  36. 36. B E N E F I T S Encapsulation
  37. 37. B E N E F I T S Pattern reuse
  38. 38. B E N E F I T S Great for teams
  39. 39. B E N E F I T S Performance benefits with http2?
  40. 40. Q U O VA D I S ? Who benefits?
  41. 41. W H O B E N E F I T S ? Designers
  42. 42. W H O B E N E F I T S ? Front-end Developers: Design
  43. 43. B E M CSS Components .event-teaser { } .event-teaser__name { } .event-teaser__date { } .event-teaser--fundraiser { }
  44. 44. S T Y L E G U I D E S KSS Node
  45. 45. P A T T E R N L I B R A R I E S Pattern Lab
  46. 46. P A T T E R N L I B R A R I E S Pattern Lab
  47. 47. P A T T E R N L I B R A R I E S Pattern Lab
  48. 48. P A T T E R N L I B R A R I E S Pattern Builder, 
 Fractal, Drizzle
  49. 49. W H O B E N E F I T S ? Front-end Developers: Interaction
  50. 50. J S C O M P O N E N T S Angular 2, React, Ember
  51. 51. J S C O M P O N E N T S ES2015 Modules
  52. 52. W E B C O M P O N E N T S Custom elements + shadow DOM: Polymer
  53. 53. W H O B E N E F I T S ? Site Builders: Outside In
  54. 54. J U S T Y O U R T Y P E Kinds of Components
  55. 55. P AG E Home page, Landing page, Article page Main section Footer section Header section
  56. 56. S E C T I O N Header, Footer Menu Branding Search
  57. 57. I T E M S E R I E S River of News, Event list Article teaser Article teaser Article teaser Pager
  58. 58. I T E M Story teaser, Event teaser, Event details Teaser text Tags Headline Byline Image
  59. 59. DA T A S E R I E S Tag list, Event dates Tag heading Tag Tag Tag Tag Tag Tag
  60. 60. DA T A I T E M Image, taxonomy term, event date Tag link target Tag link text
  61. 61. C O M B O Flyout menu Menu Social links Branding Search Terms Contact links
  62. 62. L A Y O U T Generic layout with slots for site builders Column 1 Column 2
  63. 63. S U R V I V E I will Components &Drupal
  64. 64. T H E G O O D Component-y things in Drupal
  65. 65. B L O C K S Blocks understand context!
  66. 66. D I S P L A Y M O D E S But… tightly tied to nodes
  67. 67. P A N E L S Custom content panes, mini-panels
  68. 68. S E R I E S Views list of display modes
  69. 69. S E R I E S Node queue, entity queue
  70. 70. F I E L D S Field template = data list of data items
  71. 71. T H E B A D Component challenges with Drupal
  72. 72. DA T A S T RU C T U R E S Templates tied tightly to Drupal data
  73. 73. T H E U G L Y I have to do what now?
  74. 74. T E M P L A T E S G A L O R E Multiple templates per component node--teaser--event field--image--event image--event field--tags--event
  75. 75. A N A L O G Y A L E RT Base styles vs BEM components
  76. 76. A N A L O G Y A L E RT Base templates vs template suggestions
  77. 77. A N A L O G Y A L E RT As overrides increase, value of base decreases
  78. 78. D I S C O I N F E R N O Burn the mother down Components off the island Trouble getting
  79. 79. D R I L L A B I L I T Y One template per component
  80. 80. I T E M C O M P O N E N T S Includes Data Series with Data Items Tag list heading Article Teaser Tag Tag
  81. 81. I T E M C O M P O N E N T S Separate templates for Data Series and Items?
  82. 82. I T E M C O M P O N E N T S One template: use Data Series/Items attributes? <div class=“tags”> <h2 class=“tags__heading”>{{ tags.heading }}</h2> <ul {{ tags.Attributes.addClass(‘tags__list’ }}> {% for tag in tags %} <li {{ tag.Attributes.addClass(‘tags__item’ }}> <a class=“tags__item-link” href=“{{ tag.link }}”> {{ tag.text }} </a> </li> {% endfor %} </ul> </div>
  83. 83. P R E S E N T E R S Replacing preprocess functions
  84. 84. P R E P RO C E S S Raw data > Template variables
  85. 85. P R E P RO C E S S Tied to PHP
  86. 86. T W I G P R E S E N T E R S Raw data > Template variables
  87. 87. T W I G P R E S E N T E R Presenter Logic Component Markup Raw data
  88. 88. E X T E N S I B I L I T Y ? Modules, themes register mini-presenters?
  89. 89. E X T E N S I B I L I T Y ? Include mini-presenters in main presenter? Presenter Mini-presenter Mini-presenter Mini-presenter
  90. 90. C H I L D C O M P O N E N T S Self-rendering arrays vs. includes
  91. 91. R E N D E R A R R A Y S Giant arrays of data: loads of context!
  92. 92. R E N D E R A R R A Y S Decide how to render themselves
  93. 93. R E N D E R A R R A Y S Pick their template from suggestions
  94. 94. R E N D E R A R R A Y S Contain arbitrary elements
  95. 95. E X P L I C I T I N C L U D E S Specify template and pass in variables
  96. 96. T W I G B L O C K S ? Wrap render array variable in block? {%block content %} {{ content }} {% endblock
  97. 97. T W I G B L O C K S ? External sources: explicitly include templates {%block content %} {{ include(’field’, {heading: ‘Tags’}) }} {{ include(’field’, {heading: ‘Image’}) }} {{ include(’field’, {heading: ‘CTA’}) }} {% endblock
  98. 98. C O N F L I C T Frameworks, style guides don’t have site builders
  99. 99. C O N F L I C T Site builder flexibility strength of Drupal
  100. 100. A T T R I B U T E S Unique Drupal data structures
  101. 101. T W I G E X T E N S I O N S Replicate outside Drupal?
  102. 102. T H E M E T R E E Inheritance outside Drupal
  103. 103. C O M P L E X O U T P U T Theme does not contain all output code
  104. 104. C O M P L E X O U T P U T Output depends on inheritance chain Theme Base Theme Core Modules Contrib Modules
  105. 105. R E G I S T R Y Is this needed for templates, inheritance?
  106. 106. T W I G E X T E N D S Will this work without access to theme tree?
  107. 107. L I B R A R I E S The when and where of CSS/JS
  108. 108. A T T AC H L I B R A R Y ? Can attach to templates… sometimes
  109. 109. A T T AC H L I B R A R Y ? Routes attach libraries
  110. 110. A T T AC H L I B R A R Y ? Logic in preprocess attaches libraries
  111. 111. C O N T E X T Can’t we just use blocks?
  112. 112. D E F I N I N G C O N T E X T ? Specify context needed through YML?
  113. 113. D E F I N I N G C O N T E X T ? Specify context needed through JSON?
  114. 114. D E F I N I N G C O N T E X T ? How do we bubble up context?
  115. 115. D E F I N I N G C O N T E X T ? Block plugins can handle context
  116. 116. D E F I N I N G C O N T E X T ? Block plugins outside Drupal?
  117. 117. I T ’ S C O M P L I C A T E D External reuse compelling but hard
  118. 118. D RU P A L F I R S T ? Focus on component use in Drupal?
  119. 119. E X T E R N A L R E U S E ? How much complexity does this add?
  120. 120. E X T E R N A L R E U S E ? This is where the energy is!
  121. 121. W E A R E F A M I L Y Component Theming Efforts You, your chunks and me
  122. 122. C O M P O N E N T L I B R A R I E S Register component namespaces https://www.drupal.org/project/components
  123. 123. D RU P A L 8 Z E N Presenters and namespaces https://www.drupal.org/project/zen
  124. 124. P A T T E R N L A B 
 D RU P A L T W I G Drupal Twig Extensions https://github.com/pattern-lab/edition-php-drupal-standard
  125. 125. P A T T E R N L A B 
 S T A RT E R 8 Phase2 https://www.phase2technology.com/blog/introducing-pattern-lab-starter-8/
  126. 126. P A T T E R N B U I L D E R JSON Schemas and Paragraphs https://github.com/PatternBuilder/pattern-builder-drupal
  127. 127. W I M ’ S P A T C H Register components with Drupal https://www.drupal.org/node/2702061
  128. 128. D RU P A L T W I G S L AC K #Components chat and meetings https://drupaltwig-slack.herokuapp.com/
  129. 129. C H U N K - Y M U S I C Component Vision for Theming Play that
  130. 130. D E F I N E O N C E Reuse inside and outside Drupal
  131. 131. P A T T E R N L I B R A R Y In sync with prod, default data
  132. 132. E X T E N S I B L E D E F I N I T I O N S Core and contrib, modules and themes
  133. 133. C L I E N T - S I D E R E U S E Enhance user experience
  134. 134. W E B C O M P O N E N T S Improve performance with http2
  135. 135. O U T S I D E I N Boost site building with components
  136. 136. D E F I N E P AG E S e.g. Panels/Panels Everywhere
  137. 137. S E C T I O N S A N D C O M B O S e.g. Mini-Panels
  138. 138. I T E M S E R I E S e.g. Views and Entity Queues
  139. 139. I T E M S e.g. Views, Display Modes, Panel Panes
  140. 140. C O M P O N E N T L A Y O U T S Generic vs custom markup
  141. 141. C O M P O N E N T E X T E N S I O N S Define base: Inherit defaults in variations
  142. 142. C H U N K S Components Help move forward It’s raining
  143. 143. T E S T Try out implementations!
  144. 144. T A L K Join us on Slack!
  145. 145. S P R I N T Give this a spin Sunday!
  146. 146. Photo credit: Dread Pirate Jeff, “Disco Steve VS The Cat”, Flickr Creative Commons
  147. 147. Photo credit: Dave Emerson, “Trouble”, Flickr Creative Commons Marc Drummond @MarcDrummond mdrummond IRC, drupal.org marcdrummond.com Front-end Developer, Lullabot

×