@cypress-design/vue-docmenu 0.5.1 → 0.5.3

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.
@@ -2,13 +2,13 @@ $ yarn build:module && yarn build:types
2
2
  $ yarn vite build
3
3
  $ /home/runner/work/cypress-design/cypress-design/node_modules/.bin/vite build
4
4
  The CJS build of Vite's Node API is deprecated. See https://vitejs.dev/guide/troubleshooting.html#vite-cjs-node-api-deprecated for more details.
5
- vite v5.0.4 building for production...
5
+ vite v5.0.12 building for production...
6
6
  transforming...
7
7
  ✓ 10 modules transformed.
8
8
  rendering chunks...
9
9
  computing gzip size...
10
- dist/index.es.mjs 11.10 kB │ gzip: 3.23 kB │ map: 15.39 kB
11
- dist/index.umd.js 8.76 kB │ gzip: 2.80 kB │ map: 15.00 kB
12
- ✓ built in 3.46s
10
+ dist/index.es.mjs 11.42 kB │ gzip: 3.32 kB │ map: 16.16 kB
11
+ dist/index.umd.js 8.93 kB │ gzip: 2.86 kB │ map: 15.74 kB
12
+ ✓ built in 4.09s
13
13
  $ yarn vue-tsc --project ./tsconfig.build.json
14
14
  $ /home/runner/work/cypress-design/cypress-design/node_modules/.bin/vue-tsc --project ./tsconfig.build.json
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # @cypress-design/vue-docmenu
2
2
 
