@bitrix24/b24ui-nuxt 0.6.8 → 0.7.1

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 (201) hide show
  1. package/.nuxt/b24ui/accordion.ts +20 -0
  2. package/.nuxt/b24ui/advice.ts +2 -10
  3. package/.nuxt/b24ui/alert.ts +2 -15
  4. package/.nuxt/b24ui/avatar-group.ts +2 -10
  5. package/.nuxt/b24ui/avatar.ts +3 -11
  6. package/.nuxt/b24ui/badge.ts +48 -13
  7. package/.nuxt/b24ui/button-group.ts +2 -22
  8. package/.nuxt/b24ui/button.ts +4 -17
  9. package/.nuxt/b24ui/calendar.ts +3 -11
  10. package/.nuxt/b24ui/checkbox.ts +75 -11
  11. package/.nuxt/b24ui/chip.ts +2 -10
  12. package/.nuxt/b24ui/collapsible.ts +2 -10
  13. package/.nuxt/b24ui/container.ts +2 -10
  14. package/.nuxt/b24ui/countdown.ts +2 -10
  15. package/.nuxt/b24ui/description-list.ts +2 -15
  16. package/.nuxt/b24ui/dropdown-menu.ts +4 -11
  17. package/.nuxt/b24ui/form-field.ts +3 -10
  18. package/.nuxt/b24ui/form.ts +2 -10
  19. package/.nuxt/b24ui/index.ts +1 -0
  20. package/.nuxt/b24ui/input-menu.ts +6 -30
  21. package/.nuxt/b24ui/input-number.ts +15 -10
  22. package/.nuxt/b24ui/input.ts +4 -17
  23. package/.nuxt/b24ui/kbd.ts +2 -10
  24. package/.nuxt/b24ui/link.ts +11 -17
  25. package/.nuxt/b24ui/modal.ts +3 -11
  26. package/.nuxt/b24ui/navbar-divider.ts +2 -10
  27. package/.nuxt/b24ui/navbar-section.ts +2 -10
  28. package/.nuxt/b24ui/navbar-spacer.ts +2 -10
  29. package/.nuxt/b24ui/navbar.ts +2 -10
  30. package/.nuxt/b24ui/navigation-menu.ts +69 -60
  31. package/.nuxt/b24ui/popover.ts +2 -10
  32. package/.nuxt/b24ui/progress.ts +2 -10
  33. package/.nuxt/b24ui/radio-group.ts +3 -11
  34. package/.nuxt/b24ui/range.ts +2 -10
  35. package/.nuxt/b24ui/select-menu.ts +10 -40
  36. package/.nuxt/b24ui/select.ts +10 -40
  37. package/.nuxt/b24ui/separator.ts +2 -10
  38. package/.nuxt/b24ui/sidebar-body.ts +2 -10
  39. package/.nuxt/b24ui/sidebar-footer.ts +2 -10
  40. package/.nuxt/b24ui/sidebar-header.ts +2 -10
  41. package/.nuxt/b24ui/sidebar-heading.ts +2 -10
  42. package/.nuxt/b24ui/sidebar-layout.ts +3 -11
  43. package/.nuxt/b24ui/sidebar-section.ts +2 -10
  44. package/.nuxt/b24ui/sidebar-spacer.ts +2 -10
  45. package/.nuxt/b24ui/sidebar.ts +2 -10
  46. package/.nuxt/b24ui/skeleton.ts +2 -10
  47. package/.nuxt/b24ui/slideover.ts +2 -10
  48. package/.nuxt/b24ui/stacked-layout.ts +2 -10
  49. package/.nuxt/b24ui/switch.ts +2 -10
  50. package/.nuxt/b24ui/tabs.ts +6 -13
  51. package/.nuxt/b24ui/textarea.ts +4 -17
  52. package/.nuxt/b24ui/toast.ts +2 -15
  53. package/.nuxt/b24ui/toaster.ts +3 -11
  54. package/.nuxt/b24ui/tooltip.ts +3 -11
  55. package/.nuxt/b24ui.css +1 -1
  56. package/cli/templates.mjs +2 -2
  57. package/dist/meta.d.mts +35333 -15836
  58. package/dist/meta.mjs +35333 -15836
  59. package/dist/module.json +1 -1
  60. package/dist/module.mjs +11 -3
  61. package/dist/runtime/air-design-tokens.css +1 -0
  62. package/dist/runtime/components/Accordion.vue +96 -0
  63. package/dist/runtime/components/Accordion.vue.d.ts +78 -0
  64. package/dist/runtime/components/Advice.vue +1 -1
  65. package/dist/runtime/components/Alert.vue +1 -1
  66. package/dist/runtime/components/App.vue +1 -1
  67. package/dist/runtime/components/Avatar.vue +11 -3
  68. package/dist/runtime/components/Avatar.vue.d.ts +2 -1
  69. package/dist/runtime/components/AvatarGroup.vue +1 -1
  70. package/dist/runtime/components/Badge.vue +5 -3
  71. package/dist/runtime/components/Badge.vue.d.ts +2 -0
  72. package/dist/runtime/components/Button.vue +2 -3
  73. package/dist/runtime/components/Button.vue.d.ts +1 -1
  74. package/dist/runtime/components/Calendar.vue +1 -1
  75. package/dist/runtime/components/Checkbox.vue +13 -4
  76. package/dist/runtime/components/Checkbox.vue.d.ts +9 -0
  77. package/dist/runtime/components/Chip.vue +1 -1
  78. package/dist/runtime/components/Collapsible.vue +1 -1
  79. package/dist/runtime/components/Countdown.vue +1 -1
  80. package/dist/runtime/components/Countdown.vue.d.ts +2 -2
  81. package/dist/runtime/components/DescriptionList.vue +3 -2
  82. package/dist/runtime/components/DescriptionList.vue.d.ts +1 -1
  83. package/dist/runtime/components/DropdownMenu.vue +1 -1
  84. package/dist/runtime/components/DropdownMenu.vue.d.ts +2 -0
  85. package/dist/runtime/components/DropdownMenuContent.vue +74 -72
  86. package/dist/runtime/components/DropdownMenuContent.vue.d.ts +4 -20
  87. package/dist/runtime/components/Form.vue +6 -6
  88. package/dist/runtime/components/Form.vue.d.ts +12 -11
  89. package/dist/runtime/components/FormField.vue +4 -4
  90. package/dist/runtime/components/Input.vue +12 -8
  91. package/dist/runtime/components/Input.vue.d.ts +31 -30
  92. package/dist/runtime/components/InputMenu.vue +23 -20
  93. package/dist/runtime/components/InputMenu.vue.d.ts +6 -4
  94. package/dist/runtime/components/InputNumber.vue +17 -10
  95. package/dist/runtime/components/InputNumber.vue.d.ts +6 -3
  96. package/dist/runtime/components/Link.vue +5 -13
  97. package/dist/runtime/components/Modal.vue +22 -14
  98. package/dist/runtime/components/Modal.vue.d.ts +18 -5
  99. package/dist/runtime/components/Navbar.vue +1 -1
  100. package/dist/runtime/components/NavbarDivider.vue +1 -1
  101. package/dist/runtime/components/NavbarSection.vue +1 -1
  102. package/dist/runtime/components/NavbarSpacer.vue +1 -1
  103. package/dist/runtime/components/NavigationMenu.vue +186 -44
  104. package/dist/runtime/components/NavigationMenu.vue.d.ts +39 -8
  105. package/dist/runtime/components/OverlayProvider.vue +2 -2
  106. package/dist/runtime/components/Popover.vue +4 -0
  107. package/dist/runtime/components/Popover.vue.d.ts +2 -1
  108. package/dist/runtime/components/Progress.vue +3 -2
  109. package/dist/runtime/components/Progress.vue.d.ts +2 -2
  110. package/dist/runtime/components/RadioGroup.vue +24 -8
  111. package/dist/runtime/components/RadioGroup.vue.d.ts +3 -1
  112. package/dist/runtime/components/Range.vue +2 -2
  113. package/dist/runtime/components/Range.vue.d.ts +19 -20
  114. package/dist/runtime/components/Select.vue +57 -31
  115. package/dist/runtime/components/Select.vue.d.ts +110 -2
  116. package/dist/runtime/components/SelectMenu.vue +77 -23
  117. package/dist/runtime/components/SelectMenu.vue.d.ts +111 -5
  118. package/dist/runtime/components/Separator.vue +3 -3
  119. package/dist/runtime/components/Sidebar.vue +1 -1
  120. package/dist/runtime/components/SidebarBody.vue +1 -1
  121. package/dist/runtime/components/SidebarFooter.vue +1 -1
  122. package/dist/runtime/components/SidebarHeader.vue +1 -1
  123. package/dist/runtime/components/SidebarHeading.vue +1 -1
  124. package/dist/runtime/components/SidebarLayout.vue +1 -1
  125. package/dist/runtime/components/SidebarSection.vue +1 -1
  126. package/dist/runtime/components/SidebarSpacer.vue +1 -1
  127. package/dist/runtime/components/Slideover.vue +23 -15
  128. package/dist/runtime/components/Slideover.vue.d.ts +18 -5
  129. package/dist/runtime/components/StackedLayout.vue +1 -1
  130. package/dist/runtime/components/Switch.vue +1 -1
  131. package/dist/runtime/components/Tabs.vue +28 -7
  132. package/dist/runtime/components/Tabs.vue.d.ts +6 -1
  133. package/dist/runtime/components/Textarea.vue +13 -9
  134. package/dist/runtime/components/Textarea.vue.d.ts +31 -30
  135. package/dist/runtime/components/Toast.vue +7 -6
  136. package/dist/runtime/components/Toast.vue.d.ts +6 -0
  137. package/dist/runtime/components/Toaster.vue +4 -4
  138. package/dist/runtime/components/Toaster.vue.d.ts +6 -0
  139. package/dist/runtime/components/Tooltip.vue +9 -2
  140. package/dist/runtime/components/Tooltip.vue.d.ts +2 -1
  141. package/dist/runtime/components/content/TableWrapper.vue +1 -1
  142. package/dist/runtime/composables/defineLocale.d.ts +2 -0
  143. package/dist/runtime/composables/defineLocale.js +4 -0
  144. package/dist/runtime/composables/defineShortcuts.js +8 -2
  145. package/dist/runtime/composables/useFormField.d.ts +1 -1
  146. package/dist/runtime/composables/useFormField.js +2 -1
  147. package/dist/runtime/composables/useKbd.d.ts +1 -0
  148. package/dist/runtime/composables/useKbd.js +4 -3
  149. package/dist/runtime/composables/useOverlay.d.ts +11 -11
  150. package/dist/runtime/composables/useOverlay.js +17 -11
  151. package/dist/runtime/index.css +1 -1
  152. package/dist/runtime/inertia/components/Link.vue +45 -60
  153. package/dist/runtime/inertia/components/Link.vue.d.ts +1 -1
  154. package/dist/runtime/inertia/components/LinkBase.vue +68 -0
  155. package/dist/runtime/inertia/components/LinkBase.vue.d.ts +25 -0
  156. package/dist/runtime/inertia/stubs.d.ts +1 -1
  157. package/dist/runtime/inertia/stubs.js +1 -1
  158. package/dist/runtime/prose/A.vue +1 -1
  159. package/dist/runtime/prose/Blockquote.vue +1 -1
  160. package/dist/runtime/prose/Code.vue +1 -1
  161. package/dist/runtime/prose/Em.vue +1 -1
  162. package/dist/runtime/prose/H1.vue +1 -1
  163. package/dist/runtime/prose/H2.vue +1 -1
  164. package/dist/runtime/prose/H3.vue +1 -1
  165. package/dist/runtime/prose/H4.vue +1 -1
  166. package/dist/runtime/prose/H5.vue +1 -1
  167. package/dist/runtime/prose/H6.vue +1 -1
  168. package/dist/runtime/prose/Hr.vue +1 -1
  169. package/dist/runtime/prose/Img.vue +1 -1
  170. package/dist/runtime/prose/Li.vue +1 -1
  171. package/dist/runtime/prose/Ol.vue +1 -1
  172. package/dist/runtime/prose/P.vue +1 -1
  173. package/dist/runtime/prose/Pre.vue +1 -1
  174. package/dist/runtime/prose/Strong.vue +1 -1
  175. package/dist/runtime/prose/Table.vue +1 -1
  176. package/dist/runtime/prose/Tbody.vue +1 -1
  177. package/dist/runtime/prose/Td.vue +1 -1
  178. package/dist/runtime/prose/Th.vue +1 -1
  179. package/dist/runtime/prose/Thead.vue +1 -1
  180. package/dist/runtime/prose/Tr.vue +1 -1
  181. package/dist/runtime/prose/Ul.vue +1 -1
  182. package/dist/runtime/types/form.d.ts +11 -10
  183. package/dist/runtime/types/index.d.ts +1 -0
  184. package/dist/runtime/types/index.js +1 -0
  185. package/dist/runtime/types/locale.d.ts +1 -0
  186. package/dist/runtime/types/tv.d.ts +53 -0
  187. package/dist/runtime/types/tv.js +0 -0
  188. package/dist/runtime/types/utils.d.ts +4 -51
  189. package/dist/runtime/types/utils.js +1 -0
  190. package/dist/runtime/utils/link.d.ts +1 -0
  191. package/dist/runtime/utils/link.js +12 -0
  192. package/dist/runtime/vue/components/Link.vue +26 -40
  193. package/dist/runtime/vue/composables/useAppConfig.js +3 -1
  194. package/dist/runtime/vue/stubs.d.ts +1 -1
  195. package/dist/runtime/vue/stubs.js +1 -1
  196. package/dist/shared/{b24ui-nuxt.jU270f-Q.mjs → b24ui-nuxt.CxsFEY3M.mjs} +268 -122
  197. package/dist/unplugin.d.mts +2 -2
  198. package/dist/unplugin.mjs +6 -3
  199. package/dist/vite.d.mts +1 -1
  200. package/dist/vite.mjs +2 -2
  201. package/package.json +30 -29
