parent
							
								
									318fb6efb9
								
							
						
					
					
						commit
						eb1beb8002
					
				| @ -286,6 +286,9 @@ | |||||||
|     "watchTriggerable": true, |     "watchTriggerable": true, | ||||||
|     "watchWithFilter": true, |     "watchWithFilter": true, | ||||||
|     "whenever": true, |     "whenever": true, | ||||||
|     "toValue": true |     "toValue": true, | ||||||
|  |     "injectLocal": true, | ||||||
|  |     "provideLocal": true, | ||||||
|  |     "useClipboardItems": true | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  | |||||||
							
								
								
									
										9
									
								
								auto-imports.d.ts
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										9
									
								
								auto-imports.d.ts
									
									
									
									
										vendored
									
									
								
							| @ -36,6 +36,7 @@ declare global { | |||||||
|   const h: typeof import('vue')['h'] |   const h: typeof import('vue')['h'] | ||||||
|   const ignorableWatch: typeof import('@vueuse/core')['ignorableWatch'] |   const ignorableWatch: typeof import('@vueuse/core')['ignorableWatch'] | ||||||
|   const inject: typeof import('vue')['inject'] |   const inject: typeof import('vue')['inject'] | ||||||
|  |   const injectLocal: typeof import('@vueuse/core')['injectLocal'] | ||||||
|   const isDefined: typeof import('@vueuse/core')['isDefined'] |   const isDefined: typeof import('@vueuse/core')['isDefined'] | ||||||
|   const isProxy: typeof import('vue')['isProxy'] |   const isProxy: typeof import('vue')['isProxy'] | ||||||
|   const isReactive: typeof import('vue')['isReactive'] |   const isReactive: typeof import('vue')['isReactive'] | ||||||
| @ -65,6 +66,7 @@ declare global { | |||||||
|   const onUpdated: typeof import('vue')['onUpdated'] |   const onUpdated: typeof import('vue')['onUpdated'] | ||||||
|   const pausableWatch: typeof import('@vueuse/core')['pausableWatch'] |   const pausableWatch: typeof import('@vueuse/core')['pausableWatch'] | ||||||
|   const provide: typeof import('vue')['provide'] |   const provide: typeof import('vue')['provide'] | ||||||
|  |   const provideLocal: typeof import('@vueuse/core')['provideLocal'] | ||||||
|   const reactify: typeof import('@vueuse/core')['reactify'] |   const reactify: typeof import('@vueuse/core')['reactify'] | ||||||
|   const reactifyObject: typeof import('@vueuse/core')['reactifyObject'] |   const reactifyObject: typeof import('@vueuse/core')['reactifyObject'] | ||||||
|   const reactive: typeof import('vue')['reactive'] |   const reactive: typeof import('vue')['reactive'] | ||||||
| @ -128,6 +130,7 @@ declare global { | |||||||
|   const useBrowserLocation: typeof import('@vueuse/core')['useBrowserLocation'] |   const useBrowserLocation: typeof import('@vueuse/core')['useBrowserLocation'] | ||||||
|   const useCached: typeof import('@vueuse/core')['useCached'] |   const useCached: typeof import('@vueuse/core')['useCached'] | ||||||
|   const useClipboard: typeof import('@vueuse/core')['useClipboard'] |   const useClipboard: typeof import('@vueuse/core')['useClipboard'] | ||||||
|  |   const useClipboardItems: typeof import('@vueuse/core')['useClipboardItems'] | ||||||
|   const useCloned: typeof import('@vueuse/core')['useCloned'] |   const useCloned: typeof import('@vueuse/core')['useCloned'] | ||||||
|   const useColorMode: typeof import('@vueuse/core')['useColorMode'] |   const useColorMode: typeof import('@vueuse/core')['useColorMode'] | ||||||
|   const useConfirmDialog: typeof import('@vueuse/core')['useConfirmDialog'] |   const useConfirmDialog: typeof import('@vueuse/core')['useConfirmDialog'] | ||||||
| @ -326,6 +329,7 @@ declare module 'vue' { | |||||||
|     readonly h: UnwrapRef<typeof import('vue')['h']> |     readonly h: UnwrapRef<typeof import('vue')['h']> | ||||||
|     readonly ignorableWatch: UnwrapRef<typeof import('@vueuse/core')['ignorableWatch']> |     readonly ignorableWatch: UnwrapRef<typeof import('@vueuse/core')['ignorableWatch']> | ||||||
|     readonly inject: UnwrapRef<typeof import('vue')['inject']> |     readonly inject: UnwrapRef<typeof import('vue')['inject']> | ||||||
|  |     readonly injectLocal: UnwrapRef<typeof import('@vueuse/core')['injectLocal']> | ||||||
|     readonly isDefined: UnwrapRef<typeof import('@vueuse/core')['isDefined']> |     readonly isDefined: UnwrapRef<typeof import('@vueuse/core')['isDefined']> | ||||||
|     readonly isProxy: UnwrapRef<typeof import('vue')['isProxy']> |     readonly isProxy: UnwrapRef<typeof import('vue')['isProxy']> | ||||||
|     readonly isReactive: UnwrapRef<typeof import('vue')['isReactive']> |     readonly isReactive: UnwrapRef<typeof import('vue')['isReactive']> | ||||||
| @ -355,6 +359,7 @@ declare module 'vue' { | |||||||
|     readonly onUpdated: UnwrapRef<typeof import('vue')['onUpdated']> |     readonly onUpdated: UnwrapRef<typeof import('vue')['onUpdated']> | ||||||
|     readonly pausableWatch: UnwrapRef<typeof import('@vueuse/core')['pausableWatch']> |     readonly pausableWatch: UnwrapRef<typeof import('@vueuse/core')['pausableWatch']> | ||||||
|     readonly provide: UnwrapRef<typeof import('vue')['provide']> |     readonly provide: UnwrapRef<typeof import('vue')['provide']> | ||||||
|  |     readonly provideLocal: UnwrapRef<typeof import('@vueuse/core')['provideLocal']> | ||||||
|     readonly reactify: UnwrapRef<typeof import('@vueuse/core')['reactify']> |     readonly reactify: UnwrapRef<typeof import('@vueuse/core')['reactify']> | ||||||
|     readonly reactifyObject: UnwrapRef<typeof import('@vueuse/core')['reactifyObject']> |     readonly reactifyObject: UnwrapRef<typeof import('@vueuse/core')['reactifyObject']> | ||||||
|     readonly reactive: UnwrapRef<typeof import('vue')['reactive']> |     readonly reactive: UnwrapRef<typeof import('vue')['reactive']> | ||||||
| @ -418,6 +423,7 @@ declare module 'vue' { | |||||||
|     readonly useBrowserLocation: UnwrapRef<typeof import('@vueuse/core')['useBrowserLocation']> |     readonly useBrowserLocation: UnwrapRef<typeof import('@vueuse/core')['useBrowserLocation']> | ||||||
|     readonly useCached: UnwrapRef<typeof import('@vueuse/core')['useCached']> |     readonly useCached: UnwrapRef<typeof import('@vueuse/core')['useCached']> | ||||||
|     readonly useClipboard: UnwrapRef<typeof import('@vueuse/core')['useClipboard']> |     readonly useClipboard: UnwrapRef<typeof import('@vueuse/core')['useClipboard']> | ||||||
|  |     readonly useClipboardItems: UnwrapRef<typeof import('@vueuse/core')['useClipboardItems']> | ||||||
|     readonly useCloned: UnwrapRef<typeof import('@vueuse/core')['useCloned']> |     readonly useCloned: UnwrapRef<typeof import('@vueuse/core')['useCloned']> | ||||||
|     readonly useColorMode: UnwrapRef<typeof import('@vueuse/core')['useColorMode']> |     readonly useColorMode: UnwrapRef<typeof import('@vueuse/core')['useColorMode']> | ||||||
|     readonly useConfirmDialog: UnwrapRef<typeof import('@vueuse/core')['useConfirmDialog']> |     readonly useConfirmDialog: UnwrapRef<typeof import('@vueuse/core')['useConfirmDialog']> | ||||||
| @ -610,6 +616,7 @@ declare module '@vue/runtime-core' { | |||||||
|     readonly h: UnwrapRef<typeof import('vue')['h']> |     readonly h: UnwrapRef<typeof import('vue')['h']> | ||||||
|     readonly ignorableWatch: UnwrapRef<typeof import('@vueuse/core')['ignorableWatch']> |     readonly ignorableWatch: UnwrapRef<typeof import('@vueuse/core')['ignorableWatch']> | ||||||
|     readonly inject: UnwrapRef<typeof import('vue')['inject']> |     readonly inject: UnwrapRef<typeof import('vue')['inject']> | ||||||
|  |     readonly injectLocal: UnwrapRef<typeof import('@vueuse/core')['injectLocal']> | ||||||
|     readonly isDefined: UnwrapRef<typeof import('@vueuse/core')['isDefined']> |     readonly isDefined: UnwrapRef<typeof import('@vueuse/core')['isDefined']> | ||||||
|     readonly isProxy: UnwrapRef<typeof import('vue')['isProxy']> |     readonly isProxy: UnwrapRef<typeof import('vue')['isProxy']> | ||||||
|     readonly isReactive: UnwrapRef<typeof import('vue')['isReactive']> |     readonly isReactive: UnwrapRef<typeof import('vue')['isReactive']> | ||||||
| @ -639,6 +646,7 @@ declare module '@vue/runtime-core' { | |||||||
|     readonly onUpdated: UnwrapRef<typeof import('vue')['onUpdated']> |     readonly onUpdated: UnwrapRef<typeof import('vue')['onUpdated']> | ||||||
|     readonly pausableWatch: UnwrapRef<typeof import('@vueuse/core')['pausableWatch']> |     readonly pausableWatch: UnwrapRef<typeof import('@vueuse/core')['pausableWatch']> | ||||||
|     readonly provide: UnwrapRef<typeof import('vue')['provide']> |     readonly provide: UnwrapRef<typeof import('vue')['provide']> | ||||||
|  |     readonly provideLocal: UnwrapRef<typeof import('@vueuse/core')['provideLocal']> | ||||||
|     readonly reactify: UnwrapRef<typeof import('@vueuse/core')['reactify']> |     readonly reactify: UnwrapRef<typeof import('@vueuse/core')['reactify']> | ||||||
|     readonly reactifyObject: UnwrapRef<typeof import('@vueuse/core')['reactifyObject']> |     readonly reactifyObject: UnwrapRef<typeof import('@vueuse/core')['reactifyObject']> | ||||||
|     readonly reactive: UnwrapRef<typeof import('vue')['reactive']> |     readonly reactive: UnwrapRef<typeof import('vue')['reactive']> | ||||||
| @ -702,6 +710,7 @@ declare module '@vue/runtime-core' { | |||||||
|     readonly useBrowserLocation: UnwrapRef<typeof import('@vueuse/core')['useBrowserLocation']> |     readonly useBrowserLocation: UnwrapRef<typeof import('@vueuse/core')['useBrowserLocation']> | ||||||
|     readonly useCached: UnwrapRef<typeof import('@vueuse/core')['useCached']> |     readonly useCached: UnwrapRef<typeof import('@vueuse/core')['useCached']> | ||||||
|     readonly useClipboard: UnwrapRef<typeof import('@vueuse/core')['useClipboard']> |     readonly useClipboard: UnwrapRef<typeof import('@vueuse/core')['useClipboard']> | ||||||
|  |     readonly useClipboardItems: UnwrapRef<typeof import('@vueuse/core')['useClipboardItems']> | ||||||
|     readonly useCloned: UnwrapRef<typeof import('@vueuse/core')['useCloned']> |     readonly useCloned: UnwrapRef<typeof import('@vueuse/core')['useCloned']> | ||||||
|     readonly useColorMode: UnwrapRef<typeof import('@vueuse/core')['useColorMode']> |     readonly useColorMode: UnwrapRef<typeof import('@vueuse/core')['useColorMode']> | ||||||
|     readonly useConfirmDialog: UnwrapRef<typeof import('@vueuse/core')['useConfirmDialog']> |     readonly useConfirmDialog: UnwrapRef<typeof import('@vueuse/core')['useConfirmDialog']> | ||||||
|  | |||||||
							
								
								
									
										1
									
								
								components.d.ts
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								components.d.ts
									
									
									
									
										vendored
									
									
								
							| @ -50,6 +50,7 @@ declare module '@vue/runtime-core' { | |||||||
|     'CModal.demo': typeof import('./src/ui/c-modal/c-modal.demo.vue')['default'] |     'CModal.demo': typeof import('./src/ui/c-modal/c-modal.demo.vue')['default'] | ||||||
|     CModalValue: typeof import('./src/ui/c-modal-value/c-modal-value.vue')['default'] |     CModalValue: typeof import('./src/ui/c-modal-value/c-modal-value.vue')['default'] | ||||||
|     'CModalValue.demo': typeof import('./src/ui/c-modal-value/c-modal-value.demo.vue')['default'] |     'CModalValue.demo': typeof import('./src/ui/c-modal-value/c-modal-value.demo.vue')['default'] | ||||||
|  |     CodeHighlighter: typeof import('./src/tools/code-highlighter/code-highlighter.vue')['default'] | ||||||
|     CollapsibleToolMenu: typeof import('./src/components/CollapsibleToolMenu.vue')['default'] |     CollapsibleToolMenu: typeof import('./src/components/CollapsibleToolMenu.vue')['default'] | ||||||
|     ColorConverter: typeof import('./src/tools/color-converter/color-converter.vue')['default'] |     ColorConverter: typeof import('./src/tools/color-converter/color-converter.vue')['default'] | ||||||
|     ColoredCard: typeof import('./src/components/ColoredCard.vue')['default'] |     ColoredCard: typeof import('./src/components/ColoredCard.vue')['default'] | ||||||
|  | |||||||
| @ -44,7 +44,7 @@ | |||||||
|     "@types/figlet": "^1.5.8", |     "@types/figlet": "^1.5.8", | ||||||
|     "@vicons/material": "^0.12.0", |     "@vicons/material": "^0.12.0", | ||||||
|     "@vicons/tabler": "^0.12.0", |     "@vicons/tabler": "^0.12.0", | ||||||
|     "@vueuse/core": "^10.3.0", |     "@vueuse/core": "^10.11.1", | ||||||
|     "@vueuse/head": "^1.0.0", |     "@vueuse/head": "^1.0.0", | ||||||
|     "@vueuse/router": "^10.0.0", |     "@vueuse/router": "^10.0.0", | ||||||
|     "bcryptjs": "^2.4.3", |     "bcryptjs": "^2.4.3", | ||||||
| @ -82,6 +82,7 @@ | |||||||
|     "pinia": "^2.0.34", |     "pinia": "^2.0.34", | ||||||
|     "plausible-tracker": "^0.3.8", |     "plausible-tracker": "^0.3.8", | ||||||
|     "qrcode": "^1.5.1", |     "qrcode": "^1.5.1", | ||||||
|  |     "shiki": "^1.22.0", | ||||||
|     "sql-formatter": "^13.0.0", |     "sql-formatter": "^13.0.0", | ||||||
|     "ua-parser-js": "^1.0.35", |     "ua-parser-js": "^1.0.35", | ||||||
|     "ulid": "^2.3.0", |     "ulid": "^2.3.0", | ||||||
|  | |||||||
							
								
								
									
										284
									
								
								pnpm-lock.yaml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										284
									
								
								pnpm-lock.yaml
									
									
									
										generated
									
									
									
								
							| @ -33,8 +33,8 @@ dependencies: | |||||||
|     specifier: ^0.12.0 |     specifier: ^0.12.0 | ||||||
|     version: 0.12.0 |     version: 0.12.0 | ||||||
|   '@vueuse/core': |   '@vueuse/core': | ||||||
|     specifier: ^10.3.0 |     specifier: ^10.11.1 | ||||||
|     version: 10.3.0(vue@3.3.4) |     version: 10.11.1(vue@3.3.4) | ||||||
|   '@vueuse/head': |   '@vueuse/head': | ||||||
|     specifier: ^1.0.0 |     specifier: ^1.0.0 | ||||||
|     version: 1.0.0(vue@3.3.4) |     version: 1.0.0(vue@3.3.4) | ||||||
| @ -146,6 +146,9 @@ dependencies: | |||||||
|   qrcode: |   qrcode: | ||||||
|     specifier: ^1.5.1 |     specifier: ^1.5.1 | ||||||
|     version: 1.5.1 |     version: 1.5.1 | ||||||
|  |   shiki: | ||||||
|  |     specifier: ^1.22.0 | ||||||
|  |     version: 1.22.0 | ||||||
|   sql-formatter: |   sql-formatter: | ||||||
|     specifier: ^13.0.0 |     specifier: ^13.0.0 | ||||||
|     version: 13.0.0 |     version: 13.0.0 | ||||||
| @ -160,7 +163,7 @@ dependencies: | |||||||
|     version: 0.4.0 |     version: 0.4.0 | ||||||
|   unplugin-auto-import: |   unplugin-auto-import: | ||||||
|     specifier: ^0.16.4 |     specifier: ^0.16.4 | ||||||
|     version: 0.16.4(@vueuse/core@10.3.0)(rollup@2.79.1) |     version: 0.16.4(@vueuse/core@10.11.1)(rollup@2.79.1) | ||||||
|   uuid: |   uuid: | ||||||
|     specifier: ^9.0.0 |     specifier: ^9.0.0 | ||||||
|     version: 9.0.0 |     version: 9.0.0 | ||||||
| @ -2595,6 +2598,43 @@ packages: | |||||||
|     resolution: {integrity: sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg==} |     resolution: {integrity: sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg==} | ||||||
|     dev: true |     dev: true | ||||||
| 
 | 
 | ||||||
|  |   /@shikijs/core@1.22.0: | ||||||
|  |     resolution: {integrity: sha512-S8sMe4q71TJAW+qG93s5VaiihujRK6rqDFqBnxqvga/3LvqHEnxqBIOPkt//IdXVtHkQWKu4nOQNk0uBGicU7Q==} | ||||||
|  |     dependencies: | ||||||
|  |       '@shikijs/engine-javascript': 1.22.0 | ||||||
|  |       '@shikijs/engine-oniguruma': 1.22.0 | ||||||
|  |       '@shikijs/types': 1.22.0 | ||||||
|  |       '@shikijs/vscode-textmate': 9.3.0 | ||||||
|  |       '@types/hast': 3.0.4 | ||||||
|  |       hast-util-to-html: 9.0.3 | ||||||
|  |     dev: false | ||||||
|  | 
 | ||||||
|  |   /@shikijs/engine-javascript@1.22.0: | ||||||
|  |     resolution: {integrity: sha512-AeEtF4Gcck2dwBqCFUKYfsCq0s+eEbCEbkUuFou53NZ0sTGnJnJ/05KHQFZxpii5HMXbocV9URYVowOP2wH5kw==} | ||||||
|  |     dependencies: | ||||||
|  |       '@shikijs/types': 1.22.0 | ||||||
|  |       '@shikijs/vscode-textmate': 9.3.0 | ||||||
|  |       oniguruma-to-js: 0.4.3 | ||||||
|  |     dev: false | ||||||
|  | 
 | ||||||
|  |   /@shikijs/engine-oniguruma@1.22.0: | ||||||
|  |     resolution: {integrity: sha512-5iBVjhu/DYs1HB0BKsRRFipRrD7rqjxlWTj4F2Pf+nQSPqc3kcyqFFeZXnBMzDf0HdqaFVvhDRAGiYNvyLP+Mw==} | ||||||
|  |     dependencies: | ||||||
|  |       '@shikijs/types': 1.22.0 | ||||||
|  |       '@shikijs/vscode-textmate': 9.3.0 | ||||||
|  |     dev: false | ||||||
|  | 
 | ||||||
|  |   /@shikijs/types@1.22.0: | ||||||
|  |     resolution: {integrity: sha512-Fw/Nr7FGFhlQqHfxzZY8Cwtwk5E9nKDUgeLjZgt3UuhcM3yJR9xj3ZGNravZZok8XmEZMiYkSMTPlPkULB8nww==} | ||||||
|  |     dependencies: | ||||||
|  |       '@shikijs/vscode-textmate': 9.3.0 | ||||||
|  |       '@types/hast': 3.0.4 | ||||||
|  |     dev: false | ||||||
|  | 
 | ||||||
|  |   /@shikijs/vscode-textmate@9.3.0: | ||||||
|  |     resolution: {integrity: sha512-jn7/7ky30idSkd/O5yDBfAnVt+JJpepofP/POZ1iMOxK59cOfqIgg/Dj0eFsjOTMw+4ycJN0uhZH/Eb0bs/EUA==} | ||||||
|  |     dev: false | ||||||
|  | 
 | ||||||
|   /@sinclair/typebox@0.27.8: |   /@sinclair/typebox@0.27.8: | ||||||
|     resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} |     resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} | ||||||
|     dev: true |     dev: true | ||||||
| @ -2928,6 +2968,12 @@ packages: | |||||||
|       '@types/node': 18.15.11 |       '@types/node': 18.15.11 | ||||||
|     dev: true |     dev: true | ||||||
| 
 | 
 | ||||||
|  |   /@types/hast@3.0.4: | ||||||
|  |     resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} | ||||||
|  |     dependencies: | ||||||
|  |       '@types/unist': 3.0.3 | ||||||
|  |     dev: false | ||||||
|  | 
 | ||||||
|   /@types/jsdom@21.1.0: |   /@types/jsdom@21.1.0: | ||||||
|     resolution: {integrity: sha512-leWreJOdnuIxq9Y70tBVm/bvTuh31DSlF/r4l7Cfi4uhVQqLHD0Q4v301GMisEMwwbMgF7ZKxuZ+Jbd4NcdmRw==} |     resolution: {integrity: sha512-leWreJOdnuIxq9Y70tBVm/bvTuh31DSlF/r4l7Cfi4uhVQqLHD0Q4v301GMisEMwwbMgF7ZKxuZ+Jbd4NcdmRw==} | ||||||
|     dependencies: |     dependencies: | ||||||
| @ -2977,9 +3023,15 @@ packages: | |||||||
|   /@types/mdast@3.0.11: |   /@types/mdast@3.0.11: | ||||||
|     resolution: {integrity: sha512-Y/uImid8aAwrEA24/1tcRZwpxX3pIFTSilcNDKSPn+Y2iDywSEachzRuvgAYYLR3wpGXAsMbv5lvKLDZLeYPAw==} |     resolution: {integrity: sha512-Y/uImid8aAwrEA24/1tcRZwpxX3pIFTSilcNDKSPn+Y2iDywSEachzRuvgAYYLR3wpGXAsMbv5lvKLDZLeYPAw==} | ||||||
|     dependencies: |     dependencies: | ||||||
|       '@types/unist': 2.0.6 |       '@types/unist': 3.0.3 | ||||||
|     dev: true |     dev: true | ||||||
| 
 | 
 | ||||||
|  |   /@types/mdast@4.0.4: | ||||||
|  |     resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} | ||||||
|  |     dependencies: | ||||||
|  |       '@types/unist': 3.0.3 | ||||||
|  |     dev: false | ||||||
|  | 
 | ||||||
|   /@types/mdurl@1.0.2: |   /@types/mdurl@1.0.2: | ||||||
|     resolution: {integrity: sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==} |     resolution: {integrity: sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==} | ||||||
|     dev: true |     dev: true | ||||||
| @ -3068,12 +3120,15 @@ packages: | |||||||
|     resolution: {integrity: sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==} |     resolution: {integrity: sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==} | ||||||
|     dev: true |     dev: true | ||||||
| 
 | 
 | ||||||
|  |   /@types/unist@3.0.3: | ||||||
|  |     resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} | ||||||
|  | 
 | ||||||
|   /@types/uuid@9.0.0: |   /@types/uuid@9.0.0: | ||||||
|     resolution: {integrity: sha512-kr90f+ERiQtKWMz5rP32ltJ/BtULDI5RVO0uavn1HQUOwjx0R1h0rnDYNL0CepF1zL5bSY6FISAfd9tOdDhU5Q==} |     resolution: {integrity: sha512-kr90f+ERiQtKWMz5rP32ltJ/BtULDI5RVO0uavn1HQUOwjx0R1h0rnDYNL0CepF1zL5bSY6FISAfd9tOdDhU5Q==} | ||||||
|     dev: true |     dev: true | ||||||
| 
 | 
 | ||||||
|   /@types/web-bluetooth@0.0.17: |   /@types/web-bluetooth@0.0.20: | ||||||
|     resolution: {integrity: sha512-4p9vcSmxAayx72yn70joFoL44c9MO/0+iVEBIQXe3v2h2SiAsEIo/G5v6ObFWvNKRFjbrVadNf9LqEEZeQPzdA==} |     resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} | ||||||
|     dev: false |     dev: false | ||||||
| 
 | 
 | ||||||
|   /@types/which@2.0.2: |   /@types/which@2.0.2: | ||||||
| @ -3334,6 +3389,10 @@ packages: | |||||||
|       eslint-visitor-keys: 3.4.3 |       eslint-visitor-keys: 3.4.3 | ||||||
|     dev: true |     dev: true | ||||||
| 
 | 
 | ||||||
|  |   /@ungap/structured-clone@1.2.0: | ||||||
|  |     resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} | ||||||
|  |     dev: false | ||||||
|  | 
 | ||||||
|   /@unhead/dom@0.5.1: |   /@unhead/dom@0.5.1: | ||||||
|     resolution: {integrity: sha512-cdRzGbZVWTgbwl9HiG3RZzzPThXmhj5afGB2BLRwbE+3IiwqUpMjL6v8bDjE5qttvH4YrK9AD9O8fFP9XyZQpg==} |     resolution: {integrity: sha512-cdRzGbZVWTgbwl9HiG3RZzzPThXmhj5afGB2BLRwbE+3IiwqUpMjL6v8bDjE5qttvH4YrK9AD9O8fFP9XyZQpg==} | ||||||
|     dependencies: |     dependencies: | ||||||
| @ -3360,7 +3419,7 @@ packages: | |||||||
|     dependencies: |     dependencies: | ||||||
|       '@unhead/dom': 0.5.1 |       '@unhead/dom': 0.5.1 | ||||||
|       '@unhead/schema': 0.5.1 |       '@unhead/schema': 0.5.1 | ||||||
|       '@vueuse/shared': 10.11.1(vue@3.3.4) |       '@vueuse/shared': 11.1.0(vue@3.3.4) | ||||||
|       unhead: 0.5.1 |       unhead: 0.5.1 | ||||||
|       vue: 3.3.4 |       vue: 3.3.4 | ||||||
|     transitivePeerDependencies: |     transitivePeerDependencies: | ||||||
| @ -3942,13 +4001,13 @@ packages: | |||||||
|       - typescript |       - typescript | ||||||
|     dev: false |     dev: false | ||||||
| 
 | 
 | ||||||
|   /@vueuse/core@10.3.0(vue@3.3.4): |   /@vueuse/core@10.11.1(vue@3.3.4): | ||||||
|     resolution: {integrity: sha512-BEM5yxcFKb5btFjTSAFjTu5jmwoW66fyV9uJIP4wUXXU8aR5Hl44gndaaXp7dC5HSObmgbnR2RN+Un1p68Mf5Q==} |     resolution: {integrity: sha512-guoy26JQktXPcz+0n3GukWIy/JDNKti9v6VEMu6kV2sYBsWuGiTU8OWdg+ADfUbHg3/3DlqySDe7JmdHrktiww==} | ||||||
|     dependencies: |     dependencies: | ||||||
|       '@types/web-bluetooth': 0.0.17 |       '@types/web-bluetooth': 0.0.20 | ||||||
|       '@vueuse/metadata': 10.3.0 |       '@vueuse/metadata': 10.11.1 | ||||||
|       '@vueuse/shared': 10.3.0(vue@3.3.4) |       '@vueuse/shared': 10.11.1(vue@3.3.4) | ||||||
|       vue-demi: 0.14.5(vue@3.3.4) |       vue-demi: 0.14.10(vue@3.3.4) | ||||||
|     transitivePeerDependencies: |     transitivePeerDependencies: | ||||||
|       - '@vue/composition-api' |       - '@vue/composition-api' | ||||||
|       - vue |       - vue | ||||||
| @ -3967,8 +4026,8 @@ packages: | |||||||
|       - '@vue/composition-api' |       - '@vue/composition-api' | ||||||
|     dev: false |     dev: false | ||||||
| 
 | 
 | ||||||
|   /@vueuse/metadata@10.3.0: |   /@vueuse/metadata@10.11.1: | ||||||
|     resolution: {integrity: sha512-Ema3YhNOa4swDsV0V7CEY5JXvK19JI/o1szFO1iWxdFg3vhdFtCtSTP26PCvbUpnUtNHBY2wx5y3WDXND5Pvnw==} |     resolution: {integrity: sha512-IGa5FXd003Ug1qAZmyE8wF3sJ81xGLSqTqtQ6jaVfkeZ4i5kS2mwQF61yhVqojRnenVew5PldLyRgvdl4YYuSw==} | ||||||
|     dev: false |     dev: false | ||||||
| 
 | 
 | ||||||
|   /@vueuse/router@10.0.0(vue-router@4.1.6)(vue@3.3.4): |   /@vueuse/router@10.0.0(vue-router@4.1.6)(vue@3.3.4): | ||||||
| @ -4002,10 +4061,10 @@ packages: | |||||||
|       - vue |       - vue | ||||||
|     dev: false |     dev: false | ||||||
| 
 | 
 | ||||||
|   /@vueuse/shared@10.3.0(vue@3.3.4): |   /@vueuse/shared@11.1.0(vue@3.3.4): | ||||||
|     resolution: {integrity: sha512-kGqCTEuFPMK4+fNWy6dUOiYmxGcUbtznMwBZLC1PubidF4VZY05B+Oht7Jh7/6x4VOWGpvu3R37WHi81cKpiqg==} |     resolution: {integrity: sha512-YUtIpY122q7osj+zsNMFAfMTubGz0sn5QzE5gPzAIiCmtt2ha3uQUY1+JPyL4gRCTsLPX82Y9brNbo/aqlA91w==} | ||||||
|     dependencies: |     dependencies: | ||||||
|       vue-demi: 0.14.5(vue@3.3.4) |       vue-demi: 0.14.10(vue@3.3.4) | ||||||
|     transitivePeerDependencies: |     transitivePeerDependencies: | ||||||
|       - '@vue/composition-api' |       - '@vue/composition-api' | ||||||
|       - vue |       - vue | ||||||
| @ -4363,6 +4422,10 @@ packages: | |||||||
|     engines: {node: '>=12.13'} |     engines: {node: '>=12.13'} | ||||||
|     dev: false |     dev: false | ||||||
| 
 | 
 | ||||||
|  |   /ccount@2.0.1: | ||||||
|  |     resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} | ||||||
|  |     dev: false | ||||||
|  | 
 | ||||||
|   /chai@4.3.7: |   /chai@4.3.7: | ||||||
|     resolution: {integrity: sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==} |     resolution: {integrity: sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==} | ||||||
|     engines: {node: '>=4'} |     engines: {node: '>=4'} | ||||||
| @ -4437,10 +4500,18 @@ packages: | |||||||
|       tslib: 2.5.0 |       tslib: 2.5.0 | ||||||
|     dev: false |     dev: false | ||||||
| 
 | 
 | ||||||
|  |   /character-entities-html4@2.1.0: | ||||||
|  |     resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} | ||||||
|  |     dev: false | ||||||
|  | 
 | ||||||
|   /character-entities-legacy@1.1.4: |   /character-entities-legacy@1.1.4: | ||||||
|     resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} |     resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} | ||||||
|     dev: true |     dev: true | ||||||
| 
 | 
 | ||||||
