@meistrari/chat-nuxt 1.1.3 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/README.md +70 -4
  2. package/dist/module.d.mts +5 -0
  3. package/dist/module.json +1 -1
  4. package/dist/module.mjs +58 -19
  5. package/dist/runtime/components/chat/conversation-list.d.vue.ts +1 -0
  6. package/dist/runtime/components/chat/conversation-list.vue +22 -2
  7. package/dist/runtime/components/chat/conversation-list.vue.d.ts +1 -0
  8. package/dist/runtime/components/chat/message-list.d.vue.ts +1 -0
  9. package/dist/runtime/components/chat/message-list.vue +23 -2
  10. package/dist/runtime/components/chat/message-list.vue.d.ts +1 -0
  11. package/dist/runtime/composables/useChat.d.ts +2 -1
  12. package/dist/runtime/composables/useChat.js +32 -3
  13. package/dist/runtime/composables/useChatApi.js +2 -1
  14. package/dist/runtime/composables/useConversations.d.ts +3 -2
  15. package/dist/runtime/composables/useConversations.js +99 -11
  16. package/dist/runtime/composables/useEmbedConfig.d.ts +11 -6
  17. package/dist/runtime/composables/useEmbedConfig.js +35 -7
  18. package/dist/runtime/composables/useIDB.js +4 -0
  19. package/dist/runtime/composables/usePdf.d.ts +840 -1
  20. package/dist/runtime/composables/usePdf.js +21 -3
  21. package/dist/runtime/composables/useWorkspaceContextFiles.d.ts +3 -3
  22. package/dist/runtime/composables/useWorkspaceContextFiles.js +19 -10
  23. package/dist/runtime/composables/useWorkspaceExternalSkills.d.ts +1 -1
  24. package/dist/runtime/composables/useWorkspaceExternalSkills.js +5 -6
  25. package/dist/runtime/composables/useWorkspacePersonalization.d.ts +1 -1
  26. package/dist/runtime/composables/useWorkspacePersonalization.js +4 -5
  27. package/dist/runtime/composables/useWorkspaceSettings.js +11 -8
  28. package/dist/runtime/embed/components/ChatConfigurationModal.d.vue.ts +25 -0
  29. package/dist/runtime/embed/components/ChatConfigurationModal.vue +373 -0
  30. package/dist/runtime/embed/components/ChatConfigurationModal.vue.d.ts +25 -0
  31. package/dist/runtime/embed/components/ChatEmbed.vue +12 -1
  32. package/dist/runtime/embed/components/ChatEmbedInner.vue +31 -16
  33. package/dist/runtime/embed/components/configuration/ChatConfigurationContextFilesTab.d.vue.ts +22 -0
  34. package/dist/runtime/embed/components/configuration/ChatConfigurationContextFilesTab.vue +133 -0
  35. package/dist/runtime/embed/components/configuration/ChatConfigurationContextFilesTab.vue.d.ts +22 -0
  36. package/dist/runtime/embed/components/configuration/ChatConfigurationCredentialsTab.d.vue.ts +10 -0
  37. package/dist/runtime/embed/components/configuration/ChatConfigurationCredentialsTab.vue +220 -0
  38. package/dist/runtime/embed/components/configuration/ChatConfigurationCredentialsTab.vue.d.ts +10 -0
  39. package/dist/runtime/embed/components/configuration/ChatConfigurationExternalSkillsTab.d.vue.ts +32 -0
  40. package/dist/runtime/embed/components/configuration/ChatConfigurationExternalSkillsTab.vue +222 -0
  41. package/dist/runtime/embed/components/configuration/ChatConfigurationExternalSkillsTab.vue.d.ts +32 -0
  42. package/dist/runtime/embed/components/configuration/ChatConfigurationKnowledgeSourcesTab.d.vue.ts +18 -0
  43. package/dist/runtime/embed/components/configuration/ChatConfigurationKnowledgeSourcesTab.vue +142 -0
  44. package/dist/runtime/embed/components/configuration/ChatConfigurationKnowledgeSourcesTab.vue.d.ts +18 -0
  45. package/dist/runtime/embed/components/configuration/ChatConfigurationPersonalizationTab.d.vue.ts +10 -0
  46. package/dist/runtime/embed/components/configuration/ChatConfigurationPersonalizationTab.vue +37 -0
  47. package/dist/runtime/embed/components/configuration/ChatConfigurationPersonalizationTab.vue.d.ts +10 -0
  48. package/dist/runtime/embed/components/configuration/ChatConfigurationTelaToolsTab.d.vue.ts +20 -0
  49. package/dist/runtime/embed/components/configuration/ChatConfigurationTelaToolsTab.vue +146 -0
  50. package/dist/runtime/embed/components/configuration/ChatConfigurationTelaToolsTab.vue.d.ts +20 -0
  51. package/dist/runtime/server/api/conversations/[id]/duplicate.post.js +45 -12
  52. package/dist/runtime/types/chat.d.ts +2 -1
  53. package/dist/runtime/types/workspace-settings.d.ts +3 -0
  54. package/dist/runtime/types/workspace-settings.js +0 -0
  55. package/dist/runtime/utils/conversation-list-skeleton.d.ts +31 -0
  56. package/dist/runtime/utils/conversation-list-skeleton.js +12 -0
  57. package/dist/runtime/utils/file.js +42 -42
  58. package/dist/types.d.mts +2 -0
  59. package/package.json +23 -27
  60. package/dist/runtime/composables/PageNavigation.d.ts +0 -13
  61. package/dist/runtime/composables/PageNavigation.js +0 -18
  62. /package/dist/runtime/components/{pdf-preview.d.vue.ts → pdf-preview.client.d.vue.ts} +0 -0
  63. /package/dist/runtime/components/{pdf-preview.vue → pdf-preview.client.vue} +0 -0
  64. /package/dist/runtime/components/{pdf-preview.vue.d.ts → pdf-preview.client.vue.d.ts} +0 -0
  65. /package/dist/runtime/components/{pdf-viewer.d.vue.ts → pdf-viewer.client.d.vue.ts} +0 -0
  66. /package/dist/runtime/components/{pdf-viewer.vue → pdf-viewer.client.vue} +0 -0
  67. /package/dist/runtime/components/{pdf-viewer.vue.d.ts → pdf-viewer.client.vue.d.ts} +0 -0
