ropav 0.4.0 → 0.6.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.
Files changed (266) hide show
  1. package/dist/components/autocomplete/autocomplete-root.js +3 -1
  2. package/dist/components/autocomplete/index.d.ts +3 -0
  3. package/dist/components/breadcrumbs/breadcrumbs-item.js +1 -0
  4. package/dist/components/breadcrumbs/index.d.ts +1 -0
  5. package/dist/components/calendar/index.d.ts +5 -3
  6. package/dist/components/calendar-year-picker/index.d.ts +4 -2
  7. package/dist/components/checkbox/checkbox-content.js +1 -1
  8. package/dist/components/color-field/index.d.ts +1 -0
  9. package/dist/components/color-input-group/color-input-group-root.js +2 -0
  10. package/dist/components/color-input-group/color-input-group.types.d.ts +2 -0
  11. package/dist/components/color-input-group/index.d.ts +2 -0
  12. package/dist/components/combo-box/combo-box-root.js +9 -2
  13. package/dist/components/combo-box/combo-box.types.d.ts +3 -0
  14. package/dist/components/combo-box/index.d.ts +3 -0
  15. package/dist/components/date-field/index.d.ts +1 -0
  16. package/dist/components/date-input-group/date-input-group-root.js +2 -0
  17. package/dist/components/date-input-group/date-input-group-segment.js +1 -1
  18. package/dist/components/date-input-group/date-input-group.types.d.ts +2 -0
  19. package/dist/{composables → components/date-input-group}/use-date-segment.d.ts +2 -2
  20. package/dist/{composables → components/date-input-group}/use-date-segment.js +9 -9
  21. package/dist/components/date-range-picker/date-range-picker-root.js +1 -1
  22. package/dist/components/date-range-picker/index.d.ts +15 -14
  23. package/dist/{composables → components/date-range-picker}/use-date-range-picker.d.ts +7 -7
  24. package/dist/{composables → components/date-range-picker}/use-date-range-picker.js +10 -10
  25. package/dist/components/drawer/drawer-dialog.js +1 -1
  26. package/dist/{composables → components/drawer}/use-drawer-drag.d.ts +1 -1
  27. package/dist/{composables → components/drawer}/use-drawer-drag.js +1 -1
  28. package/dist/components/drop-zone/drop-zone-root.d.ts +23 -0
  29. package/dist/components/drop-zone/drop-zone-root.js +153 -0
  30. package/dist/components/drop-zone/drop-zone-trigger.d.ts +21 -0
  31. package/dist/components/drop-zone/drop-zone-trigger.js +20 -0
  32. package/dist/components/drop-zone/drop-zone.accept.d.ts +19 -0
  33. package/dist/components/drop-zone/drop-zone.accept.js +28 -0
  34. package/dist/components/drop-zone/drop-zone.context.d.ts +6 -0
  35. package/dist/components/drop-zone/drop-zone.context.js +5 -0
  36. package/dist/components/drop-zone/drop-zone.types.d.ts +30 -0
  37. package/dist/components/drop-zone/index.d.ts +86 -0
  38. package/dist/components/drop-zone/index.js +11 -0
  39. package/dist/components/dropdown/dropdown-menu.js +1 -0
  40. package/dist/components/dropdown/dropdown-submenu-trigger.js +1 -1
  41. package/dist/components/dropdown/index.d.ts +4 -2
  42. package/dist/{composables → components/dropdown}/use-safely-mouse-to-submenu.js +1 -1
  43. package/dist/components/icons/icon-overlay-arrow.js +1 -1
  44. package/dist/components/index.d.ts +5 -0
  45. package/dist/components/input/index.d.ts +2 -0
  46. package/dist/components/input/input-root.js +3 -0
  47. package/dist/components/input/input.types.d.ts +5 -0
  48. package/dist/components/input-group/index.d.ts +2 -0
  49. package/dist/components/input-group/input-group-root.js +3 -0
  50. package/dist/components/input-group/input-group.types.d.ts +5 -0
  51. package/dist/components/input-otp/index.d.ts +6 -4
  52. package/dist/components/link/index.d.ts +2 -0
  53. package/dist/components/link/link-root.js +22 -5
  54. package/dist/components/link/link.types.d.ts +14 -3
  55. package/dist/{composables → components/list-box}/drag-collection.d.ts +2 -2
  56. package/dist/{composables → components/list-box}/drag-collection.js +1 -1
  57. package/dist/components/list-box/index.d.ts +4 -0
  58. package/dist/components/list-box/list-box-root.js +53 -32
  59. package/dist/components/list-box/list-box.types.d.ts +2 -0
  60. package/dist/components/menu/index.d.ts +2 -0
  61. package/dist/components/menu/menu-root.js +5 -1
  62. package/dist/components/menu/menu.types.d.ts +3 -0
  63. package/dist/components/number-field/index.d.ts +3 -0
  64. package/dist/components/number-field/number-field-root.js +2 -0
  65. package/dist/components/number-field/number-field.types.d.ts +2 -0
  66. package/dist/components/overlay/overlay-arrow.js +64 -11
  67. package/dist/components/progress-bar/index.d.ts +4 -0
  68. package/dist/components/progress-bar/progress-bar-root.js +4 -0
  69. package/dist/components/progress-bar/progress-bar.types.d.ts +7 -0
  70. package/dist/components/radio/radio-content.js +1 -1
  71. package/dist/components/range-calendar/index.d.ts +18 -15
  72. package/dist/components/router-provider/index.d.ts +5 -0
  73. package/dist/components/router-provider/index.js +3 -0
  74. package/dist/components/router-provider/router-provider.context.d.ts +40 -0
  75. package/dist/components/router-provider/router-provider.context.js +16 -0
  76. package/dist/components/router-provider/router-provider.d.ts +21 -0
  77. package/dist/components/router-provider/router-provider.js +22 -0
  78. package/dist/components/router-provider/router-provider.types.d.ts +23 -0
  79. package/dist/components/scroll-shadow/use-scroll-shadow.js +25 -1
  80. package/dist/components/search-field/index.d.ts +2 -0
  81. package/dist/components/search-field/search-field-root.js +3 -1
  82. package/dist/components/search-field/search-field.types.d.ts +2 -0
  83. package/dist/{composables → components/search-field}/use-search-field.d.ts +2 -2
  84. package/dist/{composables → components/search-field}/use-search-field.js +3 -3
  85. package/dist/components/segmented-control/index.d.ts +134 -0
  86. package/dist/components/segmented-control/index.js +15 -0
  87. package/dist/components/segmented-control/segmented-control-indicator.d.ts +19 -0
  88. package/dist/components/segmented-control/segmented-control-indicator.js +36 -0
  89. package/dist/components/segmented-control/segmented-control-item.d.ts +21 -0
  90. package/dist/components/segmented-control/segmented-control-item.js +96 -0
  91. package/dist/components/segmented-control/segmented-control-root.d.ts +25 -0
  92. package/dist/components/segmented-control/segmented-control-root.js +112 -0
  93. package/dist/components/segmented-control/segmented-control-separator.d.ts +19 -0
  94. package/dist/components/segmented-control/segmented-control-separator.js +18 -0
  95. package/dist/components/segmented-control/segmented-control.context.d.ts +17 -0
  96. package/dist/components/segmented-control/segmented-control.context.js +12 -0
  97. package/dist/components/segmented-control/segmented-control.types.d.ts +67 -0
  98. package/dist/components/select/index.d.ts +3 -0
  99. package/dist/components/select/select-hidden-select.js +1 -1
  100. package/dist/components/select/select-root.js +2 -0
  101. package/dist/components/select/select.types.d.ts +2 -0
  102. package/dist/components/sidebar/index.d.ts +546 -0
  103. package/dist/components/sidebar/index.js +47 -0
  104. package/dist/components/sidebar/sidebar-collapsible-trigger.d.ts +21 -0
  105. package/dist/components/sidebar/sidebar-collapsible-trigger.js +70 -0
  106. package/dist/components/sidebar/sidebar-collapsible.d.ts +24 -0
  107. package/dist/components/sidebar/sidebar-collapsible.js +78 -0
  108. package/dist/components/sidebar/sidebar-content.d.ts +21 -0
  109. package/dist/components/sidebar/sidebar-content.js +37 -0
  110. package/dist/components/sidebar/sidebar-footer.d.ts +21 -0
  111. package/dist/components/sidebar/sidebar-footer.js +24 -0
  112. package/dist/components/sidebar/sidebar-group-label.d.ts +21 -0
  113. package/dist/components/sidebar/sidebar-group-label.js +32 -0
  114. package/dist/components/sidebar/sidebar-group.d.ts +21 -0
  115. package/dist/components/sidebar/sidebar-group.js +48 -0
  116. package/dist/components/sidebar/sidebar-header.d.ts +21 -0
  117. package/dist/components/sidebar/sidebar-header.js +24 -0
  118. package/dist/components/sidebar/sidebar-inset.d.ts +21 -0
  119. package/dist/components/sidebar/sidebar-inset.js +24 -0
  120. package/dist/components/sidebar/sidebar-item-icon.d.ts +21 -0
  121. package/dist/components/sidebar/sidebar-item-icon.js +20 -0
  122. package/dist/components/sidebar/sidebar-item-indicator.d.ts +21 -0
  123. package/dist/components/sidebar/sidebar-item-indicator.js +48 -0
  124. package/dist/components/sidebar/sidebar-item-label.d.ts +21 -0
  125. package/dist/components/sidebar/sidebar-item-label.js +28 -0
  126. package/dist/components/sidebar/sidebar-item-tooltip.d.ts +21 -0
  127. package/dist/components/sidebar/sidebar-item-tooltip.js +38 -0
  128. package/dist/components/sidebar/sidebar-item-trailing.d.ts +21 -0
  129. package/dist/components/sidebar/sidebar-item-trailing.js +28 -0
  130. package/dist/components/sidebar/sidebar-item.d.ts +23 -0
  131. package/dist/components/sidebar/sidebar-item.js +160 -0
  132. package/dist/components/sidebar/sidebar-panel.d.ts +21 -0
  133. package/dist/components/sidebar/sidebar-panel.js +88 -0
  134. package/dist/components/sidebar/sidebar-rail.d.ts +21 -0
  135. package/dist/components/sidebar/sidebar-rail.js +210 -0
  136. package/dist/components/sidebar/sidebar-root.d.ts +31 -0
  137. package/dist/components/sidebar/sidebar-root.js +140 -0
  138. package/dist/components/sidebar/sidebar-separator.d.ts +19 -0
  139. package/dist/components/sidebar/sidebar-separator.js +16 -0
  140. package/dist/components/sidebar/sidebar-sub-menu.d.ts +23 -0
  141. package/dist/components/sidebar/sidebar-sub-menu.js +40 -0
  142. package/dist/components/sidebar/sidebar-trigger.d.ts +21 -0
  143. package/dist/components/sidebar/sidebar-trigger.js +69 -0
  144. package/dist/components/sidebar/sidebar.context.d.ts +75 -0
  145. package/dist/components/sidebar/sidebar.context.js +30 -0
  146. package/dist/components/sidebar/sidebar.state.d.ts +73 -0
  147. package/dist/components/sidebar/sidebar.state.js +76 -0
  148. package/dist/components/sidebar/sidebar.storage.d.ts +8 -0
  149. package/dist/components/sidebar/sidebar.storage.js +45 -0
  150. package/dist/components/sidebar/sidebar.types.d.ts +273 -0
  151. package/dist/components/splitter/index.d.ts +143 -0
  152. package/dist/components/splitter/index.js +13 -0
  153. package/dist/components/splitter/splitter-handle.d.ts +21 -0
  154. package/dist/components/splitter/splitter-handle.js +209 -0
  155. package/dist/components/splitter/splitter-panel.d.ts +21 -0
  156. package/dist/components/splitter/splitter-panel.js +70 -0
  157. package/dist/components/splitter/splitter-root.d.ts +31 -0
  158. package/dist/components/splitter/splitter-root.js +152 -0
  159. package/dist/components/splitter/splitter.context.d.ts +15 -0
  160. package/dist/components/splitter/splitter.context.js +5 -0
  161. package/dist/components/splitter/splitter.state.d.ts +87 -0
  162. package/dist/components/splitter/splitter.state.js +322 -0
  163. package/dist/components/splitter/splitter.storage.d.ts +15 -0
  164. package/dist/components/splitter/splitter.storage.js +56 -0
  165. package/dist/components/splitter/splitter.types.d.ts +98 -0
  166. package/dist/components/switch/switch-content.js +1 -1
  167. package/dist/components/table/index.d.ts +10 -9
  168. package/dist/components/table/table-body.js +13 -13
  169. package/dist/components/table/table-cell.js +49 -46
  170. package/dist/components/table/table-column-resizer.js +1 -1
  171. package/dist/components/table/table-column.js +1 -1
  172. package/dist/components/table/table-content.js +37 -18
  173. package/dist/{composables → components/table}/table-drag-collection.d.ts +1 -1
  174. package/dist/{composables → components/table}/table-drag-collection.js +1 -1
  175. package/dist/components/table/table-drop-indicator.js +3 -1
  176. package/dist/components/table/table-resizable-container.d.ts +4 -5
  177. package/dist/components/table/table-row.js +45 -14
  178. package/dist/components/table/table-virtualizer-item.d.ts +2 -7
  179. package/dist/components/table/table-virtualizer-item.js +20 -9
  180. package/dist/components/table/table.context.d.ts +11 -3
  181. package/dist/components/table/table.types.d.ts +1 -1
  182. package/dist/{composables → components/table}/use-grid-keyboard.d.ts +3 -3
  183. package/dist/{composables → components/table}/use-grid-keyboard.js +57 -55
  184. package/dist/{composables → components/table}/use-grid-selection-announcement.d.ts +2 -2
  185. package/dist/{composables → components/table}/use-grid-selection-announcement.js +2 -2
  186. package/dist/{composables → components/table}/use-table-collection.d.ts +2 -2
  187. package/dist/{composables → components/table}/use-table-collection.js +4 -4
  188. package/dist/{composables → components/table}/use-table-column-layout.d.ts +13 -20
  189. package/dist/components/table/use-table-column-layout.js +115 -0
  190. package/dist/components/textarea/index.d.ts +2 -0
  191. package/dist/components/textarea/textarea-root.js +3 -0
  192. package/dist/components/textarea/textarea.types.d.ts +5 -0
  193. package/dist/components/textfield/index.d.ts +2 -0
  194. package/dist/components/textfield/textfield-root.js +5 -1
  195. package/dist/components/textfield/textfield.context.d.ts +2 -0
  196. package/dist/components/textfield/textfield.types.d.ts +5 -0
  197. package/dist/components/time-field/index.d.ts +1 -0
  198. package/dist/components/toast/index.d.ts +1 -0
  199. package/dist/components/toast/toast-default-content.js +1 -1
  200. package/dist/components/toolbar/index.d.ts +3 -2
  201. package/dist/components/tooltip/index.js +1 -1
  202. package/dist/components/tooltip/tooltip-root.js +1 -1
  203. package/dist/components/virtualizer/index.d.ts +3 -1
  204. package/dist/components/virtualizer/index.js +2 -1
  205. package/dist/components/virtualizer/use-virtualizer-item.d.ts +23 -0
  206. package/dist/components/virtualizer/use-virtualizer-item.js +45 -0
  207. package/dist/components/virtualizer/virtualizer-item.js +7 -41
  208. package/dist/components/virtualizer/virtualizer-scrollbar-track.d.ts +20 -0
  209. package/dist/components/virtualizer/virtualizer-scrollbar-track.js +141 -0
  210. package/dist/components/virtualizer/virtualizer-scrollbar.d.ts +18 -0
  211. package/dist/components/virtualizer/virtualizer-scrollbar.js +55 -0
  212. package/dist/components/virtualizer/virtualizer.context.d.ts +17 -1
  213. package/dist/composables/drag-manager.js +1 -13
  214. package/dist/composables/index.d.ts +3 -70
  215. package/dist/composables/use-collection.d.ts +22 -3
  216. package/dist/composables/use-collection.js +67 -14
  217. package/dist/composables/use-color-area.js +2 -2
  218. package/dist/composables/use-color-field.js +1 -1
  219. package/dist/composables/use-combo-box.js +1 -1
  220. package/dist/composables/use-date-field.js +1 -1
  221. package/dist/composables/use-drag.d.ts +6 -5
  222. package/dist/composables/use-draggable-item.d.ts +2 -2
  223. package/dist/composables/use-droppable-collection.js +3 -3
  224. package/dist/composables/use-droppable-item.js +1 -1
  225. package/dist/composables/use-form-reset.d.ts +6 -2
  226. package/dist/composables/use-form-reset.js +9 -5
  227. package/dist/composables/use-list-keyboard.js +64 -62
  228. package/dist/composables/use-number-field.js +1 -1
  229. package/dist/composables/use-select.js +2 -2
  230. package/dist/composables/use-selection-manager.js +4 -4
  231. package/dist/composables/use-single-select-list-state.d.ts +37 -0
  232. package/dist/composables/use-single-select-list-state.js +110 -0
  233. package/dist/composables/use-slider-thumb.js +2 -2
  234. package/dist/composables/use-slider.js +1 -1
  235. package/dist/composables/use-tab-list-state.d.ts +10 -29
  236. package/dist/composables/use-tab-list-state.js +10 -99
  237. package/dist/composables/use-text-field.js +1 -1
  238. package/dist/composables/use-virtualizer-scroll.d.ts +52 -2
  239. package/dist/composables/use-virtualizer-scroll.js +79 -13
  240. package/dist/composables/use-virtualizer.d.ts +24 -4
  241. package/dist/composables/use-virtualizer.js +40 -6
  242. package/dist/index.js +60 -83
  243. package/dist/utils/document-order.d.ts +14 -0
  244. package/dist/utils/document-order.js +17 -0
  245. package/dist/utils/flex-sizing.d.ts +41 -0
  246. package/dist/utils/flex-sizing.js +140 -0
  247. package/dist/utils/index.d.ts +2 -0
  248. package/dist/utils/open-link.d.ts +31 -0
  249. package/dist/utils/open-link.js +32 -0
  250. package/dist/utils/story-truncation.d.ts +20 -0
  251. package/dist/utils/story-users.d.ts +11 -0
  252. package/dist/utils/virtualizer-collection.d.ts +14 -4
  253. package/dist/utils/virtualizer-collection.js +9 -14
  254. package/dist/utils/virtualizer-layout-info.js +3 -2
  255. package/dist/utils/virtualizer-list-layout.d.ts +75 -29
  256. package/dist/utils/virtualizer-list-layout.js +182 -99
  257. package/dist/utils/virtualizer-offsets.d.ts +111 -0
  258. package/dist/utils/virtualizer-offsets.js +159 -0
  259. package/dist/utils/virtualizer-overscan.d.ts +9 -15
  260. package/dist/utils/virtualizer-overscan.js +14 -33
  261. package/dist/utils/virtualizer-table-layout.d.ts +50 -21
  262. package/dist/utils/virtualizer-table-layout.js +130 -89
  263. package/dist/version.js +1 -1
  264. package/package.json +25 -5
  265. package/dist/composables/use-table-column-layout.js +0 -214
  266. /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,140 @@
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
+ variant: {},
18
+ collapsible: {},
19
+ isExpanded: {
20
+ type: Boolean,
21
+ default: void 0
22
+ },
23
+ defaultExpanded: {
24
+ type: Boolean,
25
+ default: void 0
26
+ },
27
+ isMobileOpen: {
28
+ type: Boolean,
29
+ default: void 0
30
+ },
31
+ defaultMobileOpen: {
32
+ type: Boolean,
33
+ default: void 0
34
+ },
35
+ width: {},
36
+ defaultWidth: {},
37
+ autoSaveId: {},
38
+ breakpoint: {}
39
+ },
40
+ emits: [
41
+ "expandedChange",
42
+ "update:isExpanded",
43
+ "mobileOpenChange",
44
+ "update:isMobileOpen",
45
+ "update:width"
46
+ ],
47
+ setup(__props, { expose: __expose, emit: __emit }) {
48
+ const props = __props;
49
+ const emit = __emit;
50
+ const matchesNarrow = useMediaQuery(() => props.breakpoint ?? DEFAULT_BREAKPOINT);
51
+ const isMounted = shallowRef(false);
52
+ onMounted(() => {
53
+ isMounted.value = true;
54
+ });
55
+ const isMobile = computed(() => isMounted.value && matchesNarrow.value);
56
+ const state = useSidebarState({
57
+ collapsible: () => props.collapsible,
58
+ defaultExpanded: props.defaultExpanded,
59
+ defaultMobileOpen: props.defaultMobileOpen,
60
+ defaultWidth: props.defaultWidth,
61
+ isExpanded: () => props.isExpanded,
62
+ isMobile,
63
+ isMobileOpen: () => props.isMobileOpen,
64
+ onExpandedChange: (isExpanded) => {
65
+ emit("update:isExpanded", isExpanded);
66
+ emit("expandedChange", isExpanded);
67
+ persist();
68
+ },
69
+ onMobileOpenChange: (isOpen) => {
70
+ emit("update:isMobileOpen", isOpen);
71
+ emit("mobileOpenChange", isOpen);
72
+ },
73
+ onWidthChange: (width) => {
74
+ emit("update:width", width);
75
+ persist();
76
+ },
77
+ width: () => props.width
78
+ });
79
+ function persist() {
80
+ if (!props.autoSaveId || isRestoring) return;
81
+ writeSidebarLayout(props.autoSaveId, state.isExpanded.value, state.width.value);
82
+ }
83
+ let isRestoring = false;
84
+ onMounted(() => {
85
+ if (!props.autoSaveId) return;
86
+ const restored = readSidebarLayout(props.autoSaveId);
87
+ if (!restored) return;
88
+ isRestoring = true;
89
+ state.setOpen(restored.isExpanded);
90
+ if (restored.width !== void 0) state.setWidth(restored.width);
91
+ isRestoring = false;
92
+ });
93
+ const side = computed(() => props.side ?? "left");
94
+ const slots = computed(() => sidebarVariants({
95
+ collapsible: state.collapsible.value,
96
+ side: side.value,
97
+ variant: props.variant
98
+ }));
99
+ const panelId = useId$1();
100
+ const panelElement = shallowRef(null);
101
+ const style = computed(() => state.width.value === void 0 ? void 0 : { "--sidebar-width": state.width.value });
102
+ provideSidebarContext({
103
+ panelEl: computed(() => panelElement.value),
104
+ panelId,
105
+ setPanelEl: (element) => {
106
+ panelElement.value = element;
107
+ },
108
+ side,
109
+ slots,
110
+ state
111
+ });
112
+ __expose({
113
+ close: state.close,
114
+ open: state.open,
115
+ toggle: state.toggle
116
+ });
117
+ const n1 = t0();
118
+ renderEffect(() => {
119
+ const _dataAttr = unref(dataAttr);
120
+ const _state = unref(state);
121
+ setClass(n1, slots.value.base({ class: props.class }));
122
+ setAttr(n1, "data-collapsed", _dataAttr(_state.isCollapsed.value));
123
+ setAttr(n1, "data-mobile", _dataAttr(_state.isMobile.value));
124
+ setAttr(n1, "data-side", side.value);
125
+ setStyle(n1, style.value);
126
+ });
127
+ setInsertionState(n1);
128
+ createSlot("default", {
129
+ collapsible: () => unref(state).collapsible.value,
130
+ isCollapsed: () => unref(state).isCollapsed.value,
131
+ isExpanded: () => unref(state).isExpanded.value,
132
+ isMobile: () => unref(state).isMobile.value,
133
+ isOpen: () => unref(state).isOpen.value,
134
+ side: () => side.value
135
+ });
136
+ return n1;
137
+ }
138
+ });
139
+ //#endregion
140
+ 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;