|  |   /character-entities-legacy@3.0.0: | ||||||
|  |     resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} | ||||||
|  |     dev: false | ||||||
|  | 
 | ||||||
|   /character-entities@1.2.4: |   /character-entities@1.2.4: | ||||||
|     resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==} |     resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==} | ||||||
|     dev: true |     dev: true | ||||||
| @ -4536,6 +4607,10 @@ packages: | |||||||
|       delayed-stream: 1.0.0 |       delayed-stream: 1.0.0 | ||||||
|     dev: true |     dev: true | ||||||
| 
 | 
 | ||||||
|  |   /comma-separated-tokens@2.0.3: | ||||||
|  |     resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} | ||||||
|  |     dev: false | ||||||
|  | 
 | ||||||
|   /commander@10.0.0: |   /commander@10.0.0: | ||||||
|     resolution: {integrity: sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==} |     resolution: {integrity: sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==} | ||||||
|     engines: {node: '>=14'} |     engines: {node: '>=14'} | ||||||
| @ -4862,10 +4937,21 @@ packages: | |||||||
|     engines: {node: '>=0.4.0'} |     engines: {node: '>=0.4.0'} | ||||||
|     dev: true |     dev: true | ||||||
| 
 | 
 | ||||||
|  |   /dequal@2.0.3: | ||||||
|  |     resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} | ||||||
|  |     engines: {node: '>=6'} | ||||||
|  |     dev: false | ||||||
|  | 
 | ||||||
