@docsector/docsector-reader 0.1.2 → 0.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.
package/bin/docsector.js CHANGED
@@ -4,15 +4,16 @@
4
4
  * Docsector Reader CLI
5
5
  *
6
6
  * Usage:
7
- * docsector dev Start development server with hot-reload
8
- * docsector build Build optimized SPA for production
9
- * docsector serve Serve the production build locally
10
- * docsector help Show help information
7
+ * docsector init [name] Scaffold a new documentation project
8
+ * docsector dev Start development server with hot-reload
9
+ * docsector build Build optimized SPA for production
10
+ * docsector serve Serve the production build locally
11
+ * docsector help — Show help information
11
12
  */
12
13
 
13
14
  import { execSync, spawn } from 'child_process'
14
- import { existsSync } from 'fs'
15
- import { resolve, dirname } from 'path'
15
+ import { existsSync, mkdirSync, writeFileSync } from 'fs'
16
+ import { resolve, dirname, basename } from 'path'
16
17
  import { fileURLToPath } from 'url'
17
18
 
18
19
  const __filename = fileURLToPath(import.meta.url)
@@ -22,7 +23,7 @@ const packageRoot = resolve(__dirname, '..')
22
23
  const args = process.argv.slice(2)
23
24
  const command = args[0]
24
25
 
25
- const VERSION = '0.1.0'
26
+ const VERSION = '0.2.0'
26
27
 
27
28
  const HELP = `
28
29
  Docsector Reader v${VERSION}
@@ -32,16 +33,18 @@ const HELP = `
32
33
  docsector <command> [options]
33
34
 
34
35
  Commands:
35
- dev Start development server with hot-reload (port 8181)
36
- build Build optimized SPA for production (output: dist/spa/)
37
- serve Serve the production build locally
38
- version Show version number
39
- help Show this help message
36
+ init [name] Scaffold a new documentation project
37
+ dev Start development server with hot-reload (port 8181)
38
+ build Build optimized SPA for production (output: dist/spa/)
39
+ serve Serve the production build locally
40
+ version Show version number
41
+ help Show this help message
40
42
 
41
43
  Options:
42
44
  --port <number> Override dev server port (default: 8181)
43
45
 
44
46
  Examples:
47
+ docsector init my-docs
45
48
  docsector dev
46
49
  docsector dev --port 3000
47
50
  docsector build
@@ -51,15 +54,298 @@ const HELP = `
51
54
  https://github.com/docsector/docsector-reader
52
55
  `
53
56
 
