Visibility & Conditionals
Visibility attributes allow you to show or hide elements based on your data values. These are essential for creating dynamic interfaces that respond to state changes.
dbind_show
Purpose: Show an element when a data value is truthy; hide it when falsy.
Syntax:
<element dbind_show="fieldName"></element>
<element dbind_show="nested.field"></element>
What is "Truthy"?
An element is shown when the value is truthy:
true- Non-empty strings (
"hello","yes","active") - Non-zero numbers (
1,42,-5) - Non-empty arrays (
[1, 2, 3]) - Non-empty objects (
{ key: "value" })
An element is hidden when the value is falsy:
falsenullundefined- Empty string
"" 0- Empty array
[]
Basic Usage
<!-- Show when user is verified -->
<span class="verified-badge" dbind_show="isVerified">✓ Verified</span>
<!-- Show when item has a discount -->
<span class="discount-tag" dbind_show="hasDiscount">On Sale!</span>
<!-- Nested property check -->
<div dbind_show="user.isAdmin">Admin Controls Here</div>
Data:
{
"isVerified": true,
"hasDiscount": false,
"user": {
"isAdmin": true
}
}
Result:
<span class="verified-badge">✓ Verified</span>
<!-- discount-tag is hidden -->
<div>Admin Controls Here</div>
Use Cases
1. Premium/Pro Features
<div class="feature-card">
<h3 dbind_data="featureName"></h3>
<span class="pro-badge" dbind_show="isPro">PRO</span>
<span class="free-badge" dbind_show="isFree">FREE</span>
</div>
2. User Authentication State
<!-- Navigation items based on auth -->
<nav>
<a href="/dashboard" dbind_show="isLoggedIn">Dashboard</a>
<a href="/login" dbind_show="isGuest">Login</a>
<a href="/signup" dbind_show="isGuest">Sign Up</a>
</nav>
3. Content with Warnings
<article>
<h1 dbind_data="title"></h1>
<div class="content-warning" dbind_show="hasContentWarning">
<strong>Content Warning:</strong>
<span dbind_data="contentWarningText"></span>
</div>
<div class="article-body" dbind_html="content"></div>
</article>
4. Optional Profile Fields
<div class="user-profile">
<h3 dbind_data="name"></h3>
<p dbind_show="bio" dbind_data="bio"></p>
<a dbind_show="website" dbind_href="website">Website</a>
<a dbind_show="twitter" dbind_href="twitter">Twitter</a>
<a dbind_show="github" dbind_href="github">GitHub</a>
</div>
5. Stock/Availability Status
<div class="product-availability">
<span class="in-stock" dbind_show="inStock">In Stock</span>
<span class="low-stock" dbind_show="lowStock">Only a few left!</span>
<span class="out-of-stock" dbind_show="outOfStock">Out of Stock</span>
</div>
Data (different scenarios):
// In stock
{ "inStock": true, "lowStock": false, "outOfStock": false }
// Low stock
{ "inStock": false, "lowStock": true, "outOfStock": false }
// Out of stock
{ "inStock": false, "lowStock": false, "outOfStock": true }
Showing Based on Array Length
<!-- Show message if user has notifications -->
<div dbind_show="notifications">
You have new notifications
</div>
<!-- Show if cart has items -->
<span class="cart-indicator" dbind_show="cartItems">
<span dbind_data="cartItems.length"></span> items
</span>
Data:
{
"notifications": [{ "id": 1, "message": "New follower" }],
"cartItems": []
}
In this example, notifications indicator shows (non-empty array), but cart indicator is hidden (empty array).
dbind_hide
Purpose: Hide an element when a data value is truthy; show it when falsy. This is the inverse of dbind_show.
Syntax:
<element dbind_hide="fieldName"></element>
When to Use dbind_hide vs dbind_show
| Scenario | Recommendation |
|---|---|
| Show verified badge | dbind_show="isVerified" |
| Hide when loading | dbind_hide="isLoading" |
| Show when complete | dbind_show="isComplete" |
| Hide content during edit | dbind_hide="isEditing" |
The choice often depends on code readability. Use whichever makes the intent clearer.
Basic Usage
<!-- Hide content while loading -->
<div class="main-content" dbind_hide="isLoading">
<h1 dbind_data="title"></h1>
<p dbind_data="description"></p>
</div>
<!-- Hide edit button when already editing -->
<button dbind_hide="isEditing">Edit</button>
Use Cases
1. Loading States
<div class="content-section">
<!-- Hide content while loading -->
<div class="content" dbind_hide="isLoading">
<p dbind_data="content"></p>
</div>
<!-- Show loader while loading -->
<div class="loader" dbind_show="isLoading">
Loading...
</div>
</div>
2. Edit Mode Toggle
<div class="profile-section">
<!-- Display mode -->
<div dbind_hide="isEditing">
<h3 dbind_data="name"></h3>
<p dbind_data="bio"></p>
<button onclick="toggleEdit()">Edit Profile</button>
</div>
<!-- Edit mode -->
<form dbind_show="isEditing">
<input type="text" value="{{name}}" placeholder="Name">
<textarea placeholder="Bio">{{bio}}</textarea>
<button type="submit">Save</button>
<button type="button" onclick="toggleEdit()">Cancel</button>
</form>
</div>
3. Error State Handling
<div class="data-container">
<!-- Hide data when there's an error -->
<div class="data-display" dbind_hide="hasError">
<p dbind_data="data"></p>
</div>
<!-- Show error message -->
<div class="error-message" dbind_show="hasError">
<p dbind_data="errorMessage"></p>
<button>Retry</button>
</div>
</div>
4. Disable Feature for Free Users
<div class="premium-feature">
<!-- Hide lock for premium users -->
<div class="feature-lock" dbind_hide="isPremium">
<span>🔒 Premium Feature</span>
<a href="/upgrade">Upgrade to Unlock</a>
</div>
<!-- Show feature for premium users -->
<div class="feature-content" dbind_show="isPremium">
<!-- Premium feature content -->
</div>
</div>
dbind_if
Purpose: Show or hide an element based on a conditional expression with comparison operators.
Syntax:
<!-- Simple comparison -->
<element dbind_if="field==value"></element>
<element dbind_if="field!=value"></element>
<element dbind_if="field>value"></element>
<element dbind_if="field<value"></element>
<element dbind_if="field>=value"></element>
<element dbind_if="field<=value"></element>
Supported Operators
| Operator | Meaning | Example |
|---|---|---|
== | Equals | dbind_if="status==active" |
!= | Not equals | dbind_if="role!=guest" |
> | Greater than | dbind_if="stock>0" |
< | Less than | dbind_if="price<100" |
>= | Greater or equal | dbind_if="rating>=4" |
<= | Less or equal | dbind_if="quantity<=5" |
String Comparisons
<!-- Status equals "active" -->
<span class="status-active" dbind_if="status==active">Active</span>
<!-- Status equals "pending" -->
<span class="status-pending" dbind_if="status==pending">Pending</span>
<!-- Status not equals "inactive" -->
<span dbind_if="status!=inactive">Currently operational</span>
<!-- Role equals "admin" -->
<div dbind_if="user.role==admin">
Admin Panel Access
</div>
Data:
{
"status": "active",
"user": {
"role": "admin"
}
}
Numeric Comparisons
<!-- Stock checks -->
<span class="in-stock" dbind_if="stock>10">In Stock</span>
<span class="low-stock" dbind_if="stock<=10">Low Stock</span>
<span class="out-of-stock" dbind_if="stock==0">Out of Stock</span>
<!-- Price ranges -->
<span class="budget" dbind_if="price<50">Budget Friendly</span>
<span class="mid-range" dbind_if="price>=50">Mid Range</span>
<span class="premium" dbind_if="price>=200">Premium</span>
<!-- Rating display -->
<span dbind_if="rating>=4.5">⭐ Highly Rated</span>
<span dbind_if="rating>=3">Good Rating</span>
<span dbind_if="rating<3">Needs Improvement</span>
Use Cases
1. User Role-Based UI
<nav class="admin-nav">
<!-- Super Admin only -->
<a href="/admin/settings" dbind_if="role==superadmin">System Settings</a>
<!-- Admin and Super Admin -->
<a href="/admin/users" dbind_if="role!=viewer">Manage Users</a>
<!-- Editor and above -->
<a href="/admin/content" dbind_if="role!=viewer">Manage Content</a>
<!-- Everyone -->
<a href="/admin/dashboard">Dashboard</a>
</nav>
2. Order Status Timeline
<div class="order-timeline">
<div class="step completed" dbind_if="status!=pending">
✓ Order Placed
</div>
<div class="step" dbind_class="statusClass" dbind_if="status!=pending">
Processing
</div>
<div class="step" dbind_if="status==shipped">
Shipped
</div>
<div class="step" dbind_if="status==delivered">
Delivered
</div>
</div>
3. Quantity-Based Messaging
<div class="stock-status">
<span dbind_if="quantity==0" class="out-of-stock">
Out of Stock - Email me when available
</span>
<span dbind_if="quantity<=5" class="low-stock">
Only <span dbind_data="quantity"></span> left! Order soon.
</span>
<span dbind_if="quantity>5" class="in-stock">
In Stock - Ships within 24 hours
</span>
</div>
Note: Multiple conditions can match, so structure your HTML to handle overlapping ranges appropriately or use mutually exclusive conditions.
4. Subscription Tier Features
<div class="feature-list">
<!-- Free tier -->
<div dbind_if="tier==free">
<h3>Free Plan</h3>
<ul>
<li>5 projects</li>
<li>Basic support</li>
</ul>
</div>
<!-- Pro tier -->
<div dbind_if="tier==pro">
<h3>Pro Plan</h3>
<ul>
<li>Unlimited projects</li>
<li>Priority support</li>
<li>Advanced analytics</li>
</ul>
</div>
<!-- Enterprise tier -->
<div dbind_if="tier==enterprise">
<h3>Enterprise Plan</h3>
<ul>
<li>Everything in Pro</li>
<li>Dedicated account manager</li>
<li>Custom integrations</li>
<li>SLA guarantee</li>
</ul>
</div>
</div>
5. Age/Date-Based Content
<div class="user-badge">
<span dbind_if="memberDays>=365">🏆 Veteran Member</span>
<span dbind_if="memberDays>=30">⭐ Active Member</span>
<span dbind_if="memberDays<30">🆕 New Member</span>
</div>
6. Score/Rating Display
<div class="rating-badge">
<span dbind_if="score>=90" class="grade-a">A</span>
<span dbind_if="score>=80" class="grade-b">B</span>
<span dbind_if="score>=70" class="grade-c">C</span>
<span dbind_if="score>=60" class="grade-d">D</span>
<span dbind_if="score<60" class="grade-f">F</span>
</div>
Important Notes
- String values in comparisons don't need quotes:
dbind_if="status==active"notdbind_if="status=='active'" - For boolean checks, prefer
dbind_show:dbind_show="isActive"instead ofdbind_if="isActive==true" - Comparisons are case-sensitive for strings
- Nested properties work:
dbind_if="user.role==admin"
dbind_unless
Purpose: Show an element unless a condition is true. This is the inverse of dbind_if.
Syntax:
<element dbind_unless="field==value"></element>
When to Use dbind_unless vs dbind_if
| Intent | Use |
|---|---|
| "Show if status equals active" | dbind_if="status==active" |
| "Show if status is NOT active" | dbind_unless="status==active" |
| "Show if NOT admin" | dbind_unless="role==admin" |
Basic Usage
<!-- Show unless user is admin -->
<div class="upgrade-prompt" dbind_unless="role==admin">
<p>Upgrade to Admin for more features!</p>
</div>
<!-- Show unless item is sold out -->
<button class="add-to-cart" dbind_unless="stock==0">
Add to Cart
</button>
<!-- Show unless already subscribed -->
<form class="newsletter-signup" dbind_unless="isSubscribed==true">
<input type="email" placeholder="Your email">
<button type="submit">Subscribe</button>
</form>
Use Cases
1. Showing Content to Non-Premium Users
<!-- Ad space for free users -->
<div class="advertisement" dbind_unless="tier==premium">
<p>Advertisement</p>
<a href="/upgrade">Go Premium to remove ads</a>
</div>
2. Showing Edit Controls to Non-Owners
<!-- Report button for non-owners -->
<button class="report-btn" dbind_unless="isOwner==true">
Report Content
</button>
<!-- Only owners see edit -->
<button class="edit-btn" dbind_if="isOwner==true">
Edit
</button>
3. Default State Messages
<!-- Show unless there's custom status -->
<span class="status-default" dbind_unless="customStatus==true">
No status set
</span>
<span class="status-custom" dbind_if="customStatus==true" dbind_data="statusMessage">
</span>
dbind_empty
Purpose: Show an element when an array or value is empty. Commonly used for "no results" messages.
Syntax:
<element dbind_empty="arrayField"></element>
When is Something "Empty"?
dbind_empty shows the element when:
- Array is empty:
[] - String is empty:
"" - Value is
null - Value is
undefined
Basic Usage
<!-- Show when no items in list -->
<div class="product-list" dbind_repeat="products">
<div class="product-card">
<h3 dbind_data="name"></h3>
</div>
</div>
<div class="no-products" dbind_empty="products">
<p>No products found.</p>
<a href="/products">Browse all products</a>
</div>
Use Cases
1. Search Results
<div class="search-results">
<div dbind_repeat="results">
<div class="result-item">
<h4 dbind_data="title"></h4>
<p dbind_data="description"></p>
</div>
</div>
<div class="no-results" dbind_empty="results">
<h3>No results found</h3>
<p>Try adjusting your search terms or filters.</p>
<button onclick="clearFilters()">Clear Filters</button>
</div>
</div>
2. Empty Cart
<div class="shopping-cart">
<div dbind_repeat="cartItems">
<div class="cart-item">
<span dbind_data="name"></span>
<span dbind_data="price" dbind_format="currency:USD"></span>
</div>
</div>
<div class="empty-cart" dbind_empty="cartItems">
<img src="/images/empty-cart.svg" alt="Empty cart">
<h3>Your cart is empty</h3>
<p>Looks like you haven't added anything yet.</p>
<a href="/products" class="btn-primary">Start Shopping</a>
</div>
</div>
3. Empty Notifications
<div class="notifications-panel">
<div dbind_repeat="notifications">
<div class="notification" dbind_class="typeClass">
<span dbind_data="message"></span>
<time dbind_data="timestamp" dbind_format="date:relative"></time>
</div>
</div>
<div class="no-notifications" dbind_empty="notifications">
<span class="bell-icon">🔔</span>
<p>You're all caught up!</p>
<p>No new notifications.</p>
</div>
</div>
4. Empty Dashboard State
<div class="projects-dashboard">
<div class="projects-grid" dbind_repeat="projects">
<div class="project-card">
<h3 dbind_data="name"></h3>
</div>
</div>
<div class="empty-state" dbind_empty="projects">
<img src="/images/no-projects.svg" alt="No projects">
<h2>Create your first project</h2>
<p>Get started by creating a new project.</p>
<button class="btn-primary" onclick="createProject()">
+ New Project
</button>
</div>
</div>
5. Empty Comments Section
<section class="comments-section">
<h3>Comments (<span dbind_data="comments.length">0</span>)</h3>
<div dbind_repeat="comments">
<div class="comment">
<img dbind_src="author.avatar" dbind_alt="author.name">
<div class="comment-content">
<strong dbind_data="author.name"></strong>
<p dbind_data="text"></p>
</div>
</div>
</div>
<div class="no-comments" dbind_empty="comments">
<p>No comments yet. Be the first to share your thoughts!</p>
</div>
<form class="comment-form">
<textarea placeholder="Write a comment..."></textarea>
<button type="submit">Post Comment</button>
</form>
</section>
Comparison: When to Use Which
| Attribute | Best For | Example |
|---|---|---|
dbind_show | Simple boolean checks | dbind_show="isActive" |
dbind_hide | Inverse boolean (hide when true) | dbind_hide="isLoading" |
dbind_if | Value comparisons | dbind_if="status==active" |
dbind_unless | Inverse comparisons | dbind_unless="role==admin" |
dbind_empty | Empty array/value checks | dbind_empty="searchResults" |
Decision Tree
Do you need to check if an array is empty?
→ YES: Use dbind_empty
Is it a simple true/false check?
→ YES, show when true: Use dbind_show
→ YES, hide when true: Use dbind_hide
Do you need to compare values (==, !=, >, <)?
→ YES, show when condition matches: Use dbind_if
→ YES, show when condition doesn't match: Use dbind_unless
Combining Visibility Attributes
With dbind_data
<!-- Show verified badge only for verified users -->
<span dbind_show="isVerified" class="badge-verified">
✓ Verified <span dbind_data="verificationDate" dbind_format="date:short"></span>
</span>
With dbind_repeat
<!-- Show "no results" for empty filtered list -->
<div dbind_repeat="filteredItems">
<div class="item" dbind_data="name"></div>
</div>
<div dbind_empty="filteredItems">
No items match your filters
</div>
With dbind_class
<!-- Conditional styling + visibility -->
<div dbind_show="alert" dbind_class="alertClass">
<span dbind_data="alertMessage"></span>
</div>
Multiple Conditions
<!-- Complex visibility logic -->
<div class="premium-content">
<!-- Show to premium users -->
<div dbind_show="isPremium">
<h2>Premium Content</h2>
<div dbind_html="premiumContent"></div>
</div>
<!-- Show trial expiring warning -->
<div dbind_if="daysLeft<=7" class="trial-warning">
Your trial expires in <span dbind_data="daysLeft"></span> days
</div>
<!-- Show upgrade prompt to free users -->
<div dbind_unless="isPremium==true" class="upgrade-cta">
<h3>Unlock Premium Features</h3>
<a href="/upgrade" class="btn-upgrade">Upgrade Now</a>
</div>
</div>
CSS Considerations
How Visibility is Applied
By default, DBindly hides elements by setting display: none. You can customize this behavior:
/* Default behavior */
[dbind_show][data-dbindly-hidden],
[dbind_hide]:not([data-dbindly-hidden]),
[dbind_if][data-dbindly-hidden],
[dbind_unless][data-dbindly-hidden],
[dbind_empty][data-dbindly-hidden] {
display: none !important;
}
Preventing Flash of Unstyled Content
Use dbind_cloak to prevent elements from showing before DBindly processes them:
<style>
[dbind_cloak] { display: none; }
</style>
<div dbind_cloak>
<span dbind_show="isLoggedIn">Welcome back!</span>
</div>
DBindly removes the dbind_cloak attribute after processing, revealing the correctly shown/hidden elements.
Complete Example: E-commerce Product Page
<div class="product-page">
<!-- Product Header -->
<header class="product-header">
<h1 dbind_data="name"></h1>
<!-- Badges -->
<div class="badges">
<span class="badge-new" dbind_show="isNew">New</span>
<span class="badge-sale" dbind_show="onSale">Sale</span>
<span class="badge-bestseller" dbind_if="salesRank<=10">Bestseller</span>
<span class="badge-low-stock" dbind_if="stock<=5">Only <span dbind_data="stock"></span> left</span>
</div>
</header>
<!-- Pricing -->
<div class="pricing">
<span class="current-price" dbind_data="price" dbind_format="currency:USD"></span>
<span class="original-price" dbind_show="onSale" dbind_data="originalPrice" dbind_format="currency:USD"></span>
<span class="discount-percent" dbind_show="onSale" dbind_data="discountPercent"></span>
</div>
<!-- Availability Status -->
<div class="availability">
<span class="in-stock" dbind_if="stock>10">
✓ In Stock - Ships within 24 hours
</span>
<span class="low-stock" dbind_if="stock<=10">
⚠ Low Stock - Only <span dbind_data="stock"></span> remaining
</span>
<span class="out-of-stock" dbind_if="stock==0">
✕ Out of Stock
</span>
</div>
<!-- Add to Cart Section -->
<div class="purchase-section">
<!-- Show add to cart unless out of stock -->
<button class="btn-add-cart" dbind_unless="stock==0">
Add to Cart
</button>
<!-- Show notify me for out of stock -->
<button class="btn-notify" dbind_if="stock==0">
Notify When Available
</button>
</div>
<!-- Reviews Section -->
<section class="reviews">
<h2>Customer Reviews</h2>
<!-- Review summary (show if has reviews) -->
<div class="review-summary" dbind_show="hasReviews">
<span class="avg-rating">
<span dbind_data="avgRating"></span>/5
</span>
<span>(<span dbind_data="reviewCount"></span> reviews)</span>
</div>
<!-- Review list -->
<div class="review-list" dbind_repeat="reviews">
<div class="review">
<div class="reviewer">
<span dbind_data="author"></span>
<span class="verified-buyer" dbind_show="verifiedPurchase">✓ Verified</span>
</div>
<div class="rating" dbind_data="rating"></div>
<p dbind_data="comment"></p>
</div>
</div>
<!-- No reviews message -->
<div class="no-reviews" dbind_empty="reviews">
<p>No reviews yet. Be the first to review this product!</p>
<button class="btn-write-review">Write a Review</button>
</div>
</section>
</div>
Data:
{
"name": "Premium Wireless Headphones",
"price": 149.99,
"originalPrice": 199.99,
"onSale": true,
"discountPercent": "25% OFF",
"isNew": false,
"stock": 8,
"salesRank": 5,
"hasReviews": true,
"avgRating": 4.7,
"reviewCount": 128,
"reviews": [
{
"author": "John D.",
"rating": "★★★★★",
"comment": "Amazing sound quality!",
"verifiedPurchase": true
},
{
"author": "Sarah M.",
"rating": "★★★★☆",
"comment": "Great value for the price.",
"verifiedPurchase": false
}
]
}
Next Steps
- Lists - Repeat elements for arrays
- Styling - Dynamic classes and styles
- Core Binding - Text content binding