|   /destr@2.0.1: |   /destr@2.0.1: | ||||||
|     resolution: {integrity: sha512-M1Ob1zPSIvlARiJUkKqvAZ3VAqQY6Jcuth/pBKQ2b1dX/Qx0OnJ8Vux6J2H5PTMQeRzWrrbTu70VxBfv/OPDJA==} |     resolution: {integrity: sha512-M1Ob1zPSIvlARiJUkKqvAZ3VAqQY6Jcuth/pBKQ2b1dX/Qx0OnJ8Vux6J2H5PTMQeRzWrrbTu70VxBfv/OPDJA==} | ||||||
|     dev: true |     dev: true | ||||||
| 
 | 
 | ||||||
|  |   /devlop@1.1.0: | ||||||
|  |     resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} | ||||||
|  |     dependencies: | ||||||
|  |       dequal: 2.0.3 | ||||||
|  |     dev: false | ||||||
|  | 
 | ||||||
|   /diff-sequences@29.4.3: |   /diff-sequences@29.4.3: | ||||||
|     resolution: {integrity: sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==} |     resolution: {integrity: sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==} | ||||||
|     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} |     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} | ||||||
| @ -5991,6 +6077,28 @@ packages: | |||||||
|       function-bind: 1.1.2 |       function-bind: 1.1.2 | ||||||
|     dev: true |     dev: true | ||||||
| 
 | 
 | ||||||
