ropav 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/autocomplete/autocomplete-root.js +3 -1
- package/dist/components/autocomplete/index.d.ts +3 -0
- package/dist/components/breadcrumbs/breadcrumbs-item.js +1 -0
- package/dist/components/breadcrumbs/index.d.ts +1 -0
- package/dist/components/calendar/index.d.ts +5 -3
- package/dist/components/calendar-year-picker/index.d.ts +4 -2
- package/dist/components/checkbox/checkbox-content.js +1 -1
- package/dist/components/color-field/index.d.ts +1 -0
- package/dist/components/color-input-group/color-input-group-root.js +2 -0
- package/dist/components/color-input-group/color-input-group.types.d.ts +2 -0
- package/dist/components/color-input-group/index.d.ts +2 -0
- package/dist/components/combo-box/combo-box-root.js +9 -2
- package/dist/components/combo-box/combo-box.types.d.ts +3 -0
- package/dist/components/combo-box/index.d.ts +3 -0
- package/dist/components/date-field/index.d.ts +1 -0
- package/dist/components/date-input-group/date-input-group-root.js +2 -0
- package/dist/components/date-input-group/date-input-group-segment.js +1 -1
- package/dist/components/date-input-group/date-input-group.types.d.ts +2 -0
- package/dist/{composables → components/date-input-group}/use-date-segment.d.ts +2 -2
- package/dist/{composables → components/date-input-group}/use-date-segment.js +9 -9
- package/dist/components/date-range-picker/date-range-picker-root.js +1 -1
- package/dist/components/date-range-picker/index.d.ts +15 -14
- package/dist/{composables → components/date-range-picker}/use-date-range-picker.d.ts +7 -7
- package/dist/{composables → components/date-range-picker}/use-date-range-picker.js +10 -10
- package/dist/components/drawer/drawer-dialog.js +1 -1
- package/dist/{composables → components/drawer}/use-drawer-drag.d.ts +1 -1
- package/dist/{composables → components/drawer}/use-drawer-drag.js +1 -1
- package/dist/components/dropdown/dropdown-menu.js +1 -0
- package/dist/components/dropdown/dropdown-submenu-trigger.js +1 -1
- package/dist/components/dropdown/index.d.ts +4 -2
- package/dist/{composables → components/dropdown}/use-safely-mouse-to-submenu.js +1 -1
- package/dist/components/icons/icon-overlay-arrow.js +1 -1
- package/dist/components/index.d.ts +4 -0
- package/dist/components/input/index.d.ts +2 -0
- package/dist/components/input/input-root.js +3 -0
- package/dist/components/input/input.types.d.ts +5 -0
- package/dist/components/input-group/index.d.ts +2 -0
- package/dist/components/input-group/input-group-root.js +3 -0
- package/dist/components/input-group/input-group.types.d.ts +5 -0
- package/dist/components/input-otp/index.d.ts +6 -4
- package/dist/components/link/index.d.ts +2 -0
- package/dist/components/link/link-root.js +22 -5
- package/dist/components/link/link.types.d.ts +14 -3
- package/dist/{composables → components/list-box}/drag-collection.d.ts +2 -2
- package/dist/{composables → components/list-box}/drag-collection.js +1 -1
- package/dist/components/list-box/index.d.ts +4 -0
- package/dist/components/list-box/list-box-root.js +53 -32
- package/dist/components/list-box/list-box.types.d.ts +2 -0
- package/dist/components/menu/index.d.ts +2 -0
- package/dist/components/menu/menu-root.js +5 -1
- package/dist/components/menu/menu.types.d.ts +3 -0
- package/dist/components/number-field/index.d.ts +3 -0
- package/dist/components/number-field/number-field-root.js +2 -0
- package/dist/components/number-field/number-field.types.d.ts +2 -0
- package/dist/components/overlay/overlay-arrow.js +64 -11
- package/dist/components/radio/radio-content.js +1 -1
- package/dist/components/range-calendar/index.d.ts +18 -15
- package/dist/components/router-provider/index.d.ts +5 -0
- package/dist/components/router-provider/index.js +3 -0
- package/dist/components/router-provider/router-provider.context.d.ts +40 -0
- package/dist/components/router-provider/router-provider.context.js +16 -0
- package/dist/components/router-provider/router-provider.d.ts +21 -0
- package/dist/components/router-provider/router-provider.js +22 -0
- package/dist/components/router-provider/router-provider.types.d.ts +23 -0
- package/dist/components/scroll-shadow/use-scroll-shadow.js +25 -1
- package/dist/components/search-field/index.d.ts +2 -0
- package/dist/components/search-field/search-field-root.js +3 -1
- package/dist/components/search-field/search-field.types.d.ts +2 -0
- package/dist/{composables → components/search-field}/use-search-field.d.ts +2 -2
- package/dist/{composables → components/search-field}/use-search-field.js +3 -3
- package/dist/components/segmented-control/index.d.ts +134 -0
- package/dist/components/segmented-control/index.js +15 -0
- package/dist/components/segmented-control/segmented-control-indicator.d.ts +19 -0
- package/dist/components/segmented-control/segmented-control-indicator.js +36 -0
- package/dist/components/segmented-control/segmented-control-item.d.ts +21 -0
- package/dist/components/segmented-control/segmented-control-item.js +96 -0
- package/dist/components/segmented-control/segmented-control-root.d.ts +25 -0
- package/dist/components/segmented-control/segmented-control-root.js +112 -0
- package/dist/components/segmented-control/segmented-control-separator.d.ts +19 -0
- package/dist/components/segmented-control/segmented-control-separator.js +18 -0
- package/dist/components/segmented-control/segmented-control.context.d.ts +17 -0
- package/dist/components/segmented-control/segmented-control.context.js +12 -0
- package/dist/components/segmented-control/segmented-control.types.d.ts +67 -0
- package/dist/components/select/index.d.ts +3 -0
- package/dist/components/select/select-hidden-select.js +1 -1
- package/dist/components/select/select-root.js +2 -0
- package/dist/components/select/select.types.d.ts +2 -0
- package/dist/components/sidebar/index.d.ts +544 -0
- package/dist/components/sidebar/index.js +47 -0
- package/dist/components/sidebar/sidebar-collapsible-trigger.d.ts +21 -0
- package/dist/components/sidebar/sidebar-collapsible-trigger.js +70 -0
- package/dist/components/sidebar/sidebar-collapsible.d.ts +24 -0
- package/dist/components/sidebar/sidebar-collapsible.js +78 -0
- package/dist/components/sidebar/sidebar-content.d.ts +21 -0
- package/dist/components/sidebar/sidebar-content.js +37 -0
- package/dist/components/sidebar/sidebar-footer.d.ts +21 -0
- package/dist/components/sidebar/sidebar-footer.js +24 -0
- package/dist/components/sidebar/sidebar-group-label.d.ts +21 -0
- package/dist/components/sidebar/sidebar-group-label.js +32 -0
- package/dist/components/sidebar/sidebar-group.d.ts +21 -0
- package/dist/components/sidebar/sidebar-group.js +48 -0
- package/dist/components/sidebar/sidebar-header.d.ts +21 -0
- package/dist/components/sidebar/sidebar-header.js +24 -0
- package/dist/components/sidebar/sidebar-inset.d.ts +21 -0
- package/dist/components/sidebar/sidebar-inset.js +24 -0
- package/dist/components/sidebar/sidebar-item-icon.d.ts +21 -0
- package/dist/components/sidebar/sidebar-item-icon.js +20 -0
- package/dist/components/sidebar/sidebar-item-indicator.d.ts +21 -0
- package/dist/components/sidebar/sidebar-item-indicator.js +48 -0
- package/dist/components/sidebar/sidebar-item-label.d.ts +21 -0
- package/dist/components/sidebar/sidebar-item-label.js +28 -0
- package/dist/components/sidebar/sidebar-item-tooltip.d.ts +21 -0
- package/dist/components/sidebar/sidebar-item-tooltip.js +38 -0
- package/dist/components/sidebar/sidebar-item-trailing.d.ts +21 -0
- package/dist/components/sidebar/sidebar-item-trailing.js +28 -0
- package/dist/components/sidebar/sidebar-item.d.ts +23 -0
- package/dist/components/sidebar/sidebar-item.js +160 -0
- package/dist/components/sidebar/sidebar-panel.d.ts +21 -0
- package/dist/components/sidebar/sidebar-panel.js +88 -0
- package/dist/components/sidebar/sidebar-rail.d.ts +21 -0
- package/dist/components/sidebar/sidebar-rail.js +210 -0
- package/dist/components/sidebar/sidebar-root.d.ts +31 -0
- package/dist/components/sidebar/sidebar-root.js +138 -0
- package/dist/components/sidebar/sidebar-separator.d.ts +19 -0
- package/dist/components/sidebar/sidebar-separator.js +16 -0
- package/dist/components/sidebar/sidebar-sub-menu.d.ts +23 -0
- package/dist/components/sidebar/sidebar-sub-menu.js +40 -0
- package/dist/components/sidebar/sidebar-trigger.d.ts +21 -0
- package/dist/components/sidebar/sidebar-trigger.js +69 -0
- package/dist/components/sidebar/sidebar.context.d.ts +75 -0
- package/dist/components/sidebar/sidebar.context.js +30 -0
- package/dist/components/sidebar/sidebar.state.d.ts +73 -0
- package/dist/components/sidebar/sidebar.state.js +76 -0
- package/dist/components/sidebar/sidebar.storage.d.ts +8 -0
- package/dist/components/sidebar/sidebar.storage.js +45 -0
- package/dist/components/sidebar/sidebar.types.d.ts +259 -0
- package/dist/components/splitter/index.d.ts +143 -0
- package/dist/components/splitter/index.js +13 -0
- package/dist/components/splitter/splitter-handle.d.ts +21 -0
- package/dist/components/splitter/splitter-handle.js +209 -0
- package/dist/components/splitter/splitter-panel.d.ts +21 -0
- package/dist/components/splitter/splitter-panel.js +70 -0
- package/dist/components/splitter/splitter-root.d.ts +31 -0
- package/dist/components/splitter/splitter-root.js +152 -0
- package/dist/components/splitter/splitter.context.d.ts +15 -0
- package/dist/components/splitter/splitter.context.js +5 -0
- package/dist/components/splitter/splitter.state.d.ts +87 -0
- package/dist/components/splitter/splitter.state.js +322 -0
- package/dist/components/splitter/splitter.storage.d.ts +15 -0
- package/dist/components/splitter/splitter.storage.js +56 -0
- package/dist/components/splitter/splitter.types.d.ts +98 -0
- package/dist/components/switch/switch-content.js +1 -1
- package/dist/components/table/index.d.ts +10 -9
- package/dist/components/table/table-body.js +13 -13
- package/dist/components/table/table-cell.js +49 -46
- package/dist/components/table/table-column-resizer.js +1 -1
- package/dist/components/table/table-column.js +1 -1
- package/dist/components/table/table-content.js +37 -18
- package/dist/{composables → components/table}/table-drag-collection.d.ts +1 -1
- package/dist/{composables → components/table}/table-drag-collection.js +1 -1
- package/dist/components/table/table-drop-indicator.js +3 -1
- package/dist/components/table/table-resizable-container.d.ts +4 -5
- package/dist/components/table/table-row.js +45 -14
- package/dist/components/table/table-virtualizer-item.d.ts +2 -7
- package/dist/components/table/table-virtualizer-item.js +20 -9
- package/dist/components/table/table.context.d.ts +11 -3
- package/dist/components/table/table.types.d.ts +1 -1
- package/dist/{composables → components/table}/use-grid-keyboard.d.ts +3 -3
- package/dist/{composables → components/table}/use-grid-keyboard.js +57 -55
- package/dist/{composables → components/table}/use-grid-selection-announcement.d.ts +2 -2
- package/dist/{composables → components/table}/use-grid-selection-announcement.js +2 -2
- package/dist/{composables → components/table}/use-table-collection.d.ts +2 -2
- package/dist/{composables → components/table}/use-table-collection.js +4 -4
- package/dist/{composables → components/table}/use-table-column-layout.d.ts +13 -20
- package/dist/components/table/use-table-column-layout.js +115 -0
- package/dist/components/textarea/index.d.ts +2 -0
- package/dist/components/textarea/textarea-root.js +3 -0
- package/dist/components/textarea/textarea.types.d.ts +5 -0
- package/dist/components/textfield/index.d.ts +2 -0
- package/dist/components/textfield/textfield-root.js +5 -1
- package/dist/components/textfield/textfield.context.d.ts +2 -0
- package/dist/components/textfield/textfield.types.d.ts +5 -0
- package/dist/components/time-field/index.d.ts +1 -0
- package/dist/components/toast/index.d.ts +1 -0
- package/dist/components/toast/toast-default-content.js +1 -1
- package/dist/components/toolbar/index.d.ts +3 -2
- package/dist/components/tooltip/index.js +1 -1
- package/dist/components/tooltip/tooltip-root.js +1 -1
- package/dist/components/virtualizer/index.d.ts +3 -1
- package/dist/components/virtualizer/index.js +2 -1
- package/dist/components/virtualizer/use-virtualizer-item.d.ts +23 -0
- package/dist/components/virtualizer/use-virtualizer-item.js +45 -0
- package/dist/components/virtualizer/virtualizer-item.js +7 -41
- package/dist/components/virtualizer/virtualizer-scrollbar-track.d.ts +20 -0
- package/dist/components/virtualizer/virtualizer-scrollbar-track.js +141 -0
- package/dist/components/virtualizer/virtualizer-scrollbar.d.ts +18 -0
- package/dist/components/virtualizer/virtualizer-scrollbar.js +55 -0
- package/dist/components/virtualizer/virtualizer.context.d.ts +17 -1
- package/dist/composables/drag-manager.js +1 -13
- package/dist/composables/index.d.ts +3 -71
- package/dist/composables/use-collection.d.ts +22 -3
- package/dist/composables/use-collection.js +67 -14
- package/dist/composables/use-color-area.js +2 -2
- package/dist/composables/use-color-field.js +1 -1
- package/dist/composables/use-combo-box.js +1 -1
- package/dist/composables/use-date-field.js +1 -1
- package/dist/composables/use-drag-and-drop.js +1 -1
- package/dist/composables/use-drag.d.ts +6 -5
- package/dist/composables/use-draggable-item.d.ts +2 -2
- package/dist/composables/use-droppable-collection.js +2 -2
- package/dist/composables/use-droppable-item.js +1 -1
- package/dist/composables/use-form-reset.d.ts +6 -2
- package/dist/composables/use-form-reset.js +9 -5
- package/dist/composables/use-list-keyboard.js +64 -62
- package/dist/composables/use-number-field.js +1 -1
- package/dist/composables/use-select.js +2 -2
- package/dist/composables/use-selection-manager.js +4 -4
- package/dist/composables/use-single-select-list-state.d.ts +37 -0
- package/dist/composables/use-single-select-list-state.js +110 -0
- package/dist/composables/use-slider-thumb.js +2 -2
- package/dist/composables/use-slider.js +1 -1
- package/dist/composables/use-tab-list-state.d.ts +10 -29
- package/dist/composables/use-tab-list-state.js +10 -99
- package/dist/composables/use-text-field.js +1 -1
- package/dist/composables/use-virtualizer-scroll.d.ts +52 -2
- package/dist/composables/use-virtualizer-scroll.js +79 -13
- package/dist/composables/use-virtualizer.d.ts +24 -4
- package/dist/composables/use-virtualizer.js +40 -6
- package/dist/index.js +52 -80
- package/dist/utils/document-order.d.ts +14 -0
- package/dist/utils/document-order.js +17 -0
- package/dist/utils/flex-sizing.d.ts +41 -0
- package/dist/utils/flex-sizing.js +140 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/open-link.d.ts +31 -0
- package/dist/utils/open-link.js +32 -0
- package/dist/utils/story-truncation.d.ts +20 -0
- package/dist/utils/story-users.d.ts +11 -0
- package/dist/utils/virtualizer-collection.d.ts +14 -4
- package/dist/utils/virtualizer-collection.js +9 -14
- package/dist/utils/virtualizer-layout-info.js +3 -2
- package/dist/utils/virtualizer-list-layout.d.ts +75 -29
- package/dist/utils/virtualizer-list-layout.js +182 -99
- package/dist/utils/virtualizer-offsets.d.ts +111 -0
- package/dist/utils/virtualizer-offsets.js +159 -0
- package/dist/utils/virtualizer-overscan.d.ts +9 -15
- package/dist/utils/virtualizer-overscan.js +14 -33
- package/dist/utils/virtualizer-table-layout.d.ts +50 -21
- package/dist/utils/virtualizer-table-layout.js +130 -89
- package/dist/version.js +1 -1
- package/package.json +19 -3
- package/dist/composables/use-table-column-layout.js +0 -214
- /package/dist/{composables → components/dropdown}/use-safely-mouse-to-submenu.d.ts +0 -0
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
import { composeSlotClassName } from "../../utils/compose.js";
|
|
2
|
+
import { dataAttr } from "../../utils/assertion.js";
|
|
3
|
+
import { useId as useId$1 } from "../../composables/use-id.js";
|
|
4
|
+
import { useInteractionStates } from "../../composables/use-interaction-states.js";
|
|
5
|
+
import { useMove } from "../../composables/use-move.js";
|
|
6
|
+
import { useNumberFormatter } from "../../composables/use-number-formatter.js";
|
|
7
|
+
import { useSplitterContext } from "./splitter.context.js";
|
|
8
|
+
import { child, computed, createIf, createSlot, defineVaporComponent, next, on, renderEffect, setAttr, setClass, setInsertionState, setProp, setStaticTemplateRef, shallowRef, template, unref, watch } from "vue";
|
|
9
|
+
//#region src/components/splitter/splitter-handle.vue?vue&type=script&setup=true&vapor=true&lang.ts
|
|
10
|
+
var t0 = template("<span aria-hidden=true data-slot=splitter-handle-grip>");
|
|
11
|
+
var t1 = template("<div data-slot=splitter-handle role=separator><!><span aria-hidden=true data-slot=splitter-handle-target></span>", 1);
|
|
12
|
+
var splitter_handle_vue_vue_type_script_setup_true_vapor_true_lang_default = /*@__PURE__*/ defineVaporComponent({
|
|
13
|
+
__name: "splitter-handle",
|
|
14
|
+
props: {
|
|
15
|
+
class: {},
|
|
16
|
+
id: {},
|
|
17
|
+
isDisabled: {
|
|
18
|
+
type: Boolean,
|
|
19
|
+
default: void 0
|
|
20
|
+
},
|
|
21
|
+
resetOnDoubleClick: {
|
|
22
|
+
type: Boolean,
|
|
23
|
+
default: true
|
|
24
|
+
},
|
|
25
|
+
showGrip: { type: Boolean },
|
|
26
|
+
ariaLabel: {},
|
|
27
|
+
ariaLabelledby: {}
|
|
28
|
+
},
|
|
29
|
+
setup(__props) {
|
|
30
|
+
const props = __props;
|
|
31
|
+
const { isDisabled: groupIsDisabled, keyboardLargeStep, keyboardStep, orientation, rootEl, slots, state } = useSplitterContext();
|
|
32
|
+
const generatedId = useId$1();
|
|
33
|
+
const handleKey = computed(() => props.id ?? generatedId.value);
|
|
34
|
+
const element = shallowRef(null);
|
|
35
|
+
const isDisabled = computed(() => props.isDisabled ?? groupIsDisabled.value);
|
|
36
|
+
const isVertical = computed(() => orientation.value === "vertical");
|
|
37
|
+
watch([element, handleKey], ([current], _previous, onCleanup) => {
|
|
38
|
+
if (!current) return;
|
|
39
|
+
onCleanup(state.registerHandle(handleKey.value, {
|
|
40
|
+
element: () => element.value,
|
|
41
|
+
size: () => (isVertical.value ? element.value?.offsetHeight : element.value?.offsetWidth) ?? 0
|
|
42
|
+
}));
|
|
43
|
+
}, {
|
|
44
|
+
flush: "post",
|
|
45
|
+
immediate: true
|
|
46
|
+
});
|
|
47
|
+
const states = useInteractionStates();
|
|
48
|
+
const isDragging = computed(() => state.resizingHandle.value === handleKey.value);
|
|
49
|
+
/** The delta accumulated since the drag opened; the state measures from its own snapshot. */
|
|
50
|
+
let total = 0;
|
|
51
|
+
/** Resolved once per gesture — reading it per `pointermove` would force a style recalc a frame. */
|
|
52
|
+
let isReversed = false;
|
|
53
|
+
const readDirection = () => {
|
|
54
|
+
const root = rootEl.value;
|
|
55
|
+
isReversed = !isVertical.value && !!root && getComputedStyle(root).direction === "rtl";
|
|
56
|
+
};
|
|
57
|
+
const { handlers: moveHandlers } = useMove({
|
|
58
|
+
onMove: ({ deltaX, deltaY, pointerType, shiftKey }) => {
|
|
59
|
+
let delta = isVertical.value ? deltaY : deltaX;
|
|
60
|
+
if (pointerType === "keyboard") delta *= shiftKey ? keyboardLargeStep.value : keyboardStep.value;
|
|
61
|
+
if (isReversed) delta = -delta;
|
|
62
|
+
if (delta === 0) return;
|
|
63
|
+
total += delta;
|
|
64
|
+
state.resize(handleKey.value, total);
|
|
65
|
+
},
|
|
66
|
+
onMoveEnd: () => {
|
|
67
|
+
total = 0;
|
|
68
|
+
state.endResize();
|
|
69
|
+
},
|
|
70
|
+
onMoveStart: () => {
|
|
71
|
+
total = 0;
|
|
72
|
+
readDirection();
|
|
73
|
+
state.startResize(handleKey.value);
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
const range = computed(() => state.handleRange(handleKey.value));
|
|
77
|
+
const percentFormatter = useNumberFormatter(() => ({ style: "percent" }));
|
|
78
|
+
const share = (pixels) => {
|
|
79
|
+
const available = state.availableSize.value;
|
|
80
|
+
return available > 0 ? Math.round(pixels / available * 100) : 0;
|
|
81
|
+
};
|
|
82
|
+
const valueNow = computed(() => range.value ? share(range.value.now) : 0);
|
|
83
|
+
const valueMin = computed(() => range.value ? Math.min(share(range.value.min), valueNow.value) : 0);
|
|
84
|
+
const valueMax = computed(() => range.value ? Math.max(share(range.value.max), valueNow.value) : 100);
|
|
85
|
+
const valueText = computed(() => percentFormatter.value.format(valueNow.value / 100));
|
|
86
|
+
const beforeId = computed(() => {
|
|
87
|
+
const pair = state.neighbours(handleKey.value);
|
|
88
|
+
if (!pair) return void 0;
|
|
89
|
+
return state.getPanel(state.panelKeys.value[pair.before])?.id();
|
|
90
|
+
});
|
|
91
|
+
/**
|
|
92
|
+
* `useMove` consumes every arrow key it knows before the consumer sees one, so the cross-axis
|
|
93
|
+
* arrows have to be kept away from it — otherwise a vertical splitter would swallow Left and Right
|
|
94
|
+
* and break horizontal scrolling inside its panels.
|
|
95
|
+
*/
|
|
96
|
+
const isAxisKey = (key) => isVertical.value ? key === "ArrowUp" || key === "ArrowDown" || key === "Up" || key === "Down" : key === "ArrowLeft" || key === "ArrowRight" || key === "Left" || key === "Right";
|
|
97
|
+
/** The panel `Enter` acts on: the one before the handle when it can shut, else the one after. */
|
|
98
|
+
const collapsibleNeighbour = () => {
|
|
99
|
+
const pair = state.neighbours(handleKey.value);
|
|
100
|
+
if (!pair) return null;
|
|
101
|
+
const keys = state.panelKeys.value;
|
|
102
|
+
for (const index of [pair.before, pair.after]) {
|
|
103
|
+
const key = keys[index];
|
|
104
|
+
if (key != null && state.getPanel(key)?.isCollapsible()) return key;
|
|
105
|
+
}
|
|
106
|
+
return null;
|
|
107
|
+
};
|
|
108
|
+
const jump = (delta) => {
|
|
109
|
+
state.startResize(handleKey.value);
|
|
110
|
+
state.resize(handleKey.value, delta);
|
|
111
|
+
state.endResize();
|
|
112
|
+
};
|
|
113
|
+
const onKeydown = (event) => {
|
|
114
|
+
if (isDisabled.value) return;
|
|
115
|
+
if (event.key === "Enter") {
|
|
116
|
+
const target = collapsibleNeighbour();
|
|
117
|
+
if (target == null) return;
|
|
118
|
+
event.preventDefault();
|
|
119
|
+
state.toggleCollapse(target);
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
if (event.key === "Home" || event.key === "End") {
|
|
123
|
+
event.preventDefault();
|
|
124
|
+
jump(event.key === "Home" ? -Number.MAX_SAFE_INTEGER : Number.MAX_SAFE_INTEGER);
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
if (event.key === "Escape" && isDragging.value) {
|
|
128
|
+
event.preventDefault();
|
|
129
|
+
state.cancelResize();
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
if (!isAxisKey(event.key)) return;
|
|
133
|
+
readDirection();
|
|
134
|
+
moveHandlers.onKeydown(event);
|
|
135
|
+
};
|
|
136
|
+
/**
|
|
137
|
+
* Reset rather than arithmetic: dropping the stored sizes lets the panels' declared defaults take
|
|
138
|
+
* over, and the solver refills the container by construction. A collapsed neighbour is reopened on
|
|
139
|
+
* the way, which is why this and `Enter` are separate gestures — one returns a panel to where the
|
|
140
|
+
* user left it, the other to where the author put it.
|
|
141
|
+
*/
|
|
142
|
+
const onDblclick = () => {
|
|
143
|
+
if (isDisabled.value || !props.resetOnDoubleClick) return;
|
|
144
|
+
const pair = state.neighbours(handleKey.value);
|
|
145
|
+
if (!pair) return;
|
|
146
|
+
const keys = state.panelKeys.value;
|
|
147
|
+
state.reset([keys[pair.before], keys[pair.after]]);
|
|
148
|
+
};
|
|
149
|
+
const onPointerdown = (event) => {
|
|
150
|
+
if (isDisabled.value) return;
|
|
151
|
+
states.onPointerdown(event);
|
|
152
|
+
moveHandlers.onPointerdown(event);
|
|
153
|
+
};
|
|
154
|
+
const n6 = t1();
|
|
155
|
+
const n5 = child(n6);
|
|
156
|
+
const n3 = next(n5);
|
|
157
|
+
renderEffect(() => {
|
|
158
|
+
const _isDisabled = isDisabled.value;
|
|
159
|
+
const _props = props;
|
|
160
|
+
const _dataAttr = unref(dataAttr);
|
|
161
|
+
const _states = unref(states);
|
|
162
|
+
setProp(n6, "id", unref(generatedId));
|
|
163
|
+
setAttr(n6, "aria-controls", beforeId.value);
|
|
164
|
+
setAttr(n6, "aria-disabled", _isDisabled || void 0);
|
|
165
|
+
setAttr(n6, "aria-label", _props.ariaLabel ?? "Resize panel");
|
|
166
|
+
setAttr(n6, "aria-labelledby", _props.ariaLabelledby);
|
|
167
|
+
setAttr(n6, "aria-orientation", isVertical.value ? "horizontal" : "vertical");
|
|
168
|
+
setAttr(n6, "aria-valuemax", valueMax.value);
|
|
169
|
+
setAttr(n6, "aria-valuemin", valueMin.value);
|
|
170
|
+
setAttr(n6, "aria-valuenow", valueNow.value);
|
|
171
|
+
setAttr(n6, "aria-valuetext", valueText.value);
|
|
172
|
+
setClass(n6, unref(composeSlotClassName)(unref(slots).handle, _props.class));
|
|
173
|
+
setAttr(n6, "data-disabled", _dataAttr(_isDisabled));
|
|
174
|
+
setAttr(n6, "data-dragging", _dataAttr(isDragging.value));
|
|
175
|
+
setAttr(n6, "data-focus-visible", _dataAttr(_states.isFocusVisible.value));
|
|
176
|
+
setAttr(n6, "data-focused", _dataAttr(_states.isFocused.value));
|
|
177
|
+
setAttr(n6, "data-hovered", _dataAttr(_states.isHovered.value));
|
|
178
|
+
setAttr(n6, "data-orientation", unref(orientation));
|
|
179
|
+
setProp(n6, "tabindex", _isDisabled ? -1 : 0);
|
|
180
|
+
});
|
|
181
|
+
setInsertionState(n6, n5);
|
|
182
|
+
createIf(() => props.showGrip, () => {
|
|
183
|
+
const n2 = t0();
|
|
184
|
+
renderEffect(() => setClass(n2, unref(composeSlotClassName)(unref(slots).handleGrip)));
|
|
185
|
+
return n2;
|
|
186
|
+
});
|
|
187
|
+
renderEffect(() => setClass(n3, unref(composeSlotClassName)(unref(slots).handleTarget)));
|
|
188
|
+
setInsertionState(n6, 2);
|
|
189
|
+
createSlot("default", {
|
|
190
|
+
isDisabled: () => isDisabled.value,
|
|
191
|
+
isDragging: () => isDragging.value,
|
|
192
|
+
isFocusVisible: () => unref(states).isFocusVisible.value,
|
|
193
|
+
isFocused: () => unref(states).isFocused.value,
|
|
194
|
+
isHovered: () => unref(states).isHovered.value,
|
|
195
|
+
orientation: () => unref(orientation)
|
|
196
|
+
});
|
|
197
|
+
on(n6, "blur", (e) => unref(states).onBlur(e));
|
|
198
|
+
on(n6, "dblclick", onDblclick);
|
|
199
|
+
on(n6, "focus", (e) => unref(states).onFocus(e));
|
|
200
|
+
on(n6, "keydown", onKeydown);
|
|
201
|
+
on(n6, "pointerdown", onPointerdown);
|
|
202
|
+
on(n6, "pointerenter", (e) => unref(states).onPointerenter(e));
|
|
203
|
+
on(n6, "pointerleave", (e) => unref(states).onPointerleave(e));
|
|
204
|
+
setStaticTemplateRef(n6, element, null, "element");
|
|
205
|
+
return n6;
|
|
206
|
+
}
|
|
207
|
+
});
|
|
208
|
+
//#endregion
|
|
209
|
+
export { splitter_handle_vue_vue_type_script_setup_true_vapor_true_lang_default as default };
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { SplitterPanelProps, SplitterPanelSlotProps } from "./splitter.types.js";
|
|
2
|
+
declare const __VLS_export: (__VLS_props: NonNullable<Awaited<typeof __VLS_setup>>['props'], __VLS_ctx?: __VLS_PrettifyLocal<Pick<NonNullable<Awaited<typeof __VLS_setup>>, 'attrs' | 'emit' | 'slots'>>, __VLS_exposed?: NonNullable<Awaited<typeof __VLS_setup>>['expose'], __VLS_setup?: Promise<{
|
|
3
|
+
props: import('vue').PublicProps & __VLS_PrettifyLocal<SplitterPanelProps> & (typeof globalThis extends {
|
|
4
|
+
__VLS_PROPS_FALLBACK: infer P;
|
|
5
|
+
} ? P : {});
|
|
6
|
+
expose: (exposed: {}) => void;
|
|
7
|
+
attrs: any;
|
|
8
|
+
slots: {
|
|
9
|
+
default?: (props: SplitterPanelSlotProps) => unknown;
|
|
10
|
+
};
|
|
11
|
+
emit: {};
|
|
12
|
+
}>) => import('vue').VNode & {
|
|
13
|
+
__ctx?: NonNullable<Awaited<typeof __VLS_setup>>;
|
|
14
|
+
};
|
|
15
|
+
declare const _default: typeof __VLS_export;
|
|
16
|
+
export default _default;
|
|
17
|
+
type __VLS_PrettifyLocal<T> = (T extends any ? {
|
|
18
|
+
[K in keyof T]: T[K];
|
|
19
|
+
} : {
|
|
20
|
+
[K in keyof T as K]: T[K];
|
|
21
|
+
}) & {};
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { composeSlotClassName } from "../../utils/compose.js";
|
|
2
|
+
import { dataAttr } from "../../utils/assertion.js";
|
|
3
|
+
import { useId as useId$1 } from "../../composables/use-id.js";
|
|
4
|
+
import { useSplitterContext } from "./splitter.context.js";
|
|
5
|
+
import { computed, createSlot, defineVaporComponent, renderEffect, setAttr, setClass, setInsertionState, setProp, setStaticTemplateRef, setStyle, shallowRef, template, unref, watch } from "vue";
|
|
6
|
+
//#region src/components/splitter/splitter-panel.vue?vue&type=script&setup=true&vapor=true&lang.ts
|
|
7
|
+
var t0 = template("<div data-slot=splitter-panel>", 1);
|
|
8
|
+
var splitter_panel_vue_vue_type_script_setup_true_vapor_true_lang_default = /*@__PURE__*/ defineVaporComponent({
|
|
9
|
+
__name: "splitter-panel",
|
|
10
|
+
props: {
|
|
11
|
+
class: {},
|
|
12
|
+
id: {},
|
|
13
|
+
size: {},
|
|
14
|
+
defaultSize: {},
|
|
15
|
+
minSize: {},
|
|
16
|
+
maxSize: {},
|
|
17
|
+
isCollapsible: {
|
|
18
|
+
type: Boolean,
|
|
19
|
+
default: void 0
|
|
20
|
+
},
|
|
21
|
+
collapsedSize: {}
|
|
22
|
+
},
|
|
23
|
+
setup(__props) {
|
|
24
|
+
const props = __props;
|
|
25
|
+
const { orientation, slots, state } = useSplitterContext();
|
|
26
|
+
const generatedId = useId$1();
|
|
27
|
+
const panelKey = computed(() => props.id ?? generatedId.value);
|
|
28
|
+
const element = shallowRef(null);
|
|
29
|
+
watch([element, panelKey], ([current], _previous, onCleanup) => {
|
|
30
|
+
if (!current) return;
|
|
31
|
+
onCleanup(state.registerPanel(panelKey.value, {
|
|
32
|
+
collapsedSize: () => props.collapsedSize,
|
|
33
|
+
defaultSize: () => props.defaultSize,
|
|
34
|
+
element: () => element.value,
|
|
35
|
+
id: () => generatedId.value,
|
|
36
|
+
isCollapsible: () => Boolean(props.isCollapsible),
|
|
37
|
+
maxSize: () => props.maxSize,
|
|
38
|
+
minSize: () => props.minSize,
|
|
39
|
+
size: () => props.size
|
|
40
|
+
}));
|
|
41
|
+
}, {
|
|
42
|
+
flush: "post",
|
|
43
|
+
immediate: true
|
|
44
|
+
});
|
|
45
|
+
const size = computed(() => state.getPanelSize(panelKey.value));
|
|
46
|
+
const isCollapsed = computed(() => state.isCollapsed(panelKey.value));
|
|
47
|
+
const style = computed(() => state.layout.value.length > 0 ? { flex: `0 0 ${size.value}px` } : void 0);
|
|
48
|
+
const n1 = t0();
|
|
49
|
+
renderEffect(() => {
|
|
50
|
+
const _isCollapsed = isCollapsed.value;
|
|
51
|
+
setProp(n1, "id", unref(generatedId));
|
|
52
|
+
setClass(n1, unref(composeSlotClassName)(unref(slots).panel, props.class));
|
|
53
|
+
setAttr(n1, "data-collapsed", unref(dataAttr)(_isCollapsed));
|
|
54
|
+
setAttr(n1, "data-orientation", unref(orientation));
|
|
55
|
+
setProp(n1, "inert", _isCollapsed || void 0);
|
|
56
|
+
setStyle(n1, style.value);
|
|
57
|
+
});
|
|
58
|
+
setInsertionState(n1);
|
|
59
|
+
createSlot("default", {
|
|
60
|
+
isCollapsed: () => isCollapsed.value,
|
|
61
|
+
isCollapsible: () => Boolean(props.isCollapsible),
|
|
62
|
+
orientation: () => unref(orientation),
|
|
63
|
+
size: () => size.value
|
|
64
|
+
});
|
|
65
|
+
setStaticTemplateRef(n1, element, null, "element");
|
|
66
|
+
return n1;
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
//#endregion
|
|
70
|
+
export { splitter_panel_vue_vue_type_script_setup_true_vapor_true_lang_default as default };
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { CollectionKey } from "../../composables/use-collection.js";
|
|
2
|
+
import type { SplitterRootProps, SplitterSlotProps } from "./splitter.types.js";
|
|
3
|
+
declare const __VLS_export: (__VLS_props: NonNullable<Awaited<typeof __VLS_setup>>['props'], __VLS_ctx?: __VLS_PrettifyLocal<Pick<NonNullable<Awaited<typeof __VLS_setup>>, 'attrs' | 'emit' | 'slots'>>, __VLS_exposed?: NonNullable<Awaited<typeof __VLS_setup>>['expose'], __VLS_setup?: Promise<{
|
|
4
|
+
props: import('vue').PublicProps & __VLS_PrettifyLocal<SplitterRootProps & {
|
|
5
|
+
onCollapse?: ((key: CollectionKey) => any) | undefined;
|
|
6
|
+
onExpand?: ((key: CollectionKey) => any) | undefined;
|
|
7
|
+
onResize?: ((sizes: import("../../utils/flex-sizing.js").FlexSize[]) => any) | undefined;
|
|
8
|
+
onResizeEnd?: ((sizes: import("../../utils/flex-sizing.js").FlexSize[]) => any) | undefined;
|
|
9
|
+
onResizeStart?: ((sizes: import("../../utils/flex-sizing.js").FlexSize[]) => any) | undefined;
|
|
10
|
+
"onUpdate:sizes"?: ((sizes: import("../../utils/flex-sizing.js").FlexSize[]) => any) | undefined;
|
|
11
|
+
}> & (typeof globalThis extends {
|
|
12
|
+
__VLS_PROPS_FALLBACK: infer P;
|
|
13
|
+
} ? P : {});
|
|
14
|
+
expose: (exposed: import('vue').ShallowUnwrapRef<{
|
|
15
|
+
measure: () => void;
|
|
16
|
+
}>) => void;
|
|
17
|
+
attrs: any;
|
|
18
|
+
slots: {
|
|
19
|
+
default?: (props: SplitterSlotProps) => unknown;
|
|
20
|
+
};
|
|
21
|
+
emit: ((evt: "collapse", key: CollectionKey) => void) & ((evt: "expand", key: CollectionKey) => void) & ((evt: "resize", sizes: import("../../utils/flex-sizing.js").FlexSize[]) => void) & ((evt: "resizeEnd", sizes: import("../../utils/flex-sizing.js").FlexSize[]) => void) & ((evt: "resizeStart", sizes: import("../../utils/flex-sizing.js").FlexSize[]) => void) & ((evt: "update:sizes", sizes: import("../../utils/flex-sizing.js").FlexSize[]) => void);
|
|
22
|
+
}>) => import('vue').VNode & {
|
|
23
|
+
__ctx?: NonNullable<Awaited<typeof __VLS_setup>>;
|
|
24
|
+
};
|
|
25
|
+
declare const _default: typeof __VLS_export;
|
|
26
|
+
export default _default;
|
|
27
|
+
type __VLS_PrettifyLocal<T> = (T extends any ? {
|
|
28
|
+
[K in keyof T]: T[K];
|
|
29
|
+
} : {
|
|
30
|
+
[K in keyof T as K]: T[K];
|
|
31
|
+
}) & {};
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import { dataAttr } from "../../utils/assertion.js";
|
|
2
|
+
import { provideSplitterContext } from "./splitter.context.js";
|
|
3
|
+
import { useSplitterState } from "./splitter.state.js";
|
|
4
|
+
import { readSplitterLayout, writeSplitterLayout } from "./splitter.storage.js";
|
|
5
|
+
import { computed, createSlot, defineVaporComponent, onMounted, onUnmounted, renderEffect, setAttr, setClass, setInsertionState, setStaticTemplateRef, shallowRef, template, unref, watch } from "vue";
|
|
6
|
+
import { splitterVariants } from "@ropav/styles";
|
|
7
|
+
//#region src/components/splitter/splitter-root.vue?vue&type=script&setup=true&vapor=true&lang.ts
|
|
8
|
+
var t0 = template("<div data-slot=splitter role=group>", 1);
|
|
9
|
+
var splitter_root_vue_vue_type_script_setup_true_vapor_true_lang_default = /*@__PURE__*/ defineVaporComponent({
|
|
10
|
+
__name: "splitter-root",
|
|
11
|
+
props: {
|
|
12
|
+
class: {},
|
|
13
|
+
orientation: {},
|
|
14
|
+
sizes: {},
|
|
15
|
+
defaultSizes: {},
|
|
16
|
+
autoSaveId: {},
|
|
17
|
+
isDisabled: {
|
|
18
|
+
type: Boolean,
|
|
19
|
+
default: void 0
|
|
20
|
+
},
|
|
21
|
+
keyboardStep: {},
|
|
22
|
+
keyboardLargeStep: {},
|
|
23
|
+
ariaLabel: {},
|
|
24
|
+
ariaLabelledby: {}
|
|
25
|
+
},
|
|
26
|
+
emits: [
|
|
27
|
+
"update:sizes",
|
|
28
|
+
"resizeStart",
|
|
29
|
+
"resize",
|
|
30
|
+
"resizeEnd",
|
|
31
|
+
"collapse",
|
|
32
|
+
"expand"
|
|
33
|
+
],
|
|
34
|
+
setup(__props, { expose: __expose, emit: __emit }) {
|
|
35
|
+
const props = __props;
|
|
36
|
+
const emit = __emit;
|
|
37
|
+
const element = shallowRef(null);
|
|
38
|
+
const state = useSplitterState({
|
|
39
|
+
defaultSizes: () => props.defaultSizes,
|
|
40
|
+
isDisabled: () => props.isDisabled,
|
|
41
|
+
onCollapse: (key) => {
|
|
42
|
+
emit("collapse", key);
|
|
43
|
+
schedulePersist();
|
|
44
|
+
},
|
|
45
|
+
onExpand: (key) => {
|
|
46
|
+
emit("expand", key);
|
|
47
|
+
schedulePersist();
|
|
48
|
+
},
|
|
49
|
+
onResizeEnd: (sizes) => emit("resizeEnd", sizes),
|
|
50
|
+
onResizeStart: (sizes) => emit("resizeStart", sizes),
|
|
51
|
+
onSizesChange: (sizes) => {
|
|
52
|
+
emit("update:sizes", sizes);
|
|
53
|
+
emit("resize", sizes);
|
|
54
|
+
schedulePersist();
|
|
55
|
+
},
|
|
56
|
+
orientation: () => props.orientation,
|
|
57
|
+
sizes: () => props.sizes
|
|
58
|
+
});
|
|
59
|
+
const orientation = computed(() => state.orientation.value);
|
|
60
|
+
/**
|
|
61
|
+
* `clientWidth`/`clientHeight` rather than a bounding rect: it already excludes the scrollbar, and
|
|
62
|
+
* a splitter laid out inside something hidden reports zero, which is what the state's guard wants.
|
|
63
|
+
*/
|
|
64
|
+
const measure = () => {
|
|
65
|
+
const root = element.value;
|
|
66
|
+
if (!root) return;
|
|
67
|
+
state.setAvailableSize(orientation.value === "vertical" ? root.clientHeight : root.clientWidth);
|
|
68
|
+
};
|
|
69
|
+
let observer;
|
|
70
|
+
onMounted(() => {
|
|
71
|
+
measure();
|
|
72
|
+
if (typeof ResizeObserver === "undefined" || !element.value) return;
|
|
73
|
+
observer = new ResizeObserver(measure);
|
|
74
|
+
observer.observe(element.value, { box: "border-box" });
|
|
75
|
+
});
|
|
76
|
+
let pending;
|
|
77
|
+
const persist = () => {
|
|
78
|
+
if (!props.autoSaveId) return;
|
|
79
|
+
writeSplitterLayout(props.autoSaveId, orientation.value, state.panelKeys.value, state.sizes.value, state.isCollapsed);
|
|
80
|
+
};
|
|
81
|
+
const schedulePersist = () => {
|
|
82
|
+
if (!props.autoSaveId || isRestoring) return;
|
|
83
|
+
if (pending) clearTimeout(pending);
|
|
84
|
+
pending = setTimeout(function write() {
|
|
85
|
+
if (state.resizingHandle.value != null) {
|
|
86
|
+
pending = setTimeout(write, 150);
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
pending = void 0;
|
|
90
|
+
persist();
|
|
91
|
+
}, 150);
|
|
92
|
+
};
|
|
93
|
+
let isRestoring = false;
|
|
94
|
+
const stop = watch(() => state.panelKeys.value, (keys) => {
|
|
95
|
+
if (!props.autoSaveId || keys.length === 0) return;
|
|
96
|
+
stop();
|
|
97
|
+
const restored = readSplitterLayout(props.autoSaveId, orientation.value, keys);
|
|
98
|
+
if (!restored) return;
|
|
99
|
+
isRestoring = true;
|
|
100
|
+
state.setSizes(restored.sizes);
|
|
101
|
+
for (const key of restored.collapsed) state.collapse(key);
|
|
102
|
+
isRestoring = false;
|
|
103
|
+
}, {
|
|
104
|
+
flush: "post",
|
|
105
|
+
immediate: true
|
|
106
|
+
});
|
|
107
|
+
const flush = () => {
|
|
108
|
+
if (!pending) return;
|
|
109
|
+
clearTimeout(pending);
|
|
110
|
+
pending = void 0;
|
|
111
|
+
persist();
|
|
112
|
+
};
|
|
113
|
+
onUnmounted(() => {
|
|
114
|
+
observer?.disconnect();
|
|
115
|
+
flush();
|
|
116
|
+
});
|
|
117
|
+
const styles = computed(() => splitterVariants({ orientation: orientation.value }));
|
|
118
|
+
provideSplitterContext({
|
|
119
|
+
isDisabled: state.isDisabled,
|
|
120
|
+
keyboardLargeStep: computed(() => props.keyboardLargeStep ?? 50),
|
|
121
|
+
keyboardStep: computed(() => props.keyboardStep ?? 10),
|
|
122
|
+
orientation,
|
|
123
|
+
rootEl: computed(() => element.value),
|
|
124
|
+
slots: styles,
|
|
125
|
+
state
|
|
126
|
+
});
|
|
127
|
+
__expose({ measure });
|
|
128
|
+
const n1 = t0();
|
|
129
|
+
renderEffect(() => {
|
|
130
|
+
const _props = props;
|
|
131
|
+
const _dataAttr = unref(dataAttr);
|
|
132
|
+
const _state = unref(state);
|
|
133
|
+
setAttr(n1, "aria-label", _props.ariaLabel);
|
|
134
|
+
setAttr(n1, "aria-labelledby", _props.ariaLabelledby);
|
|
135
|
+
setClass(n1, styles.value.base({ class: _props.class }));
|
|
136
|
+
setAttr(n1, "data-disabled", _dataAttr(_state.isDisabled.value));
|
|
137
|
+
setAttr(n1, "data-dragging", _dataAttr(_state.resizingHandle.value != null));
|
|
138
|
+
setAttr(n1, "data-orientation", orientation.value);
|
|
139
|
+
});
|
|
140
|
+
setInsertionState(n1);
|
|
141
|
+
createSlot("default", {
|
|
142
|
+
isDisabled: () => unref(state).isDisabled.value,
|
|
143
|
+
isDragging: () => unref(state).resizingHandle.value != null,
|
|
144
|
+
layout: () => unref(state).layout.value,
|
|
145
|
+
orientation: () => orientation.value
|
|
146
|
+
});
|
|
147
|
+
setStaticTemplateRef(n1, element, null, "element");
|
|
148
|
+
return n1;
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
//#endregion
|
|
152
|
+
export { splitter_root_vue_vue_type_script_setup_true_vapor_true_lang_default as default };
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { SplitterOrientation, SplitterState } from "./splitter.state.js";
|
|
2
|
+
import type { splitterVariants } from "@ropav/styles";
|
|
3
|
+
import type { ComputedRef } from "vue";
|
|
4
|
+
export interface SplitterContext {
|
|
5
|
+
slots: ComputedRef<ReturnType<typeof splitterVariants>>;
|
|
6
|
+
state: SplitterState;
|
|
7
|
+
/** Handed down rather than re-read, so a nested splitter cannot inherit the outer axis. */
|
|
8
|
+
orientation: ComputedRef<SplitterOrientation>;
|
|
9
|
+
isDisabled: ComputedRef<boolean>;
|
|
10
|
+
keyboardStep: ComputedRef<number>;
|
|
11
|
+
keyboardLargeStep: ComputedRef<number>;
|
|
12
|
+
/** The root element. The RTL check is read off it, and the measurement is taken from it. */
|
|
13
|
+
rootEl: ComputedRef<HTMLElement | null>;
|
|
14
|
+
}
|
|
15
|
+
export declare const useSplitterContext: () => SplitterContext, provideSplitterContext: (value: SplitterContext) => SplitterContext;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { createContext } from "../../utils/create-context.js";
|
|
2
|
+
//#region src/components/splitter/splitter.context.ts
|
|
3
|
+
var [useSplitterContext, provideSplitterContext] = createContext({ name: "SplitterContext" });
|
|
4
|
+
//#endregion
|
|
5
|
+
export { provideSplitterContext, useSplitterContext };
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import type { CollectionKey } from "../../composables/use-collection.js";
|
|
2
|
+
import type { FlexSize } from "../../utils/flex-sizing.js";
|
|
3
|
+
import type { ComputedRef, MaybeRefOrGetter } from "vue";
|
|
4
|
+
/** A panel size: pixels as a number or a `px` string, a percentage, or a fraction of what is left. */
|
|
5
|
+
export type SplitterSize = FlexSize;
|
|
6
|
+
export type SplitterOrientation = "horizontal" | "vertical";
|
|
7
|
+
/**
|
|
8
|
+
* What a panel tells the splitter about itself.
|
|
9
|
+
*
|
|
10
|
+
* Held as getters rather than values, so a panel registers once and the splitter always reads its
|
|
11
|
+
* current props. Nothing has to re-register when a `minSize` changes.
|
|
12
|
+
*/
|
|
13
|
+
export interface SplitterPanelMeta {
|
|
14
|
+
element: () => HTMLElement | null;
|
|
15
|
+
/** The panel's DOM id, which the handle beside it points `aria-controls` at. */
|
|
16
|
+
id: () => string;
|
|
17
|
+
size: () => SplitterSize | null | undefined;
|
|
18
|
+
defaultSize: () => SplitterSize | null | undefined;
|
|
19
|
+
minSize: () => SplitterSize | null | undefined;
|
|
20
|
+
maxSize: () => SplitterSize | null | undefined;
|
|
21
|
+
isCollapsible: () => boolean;
|
|
22
|
+
collapsedSize: () => SplitterSize | null | undefined;
|
|
23
|
+
}
|
|
24
|
+
export interface SplitterHandleMeta {
|
|
25
|
+
element: () => HTMLElement | null;
|
|
26
|
+
size: () => number;
|
|
27
|
+
}
|
|
28
|
+
export interface UseSplitterStateOptions {
|
|
29
|
+
orientation: MaybeRefOrGetter<SplitterOrientation | undefined>;
|
|
30
|
+
isDisabled: MaybeRefOrGetter<boolean | undefined>;
|
|
31
|
+
/** Declared sizes in panel order. Set, the splitter never writes its own state. */
|
|
32
|
+
sizes: MaybeRefOrGetter<SplitterSize[] | undefined>;
|
|
33
|
+
defaultSizes: MaybeRefOrGetter<SplitterSize[] | undefined>;
|
|
34
|
+
onSizesChange?: (sizes: SplitterSize[]) => void;
|
|
35
|
+
/** A gesture opened. Fires on the first movement, not on the press before it. */
|
|
36
|
+
onResizeStart?: (sizes: SplitterSize[]) => void;
|
|
37
|
+
/** A gesture closed, let go of or cancelled. Reports where the panels actually landed. */
|
|
38
|
+
onResizeEnd?: (sizes: SplitterSize[]) => void;
|
|
39
|
+
onCollapse?: (key: CollectionKey) => void;
|
|
40
|
+
onExpand?: (key: CollectionKey) => void;
|
|
41
|
+
}
|
|
42
|
+
export interface SplitterState {
|
|
43
|
+
orientation: ComputedRef<SplitterOrientation>;
|
|
44
|
+
isDisabled: ComputedRef<boolean>;
|
|
45
|
+
panelKeys: ComputedRef<CollectionKey[]>;
|
|
46
|
+
registerPanel: (key: CollectionKey, meta: SplitterPanelMeta) => () => void;
|
|
47
|
+
registerHandle: (key: CollectionKey, meta: SplitterHandleMeta) => () => void;
|
|
48
|
+
getPanel: (key: CollectionKey) => SplitterPanelMeta | undefined;
|
|
49
|
+
/** The panels a handle divides, as indexes into `panelKeys`. */
|
|
50
|
+
neighbours: (handleKey: CollectionKey) => {
|
|
51
|
+
before: number;
|
|
52
|
+
after: number;
|
|
53
|
+
} | null;
|
|
54
|
+
/** What the panels divide: the container less every handle. Zero until the root measures. */
|
|
55
|
+
availableSize: ComputedRef<number>;
|
|
56
|
+
setAvailableSize: (size: number) => void;
|
|
57
|
+
/** Every panel's resolved size in pixels, in panel order. Empty while unmeasured. */
|
|
58
|
+
layout: ComputedRef<number[]>;
|
|
59
|
+
getPanelSize: (key: CollectionKey) => number;
|
|
60
|
+
isCollapsed: (key: CollectionKey) => boolean;
|
|
61
|
+
/**
|
|
62
|
+
* Where the edge sits and how far it could travel, in pixels, measured on the panel before it.
|
|
63
|
+
* The ends come from running the cascade rather than from that panel's own bounds, so they
|
|
64
|
+
* report what the handle can actually reach given every neighbour's constraints.
|
|
65
|
+
*/
|
|
66
|
+
handleRange: (handleKey: CollectionKey) => {
|
|
67
|
+
now: number;
|
|
68
|
+
min: number;
|
|
69
|
+
max: number;
|
|
70
|
+
} | null;
|
|
71
|
+
resizingHandle: ComputedRef<CollectionKey | null>;
|
|
72
|
+
startResize: (handleKey: CollectionKey) => void;
|
|
73
|
+
/** Apply a pixel delta measured from the snapshot `startResize` took. */
|
|
74
|
+
resize: (handleKey: CollectionKey, totalDelta: number) => void;
|
|
75
|
+
endResize: () => void;
|
|
76
|
+
/** Put the panels back where the drag opened, reported like any other move. */
|
|
77
|
+
cancelResize: () => void;
|
|
78
|
+
collapse: (key: CollectionKey) => void;
|
|
79
|
+
expand: (key: CollectionKey) => void;
|
|
80
|
+
toggleCollapse: (key: CollectionKey) => void;
|
|
81
|
+
/** Drop the stored sizes for these panels, so their declared defaults take over again. */
|
|
82
|
+
reset: (keys: CollectionKey[]) => void;
|
|
83
|
+
/** Declared sizes in panel order — what `v-model:sizes` carries and what is persisted. */
|
|
84
|
+
sizes: ComputedRef<SplitterSize[]>;
|
|
85
|
+
setSizes: (sizes: SplitterSize[]) => void;
|
|
86
|
+
}
|
|
87
|
+
export declare const useSplitterState: (options: UseSplitterStateOptions) => SplitterState;
|