@@ -0,0 +1,20 @@
1
+ import type { TelaCanvas } from '../../../types/tela.js';
2
+ type __VLS_Props = {
3
+ searchQuery: string;
4
+ canvas: TelaCanvas[];
5
+ filteredCanvasTools: TelaCanvas[];
6
+ selectedToolIds: Set<string>;
7
+ allToolsSelected: boolean;
8
+ getProjectName: (projectId: string) => string;
9
+ };
10
+ declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
11
+ "update:searchQuery": (value: string) => any;
12
+ toggleTool: (canvasId: string) => any;
13
+ toggleAll: (selected: boolean | "indeterminate") => any;
14
+ }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
15
+ "onUpdate:searchQuery"?: ((value: string) => any) | undefined;
16
+ onToggleTool?: ((canvasId: string) => any) | undefined;
17
+ onToggleAll?: ((selected: boolean | "indeterminate") => any) | undefined;
18
+ }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
19
+ declare const _default: typeof __VLS_export;
20
+ export default _default;
@@ -1,5 +1,5 @@
1
1
  import { createError, defineEventHandler, getRouterParam } from "h3";
2
- import { eq, and } from "drizzle-orm";
2
+ import { eq, and, asc } from "drizzle-orm";
3
3
  import { useDb, schema } from "#chat-runtime/server/db";
4
4
  import { resolveChatContext } from "#chat-runtime/server/utils/chat-context";
5
5
  import { getWorkspaceSettingsUpdatedAt, resolveWorkspaceSettings, serializeResolvedWorkspaceSettings } from "#chat-runtime/server/utils/chat-workspace-settings";
@@ -27,16 +27,49 @@ export default defineEventHandler(async (event) => {
27
27
  });
28
28
  }
29
29
  const trustedSettings = original.appliedSettingsSnapshot ? original.appliedSettingsSnapshot : await resolveWorkspaceSettings(event, context, db);
