Live gallery
Component showcase
Every component, server-rendered and interactive. Each demo is a real
render*() call from @basenative/components — no mockups,
no screenshots, no virtual DOM.
No sections match your filter.
Badges & avatars
Compact status pills and an initials-fallback avatar that reads from the name attribute. Both are built on a single span element.
View source
renderBadge('Active', { variant: 'success' })
renderBadge('Warning', { variant: 'warning' })
View source
renderAvatar({ name: 'Alice Johnson', size: 'lg' })
Form controls
Native form fields with label / help / error wiring, plus a live-validating input that toggles aria-invalid based on signal state.
View source
renderInput({ name: 'email', label: 'Email', type: 'email', helpText: '...' })
renderInput({ name: 'username', label: 'Username', value: 'ab', error: '...' })
View source
const value = signal('');
const valid = computed(() => value().length >= 3);
effect(() => input.setAttribute('aria-invalid', String(!valid())));
View source
renderTextarea({ name: 'bio', rows: 3 })
renderSelect({ name: 'role', items: [...] })
renderCombobox({ name: 'framework', items: [...] })
renderMultiselect({ name: 'tags', items: [...], selected: [...] })
View source
renderCheckbox({ name: 'terms', label: '...' })
renderRadioGroup({ name: 'plan', items: [...], selected: 'Pro' })
renderToggle({ name: 'notifications', checked: true })
Feedback
Inline alerts, native progress, CSS spinners, skeletons, and an animated progress bar that ticks via setInterval bound to a signal.
View source
renderAlert('Saved.', { variant: 'success' })
renderAlert('Heads up.',{ variant: 'warning' })
renderAlert('Failed.', { variant: 'error', dismissible: true })
View source
const v = signal(0);
effect(() => bar.value = v());
setInterval(() => v.set(p => (p + 5) % 105), 200);
View source
renderSpinner({ size: 'lg', label: 'Loading' })
View source
renderSkeleton({ width: '100%', height: '1rem', count: 3 })
Cards & layout
Article-shaped cards, accordions built on the native details element, and ARIA tablists with arrow-key navigation.
Card body content with descriptive text about the feature or item being presented.
View source
renderCard({ header, body, footer })
What is BaseNative?
How does SSR work?
What about hydration?
View source
renderAccordion({ items: [{ title, content }, ...] })
BaseNative brings Angular-inspired control flow to native template elements.
Signals, computed values, effects, SSR, hydration, and template directives.
signal(), computed(), effect(), hydrate(), render().
View source
renderTabs({ tabs: [{ id, label, content }, ...] })
Data display
From a basic table to a sortable data grid, an aria-tree, and a windowed virtual list of 200 rows.
| Name | Role | Status |
|---|---|---|
| Alice Johnson | Admin | Active |
| Bob Smith | Editor | Active |
| Carol Davis | Viewer | Inactive |
View source
renderTable({ columns: [...], rows: [...], caption: 'Team members' })
| Task ↑ | Assignee | Priority | Status | |
|---|---|---|---|---|
| Design token system | Alice | High | Done | |
| Signal reactivity | Bob | High | Done | |
| Server rendering | Carol | Medium | Active | |
| Client hydration | Dan | Medium | Pending | |
| Component library | Alice | Low | Active |
View source
renderDataGrid({ columns, rows, sortBy: 'task', sortDir: 'asc', selectable: true })
- 📁src
- 📁runtime
- 📄signals.js
- 📄hydrate.js
- 📄bind.js
- 📁server
- 📁examples
View source
renderTree({ items: [...], expanded: new Set(['1', '1-1']), selected: '1-1-1' })
View source
renderVirtualList({ items: [...], itemHeight: 44, containerHeight: 240 })
Overlays
Native dialog, drawer that slides in, popover-anchored menus and tooltips, and a Cmd+K command palette.
View source
const d = renderDialog({ title, content, footer, id: 'my-dialog' });
document.getElementById('my-dialog').showModal();
View source
renderDrawer({ title, content, position: 'right' })
View source
renderDropdownMenu({ trigger: 'Actions', items: [{ label, action, icon }, ...] })
View source
renderTooltip({ trigger, content, position: 'top' })
View source
renderCommandPalette({ commands: [{ label, action, group, shortcut }, ...] })
View source
import { showToast } from '@basenative/components';
showToast({ message: 'Saved.', variant: 'success' });
Block components
Higher-order layouts: a layout grid, a week calendar, and a pipeline board — all server-rendered, all on native primitives.
View source
renderLayoutGrid({ columns: 6, cells: [{ id, label, colSpan, rowSpan }, ...] })
View source
renderCalendar({ startDate, events: [...], hours: { start: 8, end: 18 } })
View source
renderPipeline({ columns: [...], cards: [{ id, columnId, title, ... }, ...] })
Live runtime
Pure-runtime demos that prove signals + effects work without virtual DOM, without rebuilds, without classes.
Updates every second. The <time> element is server-rendered with a placeholder; hydration takes over on the client.
View source
const time = signal(new Date());
effect(() => el.textContent = time().toLocaleTimeString());
setInterval(() => time.set(new Date()), 1000);
View source
btn.onclick = (e) => {
document.documentElement.style
.setProperty('--accent', e.target.dataset.bnAccent);
};
- Value
- 0
- Doubled
- 0
- Parity
- even
View source
const n = signal(0);
const doubled = computed(() => n() * 2);
const parity = computed(() => n() % 2 === 0 ? 'even' : 'odd');
effect(() => { value.textContent = n();
doubledEl.textContent = doubled();
parityEl.textContent = parity(); });