57
+ // =============================================================================
58
+ // Scaffold templates
59
+ // =============================================================================
60
+
61
+ function getTemplatePackageJson (name) {
62
+ return JSON.stringify({
63
+ name,
64
+ version: '0.1.0',
65
+ private: true,
66
+ type: 'module',
67
+ description: `${name} — Documentation powered by Docsector Reader`,
68
+ scripts: {
69
+ dev: 'docsector dev',
70
+ build: 'docsector build',
71
+ serve: 'docsector serve'
72
+ },
73
+ dependencies: {
74
+ '@docsector/docsector-reader': '^0.2.0'
75
+ }
76
+ }, null, 2)
77
+ }
78
+
79
+ const TEMPLATE_QUASAR_CONFIG = `\
80
+ import { configure } from 'quasar/wrappers'
81
+ import { createQuasarConfig } from '@docsector/docsector-reader/quasar-factory'
82
+
83
+ export default configure(() => {
84
+ return createQuasarConfig({
85
+ projectRoot: import.meta.dirname
86
+ })
87
+ })
88
+ `
89
+
90
+ const TEMPLATE_DOCSECTOR_CONFIG = `\
91
+ /**
92
+ * Docsector Reader Configuration
93
+ *
94
+ * Customize how your documentation looks and behaves.
95
+ * Replace the values below with your project's branding and links.
96
+ */
97
+ export default {
98
+ // @ Branding
99
+ branding: {
100
+ logo: '/images/logo.png',
101
+ name: 'My Documentation',
102
+ version: 'v0.1.0'
103
+ },
104
+
105
+ // @ Links
106
+ links: {
107
+ github: 'https://github.com/your-org/your-repo',
108
+ discussions: null,
109
+ chat: null,
110
+ email: null,
111
+ changelog: null,
112
+ roadmap: null,
113
+ sponsor: null,
114
+ explore: null
115
+ },
116
+
117
+ // @ GitHub
118
+ github: {
119
+ editBaseUrl: 'https://github.com/your-org/your-repo/edit/main/src/pages'
120
+ },
121
+
122
+ // @ Languages
123
+ languages: [
124
+ {
125
+ image: '/images/flags/united-states-of-america.png',
126
+ label: 'English (US)',
127
+ value: 'en-US'
128
+ }
129
+ ],
130
+
131
+ // @ Default language
132
+ defaultLanguage: 'en-US'
133
+ }
134
+ `
135
+
136
+ const TEMPLATE_CSS_STUB = `\
137
+ // Import Docsector Reader's base styles
138
+ @import '@docsector/docsector-reader/src/css/app.sass'
139
+
140
+ // Add your custom styles below
141
+ `
142
+
143
+ const TEMPLATE_I18N_INDEX = `\
144
+ // @ Import i18n message builder from Docsector Reader
145
+ import { buildMessages } from '@docsector/docsector-reader/i18n'
146
+
147
+ // @ Import language HJSON files (Vite-compatible eager import)
148
+ const langModules = import.meta.glob('./languages/*.hjson', { eager: true })
149
+ // @ Import markdown files (Vite-compatible eager import as raw strings)
150
+ const mdModules = import.meta.glob('../pages/**/*.md', { eager: true, query: '?raw', import: 'default' })
151
+
152
+ // @ Import pages
153
+ import boot from 'pages/boot'
154
+ import pages from 'pages'
155
+
156
+ export default buildMessages({ langModules, mdModules, pages, boot })
157
+ `
158
+
159
+ const TEMPLATE_I18N_HJSON = `\
160
+ {
161
+ // Main navigation and UI labels for your documentation
162
+ nav: {
163
+ overview: Overview
164
+ }
165
+
166
+ // Page-specific translations (auto-loaded from pages/*.md)
167
+ pages: {}
168
+ }
169
+ `
170
+
171
+ const TEMPLATE_PAGES_INDEX = `\
172
+ /**
173
+ * Pages Registry
174
+ *
175
+ * Define your documentation pages here. Each key is a URL path,
176
+ * and each value configures the page's type, icon, status, and titles.
177
+ *
178
+ * config.type: top-level route prefix — 'manual', 'guide', etc.
179
+ * config.status: 'done' | 'draft' | 'empty'
180
+ * config.icon: Material Design icon name
181
+ * config.menu: menu display options (header, subheader, separator)
182
+ * config.subpages: { showcase: bool, vs: bool }
183
+ * data: per-language titles (used for navigation and <title> tag)
184
+ *
185
+ * Set config to null for category nodes (non-navigable groupings).
186
+ */
187
+ export default {
188
+ '/getting-started': {
189
+ config: {
190
+ icon: 'flag',
191
+ status: 'done',
192
+ type: 'guide',
193
+ menu: {
194
+ header: {
195
+ icon: 'school',
196
+ label: 'Guides'
197
+ }
198
+ },
199
+ subpages: {
200
+ showcase: false
201
+ }
202
+ },
203
+ data: {
204
+ 'en-US': { title: 'Getting Started' }
205
+ }
206
+ }
207
+ }
208
+ `
209
+
210
+ const TEMPLATE_PAGES_BOOT = `\
211
+ export default {
212
+ meta: {
213
+ 'en-US': {
214
+ overview: {
215
+ _translations: null
216
+ }
217
+ }
218
+ }
219
+ }
220
+ `
221
+
222
+ const TEMPLATE_BOOT_PAGE = `\
223
+ <template>
224
+ <q-page class="flex flex-center column q-pa-xl">
225
+ <h1 class="text-h3 text-weight-bold q-mb-md">
226
+ Welcome to your Documentation
227
+ </h1>
228
+ <p class="text-subtitle1 text-grey-7">
229
+ Edit <code>src/pages/@/BootPage.vue</code> to customize this page.
230
+ </p>
231
+ <q-btn
232
+ color="primary"
233
+ label="Getting Started"
234
+ to="/en-US/guide/getting-started/overview"
235
+ class="q-mt-lg"
236
+ />
237
+ </q-page>
238
+ </template>
239
+
240
+ <script setup>
241
+ defineOptions({ name: 'BootPage' })
242
+ </script>
243
+ `
244
+
245
+ const TEMPLATE_404_PAGE = `\
246
+ <template>
247
+ <q-page class="flex flex-center column q-pa-xl">
248
+ <h1 class="text-h3 text-weight-bold q-mb-md">404</h1>
249
+ <p class="text-subtitle1 text-grey-7">
250
+ Page not found.
251
+ </p>
252
+ <q-btn
253
+ flat
254
+ color="primary"
255
+ label="Go Home"
256
+ to="/"
257
+ />
258
+ </q-page>
259
+ </template>
260
+
261
+ <script setup>
262
+ defineOptions({ name: 'NotFoundPage' })
263
+ </script>
264
+ `
265
+
266
+ const TEMPLATE_INDEX_HTML = `\
267
+ <!DOCTYPE html>
268
+ <html>
269
+ <head>
270
+ <title><%= productName %></title>
271
+
272
+ <meta charset="utf-8">
273
+ <meta name="description" content="<%= productDescription %>">
274
+ <meta name="format-detection" content="telephone=no">
275
+ <meta name="msapplication-tap-highlight" content="no">
276
+ <meta name="viewport" content="user-scalable=yes, initial-scale=1, maximum-scale=5, minimum-scale=1, width=device-width">
277
+
278
+ <link rel="icon" type="image/png" sizes="128x128" href="images/icons/favicon-128.png">
279
+ <link rel="icon" type="image/png" sizes="32x32" href="images/icons/favicon-32.png">
280
+ <link rel="icon" type="image/png" sizes="16x16" href="images/icons/favicon-16.png">
281
+ <link rel="icon" type="image/ico" href="favicon.ico">
282
+ </head>
283
+ <body>
284
+ <!-- quasar:entry-point -->
285
+ </body>
286
+ </html>
287
+ `
288
+
289
+ const TEMPLATE_POSTCSS = `\
290
+ module.exports = {
291
+ plugins: [
292
+ require('autoprefixer')
293
+ ]
294
+ }
295
+ `
296
+
297
+ const TEMPLATE_GITIGNORE = `\
298
+ node_modules
299
+ .quasar
300
+ dist
301
+ npm-debug.log*
302
+ .DS_Store
303
+ .thumbs.db
304
+ `
305
+
306
+ const TEMPLATE_GETTING_STARTED_MD = `\
307
+ # Getting Started
308
+
309
+ Welcome to your documentation project!
310
+
311
+ ## Installation
312
+
313
+ \\\`\\\`\\\`bash
314
+ npm install
315
+ \\\`\\\`\\\`
316
+
317
+ ## Development
318
+
319
+ \\\`\\\`\\\`bash
320
+ npm run dev
321
+ \\\`\\\`\\\`
322
+
323
+ Your documentation will be available at **http://localhost:8181**.
324
+
325
+ ## Next Steps
326
+
327
+ - Edit pages in \\\`src/pages/\\\`
328
+ - Add languages in \\\`src/i18n/languages/\\\`
329
+ - Customize branding in \\\`docsector.config.js\\\`
330
+ `
331
+
332
+ // =============================================================================
333
+ // Commands
334
+ // =============================================================================
335
+
54
336
  function findQuasarBin () {
55
- // Try local node_modules first (user's project)
337
+ // Try local @quasar/app-vite first (user's project or hoisted)
338
+ const localAppVite = resolve(process.cwd(), 'node_modules', '@quasar', 'app-vite', 'bin', 'quasar.js')
339
+ if (existsSync(localAppVite)) return localAppVite
340
+
341
+ // Try package's own node_modules (nested dependency)
342
+ const pkgAppVite = resolve(packageRoot, 'node_modules', '@quasar', 'app-vite', 'bin', 'quasar.js')
343
+ if (existsSync(pkgAppVite)) return pkgAppVite
344
+
345
+ // Fallback: try generic quasar bin in local node_modules
56
346
  const localBin = resolve(process.cwd(), 'node_modules', '.bin', 'quasar')
57
347
  if (existsSync(localBin)) return localBin
58
348
 
59
- // Try package's own node_modules
60
- const pkgBin = resolve(packageRoot, 'node_modules', '.bin', 'quasar')
61
- if (existsSync(pkgBin)) return pkgBin
62
-
63
349
  // Fall back to npx
64
350
  return 'npx quasar'
65
351
  }
