hs-*

Elements

Additive. You never have to reach for one. Where the platform already solves a problem, the component wraps it rather than reimplementing it.

CSS-only

<hs-card>

Container-query padding on top of a styled article.

CSS-only

<hs-badge>

Inline status mark. Same as .badge.

Light DOM

<hs-alert>

Looks like .alert before JS; dismissal is the upgrade.

Light DOM

<hs-toast>

Transient sibling of alert. Lives in hs-toast-region.

Light DOM

<hs-field>

Wires label, hint, and the browser’s own validationMessage.

Light DOM

<hs-copy>

A real button plus the Clipboard API.

Light DOM

<hs-dialog>

A real <dialog>: top layer, backdrop, focus trap, Escape.

Light DOM

<hs-accordion>

Coordinates real <details> with exclusive grouping.

Light DOM

<hs-theme-toggle>

A real button that flips color-scheme.

Light DOM

<hs-tooltip>

aria-describedby cannot cross shadow, so the bubble stays light.

Light DOM

<hs-sortable>

Enhances a real <table>. Without JS it is still a table.

Shadow

<hs-tabs>

No platform widget. Roving tabindex and ARIA from the panels.

Shadow

<hs-toggle>

No cross-browser switch. Form-associated via ElementInternals.

Shadow

<hs-combobox>

Not a <select>. Filtering a long list by typing.

Shadow

<hs-menu>

<menu> is a list, not a widget. Popover + commands.

Invoice Due

CSS-only card. Container queries, not viewport media.

Berlin Hamburg Munich
Email notifications
Duplicate Rename Delete

Same tokens on <p> and <hs-combobox>.

A platform dialog

Top layer, backdrop, focus trap, Escape. <form method="dialog"> still closes it.

What if JavaScript is off?

Light-DOM elements look right before they upgrade.

Do I need a class?

No. Tags are styled. Classes are opt-in atoms and variants.

NameSize
Report12
Archive128
Notes3

Full attributes, events, and parts: the README and custom-elements.json on this site. Use these tokens on markup you invented → · Wire the manifest into an agent →