30
- const [duplicated] = await db.insert(schema.conversations).values({
31
- workspaceId: context.workspaceId,
32
- userId: context.user.id,
33
- title: `${original.title} (copy)`,
34
- createdBy: context.user.email,
35
- appliedSettingsAt: getWorkspaceSettingsUpdatedAt(trustedSettings),
36
- appliedSettingsSnapshot: serializeResolvedWorkspaceSettings(trustedSettings)
37
- }).returning();
38
- if (duplicated) {
39
- logger.info({ originalId: id, duplicatedId: duplicated.id, workspaceId: context.workspaceId }, "Conversation duplicated");
40
- }
30
+ const duplicated = await db.transaction(async (tx) => {
31
+ const [newConversation] = await tx.insert(schema.conversations).values({
32
+ workspaceId: context.workspaceId,
33
+ userId: context.user.id,
34
+ title: `${original.title} (copy)`,
35
+ createdBy: context.user.email,
36
+ model: original.model,
37
+ appliedSettingsAt: getWorkspaceSettingsUpdatedAt(trustedSettings),
38
+ appliedSettingsSnapshot: serializeResolvedWorkspaceSettings(trustedSettings)
39
+ }).returning();
40
+ if (!newConversation) {
41
+ throw createError({
42
+ statusCode: 500,
43
+ statusMessage: "Failed to duplicate conversation"
44
+ });
45
+ }
46
+ const originalMessages = await tx.select().from(schema.messages).where(eq(schema.messages.conversationId, original.id)).orderBy(asc(schema.messages.createdAt));
47
+ let duplicatedMessages = [];
48
+ if (originalMessages.length > 0) {
49
+ duplicatedMessages = await tx.insert(schema.messages).values(
50
+ originalMessages.map((message) => ({
51
+ conversationId: newConversation.id,
52
+ role: message.role,
53
+ content: message.content,
54
+ status: message.status,
55
+ reasoningData: message.reasoningData,
56
+ files: message.files,
57
+ externalUuid: null,
58
+ ttft: message.ttft,
59
+ createdBy: message.createdBy,
60
+ createdAt: message.createdAt,
61
+ updatedAt: message.updatedAt
62
+ }))
63
+ ).returning();
64
+ }
65
+ return {
66
+ ...newConversation,
67
+ messages: duplicatedMessages
68
+ };
69
+ });
70
+ logger.info(
71
+ { originalId: id, duplicatedId: duplicated.id, workspaceId: context.workspaceId },
72
+ "Conversation duplicated"
73
+ );
41
74
  return duplicated;
42
75
  });
@@ -1,6 +1,7 @@
1
1
  import type { InferSelectModel } from 'drizzle-orm';
2
- import type { conversations, messages, ContextFile as SchemaContextFile, MessageFile as SchemaMessageFile } from '#chat-runtime/server/db/schema';
2
+ import type { conversations, messages, ContextFile as SchemaContextFile, ExternalSkill as SchemaExternalSkill, MessageFile as SchemaMessageFile } from '#chat-runtime/server/db/schema';
3
3
  export type ContextFile = SchemaContextFile;
4
+ export type ExternalSkill = SchemaExternalSkill;
4
5
  export type MessageFile = SchemaMessageFile;
5
6
  export type Conversation = InferSelectModel<typeof conversations>;
6
7
  export type Message = InferSelectModel<typeof messages>;
@@ -0,0 +1,3 @@
1
+ import type { ChatConfigurationSavePayload, ChatConfigurationTab } from '../embed/components/ChatConfigurationModal.vue.js';
2
+ import type { WorkspaceSettings, WorkspaceSettingsUpdate } from '../composables/useWorkspaceSettings.js';
3
+ export type { ChatConfigurationSavePayload, ChatConfigurationTab, WorkspaceSettings, WorkspaceSettingsUpdate, };
File without changes
@@ -0,0 +1,31 @@
1
+ export declare const conversationListSkeletonRows: readonly [{
2
+ readonly id: "row-1";
3
+ readonly width: "72%";
4
+ }, {
5
+ readonly id: "row-2";
6
+ readonly width: "54%";
7
+ }, {
8
+ readonly id: "row-3";
9
+ readonly width: "64%";
10
+ }, {
11
+ readonly id: "row-4";
12
+ readonly width: "46%";
13
+ }, {
14
+ readonly id: "row-5";
15
+ readonly width: "78%";
16
+ }, {
17
+ readonly id: "row-6";
18
+ readonly width: "58%";
19
+ }, {
20
+ readonly id: "row-7";
21
+ readonly width: "69%";
22
+ }, {
23
+ readonly id: "row-8";
24
+ readonly width: "51%";
25
+ }, {
26
+ readonly id: "row-9";
27
+ readonly width: "74%";
28
+ }, {
29
+ readonly id: "row-10";
30
+ readonly width: "62%";
31
+ }];
@@ -0,0 +1,12 @@
1
+ export const conversationListSkeletonRows = [
2
+ { id: "row-1", width: "72%" },
3
+ { id: "row-2", width: "54%" },
4
+ { id: "row-3", width: "64%" },
5
+ { id: "row-4", width: "46%" },
6
+ { id: "row-5", width: "78%" },
7
+ { id: "row-6", width: "58%" },
8
+ { id: "row-7", width: "69%" },
9
+ { id: "row-8", width: "51%" },
10
+ { id: "row-9", width: "74%" },
11
+ { id: "row-10", width: "62%" }
12
+ ];
@@ -65,53 +65,53 @@ const MIME_TO_EXTENSION = (() => {
65
65
  return map;
66
66
  })();
