shoelace/docs/components/split-panel.md

244 wiersze
8.6 KiB
Markdown
Czysty Zwykły widok Historia

2021-12-22 23:32:27 +00:00
# Split Panel
[component-header:sl-split-panel]
2021-12-23 16:23:14 +00:00
Split panels display two adjacent panels, allowing the user to reposition them.
2021-12-22 23:32:27 +00:00
```html preview
<sl-split-panel>
2021-12-23 15:07:37 +00:00
<div slot="start" style="height: 200px; background: var(--sl-color-neutral-50); display: flex; align-items: center; justify-content: center;">
Start
2021-12-22 23:32:27 +00:00
</div>
2021-12-23 15:07:37 +00:00
<div slot="end" style="height: 200px; background: var(--sl-color-neutral-50); display: flex; align-items: center; justify-content: center;">
End
2021-12-22 23:32:27 +00:00
</div>
</sl-split-panel>
```
## Examples
### Initial Position
2021-12-23 16:23:14 +00:00
To set the initial position in pixels, use the `position` attribute. If you need to set the initial value as a percentage, use the `setPositionAsPercentage()` method instead. If no position is provided, it will default to half of the available space.
2021-12-22 23:32:27 +00:00
```html preview
2021-12-23 15:07:37 +00:00
<sl-split-panel position="200">
<div slot="start" style="height: 200px; background: var(--sl-color-neutral-50); display: flex; align-items: center; justify-content: center;">
Start
2021-12-22 23:32:27 +00:00
</div>
2021-12-23 15:07:37 +00:00
<div slot="end" style="height: 200px; background: var(--sl-color-neutral-50); display: flex; align-items: center; justify-content: center;">
End
2021-12-22 23:32:27 +00:00
</div>
</sl-split-panel>
```
### Vertical
2021-12-23 16:23:14 +00:00
Add the `vertical` attribute to render the split panel in a vertical orientation where the start and end panels are stacked. You also need to set a height when using the vertical orientation.
2021-12-22 23:32:27 +00:00
```html preview
<sl-split-panel vertical style="height: 400px;">
2021-12-23 15:07:37 +00:00
<div slot="start" style="height: 100%; background: var(--sl-color-neutral-50); display: flex; align-items: center; justify-content: center;">
Start
2021-12-22 23:32:27 +00:00
</div>
2021-12-23 15:07:37 +00:00
<div slot="end" style="height: 100%; background: var(--sl-color-neutral-50); display: flex; align-items: center; justify-content: center;">
End
2021-12-22 23:32:27 +00:00
</div>
</sl-split-panel>
```
### Snapping
2021-12-23 16:23:14 +00:00
To snap panels at specific positions while dragging, add the `snap` attribute with one or more space-separated values. Values must be in pixels or percentages. For example, to snap the panel at `100px` and `50%`, use `snap="100px 50%"`. You can also customize how close the divider must be before snapping with the `snap-threshold` attribute.
2021-12-22 23:32:27 +00:00
```html preview
<div class="split-panel-snapping">
<sl-split-panel snap="100px 50%">
2021-12-23 15:07:37 +00:00
<div slot="start" style="height: 200px; background: var(--sl-color-neutral-50); display: flex; align-items: center; justify-content: center;">
Start
2021-12-22 23:32:27 +00:00
</div>
2021-12-23 15:07:37 +00:00
<div slot="end" style="height: 200px; background: var(--sl-color-neutral-50); display: flex; align-items: center; justify-content: center;">
End
2021-12-22 23:32:27 +00:00
</div>
</sl-split-panel>
<div class="split-panel-snapping-dots"></div>
</div>
<style>
.split-panel-snapping {
position: relative;
}
.split-panel-snapping-dots::before,
.split-panel-snapping-dots::after {
content: '';
position: absolute;
bottom: -12px;
width: 6px;
height: 6px;
border-radius: 50%;
background: var(--sl-color-neutral-400);
transform: translateX(-3px);
}
.split-panel-snapping-dots::before {
left: 100px;
}
.split-panel-snapping-dots::after {
left: 50%;
}
</style>
```
### Disabled
2021-12-23 16:23:14 +00:00
Add the `disabled` attribute to prevent the split panel from being repositioned.
2021-12-22 23:32:27 +00:00
```html preview
<sl-split-panel disabled>
2021-12-23 15:07:37 +00:00
<div slot="start" style="height: 200px; background: var(--sl-color-neutral-50); display: flex; align-items: center; justify-content: center;">
Start
2021-12-22 23:32:27 +00:00
</div>
2021-12-23 15:07:37 +00:00
<div slot="end" style="height: 200px; background: var(--sl-color-neutral-50); display: flex; align-items: center; justify-content: center;">
End
2021-12-22 23:32:27 +00:00
</div>
</sl-split-panel>
```
2021-12-23 13:24:44 +00:00
### Setting the Primary Panel
2021-12-22 23:32:27 +00:00
2021-12-23 16:23:14 +00:00
By default, both panels will grow or shrink proportionally when the host element is resized. If a primary panel is designated, it will maintain its size and the secondary panel will grow or shrink to fit the remaining space. You can set the primary panel to `start` or `end` using the `primary` attribute.
2021-12-23 15:07:37 +00:00
2021-12-23 16:23:14 +00:00
Try resizing the example below with each option and notice how the panels respond.
2021-12-22 23:32:27 +00:00
```html preview
2021-12-23 13:24:44 +00:00
<div class="split-panel-primary">
2021-12-23 16:23:14 +00:00
<sl-split-panel>
2021-12-23 15:07:37 +00:00
<div slot="start" style="height: 200px; background: var(--sl-color-neutral-50); display: flex; align-items: center; justify-content: center;">
Start
2021-12-22 23:32:27 +00:00
</div>
2021-12-23 15:07:37 +00:00
<div slot="end" style="height: 200px; background: var(--sl-color-neutral-50); display: flex; align-items: center; justify-content: center;">
End
2021-12-22 23:32:27 +00:00
</div>
</sl-split-panel>
2021-12-23 16:23:14 +00:00
<sl-select label="Primary Panel" value="" style="max-width: 200px; margin-top: 1rem;">
<sl-menu-item value="">None</sl-menu-item>
2021-12-22 23:32:27 +00:00
<sl-menu-item value="start">Start</sl-menu-item>
<sl-menu-item value="end">End</sl-menu-item>
</sl-select>
</div>
<script>
2021-12-23 13:24:44 +00:00
const container = document.querySelector('.split-panel-primary');
2021-12-22 23:32:27 +00:00
const splitPanel = container.querySelector('sl-split-panel');
const select = container.querySelector('sl-select');
2021-12-23 13:24:44 +00:00
select.addEventListener('sl-change', () => splitPanel.primary = select.value);
2021-12-22 23:32:27 +00:00
</script>
```
2021-12-23 15:07:37 +00:00
### Min & Max
2021-12-23 16:39:25 +00:00
To set a minimum or maximum size of the primary panel, use the `--min` and `--max` custom properties. Since the secondary panel is flexible, size constraints can only be applied to the primary panel (or the `start` panel if a primary panel isn't designated).
This examples demonstrates how you can make both panels be a minimum of 150px using `--min`, `--max`, and the `calc()` function.
2021-12-23 15:07:37 +00:00
```html preview
<sl-split-panel style="--min: 150px; --max: calc(100% - 150px);">
<div slot="start" style="height: 200px; background: var(--sl-color-neutral-50); display: flex; align-items: center; justify-content: center;">
Start
</div>
<div slot="end" style="height: 200px; background: var(--sl-color-neutral-50); display: flex; align-items: center; justify-content: center;">
End
</div>
</sl-split-panel>
```
2021-12-22 23:32:27 +00:00
### Nested Split Panels
2021-12-23 16:23:14 +00:00
Create complex layouts that can be repositioned independently by nesting split panels.
2021-12-22 23:32:27 +00:00
```html preview
<sl-split-panel>
2021-12-23 15:07:37 +00:00
<div slot="start" style="height: 400px; background: var(--sl-color-neutral-50); display: flex; align-items: center; justify-content: center;">
Start
2021-12-22 23:32:27 +00:00
</div>
<div slot="end">
<sl-split-panel vertical style="height: 400px;">
2021-12-23 15:07:37 +00:00
<div slot="start" style="height: 100%; background: var(--sl-color-neutral-50); display: flex; align-items: center; justify-content: center;">
Top
2021-12-22 23:32:27 +00:00
</div>
2021-12-23 15:07:37 +00:00
<div slot="end" style="height: 100%; background: var(--sl-color-neutral-50); display: flex; align-items: center; justify-content: center;">
Bottom
2021-12-22 23:32:27 +00:00
</div>
</sl-split-panel>
</div>
</sl-split-panel>
```
### Customizing the Divider
2021-12-23 15:07:37 +00:00
You can target the `divider` part to apply CSS properties to the divider. To add a handle, slot an icon or another element into the `handle` slot. When customizing the divider, make sure to think about focus styles for keyboard users.
2021-12-22 23:32:27 +00:00
```html preview
2021-12-23 00:07:16 +00:00
<div class="split-panel-custom-divider">
2021-12-23 15:07:37 +00:00
<sl-split-panel style="--divider-width: 20px;">
<sl-icon slot="handle" name="grip-vertical"></sl-icon>
<div slot="start" style="height: 200px; background: var(--sl-color-neutral-50); display: flex; align-items: center; justify-content: center;">
Start
</div>
<div slot="end" style="height: 200px; background: var(--sl-color-neutral-50); display: flex; align-items: center; justify-content: center;">
End
</div>
</sl-split-panel>
</div>
```
2021-12-23 15:27:05 +00:00
Here's a more elaborate example that changes the divider's color and width and adds a styled handle.
2021-12-23 15:07:37 +00:00
```html preview
<div class="split-panel-handle">
2021-12-23 00:07:16 +00:00
<sl-split-panel>
<sl-icon slot="handle" name="grip-vertical"></sl-icon>
2021-12-23 15:07:37 +00:00
<div slot="start" style="height: 200px; background: var(--sl-color-neutral-50); display: flex; align-items: center; justify-content: center;">
Start
2021-12-23 00:07:16 +00:00
</div>
2021-12-23 15:07:37 +00:00
<div slot="end" style="height: 200px; background: var(--sl-color-neutral-50); display: flex; align-items: center; justify-content: center;">
End
2021-12-23 00:07:16 +00:00
</div>
</sl-split-panel>
</div>
<style>
2021-12-23 15:07:37 +00:00
.split-panel-handle sl-split-panel {
--divider-width: 2px;
}
.split-panel-handle sl-split-panel::part(divider) {
2021-12-23 00:07:16 +00:00
background-color: var(--sl-color-pink-600);
}
2021-12-23 15:07:37 +00:00
.split-panel-handle sl-icon {
2021-12-23 00:07:16 +00:00
position: absolute;
border-radius: var(--sl-border-radius-small);
background: var(--sl-color-pink-600);
color: var(--sl-color-neutral-0);
padding: .5rem .125rem;
}
2021-12-23 15:07:37 +00:00
.split-panel-handle sl-split-panel::part(divider):focus-visible {
2021-12-23 00:07:16 +00:00
background-color: var(--sl-color-primary-600);
}
2021-12-23 15:07:37 +00:00
.split-panel-handle sl-split-panel:focus-within sl-icon {
2021-12-23 00:07:16 +00:00
background-color: var(--sl-color-primary-600);
color: var(--sl-color-neutral-0);
}
</style>
2021-12-22 23:32:27 +00:00
```
[component-metadata:sl-split-panel]