|  |   /hast-util-to-html@9.0.3: | ||||||
|  |     resolution: {integrity: sha512-M17uBDzMJ9RPCqLMO92gNNUDuBSq10a25SDBI08iCCxmorf4Yy6sYHK57n9WAbRAAaU+DuR4W6GN9K4DFZesYg==} | ||||||
|  |     dependencies: | ||||||
|  |       '@types/hast': 3.0.4 | ||||||
|  |       '@types/unist': 3.0.3 | ||||||
|  |       ccount: 2.0.1 | ||||||
|  |       comma-separated-tokens: 2.0.3 | ||||||
|  |       hast-util-whitespace: 3.0.0 | ||||||
|  |       html-void-elements: 3.0.0 | ||||||
|  |       mdast-util-to-hast: 13.2.0 | ||||||
|  |       property-information: 6.5.0 | ||||||
|  |       space-separated-tokens: 2.0.2 | ||||||
|  |       stringify-entities: 4.0.4 | ||||||
|  |       zwitch: 2.0.4 | ||||||
|  |     dev: false | ||||||
|  | 
 | ||||||
|  |   /hast-util-whitespace@3.0.0: | ||||||
|  |     resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} | ||||||
|  |     dependencies: | ||||||
|  |       '@types/hast': 3.0.4 | ||||||
|  |     dev: false | ||||||
|  | 
 | ||||||