@@ -90,7 +376,112 @@ function run (cmd, cmdArgs = []) {
90
376
  })
91
377
  }
92
378
 
379
+ /**
380
+ * Scaffold a new Docsector documentation project.
381
+ */
382
+ function initProject (name) {
383
+ if (!name) {
384
+ name = 'my-docs'
385
+ console.log(` No project name specified, using "${name}"`)
386
+ }
387
+
388
+ const projectDir = resolve(process.cwd(), name)
389
+
390
+ if (existsSync(projectDir)) {
391
+ console.error(`\n Error: Directory "${name}" already exists.\n`)
392
+ process.exit(1)
393
+ }
394
+
395
+ console.log(`\n Creating Docsector project in ${projectDir}...\n`)
396
+
397
+ // Create directory structure
398
+ const dirs = [
399
+ '',
400
+ 'src',
401
+ 'src/css',
402
+ 'src/i18n',
403
+ 'src/i18n/languages',
404
+ 'src/pages',
405
+ 'src/pages/@',
406
+ 'src/pages/getting-started',
407
+ 'src/pages/getting-started/en-US',
408
+ 'public',
409
+ 'public/images',
410
+ 'public/images/icons',
411
+ 'public/images/flags'
412
+ ]
413
+
414
+ for (const dir of dirs) {
415
+ mkdirSync(resolve(projectDir, dir), { recursive: true })
416
+ }
417
+
418
+ // Create files
419
+ const files = [
420
+ ['package.json', getTemplatePackageJson(name)],
421
+ ['quasar.config.js', TEMPLATE_QUASAR_CONFIG],
422
+ ['docsector.config.js', TEMPLATE_DOCSECTOR_CONFIG],
423
+ ['index.html', TEMPLATE_INDEX_HTML],
424
+ ['postcss.config.cjs', TEMPLATE_POSTCSS],
425
+ ['.gitignore', TEMPLATE_GITIGNORE],
426
+ ['src/css/app.sass', TEMPLATE_CSS_STUB],
427
+ ['src/i18n/index.js', TEMPLATE_I18N_INDEX],
428
+ ['src/i18n/languages/en-US.hjson', TEMPLATE_I18N_HJSON],
429
+ ['src/pages/index.js', TEMPLATE_PAGES_INDEX],
430
+ ['src/pages/boot.js', TEMPLATE_PAGES_BOOT],
431
+ ['src/pages/@/BootPage.vue', TEMPLATE_BOOT_PAGE],
432
+ ['src/pages/@/404Page.vue', TEMPLATE_404_PAGE],
433
+ ['src/pages/getting-started/en-US/overview.md', TEMPLATE_GETTING_STARTED_MD]
434
+ ]
435
+
436
+ for (const [filePath, content] of files) {
437
+ writeFileSync(resolve(projectDir, filePath), content, 'utf-8')
438
+ }
439
+
440
+ console.log(' Project structure:')
441
+ console.log(` ${name}/`)
442
+ console.log(' ├── docsector.config.js')
443
+ console.log(' ├── quasar.config.js')
444
+ console.log(' ├── package.json')
445
+ console.log(' ├── index.html')
446
+ console.log(' ├── postcss.config.cjs')
447
+ console.log(' ├── .gitignore')
448
+ console.log(' ├── public/')
449
+ console.log(' │ └── images/')
450
+ console.log(' └── src/')
451
+ console.log(' ├── css/')
452
+ console.log(' │ └── app.sass')
453
+ console.log(' ├── i18n/')
454
+ console.log(' │ ├── index.js')
455
+ console.log(' │ └── languages/')
456
+ console.log(' │ └── en-US.hjson')
457
+ console.log(' └── pages/')
458
+ console.log(' ├── index.js')
459
+ console.log(' ├── boot.js')
460
+ console.log(' ├── @/')
461
+ console.log(' │ ├── BootPage.vue')
462
+ console.log(' │ └── 404Page.vue')
463
+ console.log(' └── getting-started/')
464
+ console.log(' └── en-US/')
465
+ console.log(' └── overview.md')
466
+
467
+ console.log('\n Next steps:\n')
468
+ console.log(` cd ${name}`)
469
+ console.log(' npm install')
470
+ console.log(' npx docsector dev')
471
+ console.log('')
472
+ console.log(' Then open http://localhost:8181 in your browser.')
473
+ console.log('')
474
+ }
475
+
476
+ // =============================================================================
477
+ // Command dispatcher
478
+ // =============================================================================
479
+
93
480
  switch (command) {
481
+ case 'init':
482
+ initProject(args[1])
483
+ break
484
+
94
485
  case 'dev': {
95
486
  const portIdx = args.indexOf('--port')
96
487
  const extraArgs = []
package/package.json CHANGED
@@ -1,19 +1,27 @@
1
1
  {
2
2
  "name": "@docsector/docsector-reader",
3
- "version": "0.1.2",
3
+ "version": "0.2.0",
4
4
  "description": "A documentation rendering engine built with Vue 3, Quasar v2 and Vite. Transform Markdown into beautiful, navigable documentation sites.",
5
5
  "productName": "Docsector Reader",
6
6
  "author": "Rodrigo de Araujo Vieira",
7
7
  "license": "MIT",
8
8
  "private": false,
9
+ "readmeFilename": "README.md",
9
10
  "type": "module",
10
11
  "main": "src/index.js",
11
12
  "exports": {
12
13
  ".": "./src/index.js",
13
- "./config": "./docsector.config.js"
14
+ "./config": "./docsector.config.js",
15
+ "./quasar-factory": "./src/quasar.factory.js",
16
+ "./i18n": "./src/i18n/helpers.js",
17
+ "./boot/store": "./src/boot/store.js",
18
+ "./boot/QZoom": "./src/boot/QZoom.js",
19
+ "./boot/i18n": "./src/boot/i18n.js",
20
+ "./boot/axios": "./src/boot/axios.js",
21
+ "./src/css/*": "./src/css/*"
14
22
  },
15
23
  "bin": {
16
- "docsector": "./bin/docsector.js"
24
+ "docsector": "bin/docsector.js"
17
25
  },
18
26
  "files": [
19
27
  "bin/",
@@ -63,7 +71,11 @@
63
71
  "vue": "^3.5.13",
64
72
  "vue-i18n": "^9.0.0",
65
73
  "vue-router": "^4.0.0",
66
- "vuex": "^4.0.1"
74
+ "vuex": "^4.0.1",
75
+ "hjson": "^3.2.2",
76
+ "markdown-it": "^13.0.1",
77
+ "markdown-it-attrs": "^4.1.6",
78
+ "prismjs": "^1.27.0"
67
79
  },
68
80
  "devDependencies": {
69
81
  "@quasar/app-vite": "^2.1.0",
@@ -75,11 +87,7 @@
75
87
  "eslint-plugin-n": "^15.0.0",
76
88
  "eslint-plugin-promise": "^6.0.0",
77
89
  "eslint-plugin-vue": "^9.0.0",
78
- "hjson": "^3.2.2",
79
- "markdown-it": "^13.0.1",
80
- "markdown-it-attrs": "^4.1.6",
81
- "prettier": "^2.5.1",
82
- "prismjs": "^1.27.0"
90
+ "prettier": "^2.5.1"
83
91
  },
84
92
  "browserslist": [
85
93
  "last 10 Chrome versions",
@@ -93,7 +101,7 @@
93
101
  "last 5 Opera versions"
94
102
  ],
95
103
  "engines": {
96
- "node": "^20 || ^18",
104
+ "node": "^22 || ^20 || ^18",
97
105
  "npm": ">= 9"
98
106
  }
99
107
  }
package/quasar.config.js CHANGED
@@ -1,117 +1,10 @@
1
1
  /* eslint-env node */
2
2
 
3
3
  import { configure } from 'quasar/wrappers'
4
- import { readFileSync } from 'fs'
5
- import { fileURLToPath } from 'url'
6
- import { dirname, resolve } from 'path'
7
- import HJSON from 'hjson'
8
-
9
- const __filename = fileURLToPath(import.meta.url)
10
- const __dirname = dirname(__filename)
4
+ import { createQuasarConfig } from './src/quasar.factory.js'
11
5
 
12
6
  export default configure((/* ctx */) => {
13
- return {
14
- boot: [
15
- 'store',
16
- 'QZoom',
17
- 'i18n',
18
- 'axios'
19
- ],
20
-
21
- css: [
22
- 'app.sass'
23
- ],
24
-
25
- extras: [
26
- 'fontawesome-v5',
27
- 'roboto-font',
28
- 'material-icons'
29
- ],
30
-
31
- build: {
32
- target: {
33
- browser: ['es2022', 'firefox115', 'chrome115', 'safari14'],
34
- node: 'node20'
35
- },
36
-
37
- vueRouterMode: 'history',
38
-
39
- vitePlugins: [
40
- // HJSON loader plugin
41
- {
42
- name: 'vite-plugin-hjson',
43
- transform (code, id) {
44
- if (id.endsWith('.hjson')) {
45
- const parsed = HJSON.parse(readFileSync(id, 'utf-8'))
46
- return {
47
- code: `export default ${JSON.stringify(parsed, null, 2)};`,
48
- map: null
49
- }
50
- }
51
- }
52
- }
53
- ],
54
-
55
- extendViteConf (viteConf) {
56
- viteConf.resolve = viteConf.resolve || {}
57
- viteConf.resolve.alias = viteConf.resolve.alias || {}
58
- viteConf.resolve.alias['docsector.config.js'] = resolve(__dirname, 'docsector.config.js')
59
- }
60
- },
61
-
62
- devServer: {
63
- port: 8181,
64
- open: false
65
- },
66
-
67
- framework: {
68
- config: {},
69
- lang: 'en-US',
70
- plugins: [
71
- 'LocalStorage', 'SessionStorage'
72
- ]
73
- },
74
-
75
- animations: ['zoomIn', 'zoomOut'],
76
-
77
- pwa: {
78
- workboxMode: 'GenerateSW',
79
- manifest: {
80
- name: 'Docsector Documentation System',
81
- short_name: 'Docsector Docs',
82
- description: 'Streamline your documentation process with Docsector.',
83
- display: 'standalone',
84
- orientation: 'portrait',
85
- background_color: '#ffffff',
86
- theme_color: '#655529',
87
- icons: [
88
- {
89
- src: 'icons/icon-128x128.png',
90
- sizes: '128x128',
91
- type: 'image/png'
92
- },
93
- {
94
- src: 'icons/icon-192x192.png',
95
- sizes: '192x192',
96
- type: 'image/png'
97
- },
98
- {
99
- src: 'icons/icon-256x256.png',
100
- sizes: '256x256',
101
- type: 'image/png'
102
- },
103
- {
104
- src: 'icons/icon-384x384.png',
105
- sizes: '384x384',
106
- type: 'image/png'
107
- },
108
- {
109
- src: 'icons/icon-512x512.png',
110
- sizes: '512x512',
111
- type: 'image/png'
112
- }
113
- ]
114
- }
115
- }
116
- }
7
+ return createQuasarConfig({
8
+ projectRoot: import.meta.dirname
9
+ })
117
10
  })
@@ -3,7 +3,7 @@ import { computed, onMounted, onUpdated } from 'vue'
3
3
  import { useStore } from 'vuex'
4
4
  import { useI18n } from "vue-i18n";
5
5
 
6
- import useNavigator from 'src/composables/useNavigator'
6
+ import useNavigator from '../composables/useNavigator'
7
7
 
8
8
  const props = defineProps({
9
9
  id: {
@@ -1,7 +1,7 @@
1
1
  <script setup>
2
2
  import { watch, onMounted, onUpdated } from 'vue'
3
3
 
4
- import useNavigator from 'src/composables/useNavigator'
4
+ import useNavigator from '../composables/useNavigator'
5
5
 
6
6
  const props = defineProps({
7
7
  id: {
@@ -1,7 +1,7 @@
1
1
  <script setup>
2
2
  import { watch, onMounted, onUpdated } from 'vue'
3
3
 
4
- import useNavigator from 'src/composables/useNavigator'
4
+ import useNavigator from '../composables/useNavigator'
5
5
 
6
6
  const props = defineProps({
7
7
  id: {
@@ -1,7 +1,7 @@
1
1
  <script setup>
2
2
  import { watch } from 'vue'
3
3
 
4
- import useNavigator from 'src/composables/useNavigator'
4
+ import useNavigator from '../composables/useNavigator'
5
5
 
6
6
  const props = defineProps({
7
7
  id: {