Logo
Home
Resources

Product

Custom Workflow

Resources

Blog
Youtube
Template
Home
>
Product
>
Template Top
>
detail

HubSpot CMS: A Responsive "Definition List" Module for Event Overviews & Specs

When building websites, we often need to display list-based data like "Date: Jan 1st," "Location: NY Hall," or product specifications.

Trying to create these using a standard Rich Text editor often leads to messy indentation, and using HTML Tables (<table>) causes significant layout issues on mobile devices.

This article introduces a Definition List Module that is structurally beautiful, SEO-friendly, and fully responsive. It automatically switches from a side-by-side layout on desktop to a stacked layout on mobile.

‍

Demo Video

Over view
Code

Detail

Purpose and Benefits

The primary purpose of this module is to cleanly organize and display "Label & Content" pairs.

Key Benefits:

  • Fully Responsive: Displays as a horizontal row on desktops and stacks vertically on mobile devices automatically.
  • No-Code Design Control: You can adjust colors, font sizes, and border thickness directly from the Page Editor without touching CSS.
  • Semantic HTML: It uses <dl>, <dt>, and <dd> tags. This helps search engines (SEO) understand the structure of your content better than using generic <div> tags.

Use Cases

This design is highly versatile and perfect for the following scenarios:

  • Event & Webinar Summaries
    • Date, Time, Venue, Capacity, Fee, Organizer.
  • Company Profiles
    • Company Name, CEO, Founded Date, Headquarters, Capital.
  • Product Specifications
    • Dimensions, Weight, Material, Color Options, Price.
  • Job Descriptions (Recruitment)
    • Location, Salary, Working Hours, Requirements.

How to Use in HubSpot CMS

Once you implement this code in the Design Manager, here is how marketers or content editors can use it in the Page Editor:

1. Editing Content

In the module settings panel, you will see the following fields:

  • Title:Enter the section header (e.g., "Event Details"). If left blank, it will not appear.
  • Items (Repeater Group):This is where you add your list rows. You can add as many as you need using the "Add" button.
    • Row Title: Enter the label on the left (e.g., "Date").
    • Content: Enter the details on the right. This supports Rich Text, so you can add links or bold text.

2. Adjusting Styles

Switch to the "Styles" tab (or group) to customize the design without code:

  • Title Color / Size: Adjust the main header appearance.
  • Label Color: Change the text color of the left column (the item names).
  • Text Color / Size: Change the color of the content and the overall font size.
  • Bg Color: Change the background color of the entire list box.
  • Border Color / Size: Adjust the color and thickness of the separator lines.

Module Source Code

Create a new module in the HubSpot Design Manager and paste the following code into the respective files (fields.json, module.html, module.css).

1. fields.json

This defines the module interface. It includes a repeater group for the content items and a separate group for style settings.

‍

