Search, menus & filters
Search inputs, dropdown menu items, quick-filter chips, active filter bars, and composable filter panels — the selection and discovery layer of every data-heavy view.
Search input
An enhanced text input scoped to search. Pairs a leading search icon with an optional clear button and keyboard shortcut badge.
<!-- Basic search -->
<div class="ws-search-wrap">
<svg class="ws-search-icon">...</svg>
<input class="ws-input" type="search" placeholder="Search..." />
</div>
<!-- With clear button -->
<div class="ws-search-wrap">
<svg class="ws-search-icon">...</svg>
<input class="ws-input" type="search" value="Acme Manufacturing" />
<button class="ws-search-clear" aria-label="Clear search">×</button>
</div>Menu items
The atomic unit of every dropdown, context menu, and command list. Items compose into a .ws-menu-list container and support icons, values, badges, checkboxes, radio buttons, and keyboard shortcuts.
<div class="ws-menu-list">
<!-- Section header -->
<div class="ws-menu-section">Policy type</div>
<!-- Simple item -->
<button class="ws-menu-item">
<span class="ws-menu-item__label">View details</span>
</button>
<!-- With icon -->
<button class="ws-menu-item">
<svg class="ws-menu-item__icon">...</svg>
<span class="ws-menu-item__label">Client profile</span>
</button>
<!-- Active + with count badge -->
<button class="ws-menu-item is-active">
<span class="ws-menu-item__label">Active policies</span>
<span class="ws-menu-item__badge">84</span>
</button>
<!-- Checkbox item -->
<button class="ws-menu-item is-active">
<span class="ws-menu-item__check"><svg>...checkmark...</svg></span>
<span class="ws-menu-item__label">General Liability</span>
</button>
<div class="ws-menu-divider"></div>
<!-- Danger action -->
<button class="ws-menu-item is-danger">
<span class="ws-menu-item__label">Delete policy</span>
</button>
</div>Anatomy
.ws-menu-item__icon16×16 px, secondary color. Turns brand-green on .is-active.
.ws-menu-item__labelTakes up remaining flex space. Always present.
Right-aligned metadata. Use .ws-menu-item__value for text, .ws-menu-item__badge for counts, .ws-menu-item__arrow for sub-menu chevrons.
Selection controls — use .ws-menu-item__check for multi-select, .ws-menu-item__radio for single-select. Add .is-active to the item to show selected state.
Quick filter chips
A horizontal row of toggleable chips for rapid category-level filtering. Shows counts, supports multi-select, and pairs well with a table or card list beneath it.
<div class="ws-quick-filters">
<button class="ws-quick-chip is-active">
All <span class="ws-quick-chip__count">127</span>
</button>
<button class="ws-quick-chip">
Active <span class="ws-quick-chip__count">84</span>
</button>
<button class="ws-quick-chip">Renewing</button>
</div>Filter bar
A composed strip combining a search input, removable active-filter chips, and an “Add filter” trigger. Applied filters are shown as chips so users see exactly what is active and can remove individual filters independently.
<div class="ws-filter-bar-full">
<!-- Search input -->
<div class="ws-search-wrap">
<svg class="ws-search-icon">...</svg>
<input class="ws-input" type="search" placeholder="Search..." />
</div>
<!-- Active filter chips -->
<div class="ws-active-filters">
<span class="ws-filter-chip-active">
<span class="ws-filter-chip-active__label">Status:</span> Active
<button class="ws-filter-chip-active__remove" aria-label="Remove">×</button>
</span>
<button class="ws-btn ws-btn--tertiary ws-btn--sm">Clear all</button>
</div>
<!-- Add filter trigger -->
<button class="ws-filter-trigger">
<svg>...</svg> Add filter
</button>
</div>Filter panel
The dropdown that opens from the “Add filter” or “Filter” trigger. Hosts checkbox lists, radio groups, date range inputs, and min/max inputs depending on the filter type.
<div class="ws-filter-panel">
<div class="ws-filter-panel__header">
<span class="ws-filter-panel__title">Policy type</span>
<button class="ws-filter-panel__clear">Clear</button>
</div>
<div class="ws-filter-panel__body">
<!-- Optional search within list -->
<div class="ws-search-wrap">...</div>
<!-- Checkbox items -->
<button class="ws-menu-item is-active">
<span class="ws-menu-item__check"><svg>...</svg></span>
<span class="ws-menu-item__label">General Liability</span>
<span class="ws-menu-item__badge">42</span>
</button>
</div>
<div class="ws-filter-panel__footer">
<button class="ws-btn ws-btn--secondary ws-btn--sm">Cancel</button>
<button class="ws-btn ws-btn--primary ws-btn--sm">
Apply <span class="ws-filter-count">2</span>
</button>
</div>
</div>Composing filter groups
A complete data-view header combining quick-filter chips above the table with a search + filter bar. This is the standard filter pattern for policy lists, claim queues, and client tables in WS Connect.
| Client | Policy | Type | Expiry | Status |
|---|---|---|---|---|
| Acme Manufacturing Co. | WS-2026-004471 | General Liability | 14 Mar 2027 | Active |
| Bright Horizons LLC | WS-2026-003812 | Workers' Comp | 01 Feb 2027 | Renewing |
| Cascade Systems Inc. | WS-2026-002209 | General Liability | 22 Jan 2027 | Renewing |
| Delta Logistics Group | WS-2025-009941 | Workers' Comp | 31 Dec 2026 | Expired |
<!-- Quick chips -->
<div class="ws-quick-filters">
<button class="ws-quick-chip is-active">All <span class="ws-quick-chip__count">127</span></button>
<button class="ws-quick-chip">Active</button>
<button class="ws-quick-chip">Renewing</button>
</div>
<!-- Filter bar -->
<div class="ws-filter-bar-full">
<div class="ws-search-wrap">...</div>
<div class="ws-active-filters">
<span class="ws-filter-chip-active">
<span class="ws-filter-chip-active__label">Type:</span> GL, WC
<button class="ws-filter-chip-active__remove">×</button>
</span>
</div>
<button class="ws-filter-trigger is-active">
Filter <span class="ws-filter-count">2</span>
</button>
</div>
<!-- Table or card list -->
<table class="ws-table">...</table>Quick-filter chips filter by a single dimension (e.g. status). The filter bar handles multi-dimensional filtering (type + date + status simultaneously). Never duplicate the same dimension in both layers — if status chips are present, remove status from the filter bar dropdown.