67
67
  const FILE_ICONS = {
68
- "application/pdf": "/files/pdf.svg",
69
- "application/msword": "/files/doc.svg",
70
- "application/vnd.openxmlformats-officedocument.wordprocessingml.document": "/files/doc.svg",
71
- "application/vnd.ms-excel": "/files/sheet.svg",
72
- "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": "/files/sheet.svg",
73
- "application/vnd.ms-powerpoint": "/files/presentation.svg",
74
- "application/vnd.openxmlformats-officedocument.presentationml.presentation": "/files/presentation.svg",
75
- "text/csv": "/files/sheet.svg",
76
- "text/plain": "/files/generic.svg",
77
- "text/markdown": "/files/markdown.svg",
78
- "application/json": "/files/json.svg",
79
- "application/xml": "/files/generic.svg",
80
- "application/zip": "/files/archive.svg",
81
- "application/x-rar-compressed": "/files/archive.svg",
82
- "application/x-tar": "/files/archive.svg",
83
- "application/gzip": "/files/archive.svg",
84
- "image/jpeg": "/files/image.svg",
85
- "image/png": "/files/image.svg",
86
- "image/gif": "/files/image.svg",
87
- "image/webp": "/files/image.svg",
88
- "image/svg+xml": "/files/image.svg",
89
- "video/mp4": "/files/video.svg",
90
- "video/webm": "/files/video.svg",
91
- "audio/mpeg": "/files/audio.svg",
92
- "audio/wav": "/files/audio.svg",
93
- "audio/ogg": "/files/audio.svg",
94
- "text/x-python": "/files/python.svg",
95
- "text/javascript": "/files/javascript.svg",
96
- "text/typescript": "/files/typescript.svg",
97
- "text/html": "/files/html.svg",
98
- "text/css": "/files/css.svg",
99
- "text/sql": "/files/sql.svg",
100
- "text/yaml": "/files/yaml.svg",
101
- "text/x-go": "/files/go.svg",
102
- "text/x-rust": "/files/rust.svg",
103
- "text/x-ruby": "/files/ruby.svg",
104
- "text/x-java": "/files/java.svg",
105
- "text/x-shellscript": "/files/shell.svg",
106
- "text/x-c": "/files/c.svg",
107
- "text/x-cpp": "/files/cpp.svg",
108
- "unknown": "/files/generic.svg"
68
+ "application/pdf": "/chat-files/pdf.svg",
69
+ "application/msword": "/chat-files/doc.svg",
70
+ "application/vnd.openxmlformats-officedocument.wordprocessingml.document": "/chat-files/doc.svg",
71
+ "application/vnd.ms-excel": "/chat-files/sheet.svg",
72
+ "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": "/chat-files/sheet.svg",
73
+ "application/vnd.ms-powerpoint": "/chat-files/presentation.svg",
74
+ "application/vnd.openxmlformats-officedocument.presentationml.presentation": "/chat-files/presentation.svg",
75
+ "text/csv": "/chat-files/sheet.svg",
76
+ "text/plain": "/chat-files/generic.svg",
77
+ "text/markdown": "/chat-files/markdown.svg",
78
+ "application/json": "/chat-files/json.svg",
79
+ "application/xml": "/chat-files/generic.svg",
80
+ "application/zip": "/chat-files/archive.svg",
81
+ "application/x-rar-compressed": "/chat-files/archive.svg",
82
+ "application/x-tar": "/chat-files/archive.svg",
83
+ "application/gzip": "/chat-files/archive.svg",
84
+ "image/jpeg": "/chat-files/image.svg",
85
+ "image/png": "/chat-files/image.svg",
86
+ "image/gif": "/chat-files/image.svg",
87
+ "image/webp": "/chat-files/image.svg",
88
+ "image/svg+xml": "/chat-files/image.svg",
89
+ "video/mp4": "/chat-files/video.svg",
90
+ "video/webm": "/chat-files/video.svg",
91
+ "audio/mpeg": "/chat-files/audio.svg",
92
+ "audio/wav": "/chat-files/audio.svg",
93
+ "audio/ogg": "/chat-files/audio.svg",
94
+ "text/x-python": "/chat-files/python.svg",
95
+ "text/javascript": "/chat-files/javascript.svg",
96
+ "text/typescript": "/chat-files/typescript.svg",
97
+ "text/html": "/chat-files/html.svg",
98
+ "text/css": "/chat-files/css.svg",
99
+ "text/sql": "/chat-files/sql.svg",
100
+ "text/yaml": "/chat-files/yaml.svg",
101
+ "text/x-go": "/chat-files/go.svg",
102
+ "text/x-rust": "/chat-files/rust.svg",
103
+ "text/x-ruby": "/chat-files/ruby.svg",
104
+ "text/x-java": "/chat-files/java.svg",
105
+ "text/x-shellscript": "/chat-files/shell.svg",
106
+ "text/x-c": "/chat-files/c.svg",
107
+ "text/x-cpp": "/chat-files/cpp.svg",
108
+ "unknown": "/chat-files/generic.svg"
109
109
  };
