Categories: UI/UX, Frontend, Open Source
Tools: Adobe XD, Node.js, Eleventy, Nunjucks
Project Overview
What: Designed and developed the about page for Tampa Devs main Website.
Why: They needed a page to showcase the story of how the community started and what they are about, as well as the team behind the community, Sponsors, and past events.
Long-term Goal: Create an easy to maintain page that can be updated to include new team members, sponsors, and events.
Background
TampaDevs is a nonprofit software community in the Tampa Bay area supporting over 2,000 members to work, learn, and grow together. I had previously met one of the founders at a local orlando meetup, I joined when I saw he launched the community back in September 2021. My initial involvement was minimal, where I would virtually attend the meetups and occasionally help with the website. They were in need of a new about page to showcase the story of how the community started and what they are about, as well as the team behind the community, Sponsors, and past events. I was asked to design and develop the page and I was happy to help.
Design
I started by creating a wireframe of the page to get an idea of the layout and content that would be included. I then created a mockup of the page in Adobe XD. I kept the design simple while maintaining the Tampa Devs brand colors and fonts. I included a section for the story of how the community started, a section for the team members, a section for sponsors, and a section for past events.
Development
Tampa Devs main website is built with Eleventy, a static site generator that uses JavaScript and Nunjucks templating engine. I need to ensure that I created the page in a way that it didn't affect the rest of the website, Since the website is developed via open source contributions made by the community. I also needed a way to easily add third party libraries to the page. I refactored the existing base template to make it posible to add custom head, styles, and script code blocks taking advantage of the Nunjucks templating engine's layout chaining.
Team Members
For the team members section, I created a custom data file for people that included the person's name, title, bio, image, and href. I then created a custom Nunjucks filter to sort the people by order. I used the filter to sort the people in the order they should be displayed on the page and then looped through the people to display their information on the page.
<div class="td-about-team-wrapper">
{% for person in people | sort(false, false, 'order') %}
{% if person.team.indexOf("Organizers") > -1 %}
<div class="td-about-person">
<div class="image-container">
<img
src="/_assets/img/people/{{ person.img if person.img else "no-avatar.jpg" }}"
alt="{{ person.name }}"
class="person__image"
>
</div>
<h3 class="person-name">
{% if person.href %}
<a href="{{ person.href.url }}"
target="_blank"
rel="noreferrer noopener"
>
{{ person.name }}
</a>
{% else %}
{{ person.name }}
{% endif %}
</h3>
<strong class="person-title">
{{ person.title }}
</strong>
<p class="person-bio">
{{ person.bio }}
</p>
{% if person.href %}
<a class="btn"
href={{ person.href.url }}
target="_blank"
rel="noreferrer noopener"
>
View {{ person.href.type }}
</a>
{% endif %}
</div>
{% endif %}
{% endfor %}
</div>
Sponsors
One of the challenges I faced was creating a marque effect for the sponsors section. I wanted to have the logos scroll horizontally across the screen and stop when hovered without the use of any third-party libraries. To achieve this I used CSS animations but also had to use two duplicate containers to create a seamless loop effect. I took that into consideratation when developing that section of the page template.
Similarly to the team members section, I created a custom data file for sponsors that included the sponsor's name, logo, and href. I then looped through the sponsors to display their logos on the page. The loop it self, as mentioned before, is duplicated to create the marquee effect.
<div class="td-about-sponsor__wrapper">
<div class="marquee">
{% for sponsor in sponsors | sort(false, false, 'name') %}
<a href="{{sponsor.href}}" class="sponsor" target="_blank" rel=”noopener noreferrer”>
<img src="/_assets/misc/sponsors/{{sponsor.logo}}" alt=""/>
</a>
{% endfor %}
</div>
<div class="marquee">
{% for sponsor in sponsors | sort(false, false, 'name') %}
<a href="{{sponsor.href}}" class="sponsor" target="_blank" >
<img src="/_assets/misc/sponsors/{{sponsor.logo}}" alt=""/>
</a>
{% endfor %}
</div>
</div>
The maquee style is setup to animate the logos acrossed continously. Whenever the user hovers over the marquee, the animation is paused by changing the animation-play-state
property to paused
.
_about.scss
.td-about {
&-sponsor__wrapper {
overflow: hidden;
display: flex;
flex-direction: row;
.marquee {
display: flex;
flex-direction: row;
justify-content: center;
align-items: baseline;
animation: marquee 25s linear infinite;
}
&:hover .marquee {
animation-play-state: paused;
}
}
}
marquee.scss
@keyframes marquee {
from {
transform: translateX(0);
}
to {
transform: translateX(-100%);
}
}
Conclusion
The about page is live on the Tampa Devs website and can be viewed here. The page has had updates since it was first launched to include new team members, sponsors, and events. The use of external stuctured data files made those easy to modify by the community. Along the way of developing I learned a lot about open source contributions and how to work with a team of developers to maintain a website. I am grateful for the opportunity to work with the Tampa Devs community and look forward to future projects with them.