[
 {
  "allow_new_line": false,
  "display_width": null,
  "id": "6ef51c75-6d87-4d6f-bc68-1beedff13aac",
  "label": "title",
  "locked": false,
  "name": "title",
  "required": false,
  "type": "text"
 },
 {
  "children": [
   {
    "allow_new_line": false,
    "display_width": null,
    "id": "440c75fa-45a0-401b-b719-4fed4bf08a97",
    "label": "row_title",
    "locked": false,
    "name": "row_title",
    "required": false,
    "type": "text"
   },
   {
    "display_width": null,
    "id": "1e3b082c-a362-5dbc-a2b2-6f5b4dde9f52",
    "label": "content",
    "locked": false,
    "name": "content",
    "required": false,
    "type": "richtext"
   }
  ],
  "default": [],
  "display_width": null,
  "expanded": false,
  "group_occurrence_meta": null,
  "id": "0fec1fe5-d3c2-131e-595b-989d357cf578",
  "label": "items",
  "locked": false,
  "name": "items",
  "occurrence": {},
  "required": false,
  "tab": "CONTENT",
  "type": "group"
 },
 {
  "children": [
   {
    "default": {
     "color": null,
     "opacity": null
    },
    "display_width": null,
    "id": "764c03b3-19ad-3234-2a17-9521b1d8b7a3",
    "label": "title_color",
    "locked": false,
    "name": "title_color",
    "required": false,
    "type": "color"
   },
   {
    "display": "text",
    "display_width": null,
    "id": "360fd10e-2290-cf85-3c03-fc4797ff6b22",
    "label": "title_size",
    "locked": false,
    "name": "title_size",
    "required": false,
    "step": 1,
    "type": "number"
   },
   {
    "default": {
     "color": null,
     "opacity": null
    },
    "display_width": null,
    "id": "affa2a09-3769-cf50-8255-910426c8a58e",
    "label": "label_color",
    "locked": false,
    "name": "label_color",
    "required": false,
    "type": "color"
   },
   {
    "default": {
     "color": null,
     "opacity": null
    },
    "display_width": null,
    "id": "55c972d5-db0a-1b5d-5d09-f06365a575c8",
    "label": "text_color",
    "locked": false,
    "name": "text_color",
    "required": false,
    "type": "color"
   },
   {
    "display": "text",
    "display_width": null,
    "id": "42368473-da19-6609-db94-dbf157f38a84",
    "label": "text_size",
    "locked": false,
    "name": "text_size",
    "required": false,
    "step": 1,
    "type": "number"
   },
   {
    "default": {
     "color": null,
     "opacity": null
    },
    "display_width": null,
    "id": "35e4dc65-e6ad-4a9a-c491-bddf2339ff38",
    "label": "bg_color",
    "locked": false,
    "name": "bg_color",
    "required": false,
    "type": "color"
   },
   {
    "default": {
     "color": null,
     "opacity": null
    },
    "display_width": null,
    "id": "f4b21074-995c-6aee-f577-04dc5055b2cc",
    "label": "border_color",
    "locked": false,
    "name": "border_color",
    "required": false,
    "type": "color"
   },
   {
    "display": "text",
    "display_width": null,
    "id": "107200a3-53b1-539c-ead1-5e6efa863794",
    "label": "border_size",
    "locked": false,
    "name": "border_size",
    "required": false,
    "step": 1,
    "type": "number"
   }
  ],
  "default": {
   "title_color": {
    "color": null,
    "opacity": null
   },
   "label_color": {
    "color": null,
    "opacity": null
   },
   "text_color": {
    "color": null,
    "opacity": null
   },
   "bg_color": {
    "color": null,
    "opacity": null
   },
   "border_color": {
    "color": null,
    "opacity": null
   }
  },
  "display_width": null,
  "expanded": false,
  "group_occurrence_meta": null,
  "id": "04d537c8-1df0-59fe-bb36-052c050d4360",
  "label": "styles",
  "locked": false,
  "name": "styles",
  "required": false,
  "tab": "CONTENT",
  "type": "group"
 }
]

‍

Source Code

