UI Components
Pre-built UI components for use in themes and templates.
Navigation
sdk.ui.menu(location)
Render a navigation menu.
{{{ sdk.ui.menu('primary') }}}Output:
<nav class="menu menu-primary">
<ul>
<li><a href="/">Home</a></li>
<li class="has-children">
<a href="/about">About</a>
<ul class="submenu">
<li><a href="/about/team">Team</a></li>
<li><a href="/about/contact">Contact</a></li>
</ul>
</li>
<li><a href="/blog">Blog</a></li>
</ul>
</nav>With options:
{{{ sdk.ui.menu('primary', {
class: 'main-nav',
depth: 2,
activeClass: 'current'
}) }}}sdk.ui.breadcrumbs()
Render breadcrumb navigation.
{{{ sdk.ui.breadcrumbs() }}}Output:
<nav class="breadcrumbs" aria-label="Breadcrumb">
<ol>
<li><a href="/">Home</a></li>
<li><a href="/category/tech">Technology</a></li>
<li aria-current="page">Current Post Title</li>
</ol>
</nav>With options:
{{{ sdk.ui.breadcrumbs({
separator: '›',
homeText: 'Start',
class: 'my-breadcrumbs'
}) }}}Widgets
sdk.ui.widgetArea(location)
Render a widget area.
<aside class="sidebar">
{{{ sdk.ui.widgetArea('sidebar') }}}
</aside><footer>
<div class="footer-widgets">
{{{ sdk.ui.widgetArea('footer-1') }}}
{{{ sdk.ui.widgetArea('footer-2') }}}
{{{ sdk.ui.widgetArea('footer-3') }}}
</div>
</footer>Pagination
sdk.ui.pagination(data)
Render pagination controls.
{{{ sdk.ui.pagination({
current: pagination.current,
total: pagination.total,
baseUrl: '/blog/page/'
}) }}}Output:
<nav class="pagination" aria-label="Pagination">
<a href="/blog/page/1" class="pagination-prev">Previous</a>
<a href="/blog/page/1">1</a>
<a href="/blog/page/2">2</a>
<span class="pagination-current">3</span>
<a href="/blog/page/4">4</a>
<a href="/blog/page/5">5</a>
<span class="pagination-ellipsis">...</span>
<a href="/blog/page/10">10</a>
<a href="/blog/page/4" class="pagination-next">Next</a>
</nav>Options:
{{{ sdk.ui.pagination({
current: 3,
total: 10,
baseUrl: '/blog/page/',
prevText: '← Prev',
nextText: 'Next →',
maxVisible: 7,
class: 'my-pagination'
}) }}}Search
sdk.ui.searchForm()
Render a search form.
{{{ sdk.ui.searchForm() }}}Output:
<form class="search-form" action="/search" method="GET">
<input type="search" name="q" placeholder="Search..." aria-label="Search">
<button type="submit">Search</button>
</form>With options:
{{{ sdk.ui.searchForm({
placeholder: 'Find articles...',
buttonText: 'Go',
class: 'header-search'
}) }}}Social
sdk.ui.shareButtons(url, title)
Render social share buttons.
{{{ sdk.ui.shareButtons(post.url, post.title) }}}Output:
<div class="share-buttons">
<a href="https://facebook.com/sharer/sharer.php?u=..." target="_blank" rel="noopener" class="share-btn share-facebook">Facebook</a>
<a href="https://twitter.com/intent/tweet?url=..." target="_blank" rel="noopener" class="share-btn share-twitter">Twitter</a>
<a href="https://pinterest.com/pin/create/button/?url=..." target="_blank" rel="noopener" class="share-btn share-pinterest">Pinterest</a>
</div>With options:
{{{ sdk.ui.shareButtons(post.url, post.title, {
platforms: ['facebook', 'twitter', 'linkedin', 'email'],
showLabels: false,
class: 'post-share'
}) }}}Content
sdk.ui.postCard(post)
Render a post card.
{% posts.forEach(post => { %}
{{{ sdk.ui.postCard(post) }}}
{% }) %}Output:
<article class="post-card">
<a href="/post-slug" class="post-card__image">
<img src="/uploads/image.jpg" alt="Post Title">
</a>
<div class="post-card__content">
<a href="/category/tech" class="post-card__category">Technology</a>
<h3 class="post-card__title">
<a href="/post-slug">Post Title</a>
</h3>
<p class="post-card__excerpt">Post excerpt text...</p>
<div class="post-card__meta">
<time>March 15, 2024</time>
</div>
</div>
</article>With options:
{{{ sdk.ui.postCard(post, {
showImage: true,
showCategory: true,
showExcerpt: true,
showDate: true,
showAuthor: false,
excerptLength: 100,
imageSize: 'medium',
class: 'featured-card'
}) }}}sdk.ui.categoryList()
Render category list.
{{{ sdk.ui.categoryList() }}}Output:
<ul class="category-list">
<li><a href="/category/tech">Technology</a> <span class="count">(15)</span></li>
<li><a href="/category/design">Design</a> <span class="count">(8)</span></li>
<li><a href="/category/business">Business</a> <span class="count">(12)</span></li>
</ul>With options:
{{{ sdk.ui.categoryList({
showCount: true,
orderBy: 'name', // 'name', 'count'
limit: 10,
class: 'sidebar-categories'
}) }}}sdk.ui.tagCloud()
Render a tag cloud.
{{{ sdk.ui.tagCloud() }}}Output:
<div class="tag-cloud">
<a href="/tag/javascript" class="tag tag-size-5">JavaScript</a>
<a href="/tag/css" class="tag tag-size-3">CSS</a>
<a href="/tag/react" class="tag tag-size-4">React</a>
...
</div>Forms
sdk.ui.contactForm()
Render a contact form.
{{{ sdk.ui.contactForm() }}}Output:
<form class="contact-form" action="/api/contact" method="POST">
<div class="form-group">
<label for="name">Name</label>
<input type="text" id="name" name="name" required>
</div>
<div class="form-group">
<label for="email">Email</label>
<input type="email" id="email" name="email" required>
</div>
<div class="form-group">
<label for="message">Message</label>
<textarea id="message" name="message" rows="5" required></textarea>
</div>
<button type="submit">Send Message</button>
</form>With options:
{{{ sdk.ui.contactForm({
fields: ['name', 'email', 'phone', 'subject', 'message'],
submitText: 'Send',
successMessage: 'Thanks! We\'ll be in touch.',
class: 'styled-form'
}) }}}sdk.ui.newsletterForm()
Render newsletter signup.
{{{ sdk.ui.newsletterForm() }}}With options:
{{{ sdk.ui.newsletterForm({
placeholder: 'Enter your email',
buttonText: 'Subscribe',
class: 'footer-newsletter'
}) }}}Images
sdk.ui.image(src, options)
Render responsive image.
{{{ sdk.ui.image(post.featuredImage, {
alt: post.title,
sizes: '(max-width: 768px) 100vw, 50vw',
loading: 'lazy',
class: 'post-image'
}) }}}Output:
<img
src="/uploads/image.jpg"
srcset="/uploads/image-400.jpg 400w, /uploads/image-800.jpg 800w, /uploads/image-1200.jpg 1200w"
sizes="(max-width: 768px) 100vw, 50vw"
alt="Post Title"
loading="lazy"
class="post-image"
>sdk.ui.gallery(images)
Render image gallery.
{{{ sdk.ui.gallery(post.gallery, {
columns: 3,
lightbox: true,
class: 'post-gallery'
}) }}}Author
sdk.ui.authorBox(author)
Render author information.
{{{ sdk.ui.authorBox(post.author) }}}Output:
<div class="author-box">
<img src="/avatars/john.jpg" alt="John Doe" class="author-avatar">
<div class="author-info">
<h4 class="author-name">John Doe</h4>
<p class="author-bio">Writer and developer passionate about web technologies.</p>
<div class="author-social">
<a href="https://twitter.com/johndoe">Twitter</a>
<a href="https://github.com/johndoe">GitHub</a>
</div>
</div>
</div>Comments
sdk.ui.comments(postId)
Render comments section.
{{{ sdk.ui.comments(post.id) }}}This renders the full comments list and form for the specified post.
Custom CSS Classes
All UI components accept a class option:
{{{ sdk.ui.menu('primary', { class: 'my-custom-nav' }) }}}
{{{ sdk.ui.pagination(data, { class: 'custom-pagination' }) }}}
{{{ sdk.ui.searchForm({ class: 'header-search-form' }) }}}Use these classes to style components in your theme's CSS.