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,31 @@
|
|
|
1
|
+
import type { SidebarRootProps, SidebarSlotProps } from "./sidebar.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<SidebarRootProps & {
|
|
4
|
+
onExpandedChange?: ((isExpanded: boolean) => any) | undefined;
|
|
5
|
+
onMobileOpenChange?: ((isOpen: boolean) => any) | undefined;
|
|
6
|
+
"onUpdate:isExpanded"?: ((isExpanded: boolean) => any) | undefined;
|
|
7
|
+
"onUpdate:isMobileOpen"?: ((isOpen: boolean) => any) | undefined;
|
|
8
|
+
"onUpdate:width"?: ((width: string) => any) | undefined;
|
|
9
|
+
}> & (typeof globalThis extends {
|
|
10
|
+
__VLS_PROPS_FALLBACK: infer P;
|
|
11
|
+
} ? P : {});
|
|
12
|
+
expose: (exposed: import('vue').ShallowUnwrapRef<{
|
|
13
|
+
close: () => void;
|
|
14
|
+
open: () => void;
|
|
15
|
+
toggle: () => void;
|
|
16
|
+
}>) => void;
|
|
17
|
+
attrs: any;
|
|
18
|
+
slots: {
|
|
19
|
+
default?: (props: SidebarSlotProps) => unknown;
|
|
20
|
+
};
|
|
21
|
+
emit: ((evt: "expandedChange", isExpanded: boolean) => void) & ((evt: "mobileOpenChange", isOpen: boolean) => void) & ((evt: "update:isExpanded", isExpanded: boolean) => void) & ((evt: "update:isMobileOpen", isOpen: boolean) => void) & ((evt: "update:width", width: string) => 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,138 @@
|
|
|
1
|
+
import { dataAttr } from "../../utils/assertion.js";
|
|
2
|
+
import { useId as useId$1 } from "../../composables/use-id.js";
|
|
3
|
+
import { provideSidebarContext } from "./sidebar.context.js";
|
|
4
|
+
import { useMediaQuery } from "../../composables/use-media-query.js";
|
|
5
|
+
import { useSidebarState } from "./sidebar.state.js";
|
|
6
|
+
import { readSidebarLayout, writeSidebarLayout } from "./sidebar.storage.js";
|
|
7
|
+
import { computed, createSlot, defineVaporComponent, onMounted, renderEffect, setAttr, setClass, setInsertionState, setStyle, shallowRef, template, unref } from "vue";
|
|
8
|
+
import { sidebarVariants } from "@ropav/styles";
|
|
9
|
+
//#region src/components/sidebar/sidebar-root.vue?vue&type=script&setup=true&vapor=true&lang.ts
|
|
10
|
+
var t0 = template("<div data-slot=sidebar>", 1);
|
|
11
|
+
var DEFAULT_BREAKPOINT = "(max-width: 47.99rem)";
|
|
12
|
+
var sidebar_root_vue_vue_type_script_setup_true_vapor_true_lang_default = /*@__PURE__*/ defineVaporComponent({
|
|
13
|
+
__name: "sidebar-root",
|
|
14
|
+
props: {
|
|
15
|
+
class: {},
|
|
16
|
+
side: {},
|
|
17
|
+
collapsible: {},
|
|
18
|
+
isExpanded: {
|
|
19
|
+
type: Boolean,
|
|
20
|
+
default: void 0
|
|
21
|
+
},
|
|
22
|
+
defaultExpanded: {
|
|
23
|
+
type: Boolean,
|
|
24
|
+
default: void 0
|
|
25
|
+
},
|
|
26
|
+
isMobileOpen: {
|
|
27
|
+
type: Boolean,
|
|
28
|
+
default: void 0
|
|
29
|
+
},
|
|
30
|
+
defaultMobileOpen: {
|
|
31
|
+
type: Boolean,
|
|
32
|
+
default: void 0
|
|
33
|
+
},
|
|
34
|
+
width: {},
|
|
35
|
+
defaultWidth: {},
|
|
36
|
+
autoSaveId: {},
|
|
37
|
+
breakpoint: {}
|
|
38
|
+
},
|
|
39
|
+
emits: [
|
|
40
|
+
"expandedChange",
|
|
41
|
+
"update:isExpanded",
|
|
42
|
+
"mobileOpenChange",
|
|
43
|
+
"update:isMobileOpen",
|
|
44
|
+
"update:width"
|
|
45
|
+
],
|
|
46
|
+
setup(__props, { expose: __expose, emit: __emit }) {
|
|
47
|
+
const props = __props;
|
|
48
|
+
const emit = __emit;
|
|
49
|
+
const matchesNarrow = useMediaQuery(() => props.breakpoint ?? DEFAULT_BREAKPOINT);
|
|
50
|
+
const isMounted = shallowRef(false);
|
|
51
|
+
onMounted(() => {
|
|
52
|
+
isMounted.value = true;
|
|
53
|
+
});
|
|
54
|
+
const isMobile = computed(() => isMounted.value && matchesNarrow.value);
|
|
55
|
+
const state = useSidebarState({
|
|
56
|
+
collapsible: () => props.collapsible,
|
|
57
|
+
defaultExpanded: props.defaultExpanded,
|
|
58
|
+
defaultMobileOpen: props.defaultMobileOpen,
|
|
59
|
+
defaultWidth: props.defaultWidth,
|
|
60
|
+
isExpanded: () => props.isExpanded,
|
|
61
|
+
isMobile,
|
|
62
|
+
isMobileOpen: () => props.isMobileOpen,
|
|
63
|
+
onExpandedChange: (isExpanded) => {
|
|
64
|
+
emit("update:isExpanded", isExpanded);
|
|
65
|
+
emit("expandedChange", isExpanded);
|
|
66
|
+
persist();
|
|
67
|
+
},
|
|
68
|
+
onMobileOpenChange: (isOpen) => {
|
|
69
|
+
emit("update:isMobileOpen", isOpen);
|
|
70
|
+
emit("mobileOpenChange", isOpen);
|
|
71
|
+
},
|
|
72
|
+
onWidthChange: (width) => {
|
|
73
|
+
emit("update:width", width);
|
|
74
|
+
persist();
|
|
75
|
+
},
|
|
76
|
+
width: () => props.width
|
|
77
|
+
});
|
|
78
|
+
function persist() {
|
|
79
|
+
if (!props.autoSaveId || isRestoring) return;
|
|
80
|
+
writeSidebarLayout(props.autoSaveId, state.isExpanded.value, state.width.value);
|
|
81
|
+
}
|
|
82
|
+
let isRestoring = false;
|
|
83
|
+
onMounted(() => {
|
|
84
|
+
if (!props.autoSaveId) return;
|
|
85
|
+
const restored = readSidebarLayout(props.autoSaveId);
|
|
86
|
+
if (!restored) return;
|
|
87
|
+
isRestoring = true;
|
|
88
|
+
state.setOpen(restored.isExpanded);
|
|
89
|
+
if (restored.width !== void 0) state.setWidth(restored.width);
|
|
90
|
+
isRestoring = false;
|
|
91
|
+
});
|
|
92
|
+
const side = computed(() => props.side ?? "left");
|
|
93
|
+
const slots = computed(() => sidebarVariants({
|
|
94
|
+
collapsible: state.collapsible.value,
|
|
95
|
+
side: side.value
|
|
96
|
+
}));
|
|
97
|
+
const panelId = useId$1();
|
|
98
|
+
const panelElement = shallowRef(null);
|
|
99
|
+
const style = computed(() => state.width.value === void 0 ? void 0 : { "--sidebar-width": state.width.value });
|
|
100
|
+
provideSidebarContext({
|
|
101
|
+
panelEl: computed(() => panelElement.value),
|
|
102
|
+
panelId,
|
|
103
|
+
setPanelEl: (element) => {
|
|
104
|
+
panelElement.value = element;
|
|
105
|
+
},
|
|
106
|
+
side,
|
|
107
|
+
slots,
|
|
108
|
+
state
|
|
109
|
+
});
|
|
110
|
+
__expose({
|
|
111
|
+
close: state.close,
|
|
112
|
+
open: state.open,
|
|
113
|
+
toggle: state.toggle
|
|
114
|
+
});
|
|
115
|
+
const n1 = t0();
|
|
116
|
+
renderEffect(() => {
|
|
117
|
+
const _dataAttr = unref(dataAttr);
|
|
118
|
+
const _state = unref(state);
|
|
119
|
+
setClass(n1, slots.value.base({ class: props.class }));
|
|
120
|
+
setAttr(n1, "data-collapsed", _dataAttr(_state.isCollapsed.value));
|
|
121
|
+
setAttr(n1, "data-mobile", _dataAttr(_state.isMobile.value));
|
|
122
|
+
setAttr(n1, "data-side", side.value);
|
|
123
|
+
setStyle(n1, style.value);
|
|
124
|
+
});
|
|
125
|
+
setInsertionState(n1);
|
|
126
|
+
createSlot("default", {
|
|
127
|
+
collapsible: () => unref(state).collapsible.value,
|
|
128
|
+
isCollapsed: () => unref(state).isCollapsed.value,
|
|
129
|
+
isExpanded: () => unref(state).isExpanded.value,
|
|
130
|
+
isMobile: () => unref(state).isMobile.value,
|
|
131
|
+
isOpen: () => unref(state).isOpen.value,
|
|
132
|
+
side: () => side.value
|
|
133
|
+
});
|
|
134
|
+
return n1;
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
//#endregion
|
|
138
|
+
export { sidebar_root_vue_vue_type_script_setup_true_vapor_true_lang_default as default };
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { SidebarSeparatorProps } from "./sidebar.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<SidebarSeparatorProps> & (typeof globalThis extends {
|
|
4
|
+
__VLS_PROPS_FALLBACK: infer P;
|
|
5
|
+
} ? P : {});
|
|
6
|
+
expose: (exposed: {}) => void;
|
|
7
|
+
attrs: any;
|
|
8
|
+
slots: {};
|
|
9
|
+
emit: {};
|
|
10
|
+
}>) => import('vue').VNode & {
|
|
11
|
+
__ctx?: NonNullable<Awaited<typeof __VLS_setup>>;
|
|
12
|
+
};
|
|
13
|
+
declare const _default: typeof __VLS_export;
|
|
14
|
+
export default _default;
|
|
15
|
+
type __VLS_PrettifyLocal<T> = (T extends any ? {
|
|
16
|
+
[K in keyof T]: T[K];
|
|
17
|
+
} : {
|
|
18
|
+
[K in keyof T as K]: T[K];
|
|
19
|
+
}) & {};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { composeSlotClassName } from "../../utils/compose.js";
|
|
2
|
+
import separator_root_default from "../separator/separator-root.js";
|
|
3
|
+
import { useSidebarContext } from "./sidebar.context.js";
|
|
4
|
+
import { createComponent, defineVaporComponent, unref } from "vue";
|
|
5
|
+
//#region src/components/sidebar/sidebar-separator.vue?vue&type=script&setup=true&vapor=true&lang.ts
|
|
6
|
+
var sidebar_separator_vue_vue_type_script_setup_true_vapor_true_lang_default = /*@__PURE__*/ defineVaporComponent({
|
|
7
|
+
__name: "sidebar-separator",
|
|
8
|
+
props: { class: {} },
|
|
9
|
+
setup(__props) {
|
|
10
|
+
const props = __props;
|
|
11
|
+
const { slots } = useSidebarContext();
|
|
12
|
+
return createComponent(separator_root_default, { class: () => unref(composeSlotClassName)(unref(slots).separator, props.class) }, null, true);
|
|
13
|
+
}
|
|
14
|
+
});
|
|
15
|
+
//#endregion
|
|
16
|
+
export { sidebar_separator_vue_vue_type_script_setup_true_vapor_true_lang_default as default };
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { SidebarSubMenuProps } from "./sidebar.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<SidebarSubMenuProps> & (typeof globalThis extends {
|
|
4
|
+
__VLS_PROPS_FALLBACK: infer P;
|
|
5
|
+
} ? P : {});
|
|
6
|
+
expose: (exposed: {}) => void;
|
|
7
|
+
attrs: any;
|
|
8
|
+
slots: {
|
|
9
|
+
default?: (props: {
|
|
10
|
+
isExpanded: boolean;
|
|
11
|
+
}) => unknown;
|
|
12
|
+
};
|
|
13
|
+
emit: {};
|
|
14
|
+
}>) => import('vue').VNode & {
|
|
15
|
+
__ctx?: NonNullable<Awaited<typeof __VLS_setup>>;
|
|
16
|
+
};
|
|
17
|
+
declare const _default: typeof __VLS_export;
|
|
18
|
+
export default _default;
|
|
19
|
+
type __VLS_PrettifyLocal<T> = (T extends any ? {
|
|
20
|
+
[K in keyof T]: T[K];
|
|
21
|
+
} : {
|
|
22
|
+
[K in keyof T as K]: T[K];
|
|
23
|
+
}) & {};
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { composeSlotClassName } from "../../utils/compose.js";
|
|
2
|
+
import { dataAttr } from "../../utils/assertion.js";
|
|
3
|
+
import { useDisclosurePanel } from "../../composables/use-disclosure-panel.js";
|
|
4
|
+
import { provideSidebarSubMenuContext, useSidebarCollapsibleContext, useSidebarContext } from "./sidebar.context.js";
|
|
5
|
+
import { computed, createIf, createSlot, defineVaporComponent, renderEffect, setAttr, setClass, setInsertionState, setProp, setTemplateRefBinding, template, unref } from "vue";
|
|
6
|
+
//#region src/components/sidebar/sidebar-sub-menu.vue?vue&type=script&setup=true&vapor=true&lang.ts
|
|
7
|
+
var t0 = template("<div data-slot=sidebar-sub-menu role=group>", 1);
|
|
8
|
+
var sidebar_sub_menu_vue_vue_type_script_setup_true_vapor_true_lang_default = /*@__PURE__*/ defineVaporComponent({
|
|
9
|
+
__name: "sidebar-sub-menu",
|
|
10
|
+
props: {
|
|
11
|
+
class: {},
|
|
12
|
+
ariaLabel: {}
|
|
13
|
+
},
|
|
14
|
+
setup(__props) {
|
|
15
|
+
const props = __props;
|
|
16
|
+
const { slots, state } = useSidebarContext();
|
|
17
|
+
const collapsible = useSidebarCollapsibleContext();
|
|
18
|
+
provideSidebarSubMenuContext(true);
|
|
19
|
+
const { setPanelElement } = useDisclosurePanel({ isExpanded: collapsible.isExpanded });
|
|
20
|
+
const className = computed(() => composeSlotClassName(slots.value.subMenu, props.class, { isCollapsible: true }));
|
|
21
|
+
return createIf(() => !unref(state).isCollapsed.value, () => {
|
|
22
|
+
const n3 = t0();
|
|
23
|
+
renderEffect(() => {
|
|
24
|
+
const _collapsible = unref(collapsible);
|
|
25
|
+
const _props_ariaLabel = props.ariaLabel;
|
|
26
|
+
setProp(n3, "id", _collapsible.subMenuId.value);
|
|
27
|
+
setAttr(n3, "aria-label", _props_ariaLabel);
|
|
28
|
+
setAttr(n3, "aria-labelledby", _props_ariaLabel ? void 0 : _collapsible.triggerId.value);
|
|
29
|
+
setClass(n3, className.value);
|
|
30
|
+
setAttr(n3, "data-expanded", unref(dataAttr)(_collapsible.isExpanded.value));
|
|
31
|
+
});
|
|
32
|
+
setInsertionState(n3);
|
|
33
|
+
createSlot("default", { isExpanded: () => unref(collapsible).isExpanded.value });
|
|
34
|
+
setTemplateRefBinding(n3, () => setPanelElement, void 0, "setPanelElement");
|
|
35
|
+
return n3;
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
//#endregion
|
|
40
|
+
export { sidebar_sub_menu_vue_vue_type_script_setup_true_vapor_true_lang_default as default };
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { SidebarTriggerProps, SidebarTriggerSlotProps } from "./sidebar.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<SidebarTriggerProps> & (typeof globalThis extends {
|
|
4
|
+
__VLS_PROPS_FALLBACK: infer P;
|
|
5
|
+
} ? P : {});
|
|
6
|
+
expose: (exposed: {}) => void;
|
|
7
|
+
attrs: any;
|
|
8
|
+
slots: {
|
|
9
|
+
default?: (props: SidebarTriggerSlotProps) => 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,69 @@
|
|
|
1
|
+
import { composeSlotClassName } from "../../utils/compose.js";
|
|
2
|
+
import { dataAttr } from "../../utils/assertion.js";
|
|
3
|
+
import icon_chevron_left_default from "../icons/icon-chevron-left.js";
|
|
4
|
+
import icon_chevron_right_default from "../icons/icon-chevron-right.js";
|
|
5
|
+
import { useInteractionStates } from "../../composables/use-interaction-states.js";
|
|
6
|
+
import { useSidebarContext } from "./sidebar.context.js";
|
|
7
|
+
import { computed, createDynamicComponent, createSlot, defineVaporComponent, on, renderEffect, setAttr, setClass, setInsertionState, setProp, template, unref } from "vue";
|
|
8
|
+
//#region src/components/sidebar/sidebar-trigger.vue?vue&type=script&setup=true&vapor=true&lang.ts
|
|
9
|
+
var t0 = template("<button data-slot=sidebar-trigger type=button>", 1);
|
|
10
|
+
var sidebar_trigger_vue_vue_type_script_setup_true_vapor_true_lang_default = /*@__PURE__*/ defineVaporComponent({
|
|
11
|
+
__name: "sidebar-trigger",
|
|
12
|
+
props: {
|
|
13
|
+
class: {},
|
|
14
|
+
isDisabled: {
|
|
15
|
+
type: Boolean,
|
|
16
|
+
default: void 0
|
|
17
|
+
},
|
|
18
|
+
ariaLabel: {}
|
|
19
|
+
},
|
|
20
|
+
setup(__props) {
|
|
21
|
+
const props = __props;
|
|
22
|
+
const { panelId, side, slots, state } = useSidebarContext();
|
|
23
|
+
const isDisabled = computed(() => Boolean(props.isDisabled) || state.collapsible.value === "none");
|
|
24
|
+
const interaction = useInteractionStates({ isDisabled });
|
|
25
|
+
const tabindex = computed(() => isDisabled.value ? void 0 : 0);
|
|
26
|
+
const Icon = computed(() => {
|
|
27
|
+
return (side.value === "left" ? state.isOpen.value : !state.isOpen.value) ? icon_chevron_left_default : icon_chevron_right_default;
|
|
28
|
+
});
|
|
29
|
+
const n3 = t0();
|
|
30
|
+
renderEffect(() => {
|
|
31
|
+
const _props = props;
|
|
32
|
+
const _dataAttr = unref(dataAttr);
|
|
33
|
+
const _isDisabled = isDisabled.value;
|
|
34
|
+
const _interaction = unref(interaction);
|
|
35
|
+
setAttr(n3, "aria-controls", unref(panelId));
|
|
36
|
+
setAttr(n3, "aria-expanded", unref(state).isOpen.value);
|
|
37
|
+
setAttr(n3, "aria-label", _props.ariaLabel ?? "Toggle sidebar");
|
|
38
|
+
setClass(n3, unref(composeSlotClassName)(unref(slots).trigger, _props.class));
|
|
39
|
+
setAttr(n3, "data-disabled", _dataAttr(_isDisabled));
|
|
40
|
+
setAttr(n3, "data-focus-visible", _dataAttr(_interaction.isFocusVisible.value));
|
|
41
|
+
setAttr(n3, "data-focused", _dataAttr(_interaction.isFocused.value));
|
|
42
|
+
setAttr(n3, "data-hovered", _dataAttr(_interaction.isHovered.value));
|
|
43
|
+
setAttr(n3, "data-pressed", _dataAttr(_interaction.isPressed.value));
|
|
44
|
+
setProp(n3, "disabled", _isDisabled || void 0);
|
|
45
|
+
setProp(n3, "tabindex", tabindex.value);
|
|
46
|
+
});
|
|
47
|
+
setInsertionState(n3);
|
|
48
|
+
createSlot("default", {
|
|
49
|
+
isCollapsed: () => unref(state).isCollapsed.value,
|
|
50
|
+
isDisabled: () => isDisabled.value,
|
|
51
|
+
isFocusVisible: () => unref(interaction).isFocusVisible.value,
|
|
52
|
+
isFocused: () => unref(interaction).isFocused.value,
|
|
53
|
+
isHovered: () => unref(interaction).isHovered.value,
|
|
54
|
+
isOpen: () => unref(state).isOpen.value,
|
|
55
|
+
isPressed: () => unref(interaction).isPressed.value
|
|
56
|
+
}, () => {
|
|
57
|
+
return createDynamicComponent(() => Icon.value);
|
|
58
|
+
});
|
|
59
|
+
on(n3, "blur", (e) => unref(interaction).onBlur(e));
|
|
60
|
+
on(n3, "click", (e) => unref(state).toggle(e));
|
|
61
|
+
on(n3, "focus", (e) => unref(interaction).onFocus(e));
|
|
62
|
+
on(n3, "pointerdown", (e) => unref(interaction).onPointerdown(e));
|
|
63
|
+
on(n3, "pointerenter", (e) => unref(interaction).onPointerenter(e));
|
|
64
|
+
on(n3, "pointerleave", (e) => unref(interaction).onPointerleave(e));
|
|
65
|
+
return n3;
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
//#endregion
|
|
69
|
+
export { sidebar_trigger_vue_vue_type_script_setup_true_vapor_true_lang_default as default };
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import type { SidebarState } from "./sidebar.state.js";
|
|
2
|
+
import type { SidebarSide } from "./sidebar.types.js";
|
|
3
|
+
import type { sidebarVariants } from "@ropav/styles";
|
|
4
|
+
import type { ComputedRef } from "vue";
|
|
5
|
+
export interface SidebarContext {
|
|
6
|
+
/** The slot set the root resolved, so every part styles itself from one `tv()` call. */
|
|
7
|
+
slots: ComputedRef<ReturnType<typeof sidebarVariants>>;
|
|
8
|
+
state: SidebarState;
|
|
9
|
+
side: ComputedRef<SidebarSide>;
|
|
10
|
+
/** The panel's id, which the trigger's `aria-controls` and the rail both point at. */
|
|
11
|
+
panelId: ComputedRef<string>;
|
|
12
|
+
/**
|
|
13
|
+
* The panel element, reported upward rather than reached for.
|
|
14
|
+
*
|
|
15
|
+
* The rail resizes by measuring what the panel is now and adding the drag to it, and it cannot
|
|
16
|
+
* find that element from where it sits: the two are siblings, and a caller is free to put
|
|
17
|
+
* anything between them.
|
|
18
|
+
*/
|
|
19
|
+
panelEl: ComputedRef<HTMLElement | null>;
|
|
20
|
+
setPanelEl: (element: HTMLElement | null) => void;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Strict, and keyed to this component alone.
|
|
24
|
+
*
|
|
25
|
+
* A key shared with a layout family would resolve to the nearest ancestor that provided it, so a
|
|
26
|
+
* settings nav rendered inside a sidebar's inset would read the outer sidebar's state and collapse
|
|
27
|
+
* with it.
|
|
28
|
+
*/
|
|
29
|
+
export declare const useSidebarContext: () => SidebarContext, provideSidebarContext: (value: SidebarContext) => SidebarContext;
|
|
30
|
+
/**
|
|
31
|
+
* What a group offers the label inside it.
|
|
32
|
+
*
|
|
33
|
+
* The label registers rather than the group reaching for it, because the group cannot see whether
|
|
34
|
+
* its slot rendered one — and `aria-labelledby` pointing at an id that never appears leaves the
|
|
35
|
+
* group with no name at all, which is worse than the plain unnamed group it would otherwise be.
|
|
36
|
+
*/
|
|
37
|
+
export interface SidebarGroupContext {
|
|
38
|
+
labelId: ComputedRef<string>;
|
|
39
|
+
/** Called by the label on mount; the returned function undoes it. */
|
|
40
|
+
registerLabel: () => () => void;
|
|
41
|
+
}
|
|
42
|
+
/** Loose: a group label outside a group is a heading with no group to name, not an error. */
|
|
43
|
+
export declare const useSidebarGroupContext: () => SidebarGroupContext | null, provideSidebarGroupContext: (value: SidebarGroupContext | null) => SidebarGroupContext | null;
|
|
44
|
+
/**
|
|
45
|
+
* What a collapsible nav item offers the trigger and the submenu inside it.
|
|
46
|
+
*
|
|
47
|
+
* Strict: a trigger or an indicator outside a collapsible has nothing to open and nothing to point
|
|
48
|
+
* at, so the absence of one is a mistake rather than a state to render around.
|
|
49
|
+
*/
|
|
50
|
+
export interface SidebarCollapsibleContext {
|
|
51
|
+
/** Whether the children are showing. Always false while the sidebar is a rail — see the note on
|
|
52
|
+
* `toggle` for why the rail is the one place this does not follow the item's own state. */
|
|
53
|
+
isExpanded: ComputedRef<boolean>;
|
|
54
|
+
isDisabled: ComputedRef<boolean>;
|
|
55
|
+
/**
|
|
56
|
+
* Opens and shuts the children.
|
|
57
|
+
*
|
|
58
|
+
* On the rail it opens the sidebar first. The children are not rendered at that width, so a
|
|
59
|
+
* trigger that only flipped its own flag would be a control that visibly does nothing; opening
|
|
60
|
+
* the panel is what the press was asking for either way.
|
|
61
|
+
*/
|
|
62
|
+
toggle: () => void;
|
|
63
|
+
/** The trigger's id, which names the submenu. */
|
|
64
|
+
triggerId: ComputedRef<string>;
|
|
65
|
+
/** The submenu's id, which the trigger's `aria-controls` points at. */
|
|
66
|
+
subMenuId: ComputedRef<string>;
|
|
67
|
+
}
|
|
68
|
+
export declare const useSidebarCollapsibleContext: () => SidebarCollapsibleContext, provideSidebarCollapsibleContext: (value: SidebarCollapsibleContext) => SidebarCollapsibleContext;
|
|
69
|
+
/**
|
|
70
|
+
* Whether a row is inside a submenu, which is all an item needs to know to style itself as a child.
|
|
71
|
+
*
|
|
72
|
+
* Loose and a bare boolean: an item outside a submenu is the ordinary case, not an error, and
|
|
73
|
+
* carrying the answer down beats a prop every child row would have to remember.
|
|
74
|
+
*/
|
|
75
|
+
export declare const useSidebarSubMenuContext: () => boolean, provideSidebarSubMenuContext: (value: boolean) => boolean;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { createContext } from "../../utils/create-context.js";
|
|
2
|
+
//#region src/components/sidebar/sidebar.context.ts
|
|
3
|
+
/**
|
|
4
|
+
* Strict, and keyed to this component alone.
|
|
5
|
+
*
|
|
6
|
+
* A key shared with a layout family would resolve to the nearest ancestor that provided it, so a
|
|
7
|
+
* settings nav rendered inside a sidebar's inset would read the outer sidebar's state and collapse
|
|
8
|
+
* with it.
|
|
9
|
+
*/
|
|
10
|
+
var [useSidebarContext, provideSidebarContext] = createContext({ name: "SidebarContext" });
|
|
11
|
+
/** Loose: a group label outside a group is a heading with no group to name, not an error. */
|
|
12
|
+
var [useSidebarGroupContext, provideSidebarGroupContext] = createContext({
|
|
13
|
+
defaultValue: null,
|
|
14
|
+
name: "SidebarGroupContext",
|
|
15
|
+
strict: false
|
|
16
|
+
});
|
|
17
|
+
var [useSidebarCollapsibleContext, provideSidebarCollapsibleContext] = createContext({ name: "SidebarCollapsibleContext" });
|
|
18
|
+
/**
|
|
19
|
+
* Whether a row is inside a submenu, which is all an item needs to know to style itself as a child.
|
|
20
|
+
*
|
|
21
|
+
* Loose and a bare boolean: an item outside a submenu is the ordinary case, not an error, and
|
|
22
|
+
* carrying the answer down beats a prop every child row would have to remember.
|
|
23
|
+
*/
|
|
24
|
+
var [useSidebarSubMenuContext, provideSidebarSubMenuContext] = createContext({
|
|
25
|
+
defaultValue: false,
|
|
26
|
+
name: "SidebarSubMenuContext",
|
|
27
|
+
strict: false
|
|
28
|
+
});
|
|
29
|
+
//#endregion
|
|
30
|
+
export { provideSidebarCollapsibleContext, provideSidebarContext, provideSidebarGroupContext, provideSidebarSubMenuContext, useSidebarCollapsibleContext, useSidebarContext, useSidebarGroupContext, useSidebarSubMenuContext };
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import type { ComputedRef, MaybeRefOrGetter } from "vue";
|
|
2
|
+
/**
|
|
3
|
+
* How the panel gets out of the way. `none` pins it open, and the trigger has nothing to do.
|
|
4
|
+
*
|
|
5
|
+
* Named for the mode rather than for the prop it fills, because `SidebarCollapsible` is the
|
|
6
|
+
* collapsible nav item — a component, and the more obvious owner of the bare name.
|
|
7
|
+
*/
|
|
8
|
+
export type SidebarCollapsibleMode = "icon" | "offcanvas" | "none";
|
|
9
|
+
export interface UseSidebarStateOptions {
|
|
10
|
+
collapsible: MaybeRefOrGetter<SidebarCollapsibleMode | undefined>;
|
|
11
|
+
/** Whether the viewport is narrow enough that the panel has become a drawer. */
|
|
12
|
+
isMobile: MaybeRefOrGetter<boolean | undefined>;
|
|
13
|
+
/** Whether the panel is expanded on a wide viewport. Set, the sidebar never writes its own. */
|
|
14
|
+
isExpanded: MaybeRefOrGetter<boolean | undefined>;
|
|
15
|
+
defaultExpanded?: boolean;
|
|
16
|
+
/** Whether the drawer is showing on a narrow one. */
|
|
17
|
+
isMobileOpen: MaybeRefOrGetter<boolean | undefined>;
|
|
18
|
+
defaultMobileOpen?: boolean;
|
|
19
|
+
/** The width the expanded panel renders at, as a CSS length. */
|
|
20
|
+
width: MaybeRefOrGetter<string | undefined>;
|
|
21
|
+
defaultWidth?: string;
|
|
22
|
+
onExpandedChange?: (isExpanded: boolean) => void;
|
|
23
|
+
onMobileOpenChange?: (isOpen: boolean) => void;
|
|
24
|
+
onWidthChange?: (width: string) => void;
|
|
25
|
+
}
|
|
26
|
+
export interface SidebarState {
|
|
27
|
+
collapsible: ComputedRef<SidebarCollapsibleMode>;
|
|
28
|
+
isMobile: ComputedRef<boolean>;
|
|
29
|
+
/** Whether the panel is expanded on a wide viewport. */
|
|
30
|
+
isExpanded: ComputedRef<boolean>;
|
|
31
|
+
/** Whether the drawer is showing on a narrow one. */
|
|
32
|
+
isMobileOpen: ComputedRef<boolean>;
|
|
33
|
+
/** Whether the panel is showing, whichever of the two is in charge at this width. */
|
|
34
|
+
isOpen: ComputedRef<boolean>;
|
|
35
|
+
/**
|
|
36
|
+
* Whether the panel is narrowed rather than hidden — what the parts read to decide whether to
|
|
37
|
+
* drop their labels. False at every width where the panel is a drawer, because a drawer is open
|
|
38
|
+
* or it is gone; there is no half-open drawer to shorten a label for.
|
|
39
|
+
*/
|
|
40
|
+
isCollapsed: ComputedRef<boolean>;
|
|
41
|
+
setOpen: (isOpen: boolean) => void;
|
|
42
|
+
open: () => void;
|
|
43
|
+
close: () => void;
|
|
44
|
+
toggle: () => void;
|
|
45
|
+
/** Undefined until someone sets one, so an untouched sidebar is sized by the stylesheet. */
|
|
46
|
+
width: ComputedRef<string | undefined>;
|
|
47
|
+
setWidth: (width: string) => void;
|
|
48
|
+
/** Put the width back to the declared default, which is what a double-click on the rail does. */
|
|
49
|
+
resetWidth: () => void;
|
|
50
|
+
/** Whether a drag on the rail is in flight, which is what suppresses the width transition. */
|
|
51
|
+
isResizing: ComputedRef<boolean>;
|
|
52
|
+
setResizing: (isResizing: boolean) => void;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Open state for a sidebar.
|
|
56
|
+
*
|
|
57
|
+
* The two open states are held apart on purpose. A sidebar collapsed to its rail on a wide screen
|
|
58
|
+
* that is then narrowed would, on one shared flag, open its drawer already collapsed — and
|
|
59
|
+
* widening the window again would leave the sidebar expanded because the drawer had been opened.
|
|
60
|
+
* Keeping them separate means each width remembers what the user did at that width, and `isOpen`
|
|
61
|
+
* reads whichever one is in charge.
|
|
62
|
+
*
|
|
63
|
+
* @example
|
|
64
|
+
* ```ts
|
|
65
|
+
* const state = useSidebarState({
|
|
66
|
+
* collapsible: () => props.collapsible,
|
|
67
|
+
* isMobile,
|
|
68
|
+
* isExpanded: () => props.isExpanded,
|
|
69
|
+
* onExpandedChange: (value) => emit("update:isExpanded", value),
|
|
70
|
+
* });
|
|
71
|
+
* ```
|
|
72
|
+
*/
|
|
73
|
+
export declare const useSidebarState: (options: UseSidebarStateOptions) => SidebarState;
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { useControllableState } from "../../composables/use-controllable-state.js";
|
|
2
|
+
import { computed, shallowRef, toValue } from "vue";
|
|
3
|
+
//#region src/components/sidebar/sidebar.state.ts
|
|
4
|
+
/**
|
|
5
|
+
* Open state for a sidebar.
|
|
6
|
+
*
|
|
7
|
+
* The two open states are held apart on purpose. A sidebar collapsed to its rail on a wide screen
|
|
8
|
+
* that is then narrowed would, on one shared flag, open its drawer already collapsed — and
|
|
9
|
+
* widening the window again would leave the sidebar expanded because the drawer had been opened.
|
|
10
|
+
* Keeping them separate means each width remembers what the user did at that width, and `isOpen`
|
|
11
|
+
* reads whichever one is in charge.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```ts
|
|
15
|
+
* const state = useSidebarState({
|
|
16
|
+
* collapsible: () => props.collapsible,
|
|
17
|
+
* isMobile,
|
|
18
|
+
* isExpanded: () => props.isExpanded,
|
|
19
|
+
* onExpandedChange: (value) => emit("update:isExpanded", value),
|
|
20
|
+
* });
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
var useSidebarState = (options) => {
|
|
24
|
+
const collapsible = computed(() => toValue(options.collapsible) ?? "icon");
|
|
25
|
+
const isMobile = computed(() => Boolean(toValue(options.isMobile)));
|
|
26
|
+
const isResizing = shallowRef(false);
|
|
27
|
+
const expanded = useControllableState({
|
|
28
|
+
defaultValue: options.defaultExpanded ?? true,
|
|
29
|
+
onValueChange: options.onExpandedChange,
|
|
30
|
+
value: options.isExpanded
|
|
31
|
+
});
|
|
32
|
+
const mobileOpen = useControllableState({
|
|
33
|
+
defaultValue: options.defaultMobileOpen ?? false,
|
|
34
|
+
onValueChange: options.onMobileOpenChange,
|
|
35
|
+
value: options.isMobileOpen
|
|
36
|
+
});
|
|
37
|
+
const width = useControllableState({
|
|
38
|
+
defaultValue: options.defaultWidth,
|
|
39
|
+
onValueChange: (next) => {
|
|
40
|
+
if (next !== void 0) options.onWidthChange?.(next);
|
|
41
|
+
},
|
|
42
|
+
value: options.width
|
|
43
|
+
});
|
|
44
|
+
const isExpanded = computed(() => collapsible.value === "none" || expanded.state.value);
|
|
45
|
+
const isOpen = computed(() => isMobile.value ? mobileOpen.state.value : isExpanded.value);
|
|
46
|
+
const isCollapsed = computed(() => !isMobile.value && collapsible.value !== "none" && !isExpanded.value);
|
|
47
|
+
const setOpen = (next) => {
|
|
48
|
+
if (isMobile.value) {
|
|
49
|
+
mobileOpen.setState(next);
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
if (collapsible.value === "none") return;
|
|
53
|
+
expanded.setState(next);
|
|
54
|
+
};
|
|
55
|
+
return {
|
|
56
|
+
close: () => setOpen(false),
|
|
57
|
+
collapsible,
|
|
58
|
+
isCollapsed,
|
|
59
|
+
isExpanded,
|
|
60
|
+
isMobile,
|
|
61
|
+
isMobileOpen: computed(() => mobileOpen.state.value),
|
|
62
|
+
isOpen,
|
|
63
|
+
isResizing: computed(() => isResizing.value),
|
|
64
|
+
open: () => setOpen(true),
|
|
65
|
+
resetWidth: () => width.setState(options.defaultWidth),
|
|
66
|
+
setOpen,
|
|
67
|
+
setResizing: (next) => {
|
|
68
|
+
isResizing.value = next;
|
|
69
|
+
},
|
|
70
|
+
setWidth: (next) => width.setState(next),
|
|
71
|
+
toggle: () => setOpen(!isOpen.value),
|
|
72
|
+
width: computed(() => width.state.value)
|
|
73
|
+
};
|
|
74
|
+
};
|
|
75
|
+
//#endregion
|
|
76
|
+
export { useSidebarState };
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export interface SidebarLayout {
|
|
2
|
+
isExpanded: boolean;
|
|
3
|
+
width: string | undefined;
|
|
4
|
+
}
|
|
5
|
+
/** What was stored under `id`, or `null` when there is nothing usable there. */
|
|
6
|
+
export declare const readSidebarLayout: (id: string) => SidebarLayout | null;
|
|
7
|
+
export declare const writeSidebarLayout: (id: string, isExpanded: boolean, width?: string) => void;
|
|
8
|
+
export declare const clearSidebarLayout: (id: string) => void;
|