@@ -63,39 +63,52 @@ export interface ModalProps extends DialogRootProps {
63
63
  }
64
64
  export interface ModalEmits extends DialogRootEmits {
65
65
  'after:leave': [];
66
+ 'after:enter': [];
66
67
  'close:prevent': [];
67
68
  }
68
69
  export interface ModalSlots {
69
70
  default(props: {
70
71
  open: boolean;
71
72
  }): any;
72
- content(props?: {}): any;
73
- header(props?: {}): any;
73
+ content(props: {
74
+ close: () => void;
75
+ }): any;
76
+ header(props: {
77
+ close: () => void;
78
+ }): any;
74
79
  title(props?: {}): any;
75
80
  description(props?: {}): any;
81
+ actions(props?: {}): any;
76
82
  close(props: {
83
+ close: () => void;
77
84
  b24ui: {
78
85
  [K in keyof Required<Modal['slots']>]: (props?: Record<string, any>) => string;
79
86
  };
80
87
  }): any;
81
- body(props?: {}): any;
82
- footer(props?: {}): any;
88
+ body(props: {
89
+ close: () => void;
90
+ }): any;
91
+ footer(props: {
92
+ close: () => void;
93
+ }): any;
83
94
  }
84
95
  declare const _default: __VLS_WithSlots<import("vue").DefineComponent<ModalProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