HTML
{# Assign unique module ID #}
<div id="seminar-{{ module.id }}" class="seminar-module">
  
  {# Title Area #}
  {% if module.title %}
    <h2 class="seminar-module__title">{{ module.title }}</h2>
  {% endif %}

  {# List Area #}
  <div class="seminar-module__container">
    {% for item in module.items %}
      <dl class="seminar-module__row">
        <dt class="seminar-module__label">{{ item.row_title }}</dt>
        <dd class="seminar-module__content">{{ item.content }}</dd>
      </dl>
    {% endfor %}
  </div>

</div>

{# CSS Variables Definition #}
{% require_css %}
<style>
  #seminar-{{ module.id }} {
    --title-color: {{ module.styles.title_color.css || '#003366' }};
    --label-color: {{ module.styles.label_color.css || '#003366' }};
    --text-color: {{ module.styles.text_color.css || '#333333' }};
    --bg-color: {{ module.styles.bg_color.css || '#f8f8f8' }};
    --border-color: {{ module.styles.border_color.css || '#cccccc' }};
    --border-size: {{ module.styles.border_size || 1 }}px;
    --title-size: {{ module.styles.title_size || 28 }}px;
    --text-size: {{ module.styles.text_size || 16 }}px;
  }
</style>
{% end_require_css %}

‍

CSS
.seminar-module {
  width: 100%;
  max-width: 960px;
  margin: 0 auto;
  padding: 20px 0;
  box-sizing: border-box;
}

/* Main Title */
.seminar-module__title {
  color: var(--title-color);
  font-size: var(--title-size);
  font-weight: bold;
  margin-bottom: 20px;
  line-height: 1.4;
}

/* List Container */
.seminar-module__container {
  background-color: var(--bg-color);
  padding: 30px;
  border-radius: 4px;
  box-sizing: border-box;
}

/* Individual Row Settings */
.seminar-module__row {
  display: flex;
  flex-wrap: nowrap; /* Do not wrap on desktop */
  align-items: baseline; /* Align text baselines */
  border-bottom: var(--border-size) solid var(--border-color);
  padding: 20px 0;
  margin: 0;
  box-sizing: border-box;
}

/* Remove border from the last item */
.seminar-module__row:last-child {
  border-bottom: none;
  padding-bottom: 0;
}
.seminar-module__row:first-child {
  padding-top: 0;
}

/* Left Side: Label */
.seminar-module__label {
  /* Width Settings */
  width: 20%; 
  min-width: 120px; /* Minimum width assurance */
  
  /* Style */
  color: var(--label-color);
  font-weight: bold;
  font-size: var(--text-size);
  
  /* Reset and Positioning */
  margin: 0;
  padding-right: 20px;
  box-sizing: border-box;
  flex-shrink: 0; /* Prevent shrinking */
}

/* Right Side: Content */
.seminar-module__content {
  /* Width Settings */
  width: 80%;
  flex-grow: 1; /* Fill remaining space */

  /* Style */
  color: var(--text-color);
  font-size: var(--text-size);
  line-height: 1.8;
  
  /* Reset */
  margin: 0;
  box-sizing: border-box;
}

/* Link styling inside rich text */
.seminar-module__content a {
  color: #0000EE;
  text-decoration: underline;
}

/* --- Mobile Responsiveness (Stack vertically) --- */
@media (max-width: 767px) {
  .seminar-module__container {
    padding: 20px;
  }
  
  .seminar-module__row {
    display: block; /* Disable flexbox to stack */
  }
  
  .seminar-module__label {
    width: 100%;
    margin-bottom: 8px;
    padding-right: 0;
  }
  
  .seminar-module__content {
    width: 100%;
  }
}
Javascript

FAQ

Do I need CSS knowledge to change the text or background colors of this module?

No, you do not. As mentioned in the "Styles" section of the article, this module includes built-in style settings. You can intuitively change text colors, background colors, font sizes, border colors, and more using color pickers and numeric inputs directly within the HubSpot page editor.

What happens to the side-by-side layout when viewed on a smartphone?

It automatically switches to a "vertical" (stacked) layout. This module is fully responsive; while it displays the "Item Name" and "Content" side-by-side on wide screens like PCs, the layout changes to stack vertically on narrow screens like smartphones to prioritize readability.

Is there a limit to how many list items (rows) I can add?

There is no specific limit. Since the "Items" field is configured as a repeating group (repeater), you can add, remove, and reorder as many rows as needed simply by clicking the "Add" button in the page editor.

Search

Search more

Related Template

Need Customization?

We can customize this sample to match your specific business requirements.

Book Free Consultation

Got a quick dev request?

Put it on Trello!Need a fix for HubSpot, CMS, or GAS? Post it on Trello.

Development Requests Here

How to Configure Date Add/Subtract Actions in HubSpot Custom Workflows

HubSpot CMS: Implementing a High-Converting "Rich CTA" Module with Shine Effects

HubSpot CMS: A Responsive "Definition List" Module for Event Overviews & Specs

HubSpot CMS: Implementing a "Step Flow" Module for Process Visualization

GAS Library: Automated Blog Post NG Word Checking with AI (Gemini/OpenAI)

Company Info
Name : SweetsVillage .Inc
CEO :
‍
Tomoo Motoyama

HomeTemplateCustomWorkflow
Terms & ConditionsPrivacy PolicyContact us

Copyright ©SweetsVillage .Inc

Back To Top Image