|   /he@1.2.0: |   /he@1.2.0: | ||||||
|     resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} |     resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} | ||||||
|     dev: false |     dev: false | ||||||
| @ -6039,6 +6147,10 @@ packages: | |||||||
|     engines: {node: '>=8'} |     engines: {node: '>=8'} | ||||||
|     dev: true |     dev: true | ||||||
| 
 | 
 | ||||||
|  |   /html-void-elements@3.0.0: | ||||||
|  |     resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} | ||||||
|  |     dev: false | ||||||
|  | 
 | ||||||
|   /htmlparser2@8.0.2: |   /htmlparser2@8.0.2: | ||||||
|     resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} |     resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} | ||||||
|     dependencies: |     dependencies: | ||||||
| @ -6858,6 +6970,20 @@ packages: | |||||||
|       - supports-color |       - supports-color | ||||||
|     dev: true |     dev: true | ||||||
| 
 | 
 | ||||||
|  |   /mdast-util-to-hast@13.2.0: | ||||||
|  |     resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} | ||||||
|  |     dependencies: | ||||||
|  |       '@types/hast': 3.0.4 | ||||||
|  |       '@types/mdast': 4.0.4 | ||||||
|  |       '@ungap/structured-clone': 1.2.0 | ||||||
|  |       devlop: 1.1.0 | ||||||
|  |       micromark-util-sanitize-uri: 2.0.0 | ||||||
|  |       trim-lines: 3.0.1 | ||||||
|  |       unist-util-position: 5.0.0 | ||||||
|  |       unist-util-visit: 5.0.0 | ||||||
|  |       vfile: 6.0.3 | ||||||
|  |     dev: false | ||||||
|  | 
 | ||||||
|   /mdast-util-to-string@2.0.0: |   /mdast-util-to-string@2.0.0: | ||||||
|     resolution: {integrity: sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==} |     resolution: {integrity: sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==} | ||||||
|     dev: true |     dev: true | ||||||
| @ -6881,6 +7007,33 @@ packages: | |||||||
|     resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} |     resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} | ||||||
|     engines: {node: '>= 8'} |     engines: {node: '>= 8'} | ||||||
| 
 | 
 | ||||||
|  |   /micromark-util-character@2.1.0: | ||||||
|  |     resolution: {integrity: sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==} | ||||||
|  |     dependencies: | ||||||
|  |       micromark-util-symbol: 2.0.0 | ||||||
|  |       micromark-util-types: 2.0.0 | ||||||
|  |     dev: false | ||||||
|  | 
 | ||||||
|  |   /micromark-util-encode@2.0.0: | ||||||
|  |     resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==} | ||||||
|  |     dev: false | ||||||
|  | 
 | ||||||
|  |   /micromark-util-sanitize-uri@2.0.0: | ||||||
|  |     resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==} | ||||||
|  |     dependencies: | ||||||
|  |       micromark-util-character: 2.1.0 | ||||||
|  |       micromark-util-encode: 2.0.0 | ||||||
|  |       micromark-util-symbol: 2.0.0 | ||||||
|  |     dev: false | ||||||
|  | 
 | ||||||
|  |   /micromark-util-symbol@2.0.0: | ||||||
|  |     resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==} | ||||||
|  |     dev: false | ||||||
|  | 
 | ||||||
|  |   /micromark-util-types@2.0.0: | ||||||
|  |     resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==} | ||||||
|  |     dev: false | ||||||
|  | 
 | ||||||
|   /micromark@2.11.4: |   /micromark@2.11.4: | ||||||
|     resolution: {integrity: sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==} |     resolution: {integrity: sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==} | ||||||
|     dependencies: |     dependencies: | ||||||
| @ -7182,6 +7335,12 @@ packages: | |||||||
|       mimic-fn: 2.1.0 |       mimic-fn: 2.1.0 | ||||||
|     dev: true |     dev: true | ||||||
| 
 | 
 | ||||||
|  |   /oniguruma-to-js@0.4.3: | ||||||
|  |     resolution: {integrity: sha512-X0jWUcAlxORhOqqBREgPMgnshB7ZGYszBNspP+tS9hPD3l13CdaXcHbgImoHUHlrvGx/7AvFEkTRhAGYh+jzjQ==} | ||||||
|  |     dependencies: | ||||||
|  |       regex: 4.3.3 | ||||||
|  |     dev: false | ||||||
|  | 
 | ||||||
|   /open@8.4.2: |   /open@8.4.2: | ||||||
|     resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} |     resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} | ||||||
|     engines: {node: '>=12'} |     engines: {node: '>=12'} | ||||||
| @ -7511,6 +7670,10 @@ packages: | |||||||
|       react-is: 18.2.0 |       react-is: 18.2.0 | ||||||
|     dev: true |     dev: true | ||||||
| 
 | 
 | ||||||
|  |   /property-information@6.5.0: | ||||||
|  |     resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} | ||||||
|  |     dev: false | ||||||
|  | 
 | ||||||
|   /prosemirror-changeset@2.2.1: |   /prosemirror-changeset@2.2.1: | ||||||
|     resolution: {integrity: sha512-J7msc6wbxB4ekDFj+n9gTW/jav/p53kdlivvuppHsrZXCaQdVgRghoZbSS3kwrRyAstRVQ4/+u5k7YfLgkkQvQ==} |     resolution: {integrity: sha512-J7msc6wbxB4ekDFj+n9gTW/jav/p53kdlivvuppHsrZXCaQdVgRghoZbSS3kwrRyAstRVQ4/+u5k7YfLgkkQvQ==} | ||||||
|     dependencies: |     dependencies: | ||||||
| @ -7785,6 +7948,10 @@ packages: | |||||||
|       '@babel/runtime': 7.23.2 |       '@babel/runtime': 7.23.2 | ||||||
|     dev: true |     dev: true | ||||||
| 
 | 
 | ||||||
|  |   /regex@4.3.3: | ||||||
|  |     resolution: {integrity: sha512-r/AadFO7owAq1QJVeZ/nq9jNS1vyZt+6t1p/E59B56Rn2GCya+gr1KSyOzNL/er+r+B7phv5jG2xU2Nz1YkmJg==} | ||||||
|  |     dev: false | ||||||
|  | 
 | ||||||
