React
LoadingLoading React…
No event yet
Early previewhamur is not on npm yet. The components are being built in the open, follow along on GitHub.
CompareOverlays
The same example, live in each framework. One core underneath, so they should behave the same.
Loading React…
No event yet
Loading Vue…
No event yet
Loading Svelte…
No event yet
Loading Solid…
No event yet
Loading Angular…
No event yet
The attributes each framework puts on the open popup, read from the page.
| Attribute | React | Vue | Svelte | Solid | Angular |
|---|---|---|---|---|---|
role | Closed | Closed | Closed | Closed | Closed |
aria-modal | Closed | Closed | Closed | Closed | Closed |
aria-labelledby | Closed | Closed | Closed | Closed | Closed |
data-open | Closed | Closed | Closed | Closed | Closed |
Nothing open. Open a tile to fill its column.
Each tile above runs this file.
import { FloatingPanel } from '@hamur/react/floating-panel'
const layers = ['Header', 'Hero image', 'Headline', 'Body copy', 'Sign-up form', 'Footer']
export default function FloatingPanelExample() {
return (
<FloatingPanel.Root defaultSize={{ width: 320, height: 260 }}>
<FloatingPanel.Trigger className="button">
Open layers
</FloatingPanel.Trigger>
<FloatingPanel.Portal>
<FloatingPanel.Popup className="floating-panel">
<FloatingPanel.DragHandle className="floating-panel-bar">
<FloatingPanel.Title className="floating-panel-title">
Layers
</FloatingPanel.Title>
<FloatingPanel.Minimize className="floating-panel-button">
<svg viewBox="0 0 24 24" aria-hidden="true">
<path d="M5 12h14" />
</svg>
</FloatingPanel.Minimize>
<FloatingPanel.Maximize className="floating-panel-button">
<svg className="floating-panel-icon-maximize" viewBox="0 0 24 24" aria-hidden="true">
<rect width="16" height="16" x="4" y="4" />
</svg>
<svg className="floating-panel-icon-restore" viewBox="0 0 24 24" aria-hidden="true">
<path d="M8 8V4h12v12h-4M4 8h12v12H4z" />
</svg>
</FloatingPanel.Maximize>
<FloatingPanel.Close
className="floating-panel-button"
aria-label="Close layers"
>
<svg viewBox="0 0 24 24" aria-hidden="true">
<path d="M18 6 6 18M6 6l12 12" />
</svg>
</FloatingPanel.Close>
</FloatingPanel.DragHandle>
<FloatingPanel.Body className="floating-panel-body">
<FloatingPanel.Description className="muted">
Drag the title bar to move the panel. Focused, the arrow keys move it and Alt with the
arrow keys resizes it.
</FloatingPanel.Description>
<ul className="floating-panel-list">
{layers.map((layer) => (
<li key={layer}>{layer}</li>
))}
</ul>
</FloatingPanel.Body>
<FloatingPanel.ResizeHandle
className="floating-panel-resize"
position="bottom-right"
>
<svg viewBox="0 0 24 24" aria-hidden="true">
<path d="M21 13 13 21M21 19l-2 2" />
</svg>
</FloatingPanel.ResizeHandle>
</FloatingPanel.Popup>
</FloatingPanel.Portal>
</FloatingPanel.Root>
)
}
The frameworks against each other only, on the same machine and the same example.
| Framework | Tests | Size | Open | Close | Memory |
|---|---|---|---|---|---|
| React | Not measured yet | Not measured yet | Not measured yet | Not measured yet | Not measured yet |
| Vue | 355 | Not measured yet | Not measured yet | Not measured yet | Not measured yet |
| Svelte | 355 | Not measured yet | Not measured yet | Not measured yet | Not measured yet |
| Solid | 355 | Not measured yet | Not measured yet | Not measured yet | Not measured yet |
| Angular | 355 | Not measured yet | Not measured yet | Not measured yet | Not measured yet |
Size is the gzip of the component's entry with core and dom. Open, Close and Memory are medians in Chromium 156 on Apple M3 Max; Memory is what one open and close leaves on the heap. Tests are Floating Panel's passing tests in each framework's suites. [N] is a value not measured yet.
The FloatingPanel.Root names in each framework's own syntax.
| Prop | React | Vue | Svelte | Solid | Angular |
|---|---|---|---|---|---|
| open | open | open | open | open | [open] |
| defaultOpen | defaultOpen | default-open | defaultOpen | defaultOpen | [defaultOpen] |
| onOpenChangeevent | onOpenChange | @open-change | onOpenChange | onOpenChange | (openChange) |
| onOpenChangeCompleteevent | onOpenChangeComplete | @open-change-complete | onOpenChangeComplete | onOpenChangeComplete | (openChangeComplete) |
| actionsRef | actionsRef | actions-ref | actionsRef | actionsRef | [actionsRef] |
| handle | handle | handle | handle | handle | [handle] |
| children | children | #default | children | children | ng-content |
| triggerId | triggerId | trigger-id | triggerId | triggerId | [triggerId] |
| defaultTriggerId | defaultTriggerId | default-trigger-id | defaultTriggerId | defaultTriggerId | [defaultTriggerId] |
| position | position | position | position | position | [position] |
| defaultPosition | defaultPosition | default-position | defaultPosition | defaultPosition | [defaultPosition] |
| onPositionChangeevent | onPositionChange | @position-change | onPositionChange | onPositionChange | (positionChange) |
| onPositionCommittedevent | onPositionCommitted | @position-committed | onPositionCommitted | onPositionCommitted | (positionCommitted) |
| size | size | size | size | size | [size] |
| defaultSize | defaultSize | default-size | defaultSize | defaultSize | [defaultSize] |
| onSizeChangeevent | onSizeChange | @size-change | onSizeChange | onSizeChange | (sizeChange) |
| onSizeCommittedevent | onSizeCommitted | @size-committed | onSizeCommitted | onSizeCommitted | (sizeCommitted) |
| stage | stage | stage | stage | stage | [stage] |
| defaultStage | defaultStage | default-stage | defaultStage | defaultStage | [defaultStage] |
| onStageChangeevent | onStageChange | @stage-change | onStageChange | onStageChange | (stageChange) |
| minSize | minSize | min-size | minSize | minSize | [minSize] |
| maxSize | maxSize | max-size | maxSize | maxSize | [maxSize] |
| boundary | boundary | boundary | boundary | boundary | [boundary] |
| draggable | draggable | draggable | draggable | draggable | [draggable] |
| resizable | resizable | resizable | resizable | resizable | [resizable] |
| step | step | step | step | step | [step] |
| largeStep | largeStep | large-step | largeStep | largeStep | [largeStep] |
| labels | labels | labels | labels | labels | [labels] |