A comprehensive collection of interactive UI components built with Alpine.js and styled with Tailwind CSS.
Complete set of UI components across all categories
Alpine.js powered functionality with working demos
Server-side integration with model binding
Ready-to-use Razor and HTML examples
Beautiful design with dark mode support
ARIA compliant and keyboard navigable
Flexible button components with multiple variants, sizes, and states.
<noundry-button variant="primary">Primary</noundry-button>
<noundry-button variant="secondary">Secondary</noundry-button>
<noundry-button variant="success">Success</noundry-button>
<noundry-button variant="danger">Danger</noundry-button>
Form input components with validation states and accessibility features.
<noundry-input type="text" label="Full Name" placeholder="Enter your name" />
<noundry-input type="email" label="Email" placeholder="john@example.com" />
<noundry-textarea label="Message" rows="3" placeholder="Your message..." />
Dropdown selection components with single and multiple selection capabilities.
<noundry-multiselect
label="Skills"
options="skillsOptions"
value="selectedSkills"
placeholder="Select skills..."
/>
Selection components for single and multiple choice scenarios.
<noundry-checkbox value="option1">Option 1</noundry-checkbox>
<noundry-radio-group name="payment">
<noundry-radio value="credit">Credit Card</noundry-radio>
<noundry-radio value="paypal">PayPal</noundry-radio>
</noundry-radio-group>
Toggle switches for binary settings and feature flags.
<noundry-toggle label="Enable Feature" value="enabled" />
<noundry-toggle label="Notifications" value="notifications" />
Flexible card components for organizing content.
Basic card with content.
Card with header section.
Card with footer actions.
<noundry-card>
<noundry-card-header>Header</noundry-card-header>
<noundry-card-body>Content goes here</noundry-card-body>
<noundry-card-footer>Footer actions</noundry-card-footer>
</noundry-card>
Overlay components for displaying focused content.
<noundry-modal id="example">
<noundry-modal-header>Title</noundry-modal-header>
<noundry-modal-body>Content</noundry-modal-body>
</noundry-modal>
This is an example modal with working functionality.
Alert components for displaying important messages.
<noundry-alert type="success" title="Success!">
Your changes have been saved successfully.
</noundry-alert>
<noundry-alert type="error" title="Error!">
There was an error processing your request.
</noundry-alert>
Interactive data tables with sorting, filtering, and selection.
Name | Role | Status |
---|---|---|
<noundry-table data="users">
<noundry-table-column field="name" label="Name" />
<noundry-table-column field="role" label="Role" />
<noundry-table-column field="status" label="Status" type="badge" />
</noundry-table>
u.id) : []" class="rounded border-gray-300 text-primary-600"> | Name | Status | |
---|---|---|---|
id !== user.id)" class="rounded border-gray-300 text-primary-600"> |
<noundry-table data="users" selectable="true">
<noundry-table-column type="selection" />
<noundry-table-column field="name" label="Name" />
<noundry-table-column field="email" label="Email" />
<noundry-table-column field="status" label="Status" type="badge" />
</noundry-table>
Name
|
Department | Role |
Status
|
Last Login | |
---|---|---|---|---|---|
|
|||||
Contact Information
$
Current ProjectsSkills |
<noundry-data-table
api-url="/api/employees"
page-size="25"
sortable="true"
searchable="true"
expandable="true"
>
<noundry-table-column field="name" label="Name" sortable="true" />
<noundry-table-column field="department" label="Department" />
<noundry-table-column field="status" label="Status" type="badge" />
<noundry-expand-template>
<div class="grid grid-cols-3 gap-4 p-4">
<div>
<h4>Contact Info</h4>
<p>@item.Phone</p>
<p>@item.Address</p>
</div>
<div>
<h4>Projects</h4>
<noundry-tag-list items="@item.Projects" />
</div>
<div>
<h4>Skills</h4>
<noundry-tag-list items="@item.Skills" variant="success" />
</div>
</div>
</noundry-expand-template>
</noundry-data-table>
@model List<Employee>
<noundry-data-table
data="Model"
selectable="true"
on-selection-changed="handleSelectionChange"
css-class="employee-table"
>
<noundry-table-column
field="Name"
label="Employee Name"
template-url="~/Views/Shared/_NameCell.cshtml" />
<noundry-table-column
field="Department.Name"
label="Department" />
<noundry-table-column
field="Status"
label="Status"
type="badge"
badge-config="@GetStatusBadgeConfig()" />
<noundry-table-column
field="Salary"
label="Salary"
format="currency"
culture="en-US" />
<noundry-table-actions>
<noundry-action-button
text="Edit"
action-url="@Url.Action("Edit", new { id = "@item.Id" })"
css-class="btn-primary" />
<noundry-action-button
text="Delete"
confirmation-message="Are you sure?"
action-url="@Url.Action("Delete", new { id = "@item.Id" })"
method="DELETE"
css-class="btn-danger" />
</noundry-table-actions>
</noundry-data-table>
[ApiController]
[Route("api/[controller]")]
public class EmployeesController : ControllerBase
{
[HttpGet]
public async Task<ActionResult<DataTableResponse<Employee>>> GetEmployees(
[FromQuery] DataTableRequest request)
{
var query = _context.Employees.AsQueryable();
// Apply search filter
if (!string.IsNullOrEmpty(request.Search))
{
query = query.Where(e =>
e.Name.Contains(request.Search) ||
e.Email.Contains(request.Search) ||
e.Department.Name.Contains(request.Search));
}
// Apply sorting
if (!string.IsNullOrEmpty(request.SortField))
{
query = request.SortDirection == "asc"
? query.OrderBy(request.SortField)
: query.OrderByDescending(request.SortField);
}
var totalRecords = await query.CountAsync();
// Apply pagination
var employees = await query
.Skip((request.Page - 1) * request.PageSize)
.Take(request.PageSize)
.Include(e => e.Department)
.Include(e => e.Projects)
.Include(e => e.Skills)
.ToListAsync();
return Ok(new DataTableResponse<Employee>
{
Data = employees,
TotalRecords = totalRecords,
FilteredRecords = totalRecords,
Page = request.Page,
PageSize = request.PageSize
});
}
}
List components for displaying collections of items.
<noundry-list data="tasks">
<noundry-list-item checkable="true">
<span x-text="item.text"></span>
<noundry-badge :variant="item.priority" />
</noundry-list-item>
</noundry-list>
Badge and tag components for labeling and categorization.
<noundry-badge variant="success">Active</noundry-badge>
<noundry-badge variant="warning">Pending</noundry-badge>
<noundry-badge variant="danger">Inactive</noundry-badge>
<noundry-badge variant="info">Processing</noundry-badge>
Progress indicators for showing completion status.
<noundry-progress
value="uploadProgress"
max="100"
label="Upload Progress"
show-percentage="true"
/>
Dropdown menus for actions and navigation.
<noundry-dropdown>
<noundry-dropdown-trigger>
<button>User Menu</button>
</noundry-dropdown-trigger>
<noundry-dropdown-content>
<noundry-dropdown-item>Profile</noundry-dropdown-item>
<noundry-dropdown-item>Settings</noundry-dropdown-item>
<noundry-dropdown-item variant="danger">Sign out</noundry-dropdown-item>
</noundry-dropdown-content>
</noundry-dropdown>
Contextual information overlays that appear on hover.
<noundry-tooltip text="This tooltip appears on top" position="top">
<button>Hover me</button>
</noundry-tooltip>
Non-intrusive notification messages that appear temporarily.
<noundry-toast-container position="top-right" />
// JavaScript API
toast.success('Success!', 'Operation completed successfully.');
toast.error('Error!', 'Something went wrong.');
toast.warning('Warning!', 'Please check your input.');
Tabbed interfaces for organizing content into manageable sections.
This is the overview tab content with general information about the component.
Configuration options and preferences go here.
<noundry-tabs active="activeTab">
<noundry-tab-list>
<noundry-tab value="overview">Overview</noundry-tab>
<noundry-tab value="features">Features</noundry-tab>
<noundry-tab value="settings">Settings</noundry-tab>
</noundry-tab-list>
<noundry-tab-panels>
<noundry-tab-panel value="overview">Overview content</noundry-tab-panel>
<noundry-tab-panel value="features">Features content</noundry-tab-panel>
<noundry-tab-panel value="settings">Settings content</noundry-tab-panel>
</noundry-tab-panels>
</noundry-tabs>
Collapsible content sections for FAQ, settings, and organized information.
<noundry-accordion multiple="false">
<noundry-accordion-item value="item1">
<noundry-accordion-trigger>What is Noundry?</noundry-accordion-trigger>
<noundry-accordion-content>Noundry is a comprehensive .NET development platform...</noundry-accordion-content>
</noundry-accordion-item>
<noundry-accordion-item value="item2">
<noundry-accordion-trigger>How do I get started?</noundry-accordion-trigger>
<noundry-accordion-content>Install the NuGet packages and follow our guide...</noundry-accordion-content>
</noundry-accordion-item>
</noundry-accordion>
Navigation breadcrumbs to show the current page's location within the site hierarchy.
<noundry-breadcrumb>
<noundry-breadcrumb-item href="/">Home</noundry-breadcrumb-item>
<noundry-breadcrumb-item href="/library">Library</noundry-breadcrumb-item>
<noundry-breadcrumb-item current="true">UI Components</noundry-breadcrumb-item>
</noundry-breadcrumb>
Pagination components for navigating through large datasets.
<noundry-pagination
current-page="currentPage"
total-pages="5"
show-first-last="true"
show-numbers="true"
/>
Interactive star rating components for reviews and feedback.
<noundry-rating
value="rating"
max="5"
interactive="true"
/>
<noundry-rating
value="4.0"
max="5"
readonly="true"
show-count="true"
count="120"
/>
Date selection components with calendar interfaces and range selection.
<noundry-date-picker
label="Select Date"
value="selectedDate"
format="yyyy-MM-dd"
placeholder="Choose a date"
/>
<noundry-date-range-picker
label="Select Date Range"
start-value="startDate"
end-value="endDate"
format="yyyy-MM-dd"
placeholder="Choose date range"
allow-same-day="false"
/>
<!-- With custom styling -->
<noundry-date-range-picker
label="Project Timeline"
start-value="projectStart"
end-value="projectEnd"
min-date="DateTime.Today"
max-date="DateTime.Today.AddMonths(12)"
highlight-weekends="true"
disabled-dates="holidays"
/>
Loading placeholders that mimic the shape of content while it loads.
Software Engineer
This is the actual content that appears after loading is complete. It replaces the skeleton placeholder.
<noundry-skeleton-loader type="card" />
<noundry-skeleton-loader type="list" rows="3" />
<noundry-skeleton-loader type="table" columns="4" rows="5" />
<!-- Custom skeleton -->
<noundry-skeleton>
<noundry-skeleton-avatar />
<noundry-skeleton-text lines="3" />
<noundry-skeleton-rectangle width="200" height="100" />
</noundry-skeleton>
Side panels that slide in from screen edges for detailed views and forms.
Click the button above to see the slide over panel in action.
<noundry-slide-over id="userProfile" position="right">
<noundry-slide-over-header>
<h2>User Profile</h2>
<noundry-close-button />
</noundry-slide-over-header>
<noundry-slide-over-body>
<!-- Profile form content -->
<noundry-input label="Name" value="@user.Name" />
<noundry-input label="Email" value="@user.Email" />
<noundry-textarea label="Bio" value="@user.Bio" />
</noundry-slide-over-body>
<noundry-slide-over-footer>
<noundry-button variant="primary">Save Changes</noundry-button>
<noundry-button variant="secondary">Cancel</noundry-button>
</noundry-slide-over-footer>
</noundry-slide-over>
Page-wide announcement and notification banners.
Deployment successful!
Your application has been deployed to production.
Maintenance scheduled
System maintenance on Sunday 2-4 AM EST.
New features available!
Check out our latest UI components.
<noundry-banner type="success" dismissible="true">
<noundry-banner-icon>✅</noundry-banner-icon>
<noundry-banner-content>
<strong>Deployment successful!</strong>
Your application has been deployed to production.
</noundry-banner-content>
</noundry-banner>
<noundry-banner type="warning" position="top" sticky="true">
<noundry-banner-content>
Maintenance scheduled for Sunday 2-4 AM EST
</noundry-banner-content>
<noundry-banner-action href="/maintenance">
Learn More
</noundry-banner-action>
</noundry-banner>
<!-- With auto-dismiss -->
<noundry-banner type="info" auto-dismiss="5000">
<noundry-banner-content>
This message will disappear in 5 seconds
</noundry-banner-content>
</noundry-banner>
Contextual overlays with rich content and flexible positioning.
Senior Developer
Full-stack developer with 8+ years of experience in React, Node.js, and cloud technologies.
<noundry-popover trigger="click" position="bottom-start">
<noundry-popover-trigger>
<button>Open Popover</button>
</noundry-popover-trigger>
<noundry-popover-content>
<div class="p-4 w-80">
<h4>User Profile</h4>
<p>Detailed user information goes here...</p>
<div class="mt-3">
<button>Message</button>
<button>View Profile</button>
</div>
</div>
</noundry-popover-content>
</noundry-popover>
<!-- With different positions -->
<noundry-popover position="top" offset="8">
<noundry-popover-trigger>Hover me</noundry-popover-trigger>
<noundry-popover-content>
Popover content
</noundry-popover-content>
</noundry-popover>
Right-click context menus for quick actions and shortcuts.
Right-click me!
Try right-clicking on this area
<noundry-context-menu target="#fileList">
<noundry-context-menu-item icon="📁">
New Folder
</noundry-context-menu-item>
<noundry-context-menu-item icon="📄">
New File
</noundry-context-menu-item>
<noundry-context-menu-divider />
<noundry-context-menu-item icon="📋">
Paste
</noundry-context-menu-item>
<noundry-context-menu-item icon="🗑️" variant="danger">
Delete
</noundry-context-menu-item>
</noundry-context-menu>
<!-- Programmatic usage -->
<div context-menu="fileActions">
Right-click target content
</div>
Search-driven command interface for quick actions and navigation.
Keyboard Shortcut:
<noundry-command-palette
shortcut="Ctrl+Shift+P"
placeholder="Search commands..."
max-results="10"
>
<noundry-command-group label="File">
<noundry-command action="newFile" icon="📄">
New File
</noundry-command>
<noundry-command action="openFile" icon="📁">
Open File
</noundry-command>
</noundry-command-group>
<noundry-command-group label="Navigation">
<noundry-command action="goToLine" icon="🔢">
Go to Line
</noundry-command>
<noundry-command action="searchFiles" icon="🔍">
Search Files
</noundry-command>
</noundry-command-group>
</noundry-command-palette>
Input with dropdown filtering and autocomplete functionality.
Selected:
<noundry-combobox
label="Framework"
value="selectedFramework"
options="frameworkOptions"
filterable="true"
placeholder="Search frameworks..."
>
<noundry-combobox-option value="react">React</noundry-combobox-option>
<noundry-combobox-option value="vue">Vue.js</noundry-combobox-option>
<noundry-combobox-option value="angular">Angular</noundry-combobox-option>
</noundry-combobox>
<!-- With server-side filtering -->
<noundry-combobox
api-url="/api/users/search"
value="selectedUser"
display-field="Name"
value-field="Id"
min-search-length="2"
debounce="300"
/>
One-click copy functionality for text, code, and data.
function greet(name) {
return `Hello, ${name}!`;
}
<noundry-copy-to-clipboard text="@Model.ApiKey">
<noundry-input value="@Model.ApiKey" readonly="true" />
<noundry-copy-button>Copy</noundry-copy-button>
</noundry-copy-to-clipboard>
<!-- Code block with copy -->
<noundry-code-block language="javascript" copy-button="true">
function greet(name) {
return `Hello, ${name}!`;
}
</noundry-code-block>
<!-- Inline copy -->
<noundry-copy-text text="sk-1234567890abcdef">
API Key: sk-1234567890abcdef
</noundry-copy-text>
<!-- With custom success message -->
<noundry-copy-to-clipboard
text="@shareUrl"
success-message="Link copied!"
success-duration="3000"
>
<button>Share Link</button>
</noundry-copy-to-clipboard>
Senior Developer
No commands found
Try a different search term