85
96
  "update:open": (value: boolean) => any;
86
97
  "after:leave": () => any;
98
+ "after:enter": () => any;
87
99
  "close:prevent": () => any;
88
100
  }, string, import("vue").PublicProps, Readonly<ModalProps> & Readonly<{
89
101
  "onUpdate:open"?: ((value: boolean) => any) | undefined;
90
102
  "onAfter:leave"?: (() => any) | undefined;
103
+ "onAfter:enter"?: (() => any) | undefined;
91
104
  "onClose:prevent"?: (() => any) | undefined;
92
105
  }>, {
93
106
  close: boolean | Partial<ButtonProps>;
94
107
  modal: boolean;
95
- transition: boolean;
96
108
  portal: boolean | string | HTMLElement;
97
109
  overlay: boolean;
98
110
  overlayBlur: Modal["variants"]["overlayBlur"];
111
+ transition: boolean;
99
112
  dismissible: boolean;
100
113
  scrollbarThin: boolean;
101
114
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>, ModalSlots>;
@@ -19,7 +19,7 @@ const b24ui = computed(() => tv({ extend: tv(theme), ...appConfig.b24ui?.navbar
19
19
 
20
20
  <template>
21
21
  <!-- Navbar -->
22
- <Primitive :as="as" :class="b24ui.root({ class: [props.class, props.b24ui?.root] })">
22
+ <Primitive :as="as" :class="b24ui.root({ class: [props.b24ui?.root, props.class] })">
23
23
  <slot />
24
24
  </Primitive>
25
25
  </template>
@@ -18,7 +18,7 @@ const b24ui = computed(() => tv({ extend: tv(theme), ...appConfig.b24ui?.navbarD
18
18
  </script>
19
19
 
20
20
  <template>
21
- <Primitive :as="as" aria-hidden="true" :class="b24ui.root({ class: [props.class, props.b24ui?.root] })">
21
+ <Primitive :as="as" aria-hidden="true" :class="b24ui.root({ class: [props.b24ui?.root, props.class] })">
22
22
  <slot />
23
23
  </Primitive>
24
24
  </template>
@@ -20,7 +20,7 @@ const b24ui = computed(() => tv({ extend: tv(theme), ...appConfig.b24ui?.navbarS
20
20
  <template>
21
21
  <Primitive
22
22
  :as="as"
23
- :class="b24ui.root({ class: [props.class, props.b24ui?.root] })"
23
+ :class="b24ui.root({ class: [props.b24ui?.root, props.class] })"
24
24
  data-slot="section"
25
25
  >
26
26
  <slot />
@@ -18,7 +18,7 @@ const b24ui = computed(() => tv({ extend: tv(theme), ...appConfig.b24ui?.navbarS
18
18
  </script>
19
19
 
20
20
  <template>
21
- <Primitive :as="as" aria-hidden="true" :class="b24ui.root({ class: [props.class, props.b24ui?.root] })">
21
+ <Primitive :as="as" aria-hidden="true" :class="b24ui.root({ class: [props.b24ui?.root, props.class] })">
22
22
  <slot />
23
23
  </Primitive>
24
24
  </template>
@@ -4,8 +4,9 @@ import theme from "#build/b24ui/navigation-menu";
4
4
 
5
5
  <script setup>
6
6
  import { computed, toRef } from "vue";
7
- import { NavigationMenuRoot, NavigationMenuList, NavigationMenuItem, NavigationMenuTrigger, NavigationMenuContent, NavigationMenuLink, NavigationMenuIndicator, NavigationMenuViewport, useForwardPropsEmits } from "reka-ui";
8
- import { createReusableTemplate } from "@vueuse/core";
7
+ import { NavigationMenuRoot, NavigationMenuList, NavigationMenuItem, NavigationMenuTrigger, NavigationMenuContent, NavigationMenuLink, NavigationMenuIndicator, NavigationMenuViewport, AccordionRoot, AccordionItem, AccordionTrigger, AccordionContent, useForwardPropsEmits } from "reka-ui";
8
+ import { defu } from "defu";
9
+ import { reactivePick, createReusableTemplate } from "@vueuse/core";
9
10
  import { useAppConfig } from "#imports";
10
11
  import { get, isArrayOfArray } from "../utils";
11
12
  import { tv } from "../utils/tv";
@@ -15,7 +16,8 @@ import B24LinkBase from "./LinkBase.vue";
15
16
  import B24Link from "./Link.vue";
16
17
  import B24Avatar from "./Avatar.vue";
17
18
  import B24Badge from "./Badge.vue";
18
- import B24Collapsible from "./Collapsible.vue";
19
+ import B24Popover from "./Popover.vue";
20
+ import B24Tooltip from "./Tooltip.vue";
19
21
  const props = defineProps({
20
22
  as: { type: null, required: false },
21
23
  trailingIcon: { type: [Function, Object], required: false },
@@ -25,6 +27,8 @@ const props = defineProps({
25
27
  variant: { type: null, required: false },
26
28
  orientation: { type: null, required: false, default: "horizontal" },
27
29
  collapsed: { type: Boolean, required: false },
30
+ tooltip: { type: [Boolean, Object], required: false },
31
+ popover: { type: [Boolean, Object], required: false },
28
32
  highlight: { type: Boolean, required: false },
29
33
  highlightColor: { type: null, required: false },
30
34
  content: { type: Object, required: false },
@@ -40,7 +44,10 @@ const props = defineProps({
40
44
  disableHoverTrigger: { type: Boolean, required: false },
41
45
  skipDelayDuration: { type: Number, required: false },
42
46
  disablePointerLeaveClose: { type: Boolean, required: false },
43
- unmountOnHide: { type: Boolean, required: false, default: true }
47
+ unmountOnHide: { type: Boolean, required: false, default: true },
48
+ disabled: { type: Boolean, required: false },
49
+ type: { type: String, required: false, default: "multiple" },
50
+ collapsible: { type: Boolean, required: false, default: true }
44
51
  });
45
52
  const emits = defineEmits(["update:modelValue"]);
46
53
  const slots = defineSlots();
@@ -57,7 +64,10 @@ const rootProps = useForwardPropsEmits(computed(() => ({
57
64
  disablePointerLeaveClose: props.disablePointerLeaveClose,
58
65
  unmountOnHide: props.unmountOnHide
59
66
  })), emits);
67
+ const accordionProps = useForwardPropsEmits(reactivePick(props, "collapsible", "disabled", "type", "unmountOnHide"), emits);
60
68
  const contentProps = toRef(() => props.content);
69
+ const tooltipProps = toRef(() => defu(typeof props.tooltip === "boolean" ? {} : props.tooltip, { delayDuration: 0, content: { side: "right" } }));
70
+ const popoverProps = toRef(() => defu(typeof props.popover === "boolean" ? {} : props.popover, { mode: "hover", content: { side: "right", align: "start", alignOffset: 2 } }));
61
71
  const [DefineLinkTemplate, ReuseLinkTemplate] = createReusableTemplate();
62
72
  const [DefineItemTemplate, ReuseItemTemplate] = createReusableTemplate({
63
73
  props: {
@@ -75,7 +85,7 @@ const getLabel = (item) => {
75
85
  };
76
86
  const b24ui = computed(() => tv({ extend: tv(theme), ...appConfig.b24ui?.navigationMenu || {} })({
77
87
  orientation: props.orientation,
78
- contentOrientation: props.contentOrientation,
88
+ contentOrientation: props.orientation === "vertical" ? void 0 : props.contentOrientation,
79
89
  collapsed: props.collapsed,
80
90
  color: props.color,
81
91
  variant: props.variant,
@@ -85,6 +95,15 @@ const b24ui = computed(() => tv({ extend: tv(theme), ...appConfig.b24ui?.navigat
85
95
  const lists = computed(
86
96
  () => props.items?.length ? isArrayOfArray(props.items) ? props.items : [props.items] : []
87
97
  );
98
+ function getAccordionDefaultValue(list, level = 0) {
99
+ const indexes = list.reduce((acc, item, index) => {
100
+ if (item.defaultOpen || item.open) {
101
+ acc.push(item.value || (level > 0 ? `item-${level}-${index}` : `item-${index}`));
102
+ }
103
+ return acc;
104
+ }, []);
105
+ return props.type === "single" ? indexes[0] : indexes;
106
+ }
88
107
  </script>
89
108
 
90
109
  <template>
@@ -95,14 +114,14 @@ const lists = computed(
95
114
  <Component
96
115
  :is="item.icon"
97
116
  v-if="item.icon"
98
- :class="b24ui.linkLeadingIcon({ class: props.b24ui?.linkLeadingIcon, active, disabled: !!item.disabled })"
117
+ :class="b24ui.linkLeadingIcon({ class: [props.b24ui?.linkLeadingIcon, item.b24ui?.linkLeadingIcon], active, disabled: !!item.disabled })"
99
118
  />
100
- <B24Avatar v-else-if="item.avatar" :size="props.b24ui?.linkLeadingAvatarSize || b24ui.linkLeadingAvatarSize()" v-bind="item.avatar" :class="b24ui.linkLeadingAvatar({ class: props.b24ui?.linkLeadingAvatar, active, disabled: !!item.disabled })" />
119
+ <B24Avatar v-else-if="item.avatar" :size="item.b24ui?.linkLeadingAvatarSize || props.b24ui?.linkLeadingAvatarSize || b24ui.linkLeadingAvatarSize()" v-bind="item.avatar" :class="b24ui.linkLeadingAvatar({ class: [props.b24ui?.linkLeadingAvatar, item.b24ui?.linkLeadingAvatar], active, disabled: !!item.disabled })" />
101
120
  </slot>
102
121
 
103
122
  <span
104
123
  v-if="(!collapsed || orientation !== 'vertical') && (getLabel(item) || !!slots[item.slot ? `${item.slot}-label` : 'item-label'])"
105
- :class="b24ui.linkLabel({ class: props.b24ui?.linkLabel, active })"
124
+ :class="b24ui.linkLabel({ class: [props.b24ui?.linkLabel, item.b24ui?.linkLabel], active })"
106
125
  >
107
126
  <slot :name="item.slot ? `${item.slot}-label` : 'item-label'" :item="item" :active="active" :index="index">
108
127
  {{ getLabel(item) }}
@@ -111,21 +130,27 @@ const lists = computed(
111
130
  <Component
112
131
  :is="typeof externalIcon !== 'boolean' ? externalIcon : icons.external"
113
132
  v-if="item.target === '_blank' && externalIcon !== false"
114
- :class="b24ui.linkLabelExternalIcon({ class: props.b24ui?.linkLabelExternalIcon, active })"
133
+ :class="b24ui.linkLabelExternalIcon({ class: [props.b24ui?.linkLabelExternalIcon, item.b24ui?.linkLabelExternalIcon], active })"
115
134
  />
116
135
  </span>
117
136
  </span>
118
- <span v-if="(!collapsed || orientation !== 'vertical') && (item.badge || orientation === 'horizontal' && (item.children?.length || !!slots[item.slot ? `${item.slot}-content` : 'item-content']) || orientation === 'vertical' && item.children?.length || item.trailingIcon || !!slots[item.slot ? `${item.slot}-trailing` : 'item-trailing'])" :class="b24ui.linkTrailing({ class: props.b24ui?.linkTrailing })">
137
+ <component
138
+ :is="orientation === 'vertical' && item.children?.length && !collapsed ? AccordionTrigger : 'span'"
139
+ v-if="(!collapsed || orientation !== 'vertical') && (item.badge || orientation === 'horizontal' && (item.children?.length || !!slots[item.slot ? `${item.slot}-content` : 'item-content']) || orientation === 'vertical' && item.children?.length || item.trailingIcon || !!slots[item.slot ? `${item.slot}-trailing` : 'item-trailing'])"
140
+ :class="b24ui.linkTrailing({ class: [props.b24ui?.linkTrailing, item.b24ui?.linkTrailing] })"
141
+ >
119
142
  <slot :name="item.slot ? `${item.slot}-trailing` : 'item-trailing'" :item="item" :active="active" :index="index">
120
143
  <Component
121
144
  :is="item.trailingIcon || trailingIcon || icons.chevronDown"
122
145
  v-if="orientation === 'horizontal' && (item.children?.length || !!slots[item.slot ? `${item.slot}-content` : 'item-content']) || orientation === 'vertical' && item.children?.length"
123
- :class="b24ui.linkTrailingIcon({ class: props.b24ui?.linkTrailingIcon, active })"
146
+ as="span"
147
+ :class="b24ui.linkTrailingIcon({ class: [props.b24ui?.linkTrailingIcon, item.b24ui?.linkTrailingIcon], active })"
148
+ @click.stop.prevent
124
149
  />
125
150
  <Component
126
151
  :is="item.trailingIcon"
127
152
  v-else-if="item.trailingIcon"
128
- :class="b24ui.linkTrailingIcon({ class: props.b24ui?.linkTrailingIcon, active })"
153
+ :class="b24ui.linkTrailingIcon({ class: [props.b24ui?.linkTrailingIcon, item.b24ui?.linkTrailingIcon], active })"
129
154
  />
130
155
 
131
156
  <B24Badge
@@ -133,36 +158,124 @@ const lists = computed(
133
158
  color="danger"
134
159
  depth="dark"
135
160
  :use-fill="true"
136
- :size="props.b24ui?.linkTrailingBadgeSize || b24ui.linkTrailingBadgeSize()"
161
+ :size="item.b24ui?.linkTrailingBadgeSize || props.b24ui?.linkTrailingBadgeSize || b24ui.linkTrailingBadgeSize()"
137
162
  v-bind="typeof item.badge === 'string' || typeof item.badge === 'number' ? { label: item.badge } : item.badge"
138
- :class="b24ui.linkTrailingBadge({ class: props.b24ui?.linkTrailingBadge })"
163
+ :class="b24ui.linkTrailingBadge({ class: [props.b24ui?.linkTrailingBadge, item.b24ui?.linkTrailingBadge] })"
139
164
  />
140
165
  </slot>
141
- </span>
166
+ </component>
142
167
  </slot>
143
168
  </DefineLinkTemplate>
144
169
 
145
170
  <DefineItemTemplate v-slot="{ item, index, level }">
146
171
  <component
147
- :is="orientation === 'vertical' && item.children?.length && !collapsed ? B24Collapsible : NavigationMenuItem"
172
+ :is="orientation === 'vertical' && !collapsed ? AccordionItem : NavigationMenuItem"
148
173
  as="li"
149
- :value="item.value || String(index)"
150
- :default-open="item.defaultOpen"
151
- :unmount-on-hide="orientation === 'vertical' && item.children?.length && !collapsed ? unmountOnHide : void 0"
152
- :open="item.open"
174
+ :value="item.value || ((level || 0) > 0 ? `item-${level}-${index}` : `item-${index}`)"
153
175
  >
154
- <div v-if="orientation === 'vertical' && item.type === 'label'" :class="b24ui.label({ class: props.b24ui?.label })">
176
+ <div
177
+ v-if="orientation === 'vertical' && item.type === 'label' && !collapsed"
178
+ :class="b24ui.label({ class: [props.b24ui?.label, item.b24ui?.label, item.class] })"
179
+ >
155
180
  <ReuseLinkTemplate :item="item" :index="index" />
156
181
  </div>
157
- <B24Link v-else-if="item.type !== 'label'" v-slot="{ active, ...slotProps }" v-bind="orientation === 'vertical' && item.children?.length && !collapsed ? {} : pickLinkProps(item)" custom>
182
+ <B24Link
183
+ v-else-if="item.type !== 'label'"
184
+ v-slot="{ active, ...slotProps }"
185
+ v-bind="orientation === 'vertical' && item.children?.length && !collapsed && item.type === 'trigger' ? {} : pickLinkProps(item)"
186
+ custom
187
+ >
158
188
  <component
159
- :is="orientation === 'horizontal' && (item.children?.length || !!slots[item.slot ? `${item.slot}-content` : 'item-content']) ? NavigationMenuTrigger : NavigationMenuLink"
189
+ :is="orientation === 'horizontal' && (item.children?.length || !!slots[item.slot ? `${item.slot}-content` : 'item-content']) ? NavigationMenuTrigger : orientation === 'vertical' && item.children?.length && !collapsed && !slotProps.href ? AccordionTrigger : NavigationMenuLink"
160
190
  as-child
161
191
  :active="active || item.active"
162
192
  :disabled="item.disabled"
163
193
  @select="item.onSelect"
164
194
  >
165
- <B24LinkBase v-bind="slotProps" :class="b24ui.link({ class: [props.b24ui?.link, item.class], active: active || item.active, disabled: !!item.disabled, level: orientation === 'horizontal' || (level || 0) > 0 })">
195
+ <B24Popover
196
+ v-if="orientation === 'vertical' && collapsed && item.children?.length && (!!props.popover || !!item.popover)"
197
+ v-bind="{ ...popoverProps, ...typeof item.popover === 'boolean' ? {} : item.popover || {} }"
198
+ :b24ui="{ content: b24ui.content({ class: [props.b24ui?.content, item.b24ui?.content] }) }"
199
+ >
200
+ <B24LinkBase
201
+ v-bind="slotProps"
202
+ :class="b24ui.link({
203
+ class: [props.b24ui?.link, item.b24ui?.link, item.class],
204
+ active: active || item.active,
205
+ disabled: !!item.disabled,
206
+ level: (level || 0) > 0
207
+ })"
208
+ >
209
+ <ReuseLinkTemplate :item="item" :active="active || item.active" :index="index" />
210
+ </B24LinkBase>
211
+
212
+ <template #content>
213
+ <slot :name="item.slot ? `${item.slot}-content` : 'item-content'" :item="item" :active="active || item.active" :index="index">
214
+ <ul :class="b24ui.childList({ class: [props.b24ui?.childList, item.b24ui?.childList] })">
215
+ <li :class="b24ui.childLabel({ class: [props.b24ui?.childLabel, item.b24ui?.childLabel] })">
216
+ {{ getLabel(item) }}
217
+ </li>
218
+ <li
219
+ v-for="(childItem, childIndex) in item.children"
220
+ :key="childIndex"
221
+ :class="b24ui.childItem({ class: [props.b24ui?.childItem, item.b24ui?.childItem] })"
222
+ >
223
+ <B24Link v-slot="{ active: childActive, ...childSlotProps }" v-bind="pickLinkProps(childItem)" custom>
224
+ <NavigationMenuLink as-child :active="childActive" @select="childItem.onSelect">
225
+ <B24LinkBase
226
+ v-bind="childSlotProps"
227
+ :class="b24ui.childLink({ class: [props.b24ui?.childLink, item.b24ui?.childLink, childItem.class], active: childActive })"
228
+ >
229
+ <Component
230
+ :is="childItem.icon"
231
+ v-if="childItem.icon"
232
+ :class="b24ui.childLinkIcon({ class: [props.b24ui?.childLinkIcon, item.b24ui?.childLinkIcon], active: childActive })"
233
+ />
234
+
235
+ <span :class="b24ui.childLinkLabel({ class: [props.b24ui?.childLinkLabel, item.b24ui?.childLinkLabel], active: childActive })">
236
+ {{ getLabel(childItem) }}
237
+
238
+ <Component
239
+ :is="typeof externalIcon === 'string' ? externalIcon : icons.external"
240
+ v-if="childItem.target === '_blank' && externalIcon !== false"
241
+ :class="b24ui.childLinkLabelExternalIcon({ class: [props.b24ui?.childLinkLabelExternalIcon, item.b24ui?.childLinkLabelExternalIcon], active: childActive })"
242
+ />
243
+ </span>
244
+ </B24LinkBase>
245
+ </NavigationMenuLink>
246
+ </B24Link>
247
+ </li>
248
+ </ul>
249
+ </slot>
250
+ </template>
251
+ </B24Popover>
252
+ <B24Tooltip
253
+ v-else-if="orientation === 'vertical' && collapsed && (!!props.tooltip || !!item.tooltip)"
254
+ :text="get(item, props.labelKey)"
255
+ v-bind="{ ...tooltipProps, ...typeof item.tooltip === 'boolean' ? {} : item.tooltip || {} }"
256
+ >
257
+ <B24LinkBase
258
+ v-bind="slotProps"
259
+ :class="b24ui.link({
260
+ class: [props.b24ui?.link, item.b24ui?.link, item.class],
261
+ active: active || item.active,
262
+ disabled: !!item.disabled,
263
+ level: (level || 0) > 0
264
+ })"
265
+ >
266
+ <ReuseLinkTemplate :item="item" :active="active || item.active" :index="index" />
267
+ </B24LinkBase>
268
+ </B24Tooltip>
269
+ <B24LinkBase
270
+ v-else
271
+ v-bind="slotProps"
272
+ :class="b24ui.link({
273
+ class: [props.b24ui?.link, item.b24ui?.link, item.class],
274
+ active: active || item.active,
275
+ disabled: !!item.disabled,
276
+ level: orientation === 'horizontal' || (level || 0) > 0
277
+ })"
278
+ >
166
279
  <ReuseLinkTemplate :item="item" :active="active || item.active" :index="index" />
167
280
  </B24LinkBase>
168
281
  </component>
@@ -171,31 +284,42 @@ const lists = computed(
171
284
  v-if="orientation === 'horizontal' && (item.children?.length || !!slots[item.slot ? `${item.slot}-content` : 'item-content'])"
172
285
  v-bind="contentProps"
173
286
  :data-viewport="item.viewportRtl ? 'rtl' : 'ltr'"
174
- :class="b24ui.content({ class: props.b24ui?.content })"
287
+ :class="b24ui.content({ class: [props.b24ui?.content, item.b24ui?.content] })"
175
288
  >
176
- <slot :name="item.slot ? `${item.slot}-content` : 'item-content'" :item="item" :active="active" :index="index">
177
- <ul :class="b24ui.childList({ class: props.b24ui?.childList })">
178
- <li v-for="(childItem, childIndex) in item.children" :key="childIndex" :class="b24ui.childItem({ class: props.b24ui?.childItem })">
179
- <B24Link v-slot="{ active: childActive, ...childSlotProps }" v-bind="pickLinkProps(childItem)" custom>
289
+ <slot :name="item.slot ? `${item.slot}-content` : 'item-content'" :item="item" :active="active || item.active" :index="index">
290
+ <ul :class="b24ui.childList({ class: [props.b24ui?.childList, item.b24ui?.childList] })">
291
+ <li
292
+ v-for="(childItem, childIndex) in item.children"
293
+ :key="childIndex"
294
+ :class="b24ui.childItem({ class: [props.b24ui?.childItem, item.b24ui?.childItem] })"
295
+ >
296
+ <B24Link
297
+ v-slot="{ active: childActive, ...childSlotProps }"
298
+ v-bind="pickLinkProps(childItem)"
299
+ custom
300
+ >
180
301
  <NavigationMenuLink as-child :active="childActive" @select="childItem.onSelect">
181
- <B24LinkBase v-bind="childSlotProps" :class="b24ui.childLink({ class: [props.b24ui?.childLink, childItem.class], active: childActive })">
302
+ <B24LinkBase
303
+ v-bind="childSlotProps"
304
+ :class="b24ui.childLink({ class: [props.b24ui?.childLink, childItem.childLink, childItem.class], active: childActive })"
305
+ >
182
306
  <Component
183
307
  :is="childItem.icon"
184
308
  v-if="childItem.icon"
185
- :class="b24ui.childLinkIcon({ class: props.b24ui?.childLinkIcon, active: childActive })"
309
+ :class="b24ui.childLinkIcon({ class: [props.b24ui?.childLinkIcon, item.b24ui?.childLinkIcon], active: childActive })"
186
310
  />
187
311
 
188
- <div :class="b24ui.childLinkWrapper({ class: props.b24ui?.childLinkWrapper })">
189
- <p :class="b24ui.childLinkLabel({ class: props.b24ui?.childLinkLabel, active: childActive })">
312
+ <div :class="b24ui.childLinkWrapper({ class: [props.b24ui?.childLinkWrapper, item.b24ui?.childLinkWrapper] })">
313
+ <p :class="b24ui.childLinkLabel({ class: [props.b24ui?.childLinkLabel, item.b24ui?.childLinkLabel], active: childActive })">
190
314
  {{ getLabel(childItem) }}
191
315
 
192
316
  <Component
193
317
  :is="typeof externalIcon === 'string' ? externalIcon : icons.external"
194
318
  v-if="childItem.target === '_blank' && externalIcon !== false"
195
- :class="b24ui.childLinkLabelExternalIcon({ class: props.b24ui?.childLinkLabelExternalIcon, active: childActive })"
319
+ :class="b24ui.childLinkLabelExternalIcon({ class: [props.b24ui?.childLinkLabelExternalIcon, item.b24ui?.childLinkLabelExternalIcon], active: childActive })"
196
320
  />
197
321
  </p>
198
- <p v-if="childItem.description" :class="b24ui.childLinkDescription({ class: props.b24ui?.childLinkDescription, active: childActive })">
322
+ <p v-if="childItem.description" :class="b24ui.childLinkDescription({ class: [props.b24ui?.childLinkDescription, item.b24ui?.childLinkDescription], active: childActive })">
199
323
  {{ childItem.description }}
200
324
  </p>
201
325
  </div>
@@ -208,39 +332,57 @@ const lists = computed(
208
332
  </NavigationMenuContent>
209
333
  </B24Link>
210
334
 
211
- <template v-if="orientation === 'vertical' && item.children?.length && !collapsed" #content>
212
- <ul :class="b24ui.childList({ class: props.b24ui?.childList })">
335
+ <AccordionContent
336
+ v-if="orientation === 'vertical' && item.children?.length && !collapsed"
337
+ :class="b24ui.content({ class: [props.b24ui?.content, item.b24ui?.content] })"
338
+ >
339
+ <AccordionRoot
340
+ v-bind="{
341
+ ...accordionProps,
342
+ defaultValue: getAccordionDefaultValue(item.children, (level || 0) + 1)
343
+ }"
344
+ as="ul"
345
+ :class="b24ui.childList({ class: props.b24ui?.childList })"
346
+ >
213
347
  <ReuseItemTemplate
214
348
  v-for="(childItem, childIndex) in item.children"
215
349
  :key="childIndex"
216
350
  :item="childItem"
217
351
  :index="childIndex"
218
352
  :level="(level || 0) + 1"
219
- :class="b24ui.childItem({ class: props.b24ui?.childItem })"
353
+ :class="b24ui.childItem({ class: [props.b24ui?.childItem, childItem.b24ui?.childItem] })"
220
354
  />
221
- </ul>
222
- </template>
355
+ </AccordionRoot>
356
+ </AccordionContent>
223
357
  </component>
224
358
  </DefineItemTemplate>
225
359
 
226
360
  <NavigationMenuRoot
227
361
  v-bind="rootProps"
228
362
  :data-collapsed="collapsed"
229
- :class="b24ui.root({ class: [props.class, props.b24ui?.root] })"
363
+ :class="b24ui.root({ class: [props.b24ui?.root, props.class] })"
230
364
  data-slot="section"
231
365
  >
232
366
  <slot name="list-leading" />
233
367
 
234
368
  <template v-for="(list, listIndex) in lists" :key="`list-${listIndex}`">
235
- <NavigationMenuList :class="b24ui.list({ class: props.b24ui?.list })">
369
+ <component
370
+ v-bind="orientation === 'vertical' && !collapsed ? {
371
+ ...accordionProps,
372
+ defaultValue: getAccordionDefaultValue(list)
373
+ } : {}"
374
+ :is="orientation === 'vertical' && !collapsed ? AccordionRoot : NavigationMenuList"
375
+ as="ul"
376
+ :class="b24ui.list({ class: props.b24ui?.list })"
377
+ >
236
378
  <ReuseItemTemplate
237
379
  v-for="(item, index) in list"
238
380
  :key="`list-${listIndex}-${index}`"
239
381
  :item="item"
240
382
  :index="index"
241
- :class="b24ui.item({ class: props.b24ui?.item })"
383
+ :class="b24ui.item({ class: [props.b24ui?.item, item.b24ui?.item] })"
242
384
  />
243
- </NavigationMenuList>
385
+ </component>
244
386
 
245
387
  <div v-if="orientation === 'vertical' && listIndex < lists.length - 1" :class="b24ui.separator({ class: props.b24ui?.separator })" />
246
388
  </template>
@@ -1,15 +1,15 @@
1
- import type { NavigationMenuRootProps, NavigationMenuRootEmits, NavigationMenuContentProps, NavigationMenuContentEmits, CollapsibleRootProps } from 'reka-ui';
1
+ import type { NavigationMenuRootProps, NavigationMenuRootEmits, NavigationMenuContentProps, NavigationMenuContentEmits, AccordionRootProps } from 'reka-ui';
2
2
  import type { AppConfig } from '@nuxt/schema';
3
3
  import theme from '#build/b24ui/navigation-menu';
4
- import type { AvatarProps, BadgeProps, LinkProps, IconComponent } from '../types';
4
+ import type { AvatarProps, BadgeProps, LinkProps, PopoverProps, TooltipProps, IconComponent } from '../types';
5
5
  import type { ArrayOrNested, DynamicSlots, MergeTypes, NestedItem, EmitsToProps, ComponentConfig } from '../types/utils';
6
6
  type NavigationMenu = ComponentConfig<typeof theme, AppConfig, 'navigationMenu'>;
7
- export interface NavigationMenuChildItem extends Omit<NavigationMenuItem, 'type'> {
7
+ export interface NavigationMenuChildItem extends Omit<NavigationMenuItem, 'type' | 'b24ui'> {
8
8
  /** Description is only used when `orientation` is `horizontal`. */
9
9
  description?: string;
10
10
  [key: string]: any;
11
11
  }
12
- export interface NavigationMenuItem extends Omit<LinkProps, 'type' | 'raw' | 'custom'>, Pick<CollapsibleRootProps, 'defaultOpen' | 'open'> {
12
+ export interface NavigationMenuItem extends Omit<LinkProps, 'type' | 'raw' | 'custom'> {
13
13
  label?: string;
14
14
  /**
15
15
  * @IconComponent
@@ -18,30 +18,49 @@ export interface NavigationMenuItem extends Omit<LinkProps, 'type' | 'raw' | 'cu
18
18
  avatar?: AvatarProps;
19
19
  /**
20
20
  * Display a badge on the item.
21
- * `{ size: 'sm', color: 'neutral', variant: 'outline' }`{lang="ts-type"}
21
+ * `{ size: 'sm', color: 'danger', depth: 'dark' }`{lang="ts"}
22
22
  */
23
23
  badge?: string | number | BadgeProps;
24
+ /**
25
+ * Display a tooltip on the item when the menu is collapsed with the label of the item.
26
+ * This has priority over the global `tooltip` prop.
27
+ */
28
+ tooltip?: boolean | TooltipProps;
29
+ /**
30
+ * Display a popover on the item when the menu is collapsed with the children list.
31
+ * This has priority over the global `popover` prop.
32
+ */
33
+ popover?: boolean | PopoverProps;
24
34
  /**
25
35
  * @IconComponent
26
36
  */
27
37
  trailingIcon?: IconComponent;
28
38
  /**
29
39
  * The type of the item.
30
- * The `label` type only works on `vertical` orientation.
40
+ * The `label` type is only displayed in `vertical` orientation.
41
+ * The `trigger` type is used to force the item to be collapsible when its a link in `vertical` orientation.
31
42
  * @defaultValue 'link'
32
43
  */
33
- type?: 'label' | 'link';
44
+ type?: 'label' | 'trigger' | 'link';
34
45
  slot?: string;
46
+ /**
47
+ * The value of the item. Avoid using `index` as the value to prevent conflicts in horizontal orientation with Reka UI.
48
+ * @defaultValue `item-${index}`
49
+ */
35
50
  value?: string;
36
51
  children?: NavigationMenuChildItem[];
37
52
  /**
38
53
  * With orientation=`horizontal` if `true` it will position the dropdown menu correctly
39
54
  */
40
55
  viewportRtl?: boolean;
56
+ defaultOpen?: boolean;
57
+ open?: boolean;
41
58
  onSelect?(e: Event): void;
59
+ class?: any;
60
+ b24ui?: Pick<NavigationMenu['slots'], 'item' | 'linkLeadingAvatarSize' | 'linkLeadingAvatar' | 'linkLeadingIcon' | 'linkLabel' | 'linkLabelExternalIcon' | 'linkTrailing' | 'linkTrailingBadgeSize' | 'linkTrailingBadge' | 'linkTrailingIcon' | 'label' | 'link' | 'content' | 'childList' | 'childLabel' | 'childItem' | 'childLink' | 'childLinkIcon' | 'childLinkWrapper' | 'childLinkLabel' | 'childLinkLabelExternalIcon' | 'childLinkDescription'>;
42
61
  [key: string]: any;
43
62
  }
44
- export interface NavigationMenuProps<T extends ArrayOrNested<NavigationMenuItem> = ArrayOrNested<NavigationMenuItem>> extends Pick<NavigationMenuRootProps, 'modelValue' | 'defaultValue' | 'delayDuration' | 'disableClickTrigger' | 'disableHoverTrigger' | 'skipDelayDuration' | 'disablePointerLeaveClose' | 'unmountOnHide'> {
63
+ export interface NavigationMenuProps<T extends ArrayOrNested<NavigationMenuItem> = ArrayOrNested<NavigationMenuItem>> extends Pick<NavigationMenuRootProps, 'modelValue' | 'defaultValue' | 'delayDuration' | 'disableClickTrigger' | 'disableHoverTrigger' | 'skipDelayDuration' | 'disablePointerLeaveClose' | 'unmountOnHide'>, Pick<AccordionRootProps, 'disabled' | 'type' | 'collapsible'> {
45
64
  /**
46
65
  * The element or component this component should render as.
47
66
  * @defaultValue 'div'
@@ -80,6 +99,18 @@ export interface NavigationMenuProps<T extends ArrayOrNested<NavigationMenuItem>
80
99
  * @defaultValue false
81
100
  */
82
101
  collapsed?: boolean;
102
+ /**
103
+ * Display a tooltip on the items when the menu is collapsed with the label of the item.
104
+ * `{ delayDuration: 0, content: { side: 'right' } }`{lang="ts"}
105
+ * @defaultValue false
106
+ */
107
+ tooltip?: boolean | TooltipProps;
108
+ /**
109
+ * Display a popover on the items when the menu is collapsed with the children list.
110
+ * `{ mode: 'hover', content: { side: 'right', align: 'start', alignOffset: 2 } }`{lang="ts"}
111
+ * @defaultValue false
112
+ */
113
+ popover?: boolean | PopoverProps;
83
114
  /** Display a line next to the active item. */
84
115
  highlight?: boolean;
85
116
  /**
@@ -1,11 +1,11 @@
1
1
  <script setup>
2
2
  import { computed } from "vue";
3
3
  import { useOverlay } from "../composables/useOverlay";
4
- const { overlays, unMount, close } = useOverlay();
4
+ const { overlays, unmount, close } = useOverlay();
5
5
  const mountedOverlays = computed(() => overlays.filter((overlay) => overlay.isMounted));
6
6
  const onAfterLeave = (id) => {
7
7
  close(id);
8
- unMount(id);
8
+ unmount(id);
9
9
  };
10
10
  const onClose = (id, value) => {
11
11
  close(id, value);
@@ -58,6 +58,10 @@ const Component = computed(() => props.mode === "hover" ? HoverCard : Popover);
58
58
  <slot :open="open" />
59
59
  </Component.Trigger>
60
60
 
61
+ <Component.Anchor v-if="'Anchor' in Component && !!slots.anchor" as-child>
62
+ <slot name="anchor" />
63
+ </Component.Anchor>
64
+
61
65
  <Component.Portal v-bind="portalProps">
62
66
  <Component.Content v-bind="contentProps" :class="b24ui.content({ class: [!slots.default && props.class, props.b24ui?.content] })" v-on="contentEvents">
63
67
  <slot name="content" />
@@ -41,6 +41,7 @@ export interface PopoverSlots {
41
41
  open: boolean;
42
42
  }): any;
43
43
  content(props?: {}): any;
44
+ anchor(props?: {}): any;
44
45
  }
45
46
  declare const _default: __VLS_WithSlots<import("vue").DefineComponent<PopoverProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
46
47
  "update:open": (value: boolean) => any;
@@ -49,8 +50,8 @@ declare const _default: __VLS_WithSlots<import("vue").DefineComponent<PopoverPro
49
50
  "onUpdate:open"?: ((value: boolean) => any) | undefined;
50
51
  "onClose:prevent"?: (() => any) | undefined;
51
52
  }>, {
52
- mode: "click" | "hover";
53
53
  portal: boolean | string | HTMLElement;
54
+ mode: "click" | "hover";
54
55
  dismissible: boolean;
55
56
  openDelay: number;
56
57
  closeDelay: number;