3
+ ## 0.5.3
4
+
5
+ ### Patch Changes
6
+
7
+ - [#387](https://github.com/cypress-io/cypress-design/pull/387) [`05b67c5`](https://github.com/cypress-io/cypress-design/commit/05b67c5389df1c0619d2f01e2b36fb5bd6bb30b9) Thanks [@elevatebart](https://github.com/elevatebart)! - when activePath changes, expand sections that contain the newly activated element
8
+
9
+ ## 0.5.2
10
+
11
+ ### Patch Changes
12
+
13
+ - [`fe2f9f0`](https://github.com/cypress-io/cypress-design/commit/fe2f9f0435117454b3d81ce22ec3e9258330a725) Thanks [@elevatebart](https://github.com/elevatebart)! - make margin of button on depth button
14
+
3
15
  ## 0.5.1
4
16
 
5
17
  ### Patch Changes
package/DocMenuVue.cy.tsx CHANGED
@@ -18,7 +18,7 @@ describe('<DocMenu/>', () => {
18
18
  props: {
19
19
  href: String,
20
20
  },
21
- setup(props, { slots, emit }) {
21
+ setup(props, { slots }) {
22
22
  return () => (
23
23
  <span onClick={() => (selectedHref.value = props.href)}>
24
24
  {slots.default?.()} + href: {props.href}
@@ -53,8 +53,61 @@ describe('<DocMenu/>', () => {
53
53
 
54
54
  function mountStory(items: (NavItemLink | NavGroup)[] = [], activePath = '') {
55
55
  mount(() => {
56
- return <DocMenu items={items} activePath={activePath} />
56
+ return (
57
+ <div class="p-4">
58
+ <DocMenu items={items} activePath={activePath} />
59
+ </div>
60
+ )
57
61
  })
58
62
  }
59
- assertions(mountStory)
63
+
64
+ assertions(mountStory, () => {
65
+ const selectedHref = ref<string | undefined>('/foo')
66
+
67
+ const CustomLinkVue: DefineComponent<{ href: StringConstructor }> =
68
+ defineComponent({
69
+ props: {
70
+ href: String,
71
+ },
72
+ setup(props, { slots }) {
73
+ return () => (
74
+ <button
75
+ style="text-align:left"
76
+ onClick={() => (selectedHref.value = props.href)}
77
+ >
78
+ {slots.default?.()}
79
+ </button>
80
+ )
81
+ },
82
+ })
83
+
84
+ mount(() => (
85
+ <>
86
+ <button onClick={() => (selectedHref.value = '/kephren')}>
87
+ Set path to /kephren
88
+ </button>
89
+ <DocMenu
90
+ activePath={selectedHref.value}
91
+ items={[
92
+ {
93
+ label: 'Section 1',
94
+ items: [
95
+ { href: '/foo', label: 'Foo' },
96
+ {
97
+ label: 'Subsection',
98
+ items: [{ href: '/sub', label: 'Sub' }],
99
+ },
100
+ ],
101
+ },
102
+ {
103
+ label: 'Pyramid',
104
+ items: [{ href: '/kephren', label: 'Kephren' }],
105
+ collapsed: true,
106
+ },
107
+ ]}
108
+ linkComponent={CustomLinkVue}
109
+ />
110
+ </>
111
+ ))
112
+ })
60
113
  })
package/_DocGroup.vue CHANGED
@@ -65,6 +65,15 @@ watch(open, (open) => {
65
65
  }
66
66
  })
67
67
 
68
+ watch(
69
+ () => props.activePath,
70
+ () => {
71
+ if (hasActiveItem.value && !open.value) {
72
+ open.value = true
73
+ }
74
+ },
75
+ )
76
+
68
77
  defineExpose({
69
78
  reTriggerSetActiveGroup,
70
79
  })
@@ -83,6 +92,9 @@ defineExpose({
83
92
  'text-gray-800 dark:text-gray-200': !hasActiveItem && !active,
84
93
  },
85
94
  ]"
95
+ :style="{
96
+ paddingLeft: depth >= 1 ? `${(depth - 1) * 12 + 48}px` : undefined,
97
+ }"
86
98
  :href="group.href"
87
99
  @click="
88
100
  () => {
@@ -103,9 +115,11 @@ defineExpose({
103
115
  {
104
116
  'rotate-0': open,
105
117
  '-rotate-90': !open,
106
- 'ml-[28px]': depth,
107
118
  },
108
119
  ]"
120
+ :style="{
121
+ marginLeft: depth >= 1 ? `${(depth - 1) * 12 + 28}px` : undefined,
122
+ }"
109
123
  />
110
124
  {{ group.label }}
111
125
  </component>
package/_DocLink.vue CHANGED
@@ -6,6 +6,7 @@ import {
6
6
  onMounted,
7
7
  inject,
8
8
  nextTick,
9
+ computed,
9
10
  } from 'vue'
10
11
  import type { NavItemLink } from '@cypress-design/constants-docmenu'
11
12
 
@@ -65,12 +66,19 @@ onMounted(() => {
65
66
  defineExpose({
66
67
  setActiveMarkerPosition,
67
68
  })
69
+
70
+ const itemWithoutLabel = computed(() => {
71
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
72
+ const { label, ...rest } = props.item
73
+ return rest
74
+ })
68
75
  </script>
69
76
 
70
77
  <template>
71
78
  <li ref="$container" class="list-none p-0">
72
79
  <component
73
80
  :is="linkComponent"
81
+ v-bind="itemWithoutLabel"
74
82
  class="group relative block w-full pl-[24px]"
75
83
  :class="{
76
84
  'text-indigo-500 dark:text-indigo-400': active,
@@ -81,7 +89,6 @@ defineExpose({
81
89
  :style="{
82
90
  paddingLeft: depth >= 0 ? `${depth * 12 + 48}px` : undefined,
83
91
  }"
84
- :href="item.href"
85
92
  >
86
93
  <div
87
94
  v-if="depth >= 0"
@@ -9,7 +9,7 @@ declare const _default: DefineComponent<__VLS_WithDefaults<__VLS_TypePropsToRunt
9
9
  linkComponent: string;
10
10
  collapsible: boolean;
11
11
  activePath: undefined;
12
- }>, {}, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<import("vue").ExtractPropTypes<__VLS_WithDefaults<__VLS_TypePropsToRuntimeProps<{
12
+ }>, {}, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<__VLS_WithDefaults<__VLS_TypePropsToRuntimeProps<{
13
13
  items: (NavItemLink | NavGroup)[];
14
14
  activePath?: string | undefined;
15
15
  collapsible?: boolean | undefined;
@@ -18,7 +18,7 @@ declare const _default: DefineComponent<__VLS_WithDefaults<__VLS_TypePropsToRunt
18
18
  } | undefined) => void;
19
19
  updateMarkerPosition: () => void;
20
20
  hideMarker: () => void;
21
- }, string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<import("vue").ExtractPropTypes<__VLS_WithDefaults<__VLS_TypePropsToRuntimeProps<{
21
+ }, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<__VLS_WithDefaults<__VLS_TypePropsToRuntimeProps<{
22
22
  group: NavGroup;
23
23
  activePath?: string | undefined;
24
24
  collapsible: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"_DocGroup.vue.d.ts","sourceRoot":"","sources":["../_DocGroup.vue.ts"],"names":[],"mappings":"AAEA,OAAO,EAAY,KAAK,eAAe,EAAsB,MAAM,KAAK,CAAA;AAExE,OAAO,EAAE,QAAQ,EAAW,MAAM,mCAAmC,CAAA;AAwCrE,iBAAS,uBAAuB,SAE/B;;WAwPU,QAAQ;;iBAEF,OAAO;mBACL,eAAe,GAAG,GAAG;;;;;;;;;;;;;;WAH7B,QAAQ;;iBAEF,OAAO;mBACL,eAAe,GAAG,GAAG;;;;;;;;;;;;WAC5B,MAAM;;AAXlB,wBAcG;AACH,KAAK,sBAAsB,CAAC,CAAC,IAAI,CAAC,SAAS,SAAS,GAAG,KAAK,GAAG,CAAC,CAAC;AACjE,KAAK,6BAA6B,CAAC,CAAC,IAAI;KAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,SAAS,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG;QAAE,IAAI,EAAE,OAAO,KAAK,EAAE,QAAQ,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;KAAE,GAAG;QAAE,IAAI,EAAE,OAAO,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAAC,QAAQ,EAAE,IAAI,CAAA;KAAE;CAAE,CAAC;AAC9M,KAAK,kBAAkB,CAAC,CAAC,EAAE,CAAC,IAAI;KAE1B,CAAC,IAAI,MAAM,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,MAAM,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG;QACxE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;KACb,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CACT,CAAC;AACN,KAAK,cAAc,CAAC,CAAC,IAAI;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAG,GAAG,EAAE,CAAC"}
1
+ {"version":3,"file":"_DocGroup.vue.d.ts","sourceRoot":"","sources":["../_DocGroup.vue.ts"],"names":[],"mappings":"AAEA,OAAO,EAAY,KAAK,eAAe,EAAsB,MAAM,KAAK,CAAA;AAExE,OAAO,EAAE,QAAQ,EAAW,MAAM,mCAAmC,CAAA;AAwCrE,iBAAS,uBAAuB,SAE/B;;WA0QU,QAAQ;;iBAEF,OAAO;mBACL,eAAe,GAAG,GAAG;;;;;;;;;;;;;;WAH7B,QAAQ;;iBAEF,OAAO;mBACL,eAAe,GAAG,GAAG;;;;;;;;;;;;WAC5B,MAAM;;AAXlB,wBAcG;AACH,KAAK,sBAAsB,CAAC,CAAC,IAAI,CAAC,SAAS,SAAS,GAAG,KAAK,GAAG,CAAC,CAAC;AACjE,KAAK,6BAA6B,CAAC,CAAC,IAAI;KAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,SAAS,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG;QAAE,IAAI,EAAE,OAAO,KAAK,EAAE,QAAQ,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;KAAE,GAAG;QAAE,IAAI,EAAE,OAAO,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAAC,QAAQ,EAAE,IAAI,CAAA;KAAE;CAAE,CAAC;AAC9M,KAAK,kBAAkB,CAAC,CAAC,EAAE,CAAC,IAAI;KAE1B,CAAC,IAAI,MAAM,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,MAAM,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG;QACxE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;KACb,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CACT,CAAC;AACN,KAAK,cAAc,CAAC,CAAC,IAAI;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAG,GAAG,EAAE,CAAC"}
@@ -35,7 +35,7 @@ declare const _default: DefineComponent<__VLS_TypePropsToRuntimeProps<{
35
35
  } | undefined) => void;
36
36
  updateMarkerPosition: () => void;
37
37
  hideMarker: () => void;
38
- }, string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<import("vue").ExtractPropTypes<__VLS_TypePropsToRuntimeProps<{
38
+ }, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<__VLS_TypePropsToRuntimeProps<{
39
39
  items: (NavGroup | NavItemLink)[];
40
40
  activePath?: string | undefined;
41
41
  collapsible: boolean;
@@ -16,7 +16,7 @@ declare const _default: DefineComponent<__VLS_WithDefaults<__VLS_TypePropsToRunt
16
16
  top: number;
17
17
  height: number;
18
18
  } | undefined) => void;
19
- }, string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<import("vue").ExtractPropTypes<__VLS_WithDefaults<__VLS_TypePropsToRuntimeProps<{
19
+ }, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<__VLS_WithDefaults<__VLS_TypePropsToRuntimeProps<{
20
20
  item: NavItemLink;
21
21
  active: boolean;
22
22
  collapsible: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"_DocLink.vue.d.ts","sourceRoot":"","sources":["../_DocLink.vue.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,eAAe,EAKrB,MAAM,KAAK,CAAA;AACZ,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAA;AA6BpE,iBAAS,uBAAuB,SAY/B;;UA+HS,WAAW;YACT,OAAO;iBACF,OAAO;;mBAEL,eAAe,GAAG,GAAG;;;;;;;;;;;UAJ9B,WAAW;YACT,OAAO;iBACF,OAAO;;mBAEL,eAAe,GAAG,GAAG;;;;;;;;;WAD5B,MAAM;;AAVlB,wBAcG;AACH,KAAK,sBAAsB,CAAC,CAAC,IAAI,CAAC,SAAS,SAAS,GAAG,KAAK,GAAG,CAAC,CAAC;AACjE,KAAK,6BAA6B,CAAC,CAAC,IAAI;KAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,SAAS,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG;QAAE,IAAI,EAAE,OAAO,KAAK,EAAE,QAAQ,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;KAAE,GAAG;QAAE,IAAI,EAAE,OAAO,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAAC,QAAQ,EAAE,IAAI,CAAA;KAAE;CAAE,CAAC;AAC9M,KAAK,kBAAkB,CAAC,CAAC,EAAE,CAAC,IAAI;KAE1B,CAAC,IAAI,MAAM,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,MAAM,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG;QACxE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;KACb,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CACT,CAAC;AACN,KAAK,cAAc,CAAC,CAAC,IAAI;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAG,GAAG,EAAE,CAAC"}
1
+ {"version":3,"file":"_DocLink.vue.d.ts","sourceRoot":"","sources":["../_DocLink.vue.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,eAAe,EAMrB,MAAM,KAAK,CAAA;AACZ,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAA;AA6BpE,iBAAS,uBAAuB,SAY/B;;UAmIS,WAAW;YACT,OAAO;iBACF,OAAO;;mBAEL,eAAe,GAAG,GAAG;;;;;;;;;;;UAJ9B,WAAW;YACT,OAAO;iBACF,OAAO;;mBAEL,eAAe,GAAG,GAAG;;;;;;;;;WAD5B,MAAM;;AAVlB,wBAcG;AACH,KAAK,sBAAsB,CAAC,CAAC,IAAI,CAAC,SAAS,SAAS,GAAG,KAAK,GAAG,CAAC,CAAC;AACjE,KAAK,6BAA6B,CAAC,CAAC,IAAI;KAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,SAAS,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG;QAAE,IAAI,EAAE,OAAO,KAAK,EAAE,QAAQ,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;KAAE,GAAG;QAAE,IAAI,EAAE,OAAO,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAAC,QAAQ,EAAE,IAAI,CAAA;KAAE;CAAE,CAAC;AAC9M,KAAK,kBAAkB,CAAC,CAAC,EAAE,CAAC,IAAI;KAE1B,CAAC,IAAI,MAAM,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,MAAM,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG;QACxE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;KACb,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CACT,CAAC;AACN,KAAK,cAAc,CAAC,CAAC,IAAI;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAG,GAAG,EAAE,CAAC"}
package/dist/index.es.mjs CHANGED
@@ -1,12 +1,12 @@
1
- import { defineComponent as A, ref as u, computed as P, inject as I, watch as C, openBlock as p, createElementBlock as f, Fragment as B, createBlock as M, resolveDynamicComponent as S, normalizeClass as h, unref as k, withCtx as D, createCommentVNode as $, createTextVNode as E, toDisplayString as G, createElementVNode as z, createVNode as x, onMounted as H, normalizeStyle as L, nextTick as N, renderList as V, provide as j } from "vue";
2
- import { IconChevronDownSmall as F } from "@cypress-design/vue-icon";
3
- const b = {
1
+ import { defineComponent as C, ref as u, computed as y, inject as I, watch as M, openBlock as p, createElementBlock as f, Fragment as B, createBlock as $, resolveDynamicComponent as D, normalizeClass as b, unref as k, normalizeStyle as x, withCtx as E, createCommentVNode as A, createTextVNode as G, toDisplayString as S, createElementVNode as z, createVNode as w, onMounted as H, mergeProps as N, nextTick as V, renderList as R, provide as W } from "vue";
2
+ import { IconChevronDownSmall as j } from "@cypress-design/vue-icon";
3
+ const h = {
4
4
  expandedIcon: "absolute left-0 transform transition-transform text-gray-400 dark:text-gray-700",
5
5
  button: "flex leading-[24px] py-[10px] items-center relative w-full text-start",
6
6
  topButton: "leading-[24px] text-[16px] pl-[24px] font-medium",
7
7
  leafButton: "leading-[20px] text-[14px] pl-[48px]",
8
8
  openListBorderLeft: "absolute left-[8px] top-0 w-[1px] h-full bg-gray-100 dark:bg-gray-900"
9
- }, R = /* @__PURE__ */ A({
9
+ }, F = /* @__PURE__ */ C({
10
10
  __name: "_DocGroup",
11
11
  props: {
12
12
  group: {},
@@ -16,93 +16,103 @@ const b = {
16
16
  depth: { default: 0 }
17
17
  },
18
18
  emits: ["updateActivePosition", "updateMarkerPosition", "hideMarker"],
19
- setup(g, { expose: c, emit: d }) {
20
- const n = g, i = u(n.group.collapsed !== !0), v = u(), m = u(), s = P(
21
- () => n.collapsible ? "button" : n.group.href ? "a" : "div"
22
- ), e = d, o = P(
23
- () => n.group.items.some((t) => "items" in t ? w(t.items, n.activePath) : t.href === n.activePath)
19
+ setup(g, { expose: v, emit: d }) {
20
+ const i = g, o = u(i.group.collapsed !== !0), c = u(), m = u(), s = y(
21
+ () => i.collapsible ? "button" : i.group.href ? "a" : "div"
22
+ ), l = d, e = y(
23
+ () => i.group.items.some((t) => "items" in t ? L(t.items, i.activePath) : t.href === i.activePath)
24
24
  );
25
- function a() {
25
+ function n() {
26
26
  var t;
27
- (t = v.value) == null || t.reTriggerSetActiveGroup();
27
+ (t = c.value) == null || t.reTriggerSetActiveGroup();
28
28
  }
29
- const l = P(() => n.group.href === n.activePath), y = I("transition-is-moving", u(!1));
30
- return C(l, (t) => {
31
- t && e("hideMarker");
32
- }), C(i, (t) => {
33
- o.value ? t ? a() : e("hideMarker") : e("updateMarkerPosition");
34
- }), c({
35
- reTriggerSetActiveGroup: a
29
+ const a = y(() => i.group.href === i.activePath), P = I("transition-is-moving", u(!1));
30
+ return M(a, (t) => {
31
+ t && l("hideMarker");
32
+ }), M(o, (t) => {
33
+ e.value ? t ? n() : l("hideMarker") : l("updateMarkerPosition");
34
+ }), M(
35
+ () => i.activePath,
36
+ () => {
37
+ e.value && !o.value && (o.value = !0);
38
+ }
39
+ ), v({
40
+ reTriggerSetActiveGroup: n
36
41
  }), (t, r) => (p(), f(B, null, [
37
- (p(), M(S(s.value), {
38
- class: h([
39
- k(b).button,
42
+ (p(), $(D(s.value), {
43
+ class: b([
44
+ k(h).button,
40
45
  {
41
- [k(b).topButton]: t.depth === 0,
42
- [k(b).leafButton]: t.depth,
43
- "text-indigo-500 dark:text-indigo-400": l.value,
44
- "text-gray-900 dark:text-gray-100": o.value && !l.value,
45
- "text-gray-800 dark:text-gray-200": !o.value && !l.value
46
+ [k(h).topButton]: t.depth === 0,
47
+ [k(h).leafButton]: t.depth,
48
+ "text-indigo-500 dark:text-indigo-400": a.value,
49
+ "text-gray-900 dark:text-gray-100": e.value && !a.value,
50
+ "text-gray-800 dark:text-gray-200": !e.value && !a.value
46
51
  }
47
52
  ]),
53
+ style: x({
54
+ paddingLeft: t.depth >= 1 ? `${(t.depth - 1) * 12 + 48}px` : void 0
55
+ }),
48
56
  href: t.group.href,
49
57
  onClick: r[0] || (r[0] = () => {
50
- t.collapsible ? i.value = !i.value : e("updateActivePosition");
58
+ t.collapsible ? o.value = !o.value : l("updateActivePosition");
51
59
  })
52
60
  }, {
53
- default: D(() => [
54
- n.collapsible ? (p(), M(k(F), {
61
+ default: E(() => [
62
+ i.collapsible ? (p(), $(k(j), {
55
63
  key: 0,
56
64
  "stroke-color": "current",
57
65
  size: t.depth ? "8" : "16",
58
- class: h([
59
- k(b).expandedIcon,
66
+ class: b([
67
+ k(h).expandedIcon,
60
68
  {
61
- "rotate-0": i.value,
62
- "-rotate-90": !i.value,
63
- "ml-[28px]": t.depth
69
+ "rotate-0": o.value,
70
+ "-rotate-90": !o.value
64
71
  }
65
- ])
66
- }, null, 8, ["size", "class"])) : $("", !0),
67
- E(" " + G(t.group.label), 1)
72
+ ]),
73
+ style: x({
74
+ marginLeft: t.depth >= 1 ? `${(t.depth - 1) * 12 + 28}px` : void 0
75
+ })
76
+ }, null, 8, ["size", "class", "style"])) : A("", !0),
77
+ G(" " + S(t.group.label), 1)
68
78
  ]),
69
79
  _: 1
70
- }, 8, ["class", "href"])),
80
+ }, 8, ["class", "style", "href"])),
71
81
  z("div", {
72
- class: h(["grid transition-all relative", {
73
- "grid-rows-[0fr]": !i.value && t.collapsible,
74
- "grid-rows-[1fr]": i.value || !t.collapsible
82
+ class: b(["grid transition-all relative", {
83
+ "grid-rows-[0fr]": !o.value && t.collapsible,
84
+ "grid-rows-[1fr]": o.value || !t.collapsible
75
85
  }]),
76
86
  ref_key: "$listWrapper",
77
87
  ref: m,
78
88
  onTransitionstart: r[4] || (r[4] = () => {
79
- y.value = !0;
89
+ P.value = !0;
80
90
  }),
81
91
  onTransitionend: r[5] || (r[5] = () => {
82
- y.value = !1, (i.value || !o.value) && e("updateMarkerPosition");
92
+ P.value = !1, (o.value || !e.value) && l("updateMarkerPosition");
83
93
  })
84
94
  }, [
85
- i.value && t.collapsible && t.depth === 0 ? (p(), f("div", {
95
+ o.value && t.collapsible && t.depth === 0 ? (p(), f("div", {
86
96
  key: 0,
87
- class: h(k(b).openListBorderLeft)
88
- }, null, 2)) : $("", !0),
89
- x(U, {
97
+ class: b(k(h).openListBorderLeft)
98
+ }, null, 2)) : A("", !0),
99
+ w(U, {
90
100
  ref_key: "$groupElements",
91
- ref: v,
101
+ ref: c,
92
102
  class: "overflow-hidden",
93
103
  depth: t.depth,
94
104
  items: t.group.items,
95
105
  "active-path": t.activePath,
96
106
  collapsible: t.collapsible,
97
107
  "link-component": t.linkComponent,
98
- onHideMarker: r[1] || (r[1] = (T) => e("hideMarker")),
99
- onUpdateMarkerPosition: r[2] || (r[2] = () => e("updateMarkerPosition")),
100
- onUpdateActivePosition: r[3] || (r[3] = (T) => i.value ? e("updateActivePosition", T) : null)
108
+ onHideMarker: r[1] || (r[1] = (T) => l("hideMarker")),
109
+ onUpdateMarkerPosition: r[2] || (r[2] = () => l("updateMarkerPosition")),
110
+ onUpdateActivePosition: r[3] || (r[3] = (T) => o.value ? l("updateActivePosition", T) : null)
101
111
  }, null, 8, ["depth", "items", "active-path", "collapsible", "link-component"])
102
112
  ], 34)
103
113
  ], 64));
104
114
  }
105
- }), O = /* @__PURE__ */ A({
115
+ }), q = /* @__PURE__ */ C({
106
116
  __name: "_DocLink",
107
117
  props: {
108
118
  item: {},
@@ -112,126 +122,130 @@ const b = {
112
122
  linkComponent: {}
113
123
  },
114
124
  emits: ["update:active"],
115
- setup(g, { expose: c, emit: d }) {
116
- const n = g, i = d, v = u(), m = I("transition-is-moving", u(!1));
125
+ setup(g, { expose: v, emit: d }) {
126
+ const i = g, o = d, c = u(), m = I("transition-is-moving", u(!1));
117
127
  function s() {
118
- n.active && N(() => {
128
+ i.active && V(() => {
119
129
  var a;
120
- const { top: e = 0, height: o = 36 } = ((a = v.value) == null ? void 0 : a.getBoundingClientRect()) ?? {};
121
- i("update:active", n.active, {
130
+ const { top: e = 0, height: n = 36 } = ((a = c.value) == null ? void 0 : a.getBoundingClientRect()) ?? {};
131
+ o("update:active", i.active, {
122
132
  top: e,
123
- height: o
133
+ height: n
124
134
  });
125
135
  });
126
136
  }
127
- return H(() => {
128
- C(
129
- () => n.active,
137
+ H(() => {
138
+ M(
139
+ () => i.active,
130
140
  (e) => {
131
- e ? s() : i("update:active", e);
141
+ e ? s() : o("update:active", e);
132
142
  },
133
143
  { immediate: !0 }
134
144
  );
135
- }), c({
145
+ }), v({
136
146
  setActiveMarkerPosition: s
137
- }), (e, o) => (p(), f("li", {
147
+ });
148
+ const l = y(() => {
149
+ const { label: e, ...n } = i.item;
150
+ return n;
151
+ });
152
+ return (e, n) => (p(), f("li", {
138
153
  ref_key: "$container",
139
- ref: v,
154
+ ref: c,
140
155
  class: "list-none p-0"
141
156
  }, [
142
- (p(), M(S(e.linkComponent), {
143
- class: h(["group relative block w-full pl-[24px]", {
157
+ (p(), $(D(e.linkComponent), N(l.value, {
158
+ class: ["group relative block w-full pl-[24px]", {
144
159
  "text-indigo-500 dark:text-indigo-400": e.active,
145
160
  "text-gray-700 dark:text-gray-500": !e.active,
146
161
  "py-[8px] text-[16px] leading-[24px]": e.depth < 0,
147
162
  "leading-[20px] text-[14px] py-[12px]": e.depth >= 0
148
- }]),
149
- style: L({
163
+ }],
164
+ style: {
150
165
  paddingLeft: e.depth >= 0 ? `${e.depth * 12 + 48}px` : void 0
151
- }),
152
- href: e.item.href
153
- }, {
154
- default: D(() => [
166
+ }
167
+ }), {
168
+ default: E(() => [
155
169
  e.depth >= 0 ? (p(), f("div", {
156
170
  key: 0,
157
- class: h(["left-[6.5px] absolute top-[4px] bottom-[4px] w-[4px] z-10 rounded-full", {
171
+ class: b(["left-[6.5px] absolute top-[4px] bottom-[4px] w-[4px] z-10 rounded-full", {
158
172
  hidden: !k(m) || !e.active,
159
173
  "group-hover:block bg-gray-300": !e.active && e.collapsible,
160
174
  "bg-indigo-500": e.active && k(m)
161
175
  }])
162
- }, null, 2)) : $("", !0),
163
- E(" " + G(e.item.label), 1)
176
+ }, null, 2)) : A("", !0),
177
+ G(" " + S(e.item.label), 1)
164
178
  ]),
165
179
  _: 1
166
- }, 8, ["class", "style", "href"]))
180
+ }, 16, ["class", "style"]))
167
181
  ], 512));
168
182
  }
169
- }), W = { class: "list-none p-0" }, q = {
183
+ }), J = { class: "list-none p-0" }, K = {
170
184
  key: 0,
171
185
  class: "relative list-none p-0"
172
186
  };
173
- function w(g, c) {
174
- return g.some((d) => "items" in d ? w(d.items, c) : d.href === c);
187
+ function L(g, v) {
188
+ return g.some((d) => "items" in d ? L(d.items, v) : d.href === v);
175
189
  }
176
- const U = /* @__PURE__ */ A({
190
+ const U = /* @__PURE__ */ C({
177
191
  __name: "_DocGroupElements",
178
192
  props: {
179
193
  items: {},
180
194
  activePath: {},
181
195
  collapsible: { type: Boolean },
182
- linkComponent: { type: [Object, Function, String] },
196
+ linkComponent: {},
183
197
  depth: {}
184
198
  },
185
199
  emits: ["updateActivePosition", "updateMarkerPosition", "hideMarker"],
186
- setup(g, { expose: c, emit: d }) {
187
- const n = g, i = d, v = u([]), m = u([]), s = P(
188
- () => n.items.some((o) => "items" in o ? w(o.items, n.activePath) : o.href === n.activePath)
200
+ setup(g, { expose: v, emit: d }) {
201
+ const i = g, o = d, c = u([]), m = u([]), s = y(
202
+ () => i.items.some((e) => "items" in e ? L(e.items, i.activePath) : e.href === i.activePath)
189
203
  );
190
- function e(o = -1) {
191
- v.value.forEach((l) => {
192
- l.setActiveMarkerPosition();
204
+ function l(e = -1) {
205
+ c.value.forEach((a) => {
206
+ a.setActiveMarkerPosition();
193
207
  });
194
- const a = o - // remove all the items that are not groups from the array and count them
195
- n.items.slice(0, o).filter((l) => !("items" in l)).length;
196
- m.value.slice(a + 1).forEach((l) => {
197
- l.reTriggerSetActiveGroup();
208
+ const n = e - // remove all the items that are not groups from the array and count them
209
+ i.items.slice(0, e).filter((a) => !("items" in a)).length;
210
+ m.value.slice(n + 1).forEach((a) => {
211
+ a.reTriggerSetActiveGroup();
198
212
  });
199
213
  }
200
- return c({
201
- reTriggerSetActiveGroup: e
202
- }), (o, a) => (p(), f("ul", W, [
203
- (p(!0), f(B, null, V(o.items, (l, y) => (p(), f(B, null, [
204
- l && "items" in l ? (p(), f("li", q, [
205
- x(R, {
214
+ return v({
215
+ reTriggerSetActiveGroup: l
216
+ }), (e, n) => (p(), f("ul", J, [
217
+ (p(!0), f(B, null, R(e.items, (a, P) => (p(), f(B, null, [
218
+ a && "items" in a ? (p(), f("li", K, [
219
+ w(F, {
206
220
  ref_for: !0,
207
221
  ref_key: "$groups",
208
222
  ref: m,
209
- "active-path": o.activePath,
210
- group: l,
211
- depth: o.depth + 1,
212
- collapsible: o.collapsible,
213
- "link-component": o.linkComponent,
214
- onUpdateActivePosition: a[0] || (a[0] = (t) => {
215
- i("updateActivePosition", t);
223
+ "active-path": e.activePath,
224
+ group: a,
225
+ depth: e.depth + 1,
226
+ collapsible: e.collapsible,
227
+ "link-component": e.linkComponent,
228
+ onUpdateActivePosition: n[0] || (n[0] = (t) => {
229
+ o("updateActivePosition", t);
216
230
  }),
217
231
  onUpdateMarkerPosition: () => {
218
- s.value ? e(y) : i("updateMarkerPosition");
232
+ s.value ? l(P) : o("updateMarkerPosition");
219
233
  },
220
- onHideMarker: a[1] || (a[1] = (t) => i("hideMarker"))
234
+ onHideMarker: n[1] || (n[1] = (t) => o("hideMarker"))
221
235
  }, null, 8, ["active-path", "group", "depth", "collapsible", "link-component", "onUpdateMarkerPosition"])
222
- ])) : (p(), M(O, {
236
+ ])) : (p(), $(q, {
223
237
  key: 1,
224
238
  ref_for: !0,
225
239
  ref_key: "$items",
226
- ref: v,
227
- item: l,
228
- active: l.href === o.activePath,
229
- depth: o.depth,
230
- collapsible: o.collapsible,
231
- "link-component": o.linkComponent,
232
- "onUpdate:active": a[2] || (a[2] = (t, r) => {
240
+ ref: c,
241
+ item: a,
242
+ active: a.href === e.activePath,
243
+ depth: e.depth,
244
+ collapsible: e.collapsible,
245
+ "link-component": e.linkComponent,
246
+ "onUpdate:active": n[2] || (n[2] = (t, r) => {
233
247
  if (r)
234
- o.depth < 0 ? i("hideMarker") : i("updateActivePosition", r);
248
+ e.depth < 0 ? o("hideMarker") : o("updateActivePosition", r);
235
249
  else
236
250
  return;
237
251
  })
@@ -239,51 +253,51 @@ const U = /* @__PURE__ */ A({
239
253
  ], 64))), 256))
240
254
  ]));
241
255
  }
242
- }), Q = /* @__PURE__ */ A({
256
+ }), X = /* @__PURE__ */ C({
243
257
  __name: "DocMenu",
244
258
  props: {
245
259
  items: {},
246
260
  activePath: { default: void 0 },
247
261
  collapsible: { type: Boolean, default: !0 },
248
- linkComponent: { type: [Object, Function, String], default: "a" }
262
+ linkComponent: { default: "a" }
249
263
  },
250
264
  setup(g) {
251
- const c = u(), d = u(0), n = u(36), i = u(!1);
252
- function v({ top: s, height: e } = { height: 0, top: 0 }) {
253
- var a;
254
- const o = ((a = c.value) == null ? void 0 : a.getBoundingClientRect().top) || 0;
255
- d.value = s - o, n.value = e, i.value = !0;
265
+ const v = u(), d = u(0), i = u(36), o = u(!1);
266
+ function c({ top: s, height: l } = { height: 0, top: 0 }) {
267
+ var n;
268
+ const e = ((n = v.value) == null ? void 0 : n.getBoundingClientRect().top) || 0;
269
+ d.value = s - e, i.value = l, o.value = !0;
256
270
  }
257
271
  const m = u(!1);
258
- return j("transition-is-moving", m), (s, e) => (p(), f("div", {
272
+ return W("transition-is-moving", m), (s, l) => (p(), f("div", {
259
273
  ref_key: "$container",
260
- ref: c,
274
+ ref: v,
261
275
  class: "relative"
262
276
  }, [
263
- i.value && s.collapsible && !m.value ? (p(), f("div", {
277
+ o.value && s.collapsible && !m.value ? (p(), f("div", {
264
278
  key: 0,
265
279
  "data-cy": "doc-menu-active-marker",
266
280
  class: "absolute h-[36px] w-[4px] z-50 rounded-full bg-indigo-500 transition-all duration-300 ml-[6.5px] mt-[4px]",
267
- style: L({
281
+ style: x({
268
282
  top: `${d.value}px`,
269
- height: `${n.value - 8}px`
283
+ height: `${i.value - 8}px`
270
284
  })
271
- }, null, 4)) : $("", !0),
272
- x(U, {
285
+ }, null, 4)) : A("", !0),
286
+ w(U, {
273
287
  items: s.items,
274
288
  "active-path": s.activePath,
275
289
  collapsible: s.collapsible,
276
290
  "link-component": s.linkComponent,
277
291
  depth: -1,
278
- onUpdateActivePosition: v,
279
- onHideMarker: e[0] || (e[0] = (o) => i.value = !1)
292
+ onUpdateActivePosition: c,
293
+ onHideMarker: l[0] || (l[0] = (e) => o.value = !1)
280
294
  }, null, 8, ["items", "active-path", "collapsible", "link-component"])
281
295
  ], 512));
282
296
  }
283
297
  });
284
298
  export {
285
- Q as default
299
+ X as default
286
300
  };
287
301
  //# sourceMappingURL=index.es.mjs.map
288
302
 
289
- /* <wind-keep class="container relative absolute h-[36px] w-[4px] z-50 rounded-full bg-indigo-500 transition-all duration-300 ml-[6.5px] mt-[4px] filter list-none p-0 text-indigo-500 dark:text-indigo-400 text-gray-900 dark:text-gray-100 text-gray-800 dark:text-gray-200 rotate-0 -rotate-90 ml-[28px] grid grid-rows-[0fr] grid-rows-[1fr] overflow-hidden text-indigo-400 text-gray-100 text-gray-200 icon-dark-current block w-full pl-[24px] text-gray-700 dark:text-gray-500 py-[8px] text-[16px] leading-[24px] leading-[20px] text-[14px] py-[12px] left-[6.5px] top-[4px] bottom-[4px] z-10 hidden group-hover:block bg-gray-300 text-gray-500 left-0 transform transition-transform text-gray-400 dark:text-gray-700 flex py-[10px] items-center text-start font-medium pl-[48px] left-[8px] top-0 w-[1px] h-full bg-gray-100 dark:bg-gray-900"> */
303
+ /* <wind-keep class="container relative absolute h-[36px] w-[4px] z-50 rounded-full bg-indigo-500 transition-all duration-300 ml-[6.5px] mt-[4px] filter list-none p-0 text-indigo-500 dark:text-indigo-400 text-gray-900 dark:text-gray-100 text-gray-800 dark:text-gray-200 rotate-0 -rotate-90 grid grid-rows-[0fr] grid-rows-[1fr] overflow-hidden text-indigo-400 text-gray-100 text-gray-200 icon-dark-current block w-full pl-[24px] text-gray-700 dark:text-gray-500 py-[8px] text-[16px] leading-[24px] leading-[20px] text-[14px] py-[12px] left-[6.5px] top-[4px] bottom-[4px] z-10 hidden group-hover:block bg-gray-300 text-gray-500 left-0 transform transition-transform text-gray-400 dark:text-gray-700 flex py-[10px] items-center text-start font-medium pl-[48px] left-[8px] top-0 w-[1px] h-full bg-gray-100 dark:bg-gray-900"> */
@@ -1 +1 @@
1
- {"version":3,"file":"index.es.mjs","sources":["../../constants/dist/index.js","../_DocGroup.vue","../_DocLink.vue","../_DocGroupElements.vue","../DocMenu.vue"],"sourcesContent":["export const classes = {\n expandedIcon: 'absolute left-0 transform transition-transform text-gray-400 dark:text-gray-700',\n button: 'flex leading-[24px] py-[10px] items-center relative w-full text-start',\n topButton: 'leading-[24px] text-[16px] pl-[24px] font-medium',\n leafButton: 'leading-[20px] text-[14px] pl-[48px]',\n openListBorderLeft: 'absolute left-[8px] top-0 w-[1px] h-full bg-gray-100 dark:bg-gray-900',\n};\n","<script lang=\"ts\" setup>\nimport { computed, type DefineComponent, ref, watch, inject } from 'vue'\nimport { IconChevronDownSmall } from '@cypress-design/vue-icon'\nimport { NavGroup, classes } from '@cypress-design/constants-docmenu'\nimport DocGroupElements, {\n hasActiveItemRecursively,\n type DocGroupEventsEmitted,\n} from './_DocGroupElements.vue'\n\nconst props = withDefaults(\n defineProps<{\n group: NavGroup\n activePath?: string\n collapsible: boolean\n linkComponent: DefineComponent | 'a'\n depth?: number\n }>(),\n {\n depth: 0,\n },\n)\n\nconst open = ref(props.group.collapsed !== true)\nconst $groupElements = ref<typeof DocGroupElements>()\nconst $listWrapper = ref<HTMLDivElement>()\n\nconst Head = computed(() =>\n props.collapsible ? 'button' : props.group.href ? 'a' : 'div',\n)\n\nconst emit = defineEmits<DocGroupEventsEmitted>()\n\nconst hasActiveItem = computed(() =>\n props.group.items.some((item) => {\n if ('items' in item) {\n return hasActiveItemRecursively(item.items, props.activePath)\n }\n return item.href === props.activePath\n }),\n)\n\nfunction reTriggerSetActiveGroup() {\n $groupElements.value?.reTriggerSetActiveGroup()\n}\n\nconst active = computed(() => props.group.href === props.activePath)\n\nconst markerIsMoving = inject('transition-is-moving', ref(false))\n\nwatch(active, (active) => {\n if (active) {\n emit('hideMarker')\n }\n})\n\nwatch(open, (open) => {\n if (hasActiveItem.value) {\n if (open) {\n reTriggerSetActiveGroup()\n } else {\n emit('hideMarker')\n }\n } else {\n emit('updateMarkerPosition')\n }\n})\n\ndefineExpose({\n reTriggerSetActiveGroup,\n})\n</script>\n\n<template>\n <component\n :is=\"Head\"\n :class=\"[\n classes.button,\n {\n [classes.topButton]: depth === 0,\n [classes.leafButton]: depth,\n 'text-indigo-500 dark:text-indigo-400': active,\n 'text-gray-900 dark:text-gray-100': hasActiveItem && !active,\n 'text-gray-800 dark:text-gray-200': !hasActiveItem && !active,\n },\n ]\"\n :href=\"group.href\"\n @click=\"\n () => {\n if (collapsible) {\n open = !open\n } else {\n emit('updateActivePosition')\n }\n }\n \"\n >\n <IconChevronDownSmall\n v-if=\"props.collapsible\"\n stroke-color=\"current\"\n :size=\"depth ? '8' : '16'\"\n :class=\"[\n classes.expandedIcon,\n {\n 'rotate-0': open,\n '-rotate-90': !open,\n 'ml-[28px]': depth,\n },\n ]\"\n />\n {{ group.label }}\n </component>\n <div\n class=\"grid transition-all relative\"\n ref=\"$listWrapper\"\n :class=\"{\n 'grid-rows-[0fr]': !open && collapsible,\n 'grid-rows-[1fr]': open || !collapsible,\n }\"\n @transitionstart=\"\n () => {\n markerIsMoving = true\n }\n \"\n @transitionend=\"\n () => {\n markerIsMoving = false\n if (open || !hasActiveItem) {\n emit('updateMarkerPosition')\n }\n }\n \"\n >\n <div\n v-if=\"open && collapsible && depth === 0\"\n :class=\"classes.openListBorderLeft\"\n />\n <DocGroupElements\n ref=\"$groupElements\"\n class=\"overflow-hidden\"\n :depth=\"depth\"\n :items=\"group.items\"\n :active-path=\"activePath\"\n :collapsible=\"collapsible\"\n :link-component=\"linkComponent\"\n @hide-marker=\"emit('hideMarker')\"\n @update-marker-position=\"() => emit('updateMarkerPosition')\"\n @update-active-position=\"\n (opts) => (open ? emit('updateActivePosition', opts) : null)\n \"\n />\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport {\n watch,\n type DefineComponent,\n ref,\n onMounted,\n inject,\n nextTick,\n} from 'vue'\nimport type { NavItemLink } from '@cypress-design/constants-docmenu'\n\nconst props = withDefaults(\n defineProps<{\n item: NavItemLink\n active: boolean\n collapsible: boolean\n depth?: number\n linkComponent: DefineComponent | 'a'\n }>(),\n {\n depth: -1,\n },\n)\n\nconst emit = defineEmits<{\n (\n event: 'update:active',\n active: boolean,\n opts?: { top: number; height: number },\n ): void\n}>()\n\nconst $container = ref<HTMLLIElement>()\n\nconst markerIsMoving = inject('transition-is-moving', ref(false))\n\nfunction setActiveMarkerPosition() {\n if (props.active) {\n nextTick(() => {\n const { top = 0, height = 36 } =\n $container.value?.getBoundingClientRect() ?? {}\n\n emit('update:active', props.active, {\n top,\n height,\n })\n })\n }\n}\n\nonMounted(() => {\n watch(\n () => props.active,\n (active) => {\n if (active) {\n setActiveMarkerPosition()\n } else {\n emit('update:active', active)\n }\n },\n { immediate: true },\n )\n})\n\ndefineExpose({\n setActiveMarkerPosition,\n})\n</script>\n\n<template>\n <li ref=\"$container\" class=\"list-none p-0\">\n <component\n :is=\"linkComponent\"\n class=\"group relative block w-full pl-[24px]\"\n :class=\"{\n 'text-indigo-500 dark:text-indigo-400': active,\n 'text-gray-700 dark:text-gray-500': !active,\n 'py-[8px] text-[16px] leading-[24px]': depth < 0,\n 'leading-[20px] text-[14px] py-[12px]': depth >= 0,\n }\"\n :style=\"{\n paddingLeft: depth >= 0 ? `${depth * 12 + 48}px` : undefined,\n }\"\n :href=\"item.href\"\n >\n <div\n v-if=\"depth >= 0\"\n class=\"left-[6.5px] absolute top-[4px] bottom-[4px] w-[4px] z-10 rounded-full\"\n :class=\"{\n hidden: !markerIsMoving || !active,\n 'group-hover:block bg-gray-300': !active && collapsible,\n 'bg-indigo-500': active && markerIsMoving,\n }\"\n />\n {{ item.label }}\n </component>\n </li>\n</template>\n","<script lang=\"ts\">\nexport function hasActiveItemRecursively(\n items: (NavGroup | NavItemLink)[],\n activePath?: string,\n): boolean {\n return items.some((item) => {\n if ('items' in item) {\n return hasActiveItemRecursively(item.items, activePath)\n }\n return item.href === activePath\n })\n}\n\nexport interface DocGroupEventsEmitted {\n /**\n * If the group is not collapsed, this event will emit the\n * active marker position all the way to the menu component\n */\n (event: 'updateActivePosition', opts?: { top: number; height: number }): void\n /**\n * This event will trigger a re-render of the active marker\n * to update its position if not in the current subtree\n */\n (event: 'updateMarkerPosition'): void\n /**\n * This event will bubble-up and hide the active marker\n */\n (event: 'hideMarker'): void\n}\n</script>\n\n<script lang=\"ts\" setup>\nimport { DefineComponent, computed, ref } from 'vue'\nimport { NavGroup, NavItemLink } from '@cypress-design/constants-docmenu'\nimport DocGroup from './_DocGroup.vue'\nimport DocLink from './_DocLink.vue'\n\nconst props = defineProps<{\n items: (NavGroup | NavItemLink)[]\n activePath?: string\n collapsible: boolean\n linkComponent: DefineComponent | 'a'\n depth: number\n}>()\n\nconst emit = defineEmits<DocGroupEventsEmitted>()\n\nconst $items = ref<(typeof DocLink)[]>([])\nconst $groups = ref<(typeof DocGroup)[]>([])\n\nconst hasActiveItem = computed(() =>\n props.items.some((item) => {\n if ('items' in item) {\n return hasActiveItemRecursively(item.items, props.activePath)\n }\n return item.href === props.activePath\n }),\n)\n\n/**\n * update the position of the marker when opening a group\n * @param index\n */\nfunction reTriggerSetActiveGroup(index = -1) {\n $items.value.forEach((item) => {\n item.setActiveMarkerPosition()\n })\n\n // calculate the index of the calling group in the list of groups\n const indexGroup =\n index -\n // remove all the items that are not groups from the array and count them\n props.items.slice(0, index).filter((item) => !('items' in item)).length\n\n // only update groups that come after the toggled one\n // others will not need to update the marker\n // since they are \"before\" in the rendering tree\n $groups.value.slice(indexGroup + 1).forEach((group) => {\n group.reTriggerSetActiveGroup()\n })\n}\n\ndefineExpose({\n reTriggerSetActiveGroup,\n})\n</script>\n\n<template>\n <ul class=\"list-none p-0\">\n <template v-for=\"(item, index) in items\">\n <li class=\"relative list-none p-0\" v-if=\"item && 'items' in item\">\n <DocGroup\n ref=\"$groups\"\n :active-path=\"activePath\"\n :group=\"item\"\n :depth=\"depth + 1\"\n :collapsible=\"collapsible\"\n :link-component=\"linkComponent\"\n @update-active-position=\"\n (opts) => {\n emit('updateActivePosition', opts)\n }\n \"\n @update-marker-position=\"\n () => {\n if (hasActiveItem) {\n reTriggerSetActiveGroup(index)\n } else {\n emit('updateMarkerPosition')\n }\n }\n \"\n @hide-marker=\"emit('hideMarker')\"\n />\n </li>\n <DocLink\n v-else\n ref=\"$items\"\n :item=\"item\"\n :active=\"item.href === activePath\"\n :depth=\"depth\"\n :collapsible=\"collapsible\"\n :link-component=\"linkComponent\"\n @update:active=\"\n (_, opts) => {\n if (!opts) {\n return\n } else if (depth < 0) {\n emit('hideMarker')\n } else {\n emit('updateActivePosition', opts)\n }\n }\n \"\n />\n </template>\n </ul>\n</template>\n","<script lang=\"ts\" setup>\nimport { ref, type DefineComponent, provide } from 'vue'\nimport { NavGroup, NavItemLink } from '@cypress-design/constants-docmenu'\nimport DocGroupElements from './_DocGroupElements.vue'\n\nwithDefaults(\n defineProps<{\n items: (NavItemLink | NavGroup)[]\n activePath?: string\n collapsible?: boolean\n linkComponent?: DefineComponent | 'a'\n }>(),\n {\n linkComponent: 'a',\n collapsible: true,\n activePath: undefined,\n },\n)\n\nconst $container = ref<HTMLDivElement>()\n\nconst activeTop = ref(0)\nconst activeHeight = ref(36)\nconst showMarker = ref(false)\n\nfunction updateActiveMarkerPosition({ top, height } = { height: 0, top: 0 }) {\n const containerTop = $container.value?.getBoundingClientRect().top || 0\n activeTop.value = top - containerTop\n activeHeight.value = height\n showMarker.value = true\n}\n\nconst markerIsMoving = ref(false)\n\nprovide('transition-is-moving', markerIsMoving)\n</script>\n\n<template>\n <div ref=\"$container\" class=\"relative\">\n <div\n v-if=\"showMarker && collapsible && !markerIsMoving\"\n data-cy=\"doc-menu-active-marker\"\n class=\"absolute h-[36px] w-[4px] z-50 rounded-full bg-indigo-500 transition-all duration-300 ml-[6.5px] mt-[4px]\"\n :style=\"{\n top: `${activeTop}px`,\n height: `${activeHeight - 8}px`,\n }\"\n />\n <DocGroupElements\n :items=\"items\"\n :active-path=\"activePath\"\n :collapsible=\"collapsible\"\n :link-component=\"linkComponent\"\n :depth=\"-1\"\n @update-active-position=\"updateActiveMarkerPosition\"\n @hide-marker=\"showMarker = false\"\n />\n </div>\n</template>\n"],"names":["classes","props","__props","open","ref","$groupElements","$listWrapper","Head","computed","emit","__emit","hasActiveItem","item","hasActiveItemRecursively","reTriggerSetActiveGroup","_a","active","markerIsMoving","inject","watch","__expose","$container","setActiveMarkerPosition","nextTick","top","height","onMounted","items","activePath","$items","$groups","index","indexGroup","group","activeTop","activeHeight","showMarker","updateActiveMarkerPosition","containerTop","provide"],"mappings":";;AAAO,MAAMA,IAAU;AAAA,EACnB,cAAc;AAAA,EACd,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,oBAAoB;AACxB;;;;;;;;;;;ACGA,UAAMC,IAAQC,GAaRC,IAAOC,EAAIH,EAAM,MAAM,cAAc,EAAI,GACzCI,IAAiBD,KACjBE,IAAeF,KAEfG,IAAOC;AAAA,MAAS,MACpBP,EAAM,cAAc,WAAWA,EAAM,MAAM,OAAO,MAAM;AAAA,IAAA,GAGpDQ,IAAOC,GAEPC,IAAgBH;AAAA,MAAS,MAC7BP,EAAM,MAAM,MAAM,KAAK,CAACW,MAClB,WAAWA,IACNC,EAAyBD,EAAK,OAAOX,EAAM,UAAU,IAEvDW,EAAK,SAASX,EAAM,UAC5B;AAAA,IAAA;AAGH,aAASa,IAA0B;;AACjC,OAAAC,IAAAV,EAAe,UAAf,QAAAU,EAAsB;AAAA,IACxB;AAEA,UAAMC,IAASR,EAAS,MAAMP,EAAM,MAAM,SAASA,EAAM,UAAU,GAE7DgB,IAAiBC,EAAO,wBAAwBd,EAAI,EAAK,CAAC;AAE1D,WAAAe,EAAAH,GAAQ,CAACA,MAAW;AACxB,MAAIA,KACFP,EAAK,YAAY;AAAA,IACnB,CACD,GAEKU,EAAAhB,GAAM,CAACA,MAAS;AACpB,MAAIQ,EAAc,QACZR,IACsBW,MAExBL,EAAK,YAAY,IAGnBA,EAAK,sBAAsB;AAAA,IAC7B,CACD,GAEYW,EAAA;AAAA,MACX,yBAAAN;AAAA,IAAA,CACD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC1DD,UAAMb,IAAQC,GAaRO,IAAOC,GAQPW,IAAajB,KAEba,IAAiBC,EAAO,wBAAwBd,EAAI,EAAK,CAAC;AAEhE,aAASkB,IAA0B;AACjC,MAAIrB,EAAM,UACRsB,EAAS,MAAM;;AACP,cAAA,EAAE,KAAAC,IAAM,GAAG,QAAAC,IAAS,SACxBV,IAAAM,EAAW,UAAX,gBAAAN,EAAkB,4BAA2B;AAE1C,QAAAN,EAAA,iBAAiBR,EAAM,QAAQ;AAAA,UAClC,KAAAuB;AAAA,UACA,QAAAC;AAAA,QAAA,CACD;AAAA,MAAA,CACF;AAAA,IAEL;AAEA,WAAAC,EAAU,MAAM;AACd,MAAAP;AAAA,QACE,MAAMlB,EAAM;AAAA,QACZ,CAACe,MAAW;AACV,UAAIA,IACsBM,MAExBb,EAAK,iBAAiBO,CAAM;AAAA,QAEhC;AAAA,QACA,EAAE,WAAW,GAAK;AAAA,MAAA;AAAA,IACpB,CACD,GAEYI,EAAA;AAAA,MACX,yBAAAE;AAAA,IAAA,CACD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACjEe,SAAAT,EACdc,GACAC,GACS;AACF,SAAAD,EAAM,KAAK,CAACf,MACb,WAAWA,IACNC,EAAyBD,EAAK,OAAOgB,CAAU,IAEjDhB,EAAK,SAASgB,CACtB;AACH;;;;;;;;;;;;AA0BA,UAAM3B,IAAQC,GAQRO,IAAOC,GAEPmB,IAASzB,EAAwB,CAAA,CAAE,GACnC0B,IAAU1B,EAAyB,CAAA,CAAE,GAErCO,IAAgBH;AAAA,MAAS,MAC7BP,EAAM,MAAM,KAAK,CAACW,MACZ,WAAWA,IACNC,EAAyBD,EAAK,OAAOX,EAAM,UAAU,IAEvDW,EAAK,SAASX,EAAM,UAC5B;AAAA,IAAA;AAOM,aAAAa,EAAwBiB,IAAQ,IAAI;AACpC,MAAAF,EAAA,MAAM,QAAQ,CAACjB,MAAS;AAC7B,QAAAA,EAAK,wBAAwB;AAAA,MAAA,CAC9B;AAGD,YAAMoB,IACJD;AAAA,MAEA9B,EAAM,MAAM,MAAM,GAAG8B,CAAK,EAAE,OAAO,CAACnB,MAAS,EAAE,WAAWA,EAAK,EAAE;AAKnE,MAAAkB,EAAQ,MAAM,MAAME,IAAa,CAAC,EAAE,QAAQ,CAACC,MAAU;AACrD,QAAAA,EAAM,wBAAwB;AAAA,MAAA,CAC/B;AAAA,IACH;AAEa,WAAAb,EAAA;AAAA,MACX,yBAAAN;AAAA,IAAA,CACD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACjED,UAAMO,IAAajB,KAEb8B,IAAY9B,EAAI,CAAC,GACjB+B,IAAe/B,EAAI,EAAE,GACrBgC,IAAahC,EAAI,EAAK;AAEnB,aAAAiC,EAA2B,EAAE,KAAAb,GAAK,QAAAC,EAAO,IAAI,EAAE,QAAQ,GAAG,KAAK,KAAK;;AAC3E,YAAMa,MAAevB,IAAAM,EAAW,UAAX,gBAAAN,EAAkB,wBAAwB,QAAO;AACtE,MAAAmB,EAAU,QAAQV,IAAMc,GACxBH,EAAa,QAAQV,GACrBW,EAAW,QAAQ;AAAA,IACrB;AAEM,UAAAnB,IAAiBb,EAAI,EAAK;AAEhC,WAAAmC,EAAQ,wBAAwBtB,CAAc;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.es.mjs","sources":["../../constants/dist/index.js","../_DocGroup.vue","../_DocLink.vue","../_DocGroupElements.vue","../DocMenu.vue"],"sourcesContent":["export const classes = {\n expandedIcon: 'absolute left-0 transform transition-transform text-gray-400 dark:text-gray-700',\n button: 'flex leading-[24px] py-[10px] items-center relative w-full text-start',\n topButton: 'leading-[24px] text-[16px] pl-[24px] font-medium',\n leafButton: 'leading-[20px] text-[14px] pl-[48px]',\n openListBorderLeft: 'absolute left-[8px] top-0 w-[1px] h-full bg-gray-100 dark:bg-gray-900',\n};\n","<script lang=\"ts\" setup>\nimport { computed, type DefineComponent, ref, watch, inject } from 'vue'\nimport { IconChevronDownSmall } from '@cypress-design/vue-icon'\nimport { NavGroup, classes } from '@cypress-design/constants-docmenu'\nimport DocGroupElements, {\n hasActiveItemRecursively,\n type DocGroupEventsEmitted,\n} from './_DocGroupElements.vue'\n\nconst props = withDefaults(\n defineProps<{\n group: NavGroup\n activePath?: string\n collapsible: boolean\n linkComponent: DefineComponent | 'a'\n depth?: number\n }>(),\n {\n depth: 0,\n },\n)\n\nconst open = ref(props.group.collapsed !== true)\nconst $groupElements = ref<typeof DocGroupElements>()\nconst $listWrapper = ref<HTMLDivElement>()\n\nconst Head = computed(() =>\n props.collapsible ? 'button' : props.group.href ? 'a' : 'div',\n)\n\nconst emit = defineEmits<DocGroupEventsEmitted>()\n\nconst hasActiveItem = computed(() =>\n props.group.items.some((item) => {\n if ('items' in item) {\n return hasActiveItemRecursively(item.items, props.activePath)\n }\n return item.href === props.activePath\n }),\n)\n\nfunction reTriggerSetActiveGroup() {\n $groupElements.value?.reTriggerSetActiveGroup()\n}\n\nconst active = computed(() => props.group.href === props.activePath)\n\nconst markerIsMoving = inject('transition-is-moving', ref(false))\n\nwatch(active, (active) => {\n if (active) {\n emit('hideMarker')\n }\n})\n\nwatch(open, (open) => {\n if (hasActiveItem.value) {\n if (open) {\n reTriggerSetActiveGroup()\n } else {\n emit('hideMarker')\n }\n } else {\n emit('updateMarkerPosition')\n }\n})\n\nwatch(\n () => props.activePath,\n () => {\n if (hasActiveItem.value && !open.value) {\n open.value = true\n }\n },\n)\n\ndefineExpose({\n reTriggerSetActiveGroup,\n})\n</script>\n\n<template>\n <component\n :is=\"Head\"\n :class=\"[\n classes.button,\n {\n [classes.topButton]: depth === 0,\n [classes.leafButton]: depth,\n 'text-indigo-500 dark:text-indigo-400': active,\n 'text-gray-900 dark:text-gray-100': hasActiveItem && !active,\n 'text-gray-800 dark:text-gray-200': !hasActiveItem && !active,\n },\n ]\"\n :style=\"{\n paddingLeft: depth >= 1 ? `${(depth - 1) * 12 + 48}px` : undefined,\n }\"\n :href=\"group.href\"\n @click=\"\n () => {\n if (collapsible) {\n open = !open\n } else {\n emit('updateActivePosition')\n }\n }\n \"\n >\n <IconChevronDownSmall\n v-if=\"props.collapsible\"\n stroke-color=\"current\"\n :size=\"depth ? '8' : '16'\"\n :class=\"[\n classes.expandedIcon,\n {\n 'rotate-0': open,\n '-rotate-90': !open,\n },\n ]\"\n :style=\"{\n marginLeft: depth >= 1 ? `${(depth - 1) * 12 + 28}px` : undefined,\n }\"\n />\n {{ group.label }}\n </component>\n <div\n class=\"grid transition-all relative\"\n ref=\"$listWrapper\"\n :class=\"{\n 'grid-rows-[0fr]': !open && collapsible,\n 'grid-rows-[1fr]': open || !collapsible,\n }\"\n @transitionstart=\"\n () => {\n markerIsMoving = true\n }\n \"\n @transitionend=\"\n () => {\n markerIsMoving = false\n if (open || !hasActiveItem) {\n emit('updateMarkerPosition')\n }\n }\n \"\n >\n <div\n v-if=\"open && collapsible && depth === 0\"\n :class=\"classes.openListBorderLeft\"\n />\n <DocGroupElements\n ref=\"$groupElements\"\n class=\"overflow-hidden\"\n :depth=\"depth\"\n :items=\"group.items\"\n :active-path=\"activePath\"\n :collapsible=\"collapsible\"\n :link-component=\"linkComponent\"\n @hide-marker=\"emit('hideMarker')\"\n @update-marker-position=\"() => emit('updateMarkerPosition')\"\n @update-active-position=\"\n (opts) => (open ? emit('updateActivePosition', opts) : null)\n \"\n />\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport {\n watch,\n type DefineComponent,\n ref,\n onMounted,\n inject,\n nextTick,\n computed,\n} from 'vue'\nimport type { NavItemLink } from '@cypress-design/constants-docmenu'\n\nconst props = withDefaults(\n defineProps<{\n item: NavItemLink\n active: boolean\n collapsible: boolean\n depth?: number\n linkComponent: DefineComponent | 'a'\n }>(),\n {\n depth: -1,\n },\n)\n\nconst emit = defineEmits<{\n (\n event: 'update:active',\n active: boolean,\n opts?: { top: number; height: number },\n ): void\n}>()\n\nconst $container = ref<HTMLLIElement>()\n\nconst markerIsMoving = inject('transition-is-moving', ref(false))\n\nfunction setActiveMarkerPosition() {\n if (props.active) {\n nextTick(() => {\n const { top = 0, height = 36 } =\n $container.value?.getBoundingClientRect() ?? {}\n\n emit('update:active', props.active, {\n top,\n height,\n })\n })\n }\n}\n\nonMounted(() => {\n watch(\n () => props.active,\n (active) => {\n if (active) {\n setActiveMarkerPosition()\n } else {\n emit('update:active', active)\n }\n },\n { immediate: true },\n )\n})\n\ndefineExpose({\n setActiveMarkerPosition,\n})\n\nconst itemWithoutLabel = computed(() => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { label, ...rest } = props.item\n return rest\n})\n</script>\n\n<template>\n <li ref=\"$container\" class=\"list-none p-0\">\n <component\n :is=\"linkComponent\"\n v-bind=\"itemWithoutLabel\"\n class=\"group relative block w-full pl-[24px]\"\n :class=\"{\n 'text-indigo-500 dark:text-indigo-400': active,\n 'text-gray-700 dark:text-gray-500': !active,\n 'py-[8px] text-[16px] leading-[24px]': depth < 0,\n 'leading-[20px] text-[14px] py-[12px]': depth >= 0,\n }\"\n :style=\"{\n paddingLeft: depth >= 0 ? `${depth * 12 + 48}px` : undefined,\n }\"\n >\n <div\n v-if=\"depth >= 0\"\n class=\"left-[6.5px] absolute top-[4px] bottom-[4px] w-[4px] z-10 rounded-full\"\n :class=\"{\n hidden: !markerIsMoving || !active,\n 'group-hover:block bg-gray-300': !active && collapsible,\n 'bg-indigo-500': active && markerIsMoving,\n }\"\n />\n {{ item.label }}\n </component>\n </li>\n</template>\n","<script lang=\"ts\">\nexport function hasActiveItemRecursively(\n items: (NavGroup | NavItemLink)[],\n activePath?: string,\n): boolean {\n return items.some((item) => {\n if ('items' in item) {\n return hasActiveItemRecursively(item.items, activePath)\n }\n return item.href === activePath\n })\n}\n\nexport interface DocGroupEventsEmitted {\n /**\n * If the group is not collapsed, this event will emit the\n * active marker position all the way to the menu component\n */\n (event: 'updateActivePosition', opts?: { top: number; height: number }): void\n /**\n * This event will trigger a re-render of the active marker\n * to update its position if not in the current subtree\n */\n (event: 'updateMarkerPosition'): void\n /**\n * This event will bubble-up and hide the active marker\n */\n (event: 'hideMarker'): void\n}\n</script>\n\n<script lang=\"ts\" setup>\nimport { DefineComponent, computed, ref } from 'vue'\nimport { NavGroup, NavItemLink } from '@cypress-design/constants-docmenu'\nimport DocGroup from './_DocGroup.vue'\nimport DocLink from './_DocLink.vue'\n\nconst props = defineProps<{\n items: (NavGroup | NavItemLink)[]\n activePath?: string\n collapsible: boolean\n linkComponent: DefineComponent | 'a'\n depth: number\n}>()\n\nconst emit = defineEmits<DocGroupEventsEmitted>()\n\nconst $items = ref<(typeof DocLink)[]>([])\nconst $groups = ref<(typeof DocGroup)[]>([])\n\nconst hasActiveItem = computed(() =>\n props.items.some((item) => {\n if ('items' in item) {\n return hasActiveItemRecursively(item.items, props.activePath)\n }\n return item.href === props.activePath\n }),\n)\n\n/**\n * update the position of the marker when opening a group\n * @param index\n */\nfunction reTriggerSetActiveGroup(index = -1) {\n $items.value.forEach((item) => {\n item.setActiveMarkerPosition()\n })\n\n // calculate the index of the calling group in the list of groups\n const indexGroup =\n index -\n // remove all the items that are not groups from the array and count them\n props.items.slice(0, index).filter((item) => !('items' in item)).length\n\n // only update groups that come after the toggled one\n // others will not need to update the marker\n // since they are \"before\" in the rendering tree\n $groups.value.slice(indexGroup + 1).forEach((group) => {\n group.reTriggerSetActiveGroup()\n })\n}\n\ndefineExpose({\n reTriggerSetActiveGroup,\n})\n</script>\n\n<template>\n <ul class=\"list-none p-0\">\n <template v-for=\"(item, index) in items\">\n <li class=\"relative list-none p-0\" v-if=\"item && 'items' in item\">\n <DocGroup\n ref=\"$groups\"\n :active-path=\"activePath\"\n :group=\"item\"\n :depth=\"depth + 1\"\n :collapsible=\"collapsible\"\n :link-component=\"linkComponent\"\n @update-active-position=\"\n (opts) => {\n emit('updateActivePosition', opts)\n }\n \"\n @update-marker-position=\"\n () => {\n if (hasActiveItem) {\n reTriggerSetActiveGroup(index)\n } else {\n emit('updateMarkerPosition')\n }\n }\n \"\n @hide-marker=\"emit('hideMarker')\"\n />\n </li>\n <DocLink\n v-else\n ref=\"$items\"\n :item=\"item\"\n :active=\"item.href === activePath\"\n :depth=\"depth\"\n :collapsible=\"collapsible\"\n :link-component=\"linkComponent\"\n @update:active=\"\n (_, opts) => {\n if (!opts) {\n return\n } else if (depth < 0) {\n emit('hideMarker')\n } else {\n emit('updateActivePosition', opts)\n }\n }\n \"\n />\n </template>\n </ul>\n</template>\n","<script lang=\"ts\" setup>\nimport { ref, type DefineComponent, provide } from 'vue'\nimport { NavGroup, NavItemLink } from '@cypress-design/constants-docmenu'\nimport DocGroupElements from './_DocGroupElements.vue'\n\nwithDefaults(\n defineProps<{\n items: (NavItemLink | NavGroup)[]\n activePath?: string\n collapsible?: boolean\n linkComponent?: DefineComponent | 'a'\n }>(),\n {\n linkComponent: 'a',\n collapsible: true,\n activePath: undefined,\n },\n)\n\nconst $container = ref<HTMLDivElement>()\n\nconst activeTop = ref(0)\nconst activeHeight = ref(36)\nconst showMarker = ref(false)\n\nfunction updateActiveMarkerPosition({ top, height } = { height: 0, top: 0 }) {\n const containerTop = $container.value?.getBoundingClientRect().top || 0\n activeTop.value = top - containerTop\n activeHeight.value = height\n showMarker.value = true\n}\n\nconst markerIsMoving = ref(false)\n\nprovide('transition-is-moving', markerIsMoving)\n</script>\n\n<template>\n <div ref=\"$container\" class=\"relative\">\n <div\n v-if=\"showMarker && collapsible && !markerIsMoving\"\n data-cy=\"doc-menu-active-marker\"\n class=\"absolute h-[36px] w-[4px] z-50 rounded-full bg-indigo-500 transition-all duration-300 ml-[6.5px] mt-[4px]\"\n :style=\"{\n top: `${activeTop}px`,\n height: `${activeHeight - 8}px`,\n }\"\n />\n <DocGroupElements\n :items=\"items\"\n :active-path=\"activePath\"\n :collapsible=\"collapsible\"\n :link-component=\"linkComponent\"\n :depth=\"-1\"\n @update-active-position=\"updateActiveMarkerPosition\"\n @hide-marker=\"showMarker = false\"\n />\n </div>\n</template>\n"],"names":["classes","props","__props","open","ref","$groupElements","$listWrapper","Head","computed","emit","__emit","hasActiveItem","item","hasActiveItemRecursively","reTriggerSetActiveGroup","_a","active","markerIsMoving","inject","watch","__expose","$container","setActiveMarkerPosition","nextTick","top","height","onMounted","itemWithoutLabel","label","rest","items","activePath","$items","$groups","index","indexGroup","group","activeTop","activeHeight","showMarker","updateActiveMarkerPosition","containerTop","provide"],"mappings":";;AAAO,MAAMA,IAAU;AAAA,EACnB,cAAc;AAAA,EACd,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,oBAAoB;AACxB;;;;;;;;;;;ACGA,UAAMC,IAAQC,GAaRC,IAAOC,EAAIH,EAAM,MAAM,cAAc,EAAI,GACzCI,IAAiBD,KACjBE,IAAeF,KAEfG,IAAOC;AAAA,MAAS,MACpBP,EAAM,cAAc,WAAWA,EAAM,MAAM,OAAO,MAAM;AAAA,IAAA,GAGpDQ,IAAOC,GAEPC,IAAgBH;AAAA,MAAS,MAC7BP,EAAM,MAAM,MAAM,KAAK,CAACW,MAClB,WAAWA,IACNC,EAAyBD,EAAK,OAAOX,EAAM,UAAU,IAEvDW,EAAK,SAASX,EAAM,UAC5B;AAAA,IAAA;AAGH,aAASa,IAA0B;;AACjC,OAAAC,IAAAV,EAAe,UAAf,QAAAU,EAAsB;AAAA,IACxB;AAEA,UAAMC,IAASR,EAAS,MAAMP,EAAM,MAAM,SAASA,EAAM,UAAU,GAE7DgB,IAAiBC,EAAO,wBAAwBd,EAAI,EAAK,CAAC;AAE1D,WAAAe,EAAAH,GAAQ,CAACA,MAAW;AACxB,MAAIA,KACFP,EAAK,YAAY;AAAA,IACnB,CACD,GAEKU,EAAAhB,GAAM,CAACA,MAAS;AACpB,MAAIQ,EAAc,QACZR,IACsBW,MAExBL,EAAK,YAAY,IAGnBA,EAAK,sBAAsB;AAAA,IAC7B,CACD,GAEDU;AAAA,MACE,MAAMlB,EAAM;AAAA,MACZ,MAAM;AACJ,QAAIU,EAAc,SAAS,CAACR,EAAK,UAC/BA,EAAK,QAAQ;AAAA,MAEjB;AAAA,IAAA,GAGWiB,EAAA;AAAA,MACX,yBAAAN;AAAA,IAAA,CACD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AClED,UAAMb,IAAQC,GAaRO,IAAOC,GAQPW,IAAajB,KAEba,IAAiBC,EAAO,wBAAwBd,EAAI,EAAK,CAAC;AAEhE,aAASkB,IAA0B;AACjC,MAAIrB,EAAM,UACRsB,EAAS,MAAM;;AACP,cAAA,EAAE,KAAAC,IAAM,GAAG,QAAAC,IAAS,SACxBV,IAAAM,EAAW,UAAX,gBAAAN,EAAkB,4BAA2B;AAE1C,QAAAN,EAAA,iBAAiBR,EAAM,QAAQ;AAAA,UAClC,KAAAuB;AAAA,UACA,QAAAC;AAAA,QAAA,CACD;AAAA,MAAA,CACF;AAAA,IAEL;AAEA,IAAAC,EAAU,MAAM;AACd,MAAAP;AAAA,QACE,MAAMlB,EAAM;AAAA,QACZ,CAACe,MAAW;AACV,UAAIA,IACsBM,MAExBb,EAAK,iBAAiBO,CAAM;AAAA,QAEhC;AAAA,QACA,EAAE,WAAW,GAAK;AAAA,MAAA;AAAA,IACpB,CACD,GAEYI,EAAA;AAAA,MACX,yBAAAE;AAAA,IAAA,CACD;AAEK,UAAAK,IAAmBnB,EAAS,MAAM;AAEtC,YAAM,EAAE,OAAAoB,GAAO,GAAGC,EAAA,IAAS5B,EAAM;AAC1B,aAAA4B;AAAA,IAAA,CACR;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACxEe,SAAAhB,EACdiB,GACAC,GACS;AACF,SAAAD,EAAM,KAAK,CAAClB,MACb,WAAWA,IACNC,EAAyBD,EAAK,OAAOmB,CAAU,IAEjDnB,EAAK,SAASmB,CACtB;AACH;;;;;;;;;;;;AA0BA,UAAM9B,IAAQC,GAQRO,IAAOC,GAEPsB,IAAS5B,EAAwB,CAAA,CAAE,GACnC6B,IAAU7B,EAAyB,CAAA,CAAE,GAErCO,IAAgBH;AAAA,MAAS,MAC7BP,EAAM,MAAM,KAAK,CAACW,MACZ,WAAWA,IACNC,EAAyBD,EAAK,OAAOX,EAAM,UAAU,IAEvDW,EAAK,SAASX,EAAM,UAC5B;AAAA,IAAA;AAOM,aAAAa,EAAwBoB,IAAQ,IAAI;AACpC,MAAAF,EAAA,MAAM,QAAQ,CAACpB,MAAS;AAC7B,QAAAA,EAAK,wBAAwB;AAAA,MAAA,CAC9B;AAGD,YAAMuB,IACJD;AAAA,MAEAjC,EAAM,MAAM,MAAM,GAAGiC,CAAK,EAAE,OAAO,CAACtB,MAAS,EAAE,WAAWA,EAAK,EAAE;AAKnE,MAAAqB,EAAQ,MAAM,MAAME,IAAa,CAAC,EAAE,QAAQ,CAACC,MAAU;AACrD,QAAAA,EAAM,wBAAwB;AAAA,MAAA,CAC/B;AAAA,IACH;AAEa,WAAAhB,EAAA;AAAA,MACX,yBAAAN;AAAA,IAAA,CACD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACjED,UAAMO,IAAajB,KAEbiC,IAAYjC,EAAI,CAAC,GACjBkC,IAAelC,EAAI,EAAE,GACrBmC,IAAanC,EAAI,EAAK;AAEnB,aAAAoC,EAA2B,EAAE,KAAAhB,GAAK,QAAAC,EAAO,IAAI,EAAE,QAAQ,GAAG,KAAK,KAAK;;AAC3E,YAAMgB,MAAe1B,IAAAM,EAAW,UAAX,gBAAAN,EAAkB,wBAAwB,QAAO;AACtE,MAAAsB,EAAU,QAAQb,IAAMiB,GACxBH,EAAa,QAAQb,GACrBc,EAAW,QAAQ;AAAA,IACrB;AAEM,UAAAtB,IAAiBb,EAAI,EAAK;AAEhC,WAAAsC,EAAQ,wBAAwBzB,CAAc;;;;;;;;;;;;;;;;;;;;;;;;;;"}
package/dist/index.umd.js CHANGED
@@ -1,4 +1,4 @@
1
- (function(e,u){typeof exports=="object"&&typeof module<"u"?module.exports=u(require("vue"),require("@cypress-design/vue-icon")):typeof define=="function"&&define.amd?define(["vue","@cypress-design/vue-icon"],u):(e=typeof globalThis<"u"?globalThis:e||self,e.DocMenu=u(e.Vue,e.CyIcon))})(this,function(e,u){"use strict";const g={expandedIcon:"absolute left-0 transform transition-transform text-gray-400 dark:text-gray-700",button:"flex leading-[24px] py-[10px] items-center relative w-full text-start",topButton:"leading-[24px] text-[16px] pl-[24px] font-medium",leafButton:"leading-[20px] text-[14px] pl-[48px]",openListBorderLeft:"absolute left-[8px] top-0 w-[1px] h-full bg-gray-100 dark:bg-gray-900"},C=e.defineComponent({__name:"_DocGroup",props:{group:{},activePath:{},collapsible:{type:Boolean},linkComponent:{},depth:{default:0}},emits:["updateActivePosition","updateMarkerPosition","hideMarker"],setup(k,{expose:d,emit:c}){const r=k,i=e.ref(r.group.collapsed!==!0),m=e.ref(),f=e.ref(),p=e.computed(()=>r.collapsible?"button":r.group.href?"a":"div"),t=c,n=e.computed(()=>r.group.items.some(o=>"items"in o?y(o.items,r.activePath):o.href===r.activePath));function l(){var o;(o=m.value)==null||o.reTriggerSetActiveGroup()}const a=e.computed(()=>r.group.href===r.activePath),h=e.inject("transition-is-moving",e.ref(!1));return e.watch(a,o=>{o&&t("hideMarker")}),e.watch(i,o=>{n.value?o?l():t("hideMarker"):t("updateMarkerPosition")}),d({reTriggerSetActiveGroup:l}),(o,s)=>(e.openBlock(),e.createElementBlock(e.Fragment,null,[(e.openBlock(),e.createBlock(e.resolveDynamicComponent(p.value),{class:e.normalizeClass([e.unref(g).button,{[e.unref(g).topButton]:o.depth===0,[e.unref(g).leafButton]:o.depth,"text-indigo-500 dark:text-indigo-400":a.value,"text-gray-900 dark:text-gray-100":n.value&&!a.value,"text-gray-800 dark:text-gray-200":!n.value&&!a.value}]),href:o.group.href,onClick:s[0]||(s[0]=()=>{o.collapsible?i.value=!i.value:t("updateActivePosition")})},{default:e.withCtx(()=>[r.collapsible?(e.openBlock(),e.createBlock(e.unref(u.IconChevronDownSmall),{key:0,"stroke-color":"current",size:o.depth?"8":"16",class:e.normalizeClass([e.unref(g).expandedIcon,{"rotate-0":i.value,"-rotate-90":!i.value,"ml-[28px]":o.depth}])},null,8,["size","class"])):e.createCommentVNode("",!0),e.createTextVNode(" "+e.toDisplayString(o.group.label),1)]),_:1},8,["class","href"])),e.createElementVNode("div",{class:e.normalizeClass(["grid transition-all relative",{"grid-rows-[0fr]":!i.value&&o.collapsible,"grid-rows-[1fr]":i.value||!o.collapsible}]),ref_key:"$listWrapper",ref:f,onTransitionstart:s[4]||(s[4]=()=>{h.value=!0}),onTransitionend:s[5]||(s[5]=()=>{h.value=!1,(i.value||!n.value)&&t("updateMarkerPosition")})},[i.value&&o.collapsible&&o.depth===0?(e.openBlock(),e.createElementBlock("div",{key:0,class:e.normalizeClass(e.unref(g).openListBorderLeft)},null,2)):e.createCommentVNode("",!0),e.createVNode(b,{ref_key:"$groupElements",ref:m,class:"overflow-hidden",depth:o.depth,items:o.group.items,"active-path":o.activePath,collapsible:o.collapsible,"link-component":o.linkComponent,onHideMarker:s[1]||(s[1]=B=>t("hideMarker")),onUpdateMarkerPosition:s[2]||(s[2]=()=>t("updateMarkerPosition")),onUpdateActivePosition:s[3]||(s[3]=B=>i.value?t("updateActivePosition",B):null)},null,8,["depth","items","active-path","collapsible","link-component"])],34)],64))}}),P=e.defineComponent({__name:"_DocLink",props:{item:{},active:{type:Boolean},collapsible:{type:Boolean},depth:{default:-1},linkComponent:{}},emits:["update:active"],setup(k,{expose:d,emit:c}){const r=k,i=c,m=e.ref(),f=e.inject("transition-is-moving",e.ref(!1));function p(){r.active&&e.nextTick(()=>{var l;const{top:t=0,height:n=36}=((l=m.value)==null?void 0:l.getBoundingClientRect())??{};i("update:active",r.active,{top:t,height:n})})}return e.onMounted(()=>{e.watch(()=>r.active,t=>{t?p():i("update:active",t)},{immediate:!0})}),d({setActiveMarkerPosition:p}),(t,n)=>(e.openBlock(),e.createElementBlock("li",{ref_key:"$container",ref:m,class:"list-none p-0"},[(e.openBlock(),e.createBlock(e.resolveDynamicComponent(t.linkComponent),{class:e.normalizeClass(["group relative block w-full pl-[24px]",{"text-indigo-500 dark:text-indigo-400":t.active,"text-gray-700 dark:text-gray-500":!t.active,"py-[8px] text-[16px] leading-[24px]":t.depth<0,"leading-[20px] text-[14px] py-[12px]":t.depth>=0}]),style:e.normalizeStyle({paddingLeft:t.depth>=0?`${t.depth*12+48}px`:void 0}),href:t.item.href},{default:e.withCtx(()=>[t.depth>=0?(e.openBlock(),e.createElementBlock("div",{key:0,class:e.normalizeClass(["left-[6.5px] absolute top-[4px] bottom-[4px] w-[4px] z-10 rounded-full",{hidden:!e.unref(f)||!t.active,"group-hover:block bg-gray-300":!t.active&&t.collapsible,"bg-indigo-500":t.active&&e.unref(f)}])},null,2)):e.createCommentVNode("",!0),e.createTextVNode(" "+e.toDisplayString(t.item.label),1)]),_:1},8,["class","style","href"]))],512))}}),M={class:"list-none p-0"},v={key:0,class:"relative list-none p-0"};function y(k,d){return k.some(c=>"items"in c?y(c.items,d):c.href===d)}const b=e.defineComponent({__name:"_DocGroupElements",props:{items:{},activePath:{},collapsible:{type:Boolean},linkComponent:{type:[Object,Function,String]},depth:{}},emits:["updateActivePosition","updateMarkerPosition","hideMarker"],setup(k,{expose:d,emit:c}){const r=k,i=c,m=e.ref([]),f=e.ref([]),p=e.computed(()=>r.items.some(n=>"items"in n?y(n.items,r.activePath):n.href===r.activePath));function t(n=-1){m.value.forEach(a=>{a.setActiveMarkerPosition()});const l=n-r.items.slice(0,n).filter(a=>!("items"in a)).length;f.value.slice(l+1).forEach(a=>{a.reTriggerSetActiveGroup()})}return d({reTriggerSetActiveGroup:t}),(n,l)=>(e.openBlock(),e.createElementBlock("ul",M,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(n.items,(a,h)=>(e.openBlock(),e.createElementBlock(e.Fragment,null,[a&&"items"in a?(e.openBlock(),e.createElementBlock("li",v,[e.createVNode(C,{ref_for:!0,ref_key:"$groups",ref:f,"active-path":n.activePath,group:a,depth:n.depth+1,collapsible:n.collapsible,"link-component":n.linkComponent,onUpdateActivePosition:l[0]||(l[0]=o=>{i("updateActivePosition",o)}),onUpdateMarkerPosition:()=>{p.value?t(h):i("updateMarkerPosition")},onHideMarker:l[1]||(l[1]=o=>i("hideMarker"))},null,8,["active-path","group","depth","collapsible","link-component","onUpdateMarkerPosition"])])):(e.openBlock(),e.createBlock(P,{key:1,ref_for:!0,ref_key:"$items",ref:m,item:a,active:a.href===n.activePath,depth:n.depth,collapsible:n.collapsible,"link-component":n.linkComponent,"onUpdate:active":l[2]||(l[2]=(o,s)=>{if(s)n.depth<0?i("hideMarker"):i("updateActivePosition",s);else return})},null,8,["item","active","depth","collapsible","link-component"]))],64))),256))]))}});return e.defineComponent({__name:"DocMenu",props:{items:{},activePath:{default:void 0},collapsible:{type:Boolean,default:!0},linkComponent:{type:[Object,Function,String],default:"a"}},setup(k){const d=e.ref(),c=e.ref(0),r=e.ref(36),i=e.ref(!1);function m({top:p,height:t}={height:0,top:0}){var l;const n=((l=d.value)==null?void 0:l.getBoundingClientRect().top)||0;c.value=p-n,r.value=t,i.value=!0}const f=e.ref(!1);return e.provide("transition-is-moving",f),(p,t)=>(e.openBlock(),e.createElementBlock("div",{ref_key:"$container",ref:d,class:"relative"},[i.value&&p.collapsible&&!f.value?(e.openBlock(),e.createElementBlock("div",{key:0,"data-cy":"doc-menu-active-marker",class:"absolute h-[36px] w-[4px] z-50 rounded-full bg-indigo-500 transition-all duration-300 ml-[6.5px] mt-[4px]",style:e.normalizeStyle({top:`${c.value}px`,height:`${r.value-8}px`})},null,4)):e.createCommentVNode("",!0),e.createVNode(b,{items:p.items,"active-path":p.activePath,collapsible:p.collapsible,"link-component":p.linkComponent,depth:-1,onUpdateActivePosition:m,onHideMarker:t[0]||(t[0]=n=>i.value=!1)},null,8,["items","active-path","collapsible","link-component"])],512))}})});
1
+ (function(e,k){typeof exports=="object"&&typeof module<"u"?module.exports=k(require("vue"),require("@cypress-design/vue-icon")):typeof define=="function"&&define.amd?define(["vue","@cypress-design/vue-icon"],k):(e=typeof globalThis<"u"?globalThis:e||self,e.DocMenu=k(e.Vue,e.CyIcon))})(this,function(e,k){"use strict";const g={expandedIcon:"absolute left-0 transform transition-transform text-gray-400 dark:text-gray-700",button:"flex leading-[24px] py-[10px] items-center relative w-full text-start",topButton:"leading-[24px] text-[16px] pl-[24px] font-medium",leafButton:"leading-[20px] text-[14px] pl-[48px]",openListBorderLeft:"absolute left-[8px] top-0 w-[1px] h-full bg-gray-100 dark:bg-gray-900"},P=e.defineComponent({__name:"_DocGroup",props:{group:{},activePath:{},collapsible:{type:Boolean},linkComponent:{},depth:{default:0}},emits:["updateActivePosition","updateMarkerPosition","hideMarker"],setup(u,{expose:d,emit:c}){const i=u,n=e.ref(i.group.collapsed!==!0),m=e.ref(),f=e.ref(),p=e.computed(()=>i.collapsible?"button":i.group.href?"a":"div"),a=c,t=e.computed(()=>i.group.items.some(o=>"items"in o?y(o.items,i.activePath):o.href===i.activePath));function l(){var o;(o=m.value)==null||o.reTriggerSetActiveGroup()}const r=e.computed(()=>i.group.href===i.activePath),h=e.inject("transition-is-moving",e.ref(!1));return e.watch(r,o=>{o&&a("hideMarker")}),e.watch(n,o=>{t.value?o?l():a("hideMarker"):a("updateMarkerPosition")}),e.watch(()=>i.activePath,()=>{t.value&&!n.value&&(n.value=!0)}),d({reTriggerSetActiveGroup:l}),(o,s)=>(e.openBlock(),e.createElementBlock(e.Fragment,null,[(e.openBlock(),e.createBlock(e.resolveDynamicComponent(p.value),{class:e.normalizeClass([e.unref(g).button,{[e.unref(g).topButton]:o.depth===0,[e.unref(g).leafButton]:o.depth,"text-indigo-500 dark:text-indigo-400":r.value,"text-gray-900 dark:text-gray-100":t.value&&!r.value,"text-gray-800 dark:text-gray-200":!t.value&&!r.value}]),style:e.normalizeStyle({paddingLeft:o.depth>=1?`${(o.depth-1)*12+48}px`:void 0}),href:o.group.href,onClick:s[0]||(s[0]=()=>{o.collapsible?n.value=!n.value:a("updateActivePosition")})},{default:e.withCtx(()=>[i.collapsible?(e.openBlock(),e.createBlock(e.unref(k.IconChevronDownSmall),{key:0,"stroke-color":"current",size:o.depth?"8":"16",class:e.normalizeClass([e.unref(g).expandedIcon,{"rotate-0":n.value,"-rotate-90":!n.value}]),style:e.normalizeStyle({marginLeft:o.depth>=1?`${(o.depth-1)*12+28}px`:void 0})},null,8,["size","class","style"])):e.createCommentVNode("",!0),e.createTextVNode(" "+e.toDisplayString(o.group.label),1)]),_:1},8,["class","style","href"])),e.createElementVNode("div",{class:e.normalizeClass(["grid transition-all relative",{"grid-rows-[0fr]":!n.value&&o.collapsible,"grid-rows-[1fr]":n.value||!o.collapsible}]),ref_key:"$listWrapper",ref:f,onTransitionstart:s[4]||(s[4]=()=>{h.value=!0}),onTransitionend:s[5]||(s[5]=()=>{h.value=!1,(n.value||!t.value)&&a("updateMarkerPosition")})},[n.value&&o.collapsible&&o.depth===0?(e.openBlock(),e.createElementBlock("div",{key:0,class:e.normalizeClass(e.unref(g).openListBorderLeft)},null,2)):e.createCommentVNode("",!0),e.createVNode(b,{ref_key:"$groupElements",ref:m,class:"overflow-hidden",depth:o.depth,items:o.group.items,"active-path":o.activePath,collapsible:o.collapsible,"link-component":o.linkComponent,onHideMarker:s[1]||(s[1]=B=>a("hideMarker")),onUpdateMarkerPosition:s[2]||(s[2]=()=>a("updateMarkerPosition")),onUpdateActivePosition:s[3]||(s[3]=B=>n.value?a("updateActivePosition",B):null)},null,8,["depth","items","active-path","collapsible","link-component"])],34)],64))}}),v=e.defineComponent({__name:"_DocLink",props:{item:{},active:{type:Boolean},collapsible:{type:Boolean},depth:{default:-1},linkComponent:{}},emits:["update:active"],setup(u,{expose:d,emit:c}){const i=u,n=c,m=e.ref(),f=e.inject("transition-is-moving",e.ref(!1));function p(){i.active&&e.nextTick(()=>{var r;const{top:t=0,height:l=36}=((r=m.value)==null?void 0:r.getBoundingClientRect())??{};n("update:active",i.active,{top:t,height:l})})}e.onMounted(()=>{e.watch(()=>i.active,t=>{t?p():n("update:active",t)},{immediate:!0})}),d({setActiveMarkerPosition:p});const a=e.computed(()=>{const{label:t,...l}=i.item;return l});return(t,l)=>(e.openBlock(),e.createElementBlock("li",{ref_key:"$container",ref:m,class:"list-none p-0"},[(e.openBlock(),e.createBlock(e.resolveDynamicComponent(t.linkComponent),e.mergeProps(a.value,{class:["group relative block w-full pl-[24px]",{"text-indigo-500 dark:text-indigo-400":t.active,"text-gray-700 dark:text-gray-500":!t.active,"py-[8px] text-[16px] leading-[24px]":t.depth<0,"leading-[20px] text-[14px] py-[12px]":t.depth>=0}],style:{paddingLeft:t.depth>=0?`${t.depth*12+48}px`:void 0}}),{default:e.withCtx(()=>[t.depth>=0?(e.openBlock(),e.createElementBlock("div",{key:0,class:e.normalizeClass(["left-[6.5px] absolute top-[4px] bottom-[4px] w-[4px] z-10 rounded-full",{hidden:!e.unref(f)||!t.active,"group-hover:block bg-gray-300":!t.active&&t.collapsible,"bg-indigo-500":t.active&&e.unref(f)}])},null,2)):e.createCommentVNode("",!0),e.createTextVNode(" "+e.toDisplayString(t.item.label),1)]),_:1},16,["class","style"]))],512))}}),C={class:"list-none p-0"},M={key:0,class:"relative list-none p-0"};function y(u,d){return u.some(c=>"items"in c?y(c.items,d):c.href===d)}const b=e.defineComponent({__name:"_DocGroupElements",props:{items:{},activePath:{},collapsible:{type:Boolean},linkComponent:{},depth:{}},emits:["updateActivePosition","updateMarkerPosition","hideMarker"],setup(u,{expose:d,emit:c}){const i=u,n=c,m=e.ref([]),f=e.ref([]),p=e.computed(()=>i.items.some(t=>"items"in t?y(t.items,i.activePath):t.href===i.activePath));function a(t=-1){m.value.forEach(r=>{r.setActiveMarkerPosition()});const l=t-i.items.slice(0,t).filter(r=>!("items"in r)).length;f.value.slice(l+1).forEach(r=>{r.reTriggerSetActiveGroup()})}return d({reTriggerSetActiveGroup:a}),(t,l)=>(e.openBlock(),e.createElementBlock("ul",C,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.items,(r,h)=>(e.openBlock(),e.createElementBlock(e.Fragment,null,[r&&"items"in r?(e.openBlock(),e.createElementBlock("li",M,[e.createVNode(P,{ref_for:!0,ref_key:"$groups",ref:f,"active-path":t.activePath,group:r,depth:t.depth+1,collapsible:t.collapsible,"link-component":t.linkComponent,onUpdateActivePosition:l[0]||(l[0]=o=>{n("updateActivePosition",o)}),onUpdateMarkerPosition:()=>{p.value?a(h):n("updateMarkerPosition")},onHideMarker:l[1]||(l[1]=o=>n("hideMarker"))},null,8,["active-path","group","depth","collapsible","link-component","onUpdateMarkerPosition"])])):(e.openBlock(),e.createBlock(v,{key:1,ref_for:!0,ref_key:"$items",ref:m,item:r,active:r.href===t.activePath,depth:t.depth,collapsible:t.collapsible,"link-component":t.linkComponent,"onUpdate:active":l[2]||(l[2]=(o,s)=>{if(s)t.depth<0?n("hideMarker"):n("updateActivePosition",s);else return})},null,8,["item","active","depth","collapsible","link-component"]))],64))),256))]))}});return e.defineComponent({__name:"DocMenu",props:{items:{},activePath:{default:void 0},collapsible:{type:Boolean,default:!0},linkComponent:{default:"a"}},setup(u){const d=e.ref(),c=e.ref(0),i=e.ref(36),n=e.ref(!1);function m({top:p,height:a}={height:0,top:0}){var l;const t=((l=d.value)==null?void 0:l.getBoundingClientRect().top)||0;c.value=p-t,i.value=a,n.value=!0}const f=e.ref(!1);return e.provide("transition-is-moving",f),(p,a)=>(e.openBlock(),e.createElementBlock("div",{ref_key:"$container",ref:d,class:"relative"},[n.value&&p.collapsible&&!f.value?(e.openBlock(),e.createElementBlock("div",{key:0,"data-cy":"doc-menu-active-marker",class:"absolute h-[36px] w-[4px] z-50 rounded-full bg-indigo-500 transition-all duration-300 ml-[6.5px] mt-[4px]",style:e.normalizeStyle({top:`${c.value}px`,height:`${i.value-8}px`})},null,4)):e.createCommentVNode("",!0),e.createVNode(b,{items:p.items,"active-path":p.activePath,collapsible:p.collapsible,"link-component":p.linkComponent,depth:-1,onUpdateActivePosition:m,onHideMarker:a[0]||(a[0]=t=>n.value=!1)},null,8,["items","active-path","collapsible","link-component"])],512))}})});
2
2
  //# sourceMappingURL=index.umd.js.map
3
3
 
4
- /* <wind-keep class="container relative absolute h-[36px] w-[4px] z-50 rounded-full bg-indigo-500 transition-all duration-300 ml-[6.5px] mt-[4px] filter list-none p-0 text-indigo-500 dark:text-indigo-400 text-gray-900 dark:text-gray-100 text-gray-800 dark:text-gray-200 rotate-0 -rotate-90 ml-[28px] grid grid-rows-[0fr] grid-rows-[1fr] overflow-hidden text-indigo-400 text-gray-100 text-gray-200 icon-dark-current block w-full pl-[24px] text-gray-700 dark:text-gray-500 py-[8px] text-[16px] leading-[24px] leading-[20px] text-[14px] py-[12px] left-[6.5px] top-[4px] bottom-[4px] z-10 hidden group-hover:block bg-gray-300 text-gray-500 left-0 transform transition-transform text-gray-400 dark:text-gray-700 flex py-[10px] items-center text-start font-medium pl-[48px] left-[8px] top-0 w-[1px] h-full bg-gray-100 dark:bg-gray-900"> */
4
+ /* <wind-keep class="container relative absolute h-[36px] w-[4px] z-50 rounded-full bg-indigo-500 transition-all duration-300 ml-[6.5px] mt-[4px] filter list-none p-0 text-indigo-500 dark:text-indigo-400 text-gray-900 dark:text-gray-100 text-gray-800 dark:text-gray-200 rotate-0 -rotate-90 grid grid-rows-[0fr] grid-rows-[1fr] overflow-hidden text-indigo-400 text-gray-100 text-gray-200 icon-dark-current block w-full pl-[24px] text-gray-700 dark:text-gray-500 py-[8px] text-[16px] leading-[24px] leading-[20px] text-[14px] py-[12px] left-[6.5px] top-[4px] bottom-[4px] z-10 hidden group-hover:block bg-gray-300 text-gray-500 left-0 transform transition-transform text-gray-400 dark:text-gray-700 flex py-[10px] items-center text-start font-medium pl-[48px] left-[8px] top-0 w-[1px] h-full bg-gray-100 dark:bg-gray-900"> */
@@ -1 +1 @@
1
- {"version":3,"file":"index.umd.js","sources":["../../constants/dist/index.js","../_DocGroup.vue","../_DocLink.vue","../_DocGroupElements.vue","../DocMenu.vue"],"sourcesContent":["export const classes = {\n expandedIcon: 'absolute left-0 transform transition-transform text-gray-400 dark:text-gray-700',\n button: 'flex leading-[24px] py-[10px] items-center relative w-full text-start',\n topButton: 'leading-[24px] text-[16px] pl-[24px] font-medium',\n leafButton: 'leading-[20px] text-[14px] pl-[48px]',\n openListBorderLeft: 'absolute left-[8px] top-0 w-[1px] h-full bg-gray-100 dark:bg-gray-900',\n};\n","<script lang=\"ts\" setup>\nimport { computed, type DefineComponent, ref, watch, inject } from 'vue'\nimport { IconChevronDownSmall } from '@cypress-design/vue-icon'\nimport { NavGroup, classes } from '@cypress-design/constants-docmenu'\nimport DocGroupElements, {\n hasActiveItemRecursively,\n type DocGroupEventsEmitted,\n} from './_DocGroupElements.vue'\n\nconst props = withDefaults(\n defineProps<{\n group: NavGroup\n activePath?: string\n collapsible: boolean\n linkComponent: DefineComponent | 'a'\n depth?: number\n }>(),\n {\n depth: 0,\n },\n)\n\nconst open = ref(props.group.collapsed !== true)\nconst $groupElements = ref<typeof DocGroupElements>()\nconst $listWrapper = ref<HTMLDivElement>()\n\nconst Head = computed(() =>\n props.collapsible ? 'button' : props.group.href ? 'a' : 'div',\n)\n\nconst emit = defineEmits<DocGroupEventsEmitted>()\n\nconst hasActiveItem = computed(() =>\n props.group.items.some((item) => {\n if ('items' in item) {\n return hasActiveItemRecursively(item.items, props.activePath)\n }\n return item.href === props.activePath\n }),\n)\n\nfunction reTriggerSetActiveGroup() {\n $groupElements.value?.reTriggerSetActiveGroup()\n}\n\nconst active = computed(() => props.group.href === props.activePath)\n\nconst markerIsMoving = inject('transition-is-moving', ref(false))\n\nwatch(active, (active) => {\n if (active) {\n emit('hideMarker')\n }\n})\n\nwatch(open, (open) => {\n if (hasActiveItem.value) {\n if (open) {\n reTriggerSetActiveGroup()\n } else {\n emit('hideMarker')\n }\n } else {\n emit('updateMarkerPosition')\n }\n})\n\ndefineExpose({\n reTriggerSetActiveGroup,\n})\n</script>\n\n<template>\n <component\n :is=\"Head\"\n :class=\"[\n classes.button,\n {\n [classes.topButton]: depth === 0,\n [classes.leafButton]: depth,\n 'text-indigo-500 dark:text-indigo-400': active,\n 'text-gray-900 dark:text-gray-100': hasActiveItem && !active,\n 'text-gray-800 dark:text-gray-200': !hasActiveItem && !active,\n },\n ]\"\n :href=\"group.href\"\n @click=\"\n () => {\n if (collapsible) {\n open = !open\n } else {\n emit('updateActivePosition')\n }\n }\n \"\n >\n <IconChevronDownSmall\n v-if=\"props.collapsible\"\n stroke-color=\"current\"\n :size=\"depth ? '8' : '16'\"\n :class=\"[\n classes.expandedIcon,\n {\n 'rotate-0': open,\n '-rotate-90': !open,\n 'ml-[28px]': depth,\n },\n ]\"\n />\n {{ group.label }}\n </component>\n <div\n class=\"grid transition-all relative\"\n ref=\"$listWrapper\"\n :class=\"{\n 'grid-rows-[0fr]': !open && collapsible,\n 'grid-rows-[1fr]': open || !collapsible,\n }\"\n @transitionstart=\"\n () => {\n markerIsMoving = true\n }\n \"\n @transitionend=\"\n () => {\n markerIsMoving = false\n if (open || !hasActiveItem) {\n emit('updateMarkerPosition')\n }\n }\n \"\n >\n <div\n v-if=\"open && collapsible && depth === 0\"\n :class=\"classes.openListBorderLeft\"\n />\n <DocGroupElements\n ref=\"$groupElements\"\n class=\"overflow-hidden\"\n :depth=\"depth\"\n :items=\"group.items\"\n :active-path=\"activePath\"\n :collapsible=\"collapsible\"\n :link-component=\"linkComponent\"\n @hide-marker=\"emit('hideMarker')\"\n @update-marker-position=\"() => emit('updateMarkerPosition')\"\n @update-active-position=\"\n (opts) => (open ? emit('updateActivePosition', opts) : null)\n \"\n />\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport {\n watch,\n type DefineComponent,\n ref,\n onMounted,\n inject,\n nextTick,\n} from 'vue'\nimport type { NavItemLink } from '@cypress-design/constants-docmenu'\n\nconst props = withDefaults(\n defineProps<{\n item: NavItemLink\n active: boolean\n collapsible: boolean\n depth?: number\n linkComponent: DefineComponent | 'a'\n }>(),\n {\n depth: -1,\n },\n)\n\nconst emit = defineEmits<{\n (\n event: 'update:active',\n active: boolean,\n opts?: { top: number; height: number },\n ): void\n}>()\n\nconst $container = ref<HTMLLIElement>()\n\nconst markerIsMoving = inject('transition-is-moving', ref(false))\n\nfunction setActiveMarkerPosition() {\n if (props.active) {\n nextTick(() => {\n const { top = 0, height = 36 } =\n $container.value?.getBoundingClientRect() ?? {}\n\n emit('update:active', props.active, {\n top,\n height,\n })\n })\n }\n}\n\nonMounted(() => {\n watch(\n () => props.active,\n (active) => {\n if (active) {\n setActiveMarkerPosition()\n } else {\n emit('update:active', active)\n }\n },\n { immediate: true },\n )\n})\n\ndefineExpose({\n setActiveMarkerPosition,\n})\n</script>\n\n<template>\n <li ref=\"$container\" class=\"list-none p-0\">\n <component\n :is=\"linkComponent\"\n class=\"group relative block w-full pl-[24px]\"\n :class=\"{\n 'text-indigo-500 dark:text-indigo-400': active,\n 'text-gray-700 dark:text-gray-500': !active,\n 'py-[8px] text-[16px] leading-[24px]': depth < 0,\n 'leading-[20px] text-[14px] py-[12px]': depth >= 0,\n }\"\n :style=\"{\n paddingLeft: depth >= 0 ? `${depth * 12 + 48}px` : undefined,\n }\"\n :href=\"item.href\"\n >\n <div\n v-if=\"depth >= 0\"\n class=\"left-[6.5px] absolute top-[4px] bottom-[4px] w-[4px] z-10 rounded-full\"\n :class=\"{\n hidden: !markerIsMoving || !active,\n 'group-hover:block bg-gray-300': !active && collapsible,\n 'bg-indigo-500': active && markerIsMoving,\n }\"\n />\n {{ item.label }}\n </component>\n </li>\n</template>\n","<script lang=\"ts\">\nexport function hasActiveItemRecursively(\n items: (NavGroup | NavItemLink)[],\n activePath?: string,\n): boolean {\n return items.some((item) => {\n if ('items' in item) {\n return hasActiveItemRecursively(item.items, activePath)\n }\n return item.href === activePath\n })\n}\n\nexport interface DocGroupEventsEmitted {\n /**\n * If the group is not collapsed, this event will emit the\n * active marker position all the way to the menu component\n */\n (event: 'updateActivePosition', opts?: { top: number; height: number }): void\n /**\n * This event will trigger a re-render of the active marker\n * to update its position if not in the current subtree\n */\n (event: 'updateMarkerPosition'): void\n /**\n * This event will bubble-up and hide the active marker\n */\n (event: 'hideMarker'): void\n}\n</script>\n\n<script lang=\"ts\" setup>\nimport { DefineComponent, computed, ref } from 'vue'\nimport { NavGroup, NavItemLink } from '@cypress-design/constants-docmenu'\nimport DocGroup from './_DocGroup.vue'\nimport DocLink from './_DocLink.vue'\n\nconst props = defineProps<{\n items: (NavGroup | NavItemLink)[]\n activePath?: string\n collapsible: boolean\n linkComponent: DefineComponent | 'a'\n depth: number\n}>()\n\nconst emit = defineEmits<DocGroupEventsEmitted>()\n\nconst $items = ref<(typeof DocLink)[]>([])\nconst $groups = ref<(typeof DocGroup)[]>([])\n\nconst hasActiveItem = computed(() =>\n props.items.some((item) => {\n if ('items' in item) {\n return hasActiveItemRecursively(item.items, props.activePath)\n }\n return item.href === props.activePath\n }),\n)\n\n/**\n * update the position of the marker when opening a group\n * @param index\n */\nfunction reTriggerSetActiveGroup(index = -1) {\n $items.value.forEach((item) => {\n item.setActiveMarkerPosition()\n })\n\n // calculate the index of the calling group in the list of groups\n const indexGroup =\n index -\n // remove all the items that are not groups from the array and count them\n props.items.slice(0, index).filter((item) => !('items' in item)).length\n\n // only update groups that come after the toggled one\n // others will not need to update the marker\n // since they are \"before\" in the rendering tree\n $groups.value.slice(indexGroup + 1).forEach((group) => {\n group.reTriggerSetActiveGroup()\n })\n}\n\ndefineExpose({\n reTriggerSetActiveGroup,\n})\n</script>\n\n<template>\n <ul class=\"list-none p-0\">\n <template v-for=\"(item, index) in items\">\n <li class=\"relative list-none p-0\" v-if=\"item && 'items' in item\">\n <DocGroup\n ref=\"$groups\"\n :active-path=\"activePath\"\n :group=\"item\"\n :depth=\"depth + 1\"\n :collapsible=\"collapsible\"\n :link-component=\"linkComponent\"\n @update-active-position=\"\n (opts) => {\n emit('updateActivePosition', opts)\n }\n \"\n @update-marker-position=\"\n () => {\n if (hasActiveItem) {\n reTriggerSetActiveGroup(index)\n } else {\n emit('updateMarkerPosition')\n }\n }\n \"\n @hide-marker=\"emit('hideMarker')\"\n />\n </li>\n <DocLink\n v-else\n ref=\"$items\"\n :item=\"item\"\n :active=\"item.href === activePath\"\n :depth=\"depth\"\n :collapsible=\"collapsible\"\n :link-component=\"linkComponent\"\n @update:active=\"\n (_, opts) => {\n if (!opts) {\n return\n } else if (depth < 0) {\n emit('hideMarker')\n } else {\n emit('updateActivePosition', opts)\n }\n }\n \"\n />\n </template>\n </ul>\n</template>\n","<script lang=\"ts\" setup>\nimport { ref, type DefineComponent, provide } from 'vue'\nimport { NavGroup, NavItemLink } from '@cypress-design/constants-docmenu'\nimport DocGroupElements from './_DocGroupElements.vue'\n\nwithDefaults(\n defineProps<{\n items: (NavItemLink | NavGroup)[]\n activePath?: string\n collapsible?: boolean\n linkComponent?: DefineComponent | 'a'\n }>(),\n {\n linkComponent: 'a',\n collapsible: true,\n activePath: undefined,\n },\n)\n\nconst $container = ref<HTMLDivElement>()\n\nconst activeTop = ref(0)\nconst activeHeight = ref(36)\nconst showMarker = ref(false)\n\nfunction updateActiveMarkerPosition({ top, height } = { height: 0, top: 0 }) {\n const containerTop = $container.value?.getBoundingClientRect().top || 0\n activeTop.value = top - containerTop\n activeHeight.value = height\n showMarker.value = true\n}\n\nconst markerIsMoving = ref(false)\n\nprovide('transition-is-moving', markerIsMoving)\n</script>\n\n<template>\n <div ref=\"$container\" class=\"relative\">\n <div\n v-if=\"showMarker && collapsible && !markerIsMoving\"\n data-cy=\"doc-menu-active-marker\"\n class=\"absolute h-[36px] w-[4px] z-50 rounded-full bg-indigo-500 transition-all duration-300 ml-[6.5px] mt-[4px]\"\n :style=\"{\n top: `${activeTop}px`,\n height: `${activeHeight - 8}px`,\n }\"\n />\n <DocGroupElements\n :items=\"items\"\n :active-path=\"activePath\"\n :collapsible=\"collapsible\"\n :link-component=\"linkComponent\"\n :depth=\"-1\"\n @update-active-position=\"updateActiveMarkerPosition\"\n @hide-marker=\"showMarker = false\"\n />\n </div>\n</template>\n"],"names":["classes","props","__props","open","ref","$groupElements","$listWrapper","Head","computed","emit","__emit","hasActiveItem","item","hasActiveItemRecursively","reTriggerSetActiveGroup","_a","active","markerIsMoving","inject","watch","__expose","$container","setActiveMarkerPosition","nextTick","top","height","onMounted","items","activePath","$items","$groups","index","indexGroup","group","activeTop","activeHeight","showMarker","updateActiveMarkerPosition","containerTop","provide"],"mappings":"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"}
1
+ {"version":3,"file":"index.umd.js","sources":["../../constants/dist/index.js","../_DocGroup.vue","../_DocLink.vue","../_DocGroupElements.vue","../DocMenu.vue"],"sourcesContent":["export const classes = {\n expandedIcon: 'absolute left-0 transform transition-transform text-gray-400 dark:text-gray-700',\n button: 'flex leading-[24px] py-[10px] items-center relative w-full text-start',\n topButton: 'leading-[24px] text-[16px] pl-[24px] font-medium',\n leafButton: 'leading-[20px] text-[14px] pl-[48px]',\n openListBorderLeft: 'absolute left-[8px] top-0 w-[1px] h-full bg-gray-100 dark:bg-gray-900',\n};\n","<script lang=\"ts\" setup>\nimport { computed, type DefineComponent, ref, watch, inject } from 'vue'\nimport { IconChevronDownSmall } from '@cypress-design/vue-icon'\nimport { NavGroup, classes } from '@cypress-design/constants-docmenu'\nimport DocGroupElements, {\n hasActiveItemRecursively,\n type DocGroupEventsEmitted,\n} from './_DocGroupElements.vue'\n\nconst props = withDefaults(\n defineProps<{\n group: NavGroup\n activePath?: string\n collapsible: boolean\n linkComponent: DefineComponent | 'a'\n depth?: number\n }>(),\n {\n depth: 0,\n },\n)\n\nconst open = ref(props.group.collapsed !== true)\nconst $groupElements = ref<typeof DocGroupElements>()\nconst $listWrapper = ref<HTMLDivElement>()\n\nconst Head = computed(() =>\n props.collapsible ? 'button' : props.group.href ? 'a' : 'div',\n)\n\nconst emit = defineEmits<DocGroupEventsEmitted>()\n\nconst hasActiveItem = computed(() =>\n props.group.items.some((item) => {\n if ('items' in item) {\n return hasActiveItemRecursively(item.items, props.activePath)\n }\n return item.href === props.activePath\n }),\n)\n\nfunction reTriggerSetActiveGroup() {\n $groupElements.value?.reTriggerSetActiveGroup()\n}\n\nconst active = computed(() => props.group.href === props.activePath)\n\nconst markerIsMoving = inject('transition-is-moving', ref(false))\n\nwatch(active, (active) => {\n if (active) {\n emit('hideMarker')\n }\n})\n\nwatch(open, (open) => {\n if (hasActiveItem.value) {\n if (open) {\n reTriggerSetActiveGroup()\n } else {\n emit('hideMarker')\n }\n } else {\n emit('updateMarkerPosition')\n }\n})\n\nwatch(\n () => props.activePath,\n () => {\n if (hasActiveItem.value && !open.value) {\n open.value = true\n }\n },\n)\n\ndefineExpose({\n reTriggerSetActiveGroup,\n})\n</script>\n\n<template>\n <component\n :is=\"Head\"\n :class=\"[\n classes.button,\n {\n [classes.topButton]: depth === 0,\n [classes.leafButton]: depth,\n 'text-indigo-500 dark:text-indigo-400': active,\n 'text-gray-900 dark:text-gray-100': hasActiveItem && !active,\n 'text-gray-800 dark:text-gray-200': !hasActiveItem && !active,\n },\n ]\"\n :style=\"{\n paddingLeft: depth >= 1 ? `${(depth - 1) * 12 + 48}px` : undefined,\n }\"\n :href=\"group.href\"\n @click=\"\n () => {\n if (collapsible) {\n open = !open\n } else {\n emit('updateActivePosition')\n }\n }\n \"\n >\n <IconChevronDownSmall\n v-if=\"props.collapsible\"\n stroke-color=\"current\"\n :size=\"depth ? '8' : '16'\"\n :class=\"[\n classes.expandedIcon,\n {\n 'rotate-0': open,\n '-rotate-90': !open,\n },\n ]\"\n :style=\"{\n marginLeft: depth >= 1 ? `${(depth - 1) * 12 + 28}px` : undefined,\n }\"\n />\n {{ group.label }}\n </component>\n <div\n class=\"grid transition-all relative\"\n ref=\"$listWrapper\"\n :class=\"{\n 'grid-rows-[0fr]': !open && collapsible,\n 'grid-rows-[1fr]': open || !collapsible,\n }\"\n @transitionstart=\"\n () => {\n markerIsMoving = true\n }\n \"\n @transitionend=\"\n () => {\n markerIsMoving = false\n if (open || !hasActiveItem) {\n emit('updateMarkerPosition')\n }\n }\n \"\n >\n <div\n v-if=\"open && collapsible && depth === 0\"\n :class=\"classes.openListBorderLeft\"\n />\n <DocGroupElements\n ref=\"$groupElements\"\n class=\"overflow-hidden\"\n :depth=\"depth\"\n :items=\"group.items\"\n :active-path=\"activePath\"\n :collapsible=\"collapsible\"\n :link-component=\"linkComponent\"\n @hide-marker=\"emit('hideMarker')\"\n @update-marker-position=\"() => emit('updateMarkerPosition')\"\n @update-active-position=\"\n (opts) => (open ? emit('updateActivePosition', opts) : null)\n \"\n />\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport {\n watch,\n type DefineComponent,\n ref,\n onMounted,\n inject,\n nextTick,\n computed,\n} from 'vue'\nimport type { NavItemLink } from '@cypress-design/constants-docmenu'\n\nconst props = withDefaults(\n defineProps<{\n item: NavItemLink\n active: boolean\n collapsible: boolean\n depth?: number\n linkComponent: DefineComponent | 'a'\n }>(),\n {\n depth: -1,\n },\n)\n\nconst emit = defineEmits<{\n (\n event: 'update:active',\n active: boolean,\n opts?: { top: number; height: number },\n ): void\n}>()\n\nconst $container = ref<HTMLLIElement>()\n\nconst markerIsMoving = inject('transition-is-moving', ref(false))\n\nfunction setActiveMarkerPosition() {\n if (props.active) {\n nextTick(() => {\n const { top = 0, height = 36 } =\n $container.value?.getBoundingClientRect() ?? {}\n\n emit('update:active', props.active, {\n top,\n height,\n })\n })\n }\n}\n\nonMounted(() => {\n watch(\n () => props.active,\n (active) => {\n if (active) {\n setActiveMarkerPosition()\n } else {\n emit('update:active', active)\n }\n },\n { immediate: true },\n )\n})\n\ndefineExpose({\n setActiveMarkerPosition,\n})\n\nconst itemWithoutLabel = computed(() => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { label, ...rest } = props.item\n return rest\n})\n</script>\n\n<template>\n <li ref=\"$container\" class=\"list-none p-0\">\n <component\n :is=\"linkComponent\"\n v-bind=\"itemWithoutLabel\"\n class=\"group relative block w-full pl-[24px]\"\n :class=\"{\n 'text-indigo-500 dark:text-indigo-400': active,\n 'text-gray-700 dark:text-gray-500': !active,\n 'py-[8px] text-[16px] leading-[24px]': depth < 0,\n 'leading-[20px] text-[14px] py-[12px]': depth >= 0,\n }\"\n :style=\"{\n paddingLeft: depth >= 0 ? `${depth * 12 + 48}px` : undefined,\n }\"\n >\n <div\n v-if=\"depth >= 0\"\n class=\"left-[6.5px] absolute top-[4px] bottom-[4px] w-[4px] z-10 rounded-full\"\n :class=\"{\n hidden: !markerIsMoving || !active,\n 'group-hover:block bg-gray-300': !active && collapsible,\n 'bg-indigo-500': active && markerIsMoving,\n }\"\n />\n {{ item.label }}\n </component>\n </li>\n</template>\n","<script lang=\"ts\">\nexport function hasActiveItemRecursively(\n items: (NavGroup | NavItemLink)[],\n activePath?: string,\n): boolean {\n return items.some((item) => {\n if ('items' in item) {\n return hasActiveItemRecursively(item.items, activePath)\n }\n return item.href === activePath\n })\n}\n\nexport interface DocGroupEventsEmitted {\n /**\n * If the group is not collapsed, this event will emit the\n * active marker position all the way to the menu component\n */\n (event: 'updateActivePosition', opts?: { top: number; height: number }): void\n /**\n * This event will trigger a re-render of the active marker\n * to update its position if not in the current subtree\n */\n (event: 'updateMarkerPosition'): void\n /**\n * This event will bubble-up and hide the active marker\n */\n (event: 'hideMarker'): void\n}\n</script>\n\n<script lang=\"ts\" setup>\nimport { DefineComponent, computed, ref } from 'vue'\nimport { NavGroup, NavItemLink } from '@cypress-design/constants-docmenu'\nimport DocGroup from './_DocGroup.vue'\nimport DocLink from './_DocLink.vue'\n\nconst props = defineProps<{\n items: (NavGroup | NavItemLink)[]\n activePath?: string\n collapsible: boolean\n linkComponent: DefineComponent | 'a'\n depth: number\n}>()\n\nconst emit = defineEmits<DocGroupEventsEmitted>()\n\nconst $items = ref<(typeof DocLink)[]>([])\nconst $groups = ref<(typeof DocGroup)[]>([])\n\nconst hasActiveItem = computed(() =>\n props.items.some((item) => {\n if ('items' in item) {\n return hasActiveItemRecursively(item.items, props.activePath)\n }\n return item.href === props.activePath\n }),\n)\n\n/**\n * update the position of the marker when opening a group\n * @param index\n */\nfunction reTriggerSetActiveGroup(index = -1) {\n $items.value.forEach((item) => {\n item.setActiveMarkerPosition()\n })\n\n // calculate the index of the calling group in the list of groups\n const indexGroup =\n index -\n // remove all the items that are not groups from the array and count them\n props.items.slice(0, index).filter((item) => !('items' in item)).length\n\n // only update groups that come after the toggled one\n // others will not need to update the marker\n // since they are \"before\" in the rendering tree\n $groups.value.slice(indexGroup + 1).forEach((group) => {\n group.reTriggerSetActiveGroup()\n })\n}\n\ndefineExpose({\n reTriggerSetActiveGroup,\n})\n</script>\n\n<template>\n <ul class=\"list-none p-0\">\n <template v-for=\"(item, index) in items\">\n <li class=\"relative list-none p-0\" v-if=\"item && 'items' in item\">\n <DocGroup\n ref=\"$groups\"\n :active-path=\"activePath\"\n :group=\"item\"\n :depth=\"depth + 1\"\n :collapsible=\"collapsible\"\n :link-component=\"linkComponent\"\n @update-active-position=\"\n (opts) => {\n emit('updateActivePosition', opts)\n }\n \"\n @update-marker-position=\"\n () => {\n if (hasActiveItem) {\n reTriggerSetActiveGroup(index)\n } else {\n emit('updateMarkerPosition')\n }\n }\n \"\n @hide-marker=\"emit('hideMarker')\"\n />\n </li>\n <DocLink\n v-else\n ref=\"$items\"\n :item=\"item\"\n :active=\"item.href === activePath\"\n :depth=\"depth\"\n :collapsible=\"collapsible\"\n :link-component=\"linkComponent\"\n @update:active=\"\n (_, opts) => {\n if (!opts) {\n return\n } else if (depth < 0) {\n emit('hideMarker')\n } else {\n emit('updateActivePosition', opts)\n }\n }\n \"\n />\n </template>\n </ul>\n</template>\n","<script lang=\"ts\" setup>\nimport { ref, type DefineComponent, provide } from 'vue'\nimport { NavGroup, NavItemLink } from '@cypress-design/constants-docmenu'\nimport DocGroupElements from './_DocGroupElements.vue'\n\nwithDefaults(\n defineProps<{\n items: (NavItemLink | NavGroup)[]\n activePath?: string\n collapsible?: boolean\n linkComponent?: DefineComponent | 'a'\n }>(),\n {\n linkComponent: 'a',\n collapsible: true,\n activePath: undefined,\n },\n)\n\nconst $container = ref<HTMLDivElement>()\n\nconst activeTop = ref(0)\nconst activeHeight = ref(36)\nconst showMarker = ref(false)\n\nfunction updateActiveMarkerPosition({ top, height } = { height: 0, top: 0 }) {\n const containerTop = $container.value?.getBoundingClientRect().top || 0\n activeTop.value = top - containerTop\n activeHeight.value = height\n showMarker.value = true\n}\n\nconst markerIsMoving = ref(false)\n\nprovide('transition-is-moving', markerIsMoving)\n</script>\n\n<template>\n <div ref=\"$container\" class=\"relative\">\n <div\n v-if=\"showMarker && collapsible && !markerIsMoving\"\n data-cy=\"doc-menu-active-marker\"\n class=\"absolute h-[36px] w-[4px] z-50 rounded-full bg-indigo-500 transition-all duration-300 ml-[6.5px] mt-[4px]\"\n :style=\"{\n top: `${activeTop}px`,\n height: `${activeHeight - 8}px`,\n }\"\n />\n <DocGroupElements\n :items=\"items\"\n :active-path=\"activePath\"\n :collapsible=\"collapsible\"\n :link-component=\"linkComponent\"\n :depth=\"-1\"\n @update-active-position=\"updateActiveMarkerPosition\"\n @hide-marker=\"showMarker = false\"\n />\n </div>\n</template>\n"],"names":["classes","props","__props","open","ref","$groupElements","$listWrapper","Head","computed","emit","__emit","hasActiveItem","item","hasActiveItemRecursively","reTriggerSetActiveGroup","_a","active","markerIsMoving","inject","watch","__expose","$container","setActiveMarkerPosition","nextTick","top","height","onMounted","itemWithoutLabel","label","rest","items","activePath","$items","$groups","index","indexGroup","group","activeTop","activeHeight","showMarker","updateActiveMarkerPosition","containerTop","provide"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cypress-design/vue-docmenu",
3
- "version": "0.5.1",
3
+ "version": "0.5.3",
4
4
  "files": [
5
5
  "*"
6
6
  ],
@@ -21,7 +21,7 @@
21
21
  },
22
22
  "dependencies": {
23
23
  "@cypress-design/constants-docmenu": "^0.2.0",
24
- "@cypress-design/vue-icon": "^0.31.2"
24
+ "@cypress-design/vue-icon": "^0.32.0"
25
25
  },
26
26
  "devDependencies": {
27
27
  "@cypress-design/rollup-plugin-tailwind-keep": "*"