|   /regexp-tree@0.1.27: |   /regexp-tree@0.1.27: | ||||||
|     resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} |     resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} | ||||||
|     hasBin: true |     hasBin: true | ||||||
| @ -8086,6 +8253,17 @@ packages: | |||||||
|     engines: {node: '>=8'} |     engines: {node: '>=8'} | ||||||
|     dev: true |     dev: true | ||||||
| 
 | 
 | ||||||
|  |   /shiki@1.22.0: | ||||||
|  |     resolution: {integrity: sha512-/t5LlhNs+UOKQCYBtl5ZsH/Vclz73GIqT2yQsCBygr8L/ppTdmpL4w3kPLoZJbMKVWtoG77Ue1feOjZfDxvMkw==} | ||||||
|  |     dependencies: | ||||||
|  |       '@shikijs/core': 1.22.0 | ||||||
|  |       '@shikijs/engine-javascript': 1.22.0 | ||||||
|  |       '@shikijs/engine-oniguruma': 1.22.0 | ||||||
|  |       '@shikijs/types': 1.22.0 | ||||||
|  |       '@shikijs/vscode-textmate': 9.3.0 | ||||||
|  |       '@types/hast': 3.0.4 | ||||||
|  |     dev: false | ||||||
|  | 
 | ||||||
|   /side-channel@1.0.4: |   /side-channel@1.0.4: | ||||||
|     resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} |     resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} | ||||||
|     dependencies: |     dependencies: | ||||||
| @ -8165,6 +8343,10 @@ packages: | |||||||
|     resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} |     resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} | ||||||
|     dev: true |     dev: true | ||||||
| 
 | 
 | ||||||
|  |   /space-separated-tokens@2.0.2: | ||||||
|  |     resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} | ||||||
|  |     dev: false | ||||||
|  | 
 | ||||||
|   /spdx-correct@3.2.0: |   /spdx-correct@3.2.0: | ||||||
|     resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} |     resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} | ||||||
|     dependencies: |     dependencies: | ||||||
| @ -8283,6 +8465,13 @@ packages: | |||||||
|       safe-buffer: 5.2.1 |       safe-buffer: 5.2.1 | ||||||
|     dev: true |     dev: true | ||||||
| 
 | 
 | ||||||
|  |   /stringify-entities@4.0.4: | ||||||
|  |     resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} | ||||||
|  |     dependencies: | ||||||
|  |       character-entities-html4: 2.1.0 | ||||||
|  |       character-entities-legacy: 3.0.0 | ||||||
|  |     dev: false | ||||||
|  | 
 | ||||||
|   /stringify-object@3.3.0: |   /stringify-object@3.3.0: | ||||||
|     resolution: {integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==} |     resolution: {integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==} | ||||||
|     engines: {node: '>=4'} |     engines: {node: '>=4'} | ||||||
| @ -8502,6 +8691,10 @@ packages: | |||||||
|     resolution: {integrity: sha512-M8RGFoKtZ8dF+iwJfAJTOH/SM4KluKOKRJpjCMhI8bG3qB74zrFoArKZ62ll0Fr3mqkMJiQOmWYkdYgDeITYQg==} |     resolution: {integrity: sha512-M8RGFoKtZ8dF+iwJfAJTOH/SM4KluKOKRJpjCMhI8bG3qB74zrFoArKZ62ll0Fr3mqkMJiQOmWYkdYgDeITYQg==} | ||||||
|     dev: false |     dev: false | ||||||
| 
 | 
 | ||||||
|  |   /trim-lines@3.0.1: | ||||||
|  |     resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} | ||||||
|  |     dev: false | ||||||
|  | 
 | ||||||
|   /ts-api-utils@1.0.1(typescript@5.2.2): |   /ts-api-utils@1.0.1(typescript@5.2.2): | ||||||
|     resolution: {integrity: sha512-lC/RGlPmwdrIBFTX59wwNzqh7aR2otPNPR/5brHZm/XKFYKsfqxihXUe9pU3JI+3vGkl+vyCoNNnPhJn3aLK1A==} |     resolution: {integrity: sha512-lC/RGlPmwdrIBFTX59wwNzqh7aR2otPNPR/5brHZm/XKFYKsfqxihXUe9pU3JI+3vGkl+vyCoNNnPhJn3aLK1A==} | ||||||
|     engines: {node: '>=16.13.0'} |     engines: {node: '>=16.13.0'} | ||||||
| @ -8719,12 +8912,45 @@ packages: | |||||||
|       crypto-random-string: 2.0.0 |       crypto-random-string: 2.0.0 | ||||||
|     dev: true |     dev: true | ||||||
| 
 | 
 | ||||||
|  |   /unist-util-is@6.0.0: | ||||||
|  |     resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} | ||||||
|  |     dependencies: | ||||||
|  |       '@types/unist': 3.0.3 | ||||||
|  |     dev: false | ||||||
|  | 
 | ||||||
|  |   /unist-util-position@5.0.0: | ||||||
|  |     resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} | ||||||
|  |     dependencies: | ||||||
|  |       '@types/unist': 3.0.3 | ||||||
|  |     dev: false | ||||||
|  | 
 | ||||||
|   /unist-util-stringify-position@2.0.3: |   /unist-util-stringify-position@2.0.3: | ||||||
|     resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==} |     resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==} | ||||||
|     dependencies: |     dependencies: | ||||||
|       '@types/unist': 2.0.6 |       '@types/unist': 2.0.6 | ||||||
|     dev: true |     dev: true | ||||||
| 
 | 
 | ||||||
|  |   /unist-util-stringify-position@4.0.0: | ||||||
|  |     resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} | ||||||
|  |     dependencies: | ||||||
|  |       '@types/unist': 3.0.3 | ||||||
|  |     dev: false | ||||||
|  | 
 | ||||||
|  |   /unist-util-visit-parents@6.0.1: | ||||||
|  |     resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} | ||||||
|  |     dependencies: | ||||||
|  |       '@types/unist': 3.0.3 | ||||||
|  |       unist-util-is: 6.0.0 | ||||||
|  |     dev: false | ||||||
|  | 
 | ||||||
|  |   /unist-util-visit@5.0.0: | ||||||
|  |     resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} | ||||||
|  |     dependencies: | ||||||
|  |       '@types/unist': 3.0.3 | ||||||
|  |       unist-util-is: 6.0.0 | ||||||
|  |       unist-util-visit-parents: 6.0.1 | ||||||
|  |     dev: false | ||||||
|  | 
 | ||||||
|   /universalify@0.2.0: |   /universalify@0.2.0: | ||||||
|     resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} |     resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} | ||||||
|     engines: {node: '>= 4.0.0'} |     engines: {node: '>= 4.0.0'} | ||||||
| @ -8783,7 +9009,7 @@ packages: | |||||||
|       - supports-color |       - supports-color | ||||||
|     dev: true |     dev: true | ||||||
| 
 | 
 | ||||||
|   /unplugin-auto-import@0.16.4(@vueuse/core@10.3.0)(rollup@2.79.1): |   /unplugin-auto-import@0.16.4(@vueuse/core@10.11.1)(rollup@2.79.1): | ||||||
|     resolution: {integrity: sha512-xdgBa9NAS3JG8HjkAZHSbGSMlrjKpaWKXGUzaF6RzEtr980RCl1t0Zsu0skUInNYrEQfqaHc7aGWPv41DLTK/w==} |     resolution: {integrity: sha512-xdgBa9NAS3JG8HjkAZHSbGSMlrjKpaWKXGUzaF6RzEtr980RCl1t0Zsu0skUInNYrEQfqaHc7aGWPv41DLTK/w==} | ||||||
|     engines: {node: '>=14'} |     engines: {node: '>=14'} | ||||||
|     peerDependencies: |     peerDependencies: | ||||||
| @ -8797,7 +9023,7 @@ packages: | |||||||
|     dependencies: |     dependencies: | ||||||
|       '@antfu/utils': 0.7.4 |       '@antfu/utils': 0.7.4 | ||||||
|       '@rollup/pluginutils': 5.0.2(rollup@2.79.1) |       '@rollup/pluginutils': 5.0.2(rollup@2.79.1) | ||||||
|       '@vueuse/core': 10.3.0(vue@3.3.4) |       '@vueuse/core': 10.11.1(vue@3.3.4) | ||||||
|       local-pkg: 0.4.3 |       local-pkg: 0.4.3 | ||||||
|       magic-string: 0.30.0 |       magic-string: 0.30.0 | ||||||
|       minimatch: 9.0.1 |       minimatch: 9.0.1 | ||||||
| @ -8969,6 +9195,20 @@ packages: | |||||||
|       vue: 3.3.4 |       vue: 3.3.4 | ||||||
|     dev: false |     dev: false | ||||||
| 
 | 
 | ||||||