110
110
  function normalizeMimeType(mimeType) {
111
111
  return mimeType.split(";")[0]?.trim() ?? mimeType;
112
112
  }
113
113
  function getFileIcon(mimeType) {
114
- return FILE_ICONS[mimeType] ?? "/files/generic.svg";
114
+ return FILE_ICONS[mimeType] ?? "/chat-files/generic.svg";
115
115
  }
116
116
  function getFileTypeLabel(mimeType) {
117
117
  if (mimeType.includes("pdf"))
package/dist/types.d.mts CHANGED
@@ -5,3 +5,5 @@ import type { default as Module } from './module.mjs'
5
5
  export type ModuleOptions = typeof Module extends NuxtModule<infer O> ? Partial<O> : Record<string, any>
6
6
 
7
7
  export { default } from './module.mjs'
8
+
9
+ export { type ChatNuxtModuleOptions } from './module.mjs'
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@meistrari/chat-nuxt",
3
- "version": "1.1.3",
3
+ "version": "1.2.0",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -8,7 +8,14 @@
8
8
  "import": "./dist/module.mjs"
9
9
  },
10
10
  "./assets/css/*": "./dist/runtime/assets/css/*",
11
- "./types/*": "./dist/runtime/types/*"
11
+ "./types/*": {
12
+ "types": "./dist/runtime/types/*.d.ts",
13
+ "import": "./dist/runtime/types/*.js"
14
+ },
15
+ "./utils/*": {
16
+ "types": "./dist/runtime/utils/*.d.ts",
17
+ "import": "./dist/runtime/utils/*.js"
18
+ }
12
19
  },
13
20
  "main": "./dist/module.mjs",
14
21
  "types": "./dist/types.d.mts",
@@ -18,6 +25,7 @@
18
25
  "scripts": {
19
26
  "build": "mkdir -p .nuxt && { [ -f .nuxt/tsconfig.json ] || printf '{}' > .nuxt/tsconfig.json; } && { [ -f .nuxt/tsconfig.server.json ] || printf '{}' > .nuxt/tsconfig.server.json; } && nuxt-module-build build",
20
27
  "dev:prepare": "nuxt-module-build build --stub",
28
+ "smoke:pack": "./scripts/smoke-pack-consumer.sh",
21
29
  "lint": "eslint .",
22
30
  "lint:fix": "eslint . --fix",
23
31
  "lint:attrs": "! grep -rn '[a-z0-9-]![[:space:]>@\"'\"'\"']' --include='*.vue' src/runtime/components/ src/runtime/embed/components/ 2>/dev/null",
@@ -28,61 +36,49 @@
28
36
  "db:studio": "infisical run --env=dev -- ./scripts/drizzle.sh studio"
29
37
  },
