@abraca/nuxt 1.8.2 → 1.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +27 -2
- package/dist/module.json +1 -1
- package/dist/module.mjs +42 -4
- package/dist/runtime/components/docs/ADocsNavigation.d.vue.ts +155 -0
- package/dist/runtime/components/docs/ADocsNavigation.vue +154 -0
- package/dist/runtime/components/docs/ADocsNavigation.vue.d.ts +155 -0
- package/dist/runtime/components/docs/ADocsSearch.d.vue.ts +249 -0
- package/dist/runtime/components/docs/ADocsSearch.vue +187 -0
- package/dist/runtime/components/docs/ADocsSearch.vue.d.ts +249 -0
- package/dist/runtime/components/docs/ADocsSearchButton.d.vue.ts +253 -0
- package/dist/runtime/components/docs/ADocsSearchButton.vue +99 -0
- package/dist/runtime/components/docs/ADocsSearchButton.vue.d.ts +253 -0
- package/dist/runtime/components/docs/ADocsSurround.d.vue.ts +56 -0
- package/dist/runtime/components/docs/ADocsSurround.vue +68 -0
- package/dist/runtime/components/docs/ADocsSurround.vue.d.ts +56 -0
- package/dist/runtime/components/docs/ADocsToc.d.vue.ts +117 -0
- package/dist/runtime/components/docs/ADocsToc.vue +194 -0
- package/dist/runtime/components/docs/ADocsToc.vue.d.ts +117 -0
- package/dist/runtime/components/editor/ADocLinkPopover.vue +1 -5
- package/dist/runtime/components/renderers/AMediaRenderer.vue +1 -1
- package/dist/runtime/components/shell/ADocPanelSettings.d.vue.ts +32 -2
- package/dist/runtime/components/shell/ADocPanelSettings.vue +289 -2
- package/dist/runtime/components/shell/ADocPanelSettings.vue.d.ts +32 -2
- package/dist/runtime/composables/useDocsSearch.d.ts +24 -0
- package/dist/runtime/composables/useDocsSearch.js +34 -0
- package/dist/runtime/extensions/doc-embed.js +2 -1
- package/dist/runtime/extensions/doc-link-drop.js +4 -4
- package/dist/runtime/extensions/doc-link.d.ts +12 -0
- package/dist/runtime/extensions/doc-link.js +60 -0
- package/dist/runtime/extensions/views/DocEmbedView.vue +18 -3
- package/dist/runtime/extensions/views/DocLinkView.d.vue.ts +4 -0
- package/dist/runtime/extensions/views/DocLinkView.vue +71 -0
- package/dist/runtime/extensions/views/DocLinkView.vue.d.ts +4 -0
- package/dist/runtime/plugin-abracadabra.client.js +18 -2
- package/dist/runtime/plugins/core.plugin.js +3 -0
- package/dist/runtime/server/plugins/abracadabra-service.js +3 -1
- package/dist/runtime/theme/content/_shared.d.ts +6 -0
- package/dist/runtime/theme/content/_shared.js +6 -0
- package/dist/runtime/theme/content/content-navigation.d.ts +120 -0
- package/dist/runtime/theme/content/content-navigation.js +155 -0
- package/dist/runtime/theme/content/content-search-button.d.ts +16 -0
- package/dist/runtime/theme/content/content-search-button.js +15 -0
- package/dist/runtime/theme/content/content-search.d.ts +24 -0
- package/dist/runtime/theme/content/content-search.js +23 -0
- package/dist/runtime/theme/content/content-surround.d.ts +22 -0
- package/dist/runtime/theme/content/content-surround.js +23 -0
- package/dist/runtime/theme/content/content-toc.d.ts +84 -0
- package/dist/runtime/theme/content/content-toc.js +94 -0
- package/dist/runtime/theme/content/index.d.ts +5 -0
- package/dist/runtime/theme/content/index.js +5 -0
- package/dist/runtime/utils/content.d.ts +19 -0
- package/dist/runtime/utils/content.js +23 -0
- package/dist/runtime/utils/docReferenceEdges.js +1 -1
- package/package.json +14 -7
package/README.md
CHANGED
|
@@ -216,7 +216,7 @@ pnpm install
|
|
|
216
216
|
# Generate type stubs
|
|
217
217
|
pnpm dev:prepare
|
|
218
218
|
|
|
219
|
-
# Develop with the playground
|
|
219
|
+
# Develop with the playground (one route per module feature)
|
|
220
220
|
pnpm dev
|
|
221
221
|
|
|
222
222
|
# Build
|
|
@@ -225,11 +225,36 @@ pnpm prepack
|
|
|
225
225
|
# Lint
|
|
226
226
|
pnpm lint
|
|
227
227
|
|
|
228
|
-
#
|
|
228
|
+
# Unit + integration tests (requires a running abracadabra-rs at $ABRACADABRA_URL for integration)
|
|
229
229
|
pnpm test
|
|
230
230
|
pnpm test:watch
|
|
231
|
+
pnpm test:integration
|
|
232
|
+
|
|
233
|
+
# Browser E2E (Playwright against a real spawned abracadabra-rs + abracadabra-aperio)
|
|
234
|
+
pnpm test:e2e # headless
|
|
235
|
+
pnpm test:e2e:headed # headed debug
|
|
236
|
+
pnpm test:e2e:ui # Playwright UI mode
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
### E2E setup
|
|
240
|
+
|
|
241
|
+
`pnpm test:e2e` drives Chromium against a freshly-spawned `abracadabra-rs`
|
|
242
|
+
(release binary) and `abracadabra-aperio` (Nuxt dev) — no mocks. The sibling
|
|
243
|
+
repos must be checked out next to this one:
|
|
244
|
+
|
|
245
|
+
```
|
|
246
|
+
Abracadabra/
|
|
247
|
+
├── abracadabra-nuxt/ (this repo)
|
|
248
|
+
├── abracadabra-rs/ # build: cargo build --release -p abracadabra-server
|
|
249
|
+
└── abracadabra-aperio/ # consumer app under test
|
|
231
250
|
```
|
|
232
251
|
|
|
252
|
+
The test harness listens on port **3300** for aperio. Keep that free. Set
|
|
253
|
+
`E2E_VERBOSE=1` to stream rs + aperio logs alongside test output — useful
|
|
254
|
+
when a test is surprising you.
|
|
255
|
+
|
|
256
|
+
The `playground/` directory is a focused, multi-page sandbox — one route per module feature — used to develop and visually verify the module in isolation. For a full reference application that exercises the entire module surface (auth, spaces, chat, file transfer, settings, etc.), see [`abracadabra-aperio`](../abracadabra-aperio), the open-source dashboard built on top of `@abraca/nuxt`.
|
|
257
|
+
|
|
233
258
|
<!-- Badges -->
|
|
234
259
|
[npm-version-src]: https://img.shields.io/npm/v/@abraca/nuxt/latest.svg?style=flat&colorA=020420&colorB=00DC82
|
|
235
260
|
[npm-version-href]: https://npmjs.com/package/@abraca/nuxt
|
package/dist/module.json
CHANGED
package/dist/module.mjs
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { createRequire } from 'node:module';
|
|
1
2
|
import { defineNuxtModule, createResolver, addPlugin, addImportsDir, addImports, addComponentsDir, addServerHandler, addRouteMiddleware, addServerPlugin, addServerImportsDir } from '@nuxt/kit';
|
|
2
3
|
import { defu } from 'defu';
|
|
3
4
|
export { buildSlugMap, isUUID, slugify } from '../dist/runtime/utils/slugify.js';
|
|
@@ -118,6 +119,9 @@ const module$1 = defineNuxtModule({
|
|
|
118
119
|
"prosemirror-dropcursor",
|
|
119
120
|
"prosemirror-commands",
|
|
120
121
|
"prosemirror-tables",
|
|
122
|
+
// y-prosemirror is transitive via @tiptap/extension-collaboration — dedupe
|
|
123
|
+
// is still valuable (prevents two copies if the app happens to install it
|
|
124
|
+
// directly), and Vite dedupe silently skips entries it can't resolve.
|
|
121
125
|
"y-prosemirror",
|
|
122
126
|
"yjs",
|
|
123
127
|
"y-protocols",
|
|
@@ -162,7 +166,8 @@ const module$1 = defineNuxtModule({
|
|
|
162
166
|
}
|
|
163
167
|
nuxt.options.vite.optimizeDeps = defu(nuxt.options.vite.optimizeDeps, { include: [] });
|
|
164
168
|
const includeList = nuxt.options.vite.optimizeDeps.include ?? [];
|
|
165
|
-
const
|
|
169
|
+
const prebundleDeps = [
|
|
170
|
+
// ProseMirror core (re-exported by @tiptap/pm)
|
|
166
171
|
"prosemirror-view",
|
|
167
172
|
"prosemirror-state",
|
|
168
173
|
"prosemirror-model",
|
|
@@ -175,17 +180,44 @@ const module$1 = defineNuxtModule({
|
|
|
175
180
|
"prosemirror-inputrules",
|
|
176
181
|
"prosemirror-history",
|
|
177
182
|
"prosemirror-schema-list",
|
|
178
|
-
|
|
183
|
+
// TipTap core + Vue binding (shared globals plugin)
|
|
184
|
+
"@tiptap/core",
|
|
185
|
+
"@tiptap/vue-3",
|
|
186
|
+
"@tiptap/starter-kit",
|
|
187
|
+
// TipTap extensions used by core.plugin.ts
|
|
179
188
|
"@tiptap/extension-table",
|
|
180
189
|
"@tiptap/extension-table-row",
|
|
181
190
|
"@tiptap/extension-table-header",
|
|
182
191
|
"@tiptap/extension-table-cell",
|
|
183
192
|
"@tiptap/extension-collaboration",
|
|
184
193
|
"@tiptap/extension-collaboration-caret",
|
|
194
|
+
"@tiptap/extension-task-list",
|
|
195
|
+
"@tiptap/extension-task-item",
|
|
196
|
+
"@tiptap/extension-character-count",
|
|
197
|
+
"@tiptap/extension-text-align",
|
|
198
|
+
"@tiptap/extension-highlight",
|
|
199
|
+
"@tiptap/extension-color",
|
|
200
|
+
"@tiptap/extension-text-style",
|
|
201
|
+
"@tiptap/extension-superscript",
|
|
202
|
+
"@tiptap/extension-subscript",
|
|
203
|
+
"@tiptap/extension-code-block-lowlight",
|
|
204
|
+
"lowlight",
|
|
205
|
+
// Yjs + provider deps (shared globals + client plugin)
|
|
206
|
+
"yjs",
|
|
207
|
+
"@abraca/dabra",
|
|
208
|
+
"@noble/ed25519",
|
|
209
|
+
"@noble/hashes/sha512",
|
|
210
|
+
// Composable + util deps
|
|
211
|
+
"@vueuse/core",
|
|
185
212
|
"nanoevents"
|
|
186
213
|
];
|
|
214
|
+
try {
|
|
215
|
+
createRequire(`${nuxt.options.rootDir}/`).resolve("jszip");
|
|
216
|
+
prebundleDeps.push("jszip");
|
|
217
|
+
} catch {
|
|
218
|
+
}
|
|
187
219
|
nuxt.options.vite.optimizeDeps.include = [
|
|
188
|
-
.../* @__PURE__ */ new Set([...includeList, ...
|
|
220
|
+
.../* @__PURE__ */ new Set([...includeList, ...prebundleDeps])
|
|
189
221
|
];
|
|
190
222
|
if (options.features?.editor !== false) {
|
|
191
223
|
nuxt.options.css.push(resolver.resolve("./runtime/assets/editor.css"));
|
|
@@ -273,6 +305,11 @@ const module$1 = defineNuxtModule({
|
|
|
273
305
|
prefix: options.prefix ?? "",
|
|
274
306
|
pathPrefix: false
|
|
275
307
|
});
|
|
308
|
+
addComponentsDir({
|
|
309
|
+
path: resolver.resolve("./runtime/components/docs"),
|
|
310
|
+
prefix: options.prefix ?? "",
|
|
311
|
+
pathPrefix: false
|
|
312
|
+
});
|
|
276
313
|
if (options.features?.chat) {
|
|
277
314
|
addComponentsDir({
|
|
278
315
|
path: resolver.resolve("./runtime/components/chat"),
|
|
@@ -282,7 +319,8 @@ const module$1 = defineNuxtModule({
|
|
|
282
319
|
}
|
|
283
320
|
addComponentsDir({
|
|
284
321
|
path: resolver.resolve("./runtime/components"),
|
|
285
|
-
prefix: options.prefix ?? ""
|
|
322
|
+
prefix: options.prefix ?? "",
|
|
323
|
+
ignore: ["**/docs/**"]
|
|
286
324
|
});
|
|
287
325
|
if (options.server?.render !== false) {
|
|
288
326
|
addServerHandler({
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
declare const _default: typeof __VLS_export;
|
|
2
|
+
export default _default;
|
|
3
|
+
declare const __VLS_export: __VLS_WithSlots<import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
|
4
|
+
as: {
|
|
5
|
+
type: null;
|
|
6
|
+
required: false;
|
|
7
|
+
default: string;
|
|
8
|
+
};
|
|
9
|
+
defaultOpen: {
|
|
10
|
+
type: BooleanConstructor;
|
|
11
|
+
required: false;
|
|
12
|
+
default: undefined;
|
|
13
|
+
};
|
|
14
|
+
trailingIcon: {
|
|
15
|
+
type: null;
|
|
16
|
+
required: false;
|
|
17
|
+
};
|
|
18
|
+
color: {
|
|
19
|
+
type: null;
|
|
20
|
+
required: false;
|
|
21
|
+
};
|
|
22
|
+
variant: {
|
|
23
|
+
type: null;
|
|
24
|
+
required: false;
|
|
25
|
+
};
|
|
26
|
+
highlight: {
|
|
27
|
+
type: BooleanConstructor;
|
|
28
|
+
required: false;
|
|
29
|
+
default: boolean;
|
|
30
|
+
};
|
|
31
|
+
highlightColor: {
|
|
32
|
+
type: null;
|
|
33
|
+
required: false;
|
|
34
|
+
};
|
|
35
|
+
collapsible: {
|
|
36
|
+
type: BooleanConstructor;
|
|
37
|
+
required: false;
|
|
38
|
+
default: boolean;
|
|
39
|
+
};
|
|
40
|
+
level: {
|
|
41
|
+
type: NumberConstructor;
|
|
42
|
+
required: false;
|
|
43
|
+
default: number;
|
|
44
|
+
};
|
|
45
|
+
navigation: {
|
|
46
|
+
type: ArrayConstructor;
|
|
47
|
+
required: false;
|
|
48
|
+
};
|
|
49
|
+
class: {
|
|
50
|
+
type: null;
|
|
51
|
+
required: false;
|
|
52
|
+
};
|
|
53
|
+
ui: {
|
|
54
|
+
type: ObjectConstructor;
|
|
55
|
+
required: false;
|
|
56
|
+
};
|
|
57
|
+
disabled: {
|
|
58
|
+
type: BooleanConstructor;
|
|
59
|
+
required: false;
|
|
60
|
+
};
|
|
61
|
+
type: {
|
|
62
|
+
type: StringConstructor;
|
|
63
|
+
required: false;
|
|
64
|
+
default: string;
|
|
65
|
+
};
|
|
66
|
+
unmountOnHide: {
|
|
67
|
+
type: BooleanConstructor;
|
|
68
|
+
required: false;
|
|
69
|
+
default: boolean;
|
|
70
|
+
};
|
|
71
|
+
}>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
72
|
+
"update:modelValue": (...args: any[]) => void;
|
|
73
|
+
}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
|
74
|
+
as: {
|
|
75
|
+
type: null;
|
|
76
|
+
required: false;
|
|
77
|
+
default: string;
|
|
78
|
+
};
|
|
79
|
+
defaultOpen: {
|
|
80
|
+
type: BooleanConstructor;
|
|
81
|
+
required: false;
|
|
82
|
+
default: undefined;
|
|
83
|
+
};
|
|
84
|
+
trailingIcon: {
|
|
85
|
+
type: null;
|
|
86
|
+
required: false;
|
|
87
|
+
};
|
|
88
|
+
color: {
|
|
89
|
+
type: null;
|
|
90
|
+
required: false;
|
|
91
|
+
};
|
|
92
|
+
variant: {
|
|
93
|
+
type: null;
|
|
94
|
+
required: false;
|
|
95
|
+
};
|
|
96
|
+
highlight: {
|
|
97
|
+
type: BooleanConstructor;
|
|
98
|
+
required: false;
|
|
99
|
+
default: boolean;
|
|
100
|
+
};
|
|
101
|
+
highlightColor: {
|
|
102
|
+
type: null;
|
|
103
|
+
required: false;
|
|
104
|
+
};
|
|
105
|
+
collapsible: {
|
|
106
|
+
type: BooleanConstructor;
|
|
107
|
+
required: false;
|
|
108
|
+
default: boolean;
|
|
109
|
+
};
|
|
110
|
+
level: {
|
|
111
|
+
type: NumberConstructor;
|
|
112
|
+
required: false;
|
|
113
|
+
default: number;
|
|
114
|
+
};
|
|
115
|
+
navigation: {
|
|
116
|
+
type: ArrayConstructor;
|
|
117
|
+
required: false;
|
|
118
|
+
};
|
|
119
|
+
class: {
|
|
120
|
+
type: null;
|
|
121
|
+
required: false;
|
|
122
|
+
};
|
|
123
|
+
ui: {
|
|
124
|
+
type: ObjectConstructor;
|
|
125
|
+
required: false;
|
|
126
|
+
};
|
|
127
|
+
disabled: {
|
|
128
|
+
type: BooleanConstructor;
|
|
129
|
+
required: false;
|
|
130
|
+
};
|
|
131
|
+
type: {
|
|
132
|
+
type: StringConstructor;
|
|
133
|
+
required: false;
|
|
134
|
+
default: string;
|
|
135
|
+
};
|
|
136
|
+
unmountOnHide: {
|
|
137
|
+
type: BooleanConstructor;
|
|
138
|
+
required: false;
|
|
139
|
+
default: boolean;
|
|
140
|
+
};
|
|
141
|
+
}>> & Readonly<{
|
|
142
|
+
"onUpdate:modelValue"?: ((...args: any[]) => any) | undefined;
|
|
143
|
+
}>, {
|
|
144
|
+
type: string;
|
|
145
|
+
disabled: boolean;
|
|
146
|
+
level: number;
|
|
147
|
+
as: any;
|
|
148
|
+
collapsible: boolean;
|
|
149
|
+
highlight: boolean;
|
|
150
|
+
defaultOpen: boolean;
|
|
151
|
+
unmountOnHide: boolean;
|
|
152
|
+
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>, __VLS_Slots>;
|
|
153
|
+
type __VLS_WithSlots<T, S> = T & (new () => {
|
|
154
|
+
$slots: S;
|
|
155
|
+
});
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
<script>
|
|
2
|
+
import theme from "../../theme/content/content-navigation";
|
|
3
|
+
</script>
|
|
4
|
+
|
|
5
|
+
<script setup>
|
|
6
|
+
import { computed } from "vue";
|
|
7
|
+
import { Primitive, AccordionRoot, AccordionItem, AccordionTrigger, AccordionContent, useForwardPropsEmits } from "reka-ui";
|
|
8
|
+
import { reactivePick, createReusableTemplate } from "@vueuse/core";
|
|
9
|
+
import { useRoute, useAppConfig } from "#imports";
|
|
10
|
+
import { useComponentUI } from "@nuxt/ui/composables/useComponentUI";
|
|
11
|
+
import { pickLinkProps } from "@nuxt/ui/utils/link";
|
|
12
|
+
import { tv } from "@nuxt/ui/utils/tv";
|
|
13
|
+
import { mapContentNavigationItem } from "../../utils/content";
|
|
14
|
+
import ADocsNavigation from "./ADocsNavigation.vue";
|
|
15
|
+
defineOptions({ inheritAttrs: false });
|
|
16
|
+
const props = defineProps({
|
|
17
|
+
as: { type: null, required: false, default: "nav" },
|
|
18
|
+
defaultOpen: { type: Boolean, required: false, default: void 0 },
|
|
19
|
+
trailingIcon: { type: null, required: false },
|
|
20
|
+
color: { type: null, required: false },
|
|
21
|
+
variant: { type: null, required: false },
|
|
22
|
+
highlight: { type: Boolean, required: false, default: false },
|
|
23
|
+
highlightColor: { type: null, required: false },
|
|
24
|
+
collapsible: { type: Boolean, required: false, default: true },
|
|
25
|
+
level: { type: Number, required: false, default: 0 },
|
|
26
|
+
navigation: { type: Array, required: false },
|
|
27
|
+
class: { type: null, required: false },
|
|
28
|
+
ui: { type: Object, required: false },
|
|
29
|
+
disabled: { type: Boolean, required: false },
|
|
30
|
+
type: { type: String, required: false, default: "multiple" },
|
|
31
|
+
unmountOnHide: { type: Boolean, required: false, default: true }
|
|
32
|
+
});
|
|
33
|
+
const emits = defineEmits(["update:modelValue"]);
|
|
34
|
+
const slots = defineSlots();
|
|
35
|
+
const rootProps = useForwardPropsEmits(reactivePick(props, "collapsible", "type", "unmountOnHide"), emits);
|
|
36
|
+
const route = useRoute();
|
|
37
|
+
const appConfig = useAppConfig();
|
|
38
|
+
const uiProp = useComponentUI("contentNavigation", props);
|
|
39
|
+
const [DefineLinkTemplate, ReuseLinkTemplate] = createReusableTemplate();
|
|
40
|
+
const ui = computed(() => tv({ extend: tv(theme), ...appConfig.ui?.contentNavigation || {} })({
|
|
41
|
+
color: props.color,
|
|
42
|
+
variant: props.variant,
|
|
43
|
+
highlight: props.highlight,
|
|
44
|
+
highlightColor: props.highlightColor || props.color
|
|
45
|
+
}));
|
|
46
|
+
const disabled = computed(() => props.disabled || props.type === "multiple" && props.collapsible === false);
|
|
47
|
+
function isRouteInTree(link, routePath) {
|
|
48
|
+
if (link.children?.length) {
|
|
49
|
+
return link.children.some((child) => isRouteInTree(child, routePath));
|
|
50
|
+
}
|
|
51
|
+
return routePath === link.path;
|
|
52
|
+
}
|
|
53
|
+
const defaultValue = computed(() => {
|
|
54
|
+
if (props.defaultOpen === false) {
|
|
55
|
+
return void 0;
|
|
56
|
+
}
|
|
57
|
+
if (props.defaultOpen === void 0) {
|
|
58
|
+
return props.type === "single" ? "0" : props.navigation?.map((link, index) => link.defaultOpen !== false && String(index)).filter(Boolean);
|
|
59
|
+
}
|
|
60
|
+
const indices = props.navigation?.reduce((acc, link, index) => {
|
|
61
|
+
if (isRouteInTree(link, route.path)) {
|
|
62
|
+
acc.push(String(index));
|
|
63
|
+
}
|
|
64
|
+
return acc;
|
|
65
|
+
}, []) || [];
|
|
66
|
+
return props.type === "multiple" ? indices : indices[0];
|
|
67
|
+
});
|
|
68
|
+
</script>
|
|
69
|
+
|
|
70
|
+
<template>
|
|
71
|
+
<DefineLinkTemplate v-slot="{ link, active }">
|
|
72
|
+
<slot name="link" :link="link" :active="active" :ui="ui">
|
|
73
|
+
<slot name="link-leading" :link="link" :active="active" :ui="ui">
|
|
74
|
+
<UIcon v-if="link.icon" :name="link.icon" data-slot="linkLeadingIcon" :class="ui.linkLeadingIcon({ class: [uiProp?.linkLeadingIcon, link.ui?.linkLeadingIcon], active })" />
|
|
75
|
+
</slot>
|
|
76
|
+
|
|
77
|
+
<span v-if="link.title || !!slots['link-title']" data-slot="linkTitle" :class="ui.linkTitle({ class: [uiProp?.linkTitle, link.ui?.linkTitle], active })">
|
|
78
|
+
<slot name="link-title" :link="link" :active="active" :ui="ui">
|
|
79
|
+
{{ link.title }}
|
|
80
|
+
</slot>
|
|
81
|
+
|
|
82
|
+
<UIcon v-if="link.target === '_blank'" :name="appConfig.ui.icons.external" data-slot="linkTitleExternalIcon" :class="ui.linkTitleExternalIcon({ class: [uiProp?.linkTitleExternalIcon, link.ui?.linkTitleExternalIcon], active })" />
|
|
83
|
+
</span>
|
|
84
|
+
|
|
85
|
+
<span v-if="link.badge || link.badge === 0 || link.children?.length && !disabled || link.trailingIcon || !!slots['link-trailing']" data-slot="linkTrailing" :class="ui.linkTrailing({ class: [uiProp?.linkTrailing, link.ui?.linkTrailing] })">
|
|
86
|
+
<slot name="link-trailing" :link="link" :active="active" :ui="ui">
|
|
87
|
+
<UBadge
|
|
88
|
+
v-if="link.badge || link.badge === 0"
|
|
89
|
+
color="neutral"
|
|
90
|
+
variant="outline"
|
|
91
|
+
:size="uiProp?.linkTrailingBadgeSize || ui.linkTrailingBadgeSize()"
|
|
92
|
+
v-bind="typeof link.badge === 'string' || typeof link.badge === 'number' ? { label: link.badge } : link.badge"
|
|
93
|
+
data-slot="linkTrailingBadge"
|
|
94
|
+
:class="ui.linkTrailingBadge({ class: uiProp?.linkTrailingBadge })"
|
|
95
|
+
/>
|
|
96
|
+
<UIcon v-if="link.children?.length && !disabled" :name="link.trailingIcon || trailingIcon || appConfig.ui.icons.chevronDown" data-slot="linkTrailingIcon" :class="ui.linkTrailingIcon({ class: [uiProp?.linkTrailingIcon, link.ui?.linkTrailingIcon] })" />
|
|
97
|
+
<UIcon v-else-if="link.trailingIcon" :name="link.trailingIcon" data-slot="linkTrailingIcon" :class="ui.linkTrailingIcon({ class: [uiProp?.linkTrailingIcon, link.ui?.linkTrailingIcon] })" />
|
|
98
|
+
</slot>
|
|
99
|
+
</span>
|
|
100
|
+
</slot>
|
|
101
|
+
</DefineLinkTemplate>
|
|
102
|
+
|
|
103
|
+
<Primitive :as="as" v-bind="$attrs" :as-child="level > 0" data-slot="root" :class="ui.root({ class: [uiProp?.root, props.class] })">
|
|
104
|
+
<AccordionRoot as="ul" :disabled="disabled" v-bind="rootProps" :default-value="defaultValue" :class="level > 0 ? ui.listWithChildren({ class: uiProp?.listWithChildren }) : ui.list({ class: uiProp?.list })">
|
|
105
|
+
<template v-for="(link, index) in navigation" :key="index">
|
|
106
|
+
<AccordionItem
|
|
107
|
+
v-if="link.children?.length"
|
|
108
|
+
as="li"
|
|
109
|
+
:disabled="!!link.disabled"
|
|
110
|
+
data-slot="itemWithChildren"
|
|
111
|
+
:class="ui.itemWithChildren({ class: [uiProp?.itemWithChildren, link.ui?.itemWithChildren], level: level > 0 })"
|
|
112
|
+
:value="String(index)"
|
|
113
|
+
>
|
|
114
|
+
<AccordionTrigger
|
|
115
|
+
as="button"
|
|
116
|
+
:class="[
|
|
117
|
+
ui.link({ class: [uiProp?.link, link.ui?.link, link.class], active: link.active, disabled: !!link.disabled || disabled }),
|
|
118
|
+
ui.trigger({ class: [uiProp?.trigger, link.ui?.trigger], disabled: !!link.disabled || disabled })
|
|
119
|
+
]"
|
|
120
|
+
>
|
|
121
|
+
<ReuseLinkTemplate :link="link" :active="link.active || false" />
|
|
122
|
+
</AccordionTrigger>
|
|
123
|
+
|
|
124
|
+
<AccordionContent data-slot="content" :class="ui.content({ class: [uiProp?.content, link.ui?.content] })">
|
|
125
|
+
<ADocsNavigation
|
|
126
|
+
v-bind="rootProps"
|
|
127
|
+
:navigation="link.children"
|
|
128
|
+
:default-open="defaultOpen"
|
|
129
|
+
:level="level + 1"
|
|
130
|
+
:trailing-icon="trailingIcon"
|
|
131
|
+
:color="color"
|
|
132
|
+
:variant="variant"
|
|
133
|
+
:highlight="highlight"
|
|
134
|
+
:highlight-color="highlightColor"
|
|
135
|
+
:ui="uiProp"
|
|
136
|
+
>
|
|
137
|
+
<template v-for="(_, name) in slots" #[name]="slotData">
|
|
138
|
+
<slot :name="name" v-bind="{ ...slotData, link: slotData.link }" />
|
|
139
|
+
</template>
|
|
140
|
+
</ADocsNavigation>
|
|
141
|
+
</AccordionContent>
|
|
142
|
+
</AccordionItem>
|
|
143
|
+
|
|
144
|
+
<li v-else data-slot="item" :class="ui.item({ class: [uiProp?.item, link.ui?.item], level: level > 0 })">
|
|
145
|
+
<ULink v-slot="{ active, ...slotProps }" v-bind="pickLinkProps(mapContentNavigationItem(link))" custom>
|
|
146
|
+
<ULinkBase v-bind="slotProps" data-slot="link" :class="ui.link({ class: [uiProp?.link, link.ui?.link, link.class], active, disabled: !!link.disabled, level: level > 0 })">
|
|
147
|
+
<ReuseLinkTemplate :link="link" :active="active" />
|
|
148
|
+
</ULinkBase>
|
|
149
|
+
</ULink>
|
|
150
|
+
</li>
|
|
151
|
+
</template>
|
|
152
|
+
</AccordionRoot>
|
|
153
|
+
</Primitive>
|
|
154
|
+
</template>
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
declare const _default: typeof __VLS_export;
|
|
2
|
+
export default _default;
|
|
3
|
+
declare const __VLS_export: __VLS_WithSlots<import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
|
4
|
+
as: {
|
|
5
|
+
type: null;
|
|
6
|
+
required: false;
|
|
7
|
+
default: string;
|
|
8
|
+
};
|
|
9
|
+
defaultOpen: {
|
|
10
|
+
type: BooleanConstructor;
|
|
11
|
+
required: false;
|
|
12
|
+
default: undefined;
|
|
13
|
+
};
|
|
14
|
+
trailingIcon: {
|
|
15
|
+
type: null;
|
|
16
|
+
required: false;
|
|
17
|
+
};
|
|
18
|
+
color: {
|
|
19
|
+
type: null;
|
|
20
|
+
required: false;
|
|
21
|
+
};
|
|
22
|
+
variant: {
|
|
23
|
+
type: null;
|
|
24
|
+
required: false;
|
|
25
|
+
};
|
|
26
|
+
highlight: {
|
|
27
|
+
type: BooleanConstructor;
|
|
28
|
+
required: false;
|
|
29
|
+
default: boolean;
|
|
30
|
+
};
|
|
31
|
+
highlightColor: {
|
|
32
|
+
type: null;
|
|
33
|
+
required: false;
|
|
34
|
+
};
|
|
35
|
+
collapsible: {
|
|
36
|
+
type: BooleanConstructor;
|
|
37
|
+
required: false;
|
|
38
|
+
default: boolean;
|
|
39
|
+
};
|
|
40
|
+
level: {
|
|
41
|
+
type: NumberConstructor;
|
|
42
|
+
required: false;
|
|
43
|
+
default: number;
|
|
44
|
+
};
|
|
45
|
+
navigation: {
|
|
46
|
+
type: ArrayConstructor;
|
|
47
|
+
required: false;
|
|
48
|
+
};
|
|
49
|
+
class: {
|
|
50
|
+
type: null;
|
|
51
|
+
required: false;
|
|
52
|
+
};
|
|
53
|
+
ui: {
|
|
54
|
+
type: ObjectConstructor;
|
|
55
|
+
required: false;
|
|
56
|
+
};
|
|
57
|
+
disabled: {
|
|
58
|
+
type: BooleanConstructor;
|
|
59
|
+
required: false;
|
|
60
|
+
};
|
|
61
|
+
type: {
|
|
62
|
+
type: StringConstructor;
|
|
63
|
+
required: false;
|
|
64
|
+
default: string;
|
|
65
|
+
};
|
|
66
|
+
unmountOnHide: {
|
|
67
|
+
type: BooleanConstructor;
|
|
68
|
+
required: false;
|
|
69
|
+
default: boolean;
|
|
70
|
+
};
|
|
71
|
+
}>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
72
|
+
"update:modelValue": (...args: any[]) => void;
|
|
73
|
+
}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
|
74
|
+
as: {
|
|
75
|
+
type: null;
|
|
76
|
+
required: false;
|
|
77
|
+
default: string;
|
|
78
|
+
};
|
|
79
|
+
defaultOpen: {
|
|
80
|
+
type: BooleanConstructor;
|
|
81
|
+
required: false;
|
|
82
|
+
default: undefined;
|
|
83
|
+
};
|
|
84
|
+
trailingIcon: {
|
|
85
|
+
type: null;
|
|
86
|
+
required: false;
|
|
87
|
+
};
|
|
88
|
+
color: {
|
|
89
|
+
type: null;
|
|
90
|
+
required: false;
|
|
91
|
+
};
|
|
92
|
+
variant: {
|
|
93
|
+
type: null;
|
|
94
|
+
required: false;
|
|
95
|
+
};
|
|
96
|
+
highlight: {
|
|
97
|
+
type: BooleanConstructor;
|
|
98
|
+
required: false;
|
|
99
|
+
default: boolean;
|
|
100
|
+
};
|
|
101
|
+
highlightColor: {
|
|
102
|
+
type: null;
|
|
103
|
+
required: false;
|
|
104
|
+
};
|
|
105
|
+
collapsible: {
|
|
106
|
+
type: BooleanConstructor;
|
|
107
|
+
required: false;
|
|
108
|
+
default: boolean;
|
|
109
|
+
};
|
|
110
|
+
level: {
|
|
111
|
+
type: NumberConstructor;
|
|
112
|
+
required: false;
|
|
113
|
+
default: number;
|
|
114
|
+
};
|
|
115
|
+
navigation: {
|
|
116
|
+
type: ArrayConstructor;
|
|
117
|
+
required: false;
|
|
118
|
+
};
|
|
119
|
+
class: {
|
|
120
|
+
type: null;
|
|
121
|
+
required: false;
|
|
122
|
+
};
|
|
123
|
+
ui: {
|
|
124
|
+
type: ObjectConstructor;
|
|
125
|
+
required: false;
|
|
126
|
+
};
|
|
127
|
+
disabled: {
|
|
128
|
+
type: BooleanConstructor;
|
|
129
|
+
required: false;
|
|
130
|
+
};
|
|
131
|
+
type: {
|
|
132
|
+
type: StringConstructor;
|
|
133
|
+
required: false;
|
|
134
|
+
default: string;
|
|
135
|
+
};
|
|
136
|
+
unmountOnHide: {
|
|
137
|
+
type: BooleanConstructor;
|
|
138
|
+
required: false;
|
|
139
|
+
default: boolean;
|
|
140
|
+
};
|
|
141
|
+
}>> & Readonly<{
|
|
142
|
+
"onUpdate:modelValue"?: ((...args: any[]) => any) | undefined;
|
|
143
|
+
}>, {
|
|
144
|
+
type: string;
|
|
145
|
+
disabled: boolean;
|
|
146
|
+
level: number;
|
|
147
|
+
as: any;
|
|
148
|
+
collapsible: boolean;
|
|
149
|
+
highlight: boolean;
|
|
150
|
+
defaultOpen: boolean;
|
|
151
|
+
unmountOnHide: boolean;
|
|
152
|
+
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>, __VLS_Slots>;
|
|
153
|
+
type __VLS_WithSlots<T, S> = T & (new () => {
|
|
154
|
+
$slots: S;
|
|
155
|
+
});
|