|  |   /vfile-message@4.0.2: | ||||||
|  |     resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} | ||||||
|  |     dependencies: | ||||||
|  |       '@types/unist': 3.0.3 | ||||||
|  |       unist-util-stringify-position: 4.0.0 | ||||||
|  |     dev: false | ||||||
|  | 
 | ||||||
|  |   /vfile@6.0.3: | ||||||
|  |     resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} | ||||||
|  |     dependencies: | ||||||
|  |       '@types/unist': 3.0.3 | ||||||
|  |       vfile-message: 4.0.2 | ||||||
|  |     dev: false | ||||||
|  | 
 | ||||||
|   /vite-node@0.34.0(@types/node@18.15.11)(less@4.1.3): |   /vite-node@0.34.0(@types/node@18.15.11)(less@4.1.3): | ||||||
|     resolution: {integrity: sha512-rGZMvpb052rjUwJA/a17xMfOibzNF7byMdRSTcN2Lw8uxX08s5EfjWW5mBkm3MSFTPctMSVtT2yC+8ShrZbT5g==} |     resolution: {integrity: sha512-rGZMvpb052rjUwJA/a17xMfOibzNF7byMdRSTcN2Lw8uxX08s5EfjWW5mBkm3MSFTPctMSVtT2yC+8ShrZbT5g==} | ||||||
|     engines: {node: '>=v14.18.0'} |     engines: {node: '>=v14.18.0'} | ||||||
| @ -9661,6 +9901,10 @@ packages: | |||||||
|     engines: {node: '>=12.20'} |     engines: {node: '>=12.20'} | ||||||
|     dev: true |     dev: true | ||||||
| 
 | 
 | ||||||
|  |   /zwitch@2.0.4: | ||||||
|  |     resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} | ||||||
|  |     dev: false | ||||||
|  | 
 | ||||||
|   /zx@7.2.1: |   /zx@7.2.1: | ||||||
|     resolution: {integrity: sha512-TgKwppaMLMNAXHhlhbBh7rMoOSx3/9qqnkv8frmhVlSomEuWkDijh/BCmYntkoS7ZQyemApAUyEi24jIrrS+hA==} |     resolution: {integrity: sha512-TgKwppaMLMNAXHhlhbBh7rMoOSx3/9qqnkv8frmhVlSomEuWkDijh/BCmYntkoS7ZQyemApAUyEi24jIrrS+hA==} | ||||||
|     engines: {node: '>= 16.0.0'} |     engines: {node: '>= 16.0.0'} | ||||||
|  | |||||||
| @ -1,5 +1,5 @@ | |||||||
| // eslint-disable-next-line no-restricted-imports
 | // eslint-disable-next-line no-restricted-imports
 | ||||||
| import { useClipboard } from '@vueuse/core'; | import { useClipboard, useClipboardItems } from '@vueuse/core'; | ||||||
| import { useMessage } from 'naive-ui'; | import { useMessage } from 'naive-ui'; | ||||||
| import type { MaybeRefOrGetter } from 'vue'; | import type { MaybeRefOrGetter } from 'vue'; | ||||||
| 
 | 
 | ||||||