30
38
  "peerDependencies": {
31
- "@iconify/vue": "^5.0.0",
32
- "@meistrari/auth-nuxt": "^3.4.1",
33
- "@meistrari/tela-build": "^1.30.0",
34
- "@sentry/nuxt": "^10.0.0",
35
- "@vueuse/components": "^12.8.0",
36
- "@vueuse/core": "^12.8.0",
37
- "h3": "^1.15.0",
38
- "markstream-vue": "0.0.3-beta.6",
39
- "motion": "^11.13.0",
40
- "nitropack": "^2.10.0",
41
39
  "nuxt": "^3.17.0",
42
- "virtua": "^0.42.0",
43
- "vue": "^3.5.0",
44
- "vue-i18n": "^11.0.0"
40
+ "vue": "^3.5.0"
45
41
  },
46
42
  "dependencies": {
47
43
  "@iconify-json/ph": "^1.2.2",
44
+ "@iconify/vue": "^5.0.0",
45
+ "@meistrari/auth-nuxt": "^3.5.0",
48
46
  "@meistrari/logger": "^2.1.3",
49
47
  "@meistrari/mise-en-place": "^2.5.1",
50
48
  "@meistrari/tela-sdk-js": "^2.8.0",
49
+ "@meistrari/tela-build": "^1.30.0",
51
50
  "@meistrari/vault-sdk": "^3.0.0",
51
+ "@sentry/nuxt": "^10.0.0",
52
+ "@vueuse/components": "^12.8.0",
53
+ "@vueuse/core": "^12.8.0",
52
54
  "beautiful-mermaid": "^1.1.3",
53
55
  "dompurify": "^3.3.2",
54
56
  "drizzle-orm": "^0.38.0",
57
+ "h3": "^1.15.0",
58
+ "markstream-vue": "0.0.3-beta.6",
55
59
  "mermaid": "^11.13.0",
60
+ "motion": "^11.13.0",
61
+ "nitropack": "^2.10.0",
56
62
  "pdfjs-dist": "^5.4.530",
57
63
  "postgres": "^3.4.5",
58
64
  "posthog-js": "^1.364.2",
65
+ "virtua": "^0.42.0",
59
66
  "xlsx": "^0.18.5",
67
+ "vue-i18n": "^11.0.0",
60
68
  "zod": "^4.1.13"
61
69
  },
62
70
  "devDependencies": {
63
71
  "@antfu/eslint-config": "3.11.2",
64
- "@iconify/vue": "5.0.0",
65
- "@meistrari/auth-nuxt": "3.4.1",
66
- "@meistrari/tela-build": "^1.30.0",
67
72
  "@nuxt/module-builder": "^1.0.2",
68
- "@sentry/nuxt": "^10.38.0",
69
73
  "@types/node": "^20.19.0",
70
- "@vueuse/components": "12.8.2",
71
- "@vueuse/core": "12.8.2",
72
74
  "dotenv-cli": "^11.0.0",
73
75
  "drizzle-kit": "^0.30.0",
74
76
  "eslint": "9.16.0",
75
- "h3": "^1.15.1",
76
- "markstream-vue": "0.0.3-beta.6",
77
- "motion": "11.13.1",
78
- "nitropack": "2.10.4",
79
77
  "nuxt": "3.17.7",
80
78
  "pino": "^10.3.1",
81
79
  "pino-pretty": "^13.1.3",
82
80
  "typescript": "^5.7.3",
83
- "virtua": "0.42.0",
84
81
  "vitest": "^3.2.1",
85
- "vue-i18n": "11.3.2",
86
82
  "vue-tsc": "^3.2.6"
87
83
  }
88
84
  }
@@ -1,13 +0,0 @@
1
- export declare function usePageNavigation(): {
2
- currentPage: any;
3
- pageMetadata: {
4
- readonly '/': {
5
- readonly title: "Home";
6
- readonly icon: "i-ph-house";
7
- };
8
- readonly '/sample-page': {
9
- readonly title: "Sample Page";
10
- readonly icon: "i-ph-stack-simple";
11
- };
12
- };
13
- };
@@ -1,18 +0,0 @@
1
- export function usePageNavigation() {
2
- const pageMetadata = {
3
- "/": {
4
- title: "Home",
5
- icon: "i-ph-house"
6
- },
7
- "/sample-page": {
8
- title: "Sample Page",
9
- icon: "i-ph-stack-simple"
10
- }
11
- };
12
- const route = useRoute();
13
- const currentPage = computed(() => pageMetadata[route.path]);
14
- return {
15
- currentPage,
16
- pageMetadata
17
- };
18
- }