| @ -28,3 +28,34 @@ export function useCopy({ source, text = 'Copied to the clipboard', createToast | |||||||
|     }, |     }, | ||||||
|   }; |   }; | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | export function useCopyClipboardItems({ source, text = 'Copied to the clipboard', createToast = true }: { source?: MaybeRefOrGetter<Array<{ mime: string; content: string }>>; text?: string; createToast?: boolean } = {}) { | ||||||
|  |   function toClipboardItem(item: { mime: string; content: string }) { | ||||||
|  |     return new ClipboardItem({ | ||||||
|  |       [item.mime]: new Blob([item.content], { type: item.mime }), | ||||||
|  |     }); | ||||||
|  |   } | ||||||
|  |   const sourceClipboardItems = computed(() => (toValue(source) || []).map(toClipboardItem)); | ||||||
|  |   const { copy, copied, ...rest } = useClipboardItems({ | ||||||
|  |     source: sourceClipboardItems, | ||||||
|  |   }); | ||||||
|  | 
 | ||||||
|  |   const message = useMessage(); | ||||||
|  | 
 | ||||||
|  |   return { | ||||||
|  |     ...rest, | ||||||
|  |     isJustCopied: copied, | ||||||
|  |     async copy(content?: { mime: string; content: string }[], { notificationMessage }: { notificationMessage?: string } = {}) { | ||||||
|  |       if (source) { | ||||||
|  |         await copy(); | ||||||
|  |       } | ||||||
|  |       else { | ||||||
|  |         await copy((content || []).map(toClipboardItem)); | ||||||
|  |       } | ||||||
|  | 
 | ||||||
|  |       if (createToast) { | ||||||
|  |         message.success(notificationMessage ?? text); | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |   }; | ||||||
|  | } | ||||||
|  | |||||||
| @ -1,7 +1,8 @@ | |||||||
| import { useRouteQuery } from '@vueuse/router'; | import { useRouteQuery } from '@vueuse/router'; | ||||||
| import { computed } from 'vue'; | import { computed } from 'vue'; | ||||||
|  | import { useStorage } from '@vueuse/core'; | ||||||
| 
 | 
 | ||||||
| export { useQueryParam }; | export { useQueryParam, useQueryParamOrStorage }; | ||||||
| 
 | 
 | ||||||
| const transformers = { | const transformers = { | ||||||
|   number: { |   number: { | ||||||
| @ -16,6 +17,12 @@ const transformers = { | |||||||
|     fromQuery: (value: string) => value.toLowerCase() === 'true', |     fromQuery: (value: string) => value.toLowerCase() === 'true', | ||||||
|     toQuery: (value: boolean) => (value ? 'true' : 'false'), |     toQuery: (value: boolean) => (value ? 'true' : 'false'), | ||||||
|   }, |   }, | ||||||
|  |   object: { | ||||||
|  |     fromQuery: (value: string) => { | ||||||
|  |       return JSON.parse(value); | ||||||
|  |     }, | ||||||
|  |     toQuery: (value: object) => JSON.stringify(value), | ||||||
|  |   }, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| function useQueryParam<T>({ name, defaultValue }: { name: string; defaultValue: T }) { | function useQueryParam<T>({ name, defaultValue }: { name: string; defaultValue: T }) { | ||||||
| @ -33,3 +40,27 @@ function useQueryParam<T>({ name, defaultValue }: { name: string; defaultValue: | |||||||
|     }, |     }, | ||||||
|   }); |   }); | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | function useQueryParamOrStorage<T>({ name, storageName, defaultValue }: { name: string; storageName: string; defaultValue: T }) { | ||||||
|  |   const type = typeof defaultValue; | ||||||
|  |   const transformer = transformers[type as keyof typeof transformers] ?? transformers.string; | ||||||
|  | 
 | ||||||
|  |   const storageRef = useStorage(storageName, defaultValue); | ||||||
|  |   const proxyDefaultValue = transformer.toQuery(defaultValue as never); | ||||||
|  |   const proxy = useRouteQuery(name, proxyDefaultValue); | ||||||
|  | 
 | ||||||
|  |   const r = ref(defaultValue); | ||||||
|  | 
 | ||||||
|  |   watch(r, | ||||||
|  |     (value) => { | ||||||
|  |       proxy.value = transformer.toQuery(value as never); | ||||||
|  |       storageRef.value = value as never; | ||||||
|  |     }, | ||||||
|  |     { deep: true }); | ||||||
|  | 
 | ||||||
|  |   r.value = (proxy.value && proxy.value !== proxyDefaultValue | ||||||
|  |     ? transformer.fromQuery(proxy.value) as unknown as T | ||||||
|  |     : storageRef.value as T) as never; | ||||||
|  | 
 | ||||||
|  |   return r; | ||||||
|  | } | ||||||
|  | |||||||
							
								
								
									
										133
									
								
								src/tools/code-highlighter/code-highlighter.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										133
									
								
								src/tools/code-highlighter/code-highlighter.vue
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,133 @@ | |||||||
|  | <script setup lang="ts"> | ||||||
|  | import { computed, ref } from 'vue'; | ||||||
|  | import { bundledLanguagesInfo, createHighlighter } from 'shiki/bundle/full'; | ||||||
|  | import { bundledThemesInfo } from 'shiki/themes'; | ||||||
|  | import { useQueryParamOrStorage } from '@/composable/queryParams'; | ||||||
|  | import { useCopy, useCopyClipboardItems } from '@/composable/copy'; | ||||||
|  | 
 | ||||||
|  | const code = ref(`// Using 'typeof' to infer types | ||||||
|  | const person = { name: "Alice", age: 30 }; | ||||||
|  | type PersonType = typeof person;  // { name: string; age: number } | ||||||
|  | 
 | ||||||
|  | // 'satisfies' to ensure a type matches but allows more specific types | ||||||
|  | type Animal = { name: string }; | ||||||
|  | const dog = { name: "Buddy", breed: "Golden Retriever" } satisfies Animal; | ||||||
|  | 
 | ||||||
|  | // Generics with 'extends' and default values | ||||||
|  | function identity<T extends number | string = string>(arg: T): T { | ||||||
|  |   return arg; | ||||||
|  | }`); | ||||||
|  | 
 | ||||||
|  | const themes = ref<{ value: string; label: string }[]>( | ||||||
|  |   bundledThemesInfo.map((item) => { | ||||||
|  |     return { | ||||||
|  |       value: item.id, | ||||||
|  |       label: item.displayName, | ||||||
|  |     }; | ||||||
|  |   })); | ||||||
|  | const langs = ref<{ value: string; label: string }[]>( | ||||||
|  |   bundledLanguagesInfo.map(item => ({ | ||||||
|  |     value: item.id, | ||||||
|  |     label: item.name, | ||||||
|  |   }))); | ||||||
|  | 
 | ||||||
|  | const currentTheme = useQueryParamOrStorage({ name: 'theme', storageName: 'code-highlighter:theme', defaultValue: 'dark-plus' }); | ||||||
|  | const currentLang = useQueryParamOrStorage({ name: 'lang', storageName: 'code-highlighter:lang', defaultValue: 'typescript' }); | ||||||
|  | 
 | ||||||
|  | const showLineNumbers = ref(false); | ||||||
|  | 
 | ||||||
|  | const formattedCodeHtml = computedAsync(async () => { | ||||||
|  |   const currentThemeValue = currentTheme.value; | ||||||
|  |   const currentLangValue = currentLang.value; | ||||||
|  |   const codeValue = code.value; | ||||||
|  |   const needLineNumbers = showLineNumbers.value; | ||||||
|  | 
 | ||||||
|  |   const lineNumberWidth = Math.log10(codeValue.split('\n').length) + 2; | ||||||
|  | 
 | ||||||
|  |   const highlighter = await createHighlighter( | ||||||
|  |     { | ||||||
|  |       langs: [currentLangValue], | ||||||
|  |       themes: [currentThemeValue], | ||||||
|  |     }); | ||||||
|  |   return highlighter.codeToHtml(codeValue, { | ||||||
|  |     lang: currentLangValue, | ||||||
|  |     theme: currentThemeValue, | ||||||
|  |     transformers: [ | ||||||
|  |       { | ||||||
|  |         postprocess(html: string) { | ||||||
|  |           // when copied to clipboard and pasted to LibreOffice, | ||||||
|  |           // formatting of first line is only kept if there is a line break before... | ||||||
|  |           const ensureFirstLineFormattedWhenCopied | ||||||
|  |               = (html: string) => html.replace('<code>', '<code>\n'); | ||||||
|  |           if (!needLineNumbers) { | ||||||
|  |             return ensureFirstLineFormattedWhenCopied(html); | ||||||
|  |           } | ||||||
|  |           let lineNumber = 1; | ||||||
|  |           return html.replace(/<span class="line/g, (m) => { | ||||||
|  |             const lineNumberFormatted = (lineNumber++).toString().padStart(lineNumberWidth, ' '); | ||||||
|  |             return `<span class="line-number" style="white-space-collapse: preserve">${lineNumberFormatted}  </span>${m}`; | ||||||
|  |           }).replace('<code>', '<code>\n'); | ||||||
|  |         }, | ||||||
|  |       }, | ||||||
|  |     ], | ||||||
|  |   }); | ||||||
|  | }); | ||||||
|  | const htmlClipboardItems = computed(() => [{ | ||||||
|  |   mime: 'text/html', | ||||||
|  |   content: formattedCodeHtml.value, | ||||||
|  | }]); | ||||||
|  | const { copy: copyHtml } = useCopyClipboardItems({ source: htmlClipboardItems }); | ||||||
|  | const { copy: copyText } = useCopy({ source: code }); | ||||||
|  | </script> | ||||||
|  | 
 | ||||||
|  | <template> | ||||||
|  |   <div> | ||||||
|  |     <div mb-3 flex items-baseline gap-1> | ||||||
|  |       <c-select | ||||||
|  |         v-model:value="currentLang" | ||||||
|  |         label="Language" | ||||||
|  |         label-position="left" | ||||||
|  |         searchable | ||||||
|  |         :options="langs" | ||||||
|  |         flex-1 | ||||||
|  |       /> | ||||||
|  |       <c-select | ||||||
|  |         v-model:value="currentTheme" | ||||||
|  |         label="Theme" | ||||||
|  |         label-position="left" | ||||||
|  |         searchable | ||||||
|  |         :options="themes" | ||||||
|  |         flex-1 | ||||||
|  |       /> | ||||||
|  |     </div> | ||||||
|  | 
 | ||||||
|  |     <c-input-text | ||||||
|  |       v-model:value="code" | ||||||
|  |       label="Code snippet to format:" | ||||||
|  |       multiline | ||||||
|  |       placeholder="Put your code snippet here" | ||||||
|  |       rows="5" | ||||||
|  |       mb-3 | ||||||
|  |     /> | ||||||
|  | 
 | ||||||
|  |     <div flex justify-center gap-2> | ||||||
|  |       <n-form-item label="Show line numbers" label-placement="left"> | ||||||
|  |         <n-switch v-model:value="showLineNumbers" /> | ||||||
|  |       </n-form-item> | ||||||
|  |       <c-button @click="copyHtml()"> | ||||||
|  |         Copy HTML Formatted | ||||||
|  |       </c-button> | ||||||
|  |       <c-button @click="copyText()"> | ||||||
|  |         Copy Code Text | ||||||
|  |       </c-button> | ||||||
|  |     </div> | ||||||
|  | 
 | ||||||
|  |     <div v-html="formattedCodeHtml" /><!-- //NOSONAR --> | ||||||
|  |   </div> | ||||||
|  | </template> | ||||||
|  | 
 | ||||||
|  | <style scoped> | ||||||
|  | ::v-deep(.line-number) { | ||||||
|  |   text-wrap: nowrap; | ||||||
|  | } | ||||||
|  | </style> | ||||||
							
								
								
									
										12
									
								
								src/tools/code-highlighter/index.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								src/tools/code-highlighter/index.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,12 @@ | |||||||
|  | import { Code } from '@vicons/tabler'; | ||||||
|  | import { defineTool } from '../tool'; | ||||||
|  | 
 | ||||||
|  | export const tool = defineTool({ | ||||||
|  |   name: 'Code/Scripts Highlighter', | ||||||
|  |   path: '/code-highlighter', | ||||||
|  |   description: 'Highlight programming code fragments', | ||||||
|  |   keywords: ['code', 'highlighter'], | ||||||
|  |   component: () => import('./code-highlighter.vue'), | ||||||
|  |   icon: Code, | ||||||
|  |   createdAt: new Date('2024-08-15'), | ||||||
|  | }); | ||||||
| @ -2,6 +2,7 @@ import { tool as base64FileConverter } from './base64-file-converter'; | |||||||
| import { tool as base64StringConverter } from './base64-string-converter'; | import { tool as base64StringConverter } from './base64-string-converter'; | ||||||
| import { tool as basicAuthGenerator } from './basic-auth-generator'; | import { tool as basicAuthGenerator } from './basic-auth-generator'; | ||||||
| import { tool as emailNormalizer } from './email-normalizer'; | import { tool as emailNormalizer } from './email-normalizer'; | ||||||
|  | import { tool as codeHighlighter } from './code-highlighter'; | ||||||
| 
 | 
 | ||||||
| import { tool as asciiTextDrawer } from './ascii-text-drawer'; | import { tool as asciiTextDrawer } from './ascii-text-drawer'; | ||||||
| 
 | 
 | ||||||
| @ -154,6 +155,7 @@ export const toolsByCategory: ToolCategory[] = [ | |||||||
|       xmlFormatter, |       xmlFormatter, | ||||||
|       yamlViewer, |       yamlViewer, | ||||||
|       emailNormalizer, |       emailNormalizer, | ||||||
|  |       codeHighlighter, | ||||||
|     ], |     ], | ||||||
|   }, |   }, | ||||||
|   { |   { | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user