Merge ebc79566b9 into b47d132839
				
					
				
			This commit is contained in:
		
						commit
						1feff7a3a6
					
				| @ -286,6 +286,9 @@ | ||||
|     "watchTriggerable": true, | ||||
|     "watchWithFilter": 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 ignorableWatch: typeof import('@vueuse/core')['ignorableWatch'] | ||||
|   const inject: typeof import('vue')['inject'] | ||||
|   const injectLocal: typeof import('@vueuse/core')['injectLocal'] | ||||
|   const isDefined: typeof import('@vueuse/core')['isDefined'] | ||||
|   const isProxy: typeof import('vue')['isProxy'] | ||||
|   const isReactive: typeof import('vue')['isReactive'] | ||||
| @ -65,6 +66,7 @@ declare global { | ||||
|   const onUpdated: typeof import('vue')['onUpdated'] | ||||
|   const pausableWatch: typeof import('@vueuse/core')['pausableWatch'] | ||||
|   const provide: typeof import('vue')['provide'] | ||||
|   const provideLocal: typeof import('@vueuse/core')['provideLocal'] | ||||
|   const reactify: typeof import('@vueuse/core')['reactify'] | ||||
|   const reactifyObject: typeof import('@vueuse/core')['reactifyObject'] | ||||
|   const reactive: typeof import('vue')['reactive'] | ||||
| @ -128,6 +130,7 @@ declare global { | ||||
|   const useBrowserLocation: typeof import('@vueuse/core')['useBrowserLocation'] | ||||
|   const useCached: typeof import('@vueuse/core')['useCached'] | ||||
|   const useClipboard: typeof import('@vueuse/core')['useClipboard'] | ||||
|   const useClipboardItems: typeof import('@vueuse/core')['useClipboardItems'] | ||||
|   const useCloned: typeof import('@vueuse/core')['useCloned'] | ||||
|   const useColorMode: typeof import('@vueuse/core')['useColorMode'] | ||||
|   const useConfirmDialog: typeof import('@vueuse/core')['useConfirmDialog'] | ||||
| @ -326,6 +329,7 @@ declare module 'vue' { | ||||
|     readonly h: UnwrapRef<typeof import('vue')['h']> | ||||
|     readonly ignorableWatch: UnwrapRef<typeof import('@vueuse/core')['ignorableWatch']> | ||||
|     readonly inject: UnwrapRef<typeof import('vue')['inject']> | ||||
|     readonly injectLocal: UnwrapRef<typeof import('@vueuse/core')['injectLocal']> | ||||
|     readonly isDefined: UnwrapRef<typeof import('@vueuse/core')['isDefined']> | ||||
|     readonly isProxy: UnwrapRef<typeof import('vue')['isProxy']> | ||||
|     readonly isReactive: UnwrapRef<typeof import('vue')['isReactive']> | ||||
| @ -355,6 +359,7 @@ declare module 'vue' { | ||||
|     readonly onUpdated: UnwrapRef<typeof import('vue')['onUpdated']> | ||||
|     readonly pausableWatch: UnwrapRef<typeof import('@vueuse/core')['pausableWatch']> | ||||
|     readonly provide: UnwrapRef<typeof import('vue')['provide']> | ||||
|     readonly provideLocal: UnwrapRef<typeof import('@vueuse/core')['provideLocal']> | ||||
|     readonly reactify: UnwrapRef<typeof import('@vueuse/core')['reactify']> | ||||
|     readonly reactifyObject: UnwrapRef<typeof import('@vueuse/core')['reactifyObject']> | ||||
|     readonly reactive: UnwrapRef<typeof import('vue')['reactive']> | ||||
| @ -418,6 +423,7 @@ declare module 'vue' { | ||||
|     readonly useBrowserLocation: UnwrapRef<typeof import('@vueuse/core')['useBrowserLocation']> | ||||
|     readonly useCached: UnwrapRef<typeof import('@vueuse/core')['useCached']> | ||||
|     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 useColorMode: UnwrapRef<typeof import('@vueuse/core')['useColorMode']> | ||||
|     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 ignorableWatch: UnwrapRef<typeof import('@vueuse/core')['ignorableWatch']> | ||||
|     readonly inject: UnwrapRef<typeof import('vue')['inject']> | ||||
|     readonly injectLocal: UnwrapRef<typeof import('@vueuse/core')['injectLocal']> | ||||
|     readonly isDefined: UnwrapRef<typeof import('@vueuse/core')['isDefined']> | ||||
|     readonly isProxy: UnwrapRef<typeof import('vue')['isProxy']> | ||||
|     readonly isReactive: UnwrapRef<typeof import('vue')['isReactive']> | ||||
| @ -639,6 +646,7 @@ declare module '@vue/runtime-core' { | ||||
|     readonly onUpdated: UnwrapRef<typeof import('vue')['onUpdated']> | ||||
|     readonly pausableWatch: UnwrapRef<typeof import('@vueuse/core')['pausableWatch']> | ||||
|     readonly provide: UnwrapRef<typeof import('vue')['provide']> | ||||
|     readonly provideLocal: UnwrapRef<typeof import('@vueuse/core')['provideLocal']> | ||||
|     readonly reactify: UnwrapRef<typeof import('@vueuse/core')['reactify']> | ||||
|     readonly reactifyObject: UnwrapRef<typeof import('@vueuse/core')['reactifyObject']> | ||||
|     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 useCached: UnwrapRef<typeof import('@vueuse/core')['useCached']> | ||||
|     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 useColorMode: UnwrapRef<typeof import('@vueuse/core')['useColorMode']> | ||||
|     readonly useConfirmDialog: UnwrapRef<typeof import('@vueuse/core')['useConfirmDialog']> | ||||
|  | ||||
							
								
								
									
										34
									
								
								components.d.ts
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										34
									
								
								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'] | ||||
|     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'] | ||||
|     CodeHighlighter: typeof import('./src/tools/code-highlighter/code-highlighter.vue')['default'] | ||||
|     CollapsibleToolMenu: typeof import('./src/components/CollapsibleToolMenu.vue')['default'] | ||||
|     ColorConverter: typeof import('./src/tools/color-converter/color-converter.vue')['default'] | ||||
|     ColoredCard: typeof import('./src/components/ColoredCard.vue')['default'] | ||||
| @ -90,17 +91,28 @@ declare module '@vue/runtime-core' { | ||||
|     HttpStatusCodes: typeof import('./src/tools/http-status-codes/http-status-codes.vue')['default'] | ||||
|     IbanValidatorAndParser: typeof import('./src/tools/iban-validator-and-parser/iban-validator-and-parser.vue')['default'] | ||||
|     'IconMdi:brushVariant': typeof import('~icons/mdi/brush-variant')['default'] | ||||
|     'IconMdi:contentCopy': typeof import('~icons/mdi/content-copy')['default'] | ||||
|     'IconMdi:kettleSteamOutline': typeof import('~icons/mdi/kettle-steam-outline')['default'] | ||||
|     IconMdiArrowDown: typeof import('~icons/mdi/arrow-down')['default'] | ||||
|     IconMdiArrowRightBottom: typeof import('~icons/mdi/arrow-right-bottom')['default'] | ||||
|     IconMdiCamera: typeof import('~icons/mdi/camera')['default'] | ||||
|     IconMdiChevronDown: typeof import('~icons/mdi/chevron-down')['default'] | ||||
|     IconMdiChevronRight: typeof import('~icons/mdi/chevron-right')['default'] | ||||
|     IconMdiClose: typeof import('~icons/mdi/close')['default'] | ||||
|     IconMdiContentCopy: typeof import('~icons/mdi/content-copy')['default'] | ||||
|     IconMdiDeleteOutline: typeof import('~icons/mdi/delete-outline')['default'] | ||||
|     IconMdiDownload: typeof import('~icons/mdi/download')['default'] | ||||
|     IconMdiEye: typeof import('~icons/mdi/eye')['default'] | ||||
|     IconMdiEyeOff: typeof import('~icons/mdi/eye-off')['default'] | ||||
|     IconMdiHeart: typeof import('~icons/mdi/heart')['default'] | ||||
|     IconMdiPause: typeof import('~icons/mdi/pause')['default'] | ||||
|     IconMdiPlay: typeof import('~icons/mdi/play')['default'] | ||||
|     IconMdiRecord: typeof import('~icons/mdi/record')['default'] | ||||
|     IconMdiRefresh: typeof import('~icons/mdi/refresh')['default'] | ||||
|     IconMdiSearch: typeof import('~icons/mdi/search')['default'] | ||||
|     IconMdiTranslate: typeof import('~icons/mdi/translate')['default'] | ||||
|     IconMdiTriangleDown: typeof import('~icons/mdi/triangle-down')['default'] | ||||
|     IconMdiVideo: typeof import('~icons/mdi/video')['default'] | ||||
|     InputCopyable: typeof import('./src/components/InputCopyable.vue')['default'] | ||||
|     IntegerBaseConverter: typeof import('./src/tools/integer-base-converter/integer-base-converter.vue')['default'] | ||||
|     Ipv4AddressConverter: typeof import('./src/tools/ipv4-address-converter/ipv4-address-converter.vue')['default'] | ||||
| @ -129,20 +141,42 @@ declare module '@vue/runtime-core' { | ||||
|     MenuLayout: typeof import('./src/components/MenuLayout.vue')['default'] | ||||
|     MetaTagGenerator: typeof import('./src/tools/meta-tag-generator/meta-tag-generator.vue')['default'] | ||||
|     MimeTypes: typeof import('./src/tools/mime-types/mime-types.vue')['default'] | ||||
|     NAlert: typeof import('naive-ui')['NAlert'] | ||||
|     NavbarButtons: typeof import('./src/components/NavbarButtons.vue')['default'] | ||||
|     NButton: typeof import('naive-ui')['NButton'] | ||||
|     NCheckbox: typeof import('naive-ui')['NCheckbox'] | ||||
|     NCode: typeof import('naive-ui')['NCode'] | ||||
|     NCollapseTransition: typeof import('naive-ui')['NCollapseTransition'] | ||||
|     NColorPicker: typeof import('naive-ui')['NColorPicker'] | ||||
|     NConfigProvider: typeof import('naive-ui')['NConfigProvider'] | ||||
|     NDatePicker: typeof import('naive-ui')['NDatePicker'] | ||||
|     NDivider: typeof import('naive-ui')['NDivider'] | ||||
|     NDynamicInput: typeof import('naive-ui')['NDynamicInput'] | ||||
|     NEllipsis: typeof import('naive-ui')['NEllipsis'] | ||||
|     NForm: typeof import('naive-ui')['NForm'] | ||||
|     NFormItem: typeof import('naive-ui')['NFormItem'] | ||||
|     NGi: typeof import('naive-ui')['NGi'] | ||||
|     NGrid: typeof import('naive-ui')['NGrid'] | ||||
|     NH1: typeof import('naive-ui')['NH1'] | ||||
|     NH2: typeof import('naive-ui')['NH2'] | ||||
|     NH3: typeof import('naive-ui')['NH3'] | ||||
|     NIcon: typeof import('naive-ui')['NIcon'] | ||||
|     NImage: typeof import('naive-ui')['NImage'] | ||||
|     NInputGroup: typeof import('naive-ui')['NInputGroup'] | ||||
|     NInputGroupLabel: typeof import('naive-ui')['NInputGroupLabel'] | ||||
|     NInputNumber: typeof import('naive-ui')['NInputNumber'] | ||||
|     NLayout: typeof import('naive-ui')['NLayout'] | ||||
|     NLayoutSider: typeof import('naive-ui')['NLayoutSider'] | ||||
|     NMenu: typeof import('naive-ui')['NMenu'] | ||||
|     NProgress: typeof import('naive-ui')['NProgress'] | ||||
|     NScrollbar: typeof import('naive-ui')['NScrollbar'] | ||||
|     NSlider: typeof import('naive-ui')['NSlider'] | ||||
|     NSpace: typeof import('naive-ui')['NSpace'] | ||||
|     NSpin: typeof import('naive-ui')['NSpin'] | ||||
|     NStatistic: typeof import('naive-ui')['NStatistic'] | ||||
|     NSwitch: typeof import('naive-ui')['NSwitch'] | ||||
|     NTable: typeof import('naive-ui')['NTable'] | ||||
|     NTag: typeof import('naive-ui')['NTag'] | ||||
|     NumeronymGenerator: typeof import('./src/tools/numeronym-generator/numeronym-generator.vue')['default'] | ||||
|     OtpCodeGeneratorAndValidator: typeof import('./src/tools/otp-code-generator-and-validator/otp-code-generator-and-validator.vue')['default'] | ||||
|     PasswordStrengthAnalyser: typeof import('./src/tools/password-strength-analyser/password-strength-analyser.vue')['default'] | ||||
|  | ||||
| @ -48,7 +48,7 @@ | ||||
|     "@types/markdown-it": "^13.0.7", | ||||
|     "@vicons/material": "^0.12.0", | ||||
|     "@vicons/tabler": "^0.12.0", | ||||
|     "@vueuse/core": "^10.3.0", | ||||
|     "@vueuse/core": "^10.11.1", | ||||
|     "@vueuse/head": "^1.0.0", | ||||
|     "@vueuse/router": "^10.0.0", | ||||
|     "bcryptjs": "^2.4.3", | ||||
| @ -88,6 +88,8 @@ | ||||
|     "plausible-tracker": "^0.3.8", | ||||
|     "qrcode": "^1.5.1", | ||||
|     "randexp": "^0.5.3", | ||||
|     "regex": "^4.3.3", | ||||
|     "shiki": "^1.22.0", | ||||
|     "sql-formatter": "^13.0.0", | ||||
|     "ua-parser-js": "^1.0.35", | ||||
|     "ulid": "^2.3.0", | ||||
|  | ||||
							
								
								
									
										293
									
								
								pnpm-lock.yaml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										293
									
								
								pnpm-lock.yaml
									
									
									
										generated
									
									
									
								
							| @ -42,8 +42,8 @@ dependencies: | ||||
|     specifier: ^0.12.0 | ||||
|     version: 0.12.0 | ||||
|   '@vueuse/core': | ||||
|     specifier: ^10.3.0 | ||||
|     version: 10.3.0(vue@3.3.4) | ||||
|     specifier: ^10.11.1 | ||||
|     version: 10.11.1(vue@3.3.4) | ||||
|   '@vueuse/head': | ||||
|     specifier: ^1.0.0 | ||||
|     version: 1.0.0(vue@3.3.4) | ||||
| @ -161,6 +161,12 @@ dependencies: | ||||
|   randexp: | ||||
|     specifier: ^0.5.3 | ||||
|     version: 0.5.3 | ||||
|   regex: | ||||
|     specifier: ^4.3.3 | ||||
|     version: 4.3.3 | ||||
|   shiki: | ||||
|     specifier: ^1.22.0 | ||||
|     version: 1.22.0 | ||||
|   sql-formatter: | ||||
|     specifier: ^13.0.0 | ||||
|     version: 13.0.0 | ||||
| @ -175,7 +181,7 @@ dependencies: | ||||
|     version: 0.4.0 | ||||
|   unplugin-auto-import: | ||||
|     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: | ||||
|     specifier: ^9.0.0 | ||||
|     version: 9.0.0 | ||||
| @ -2627,6 +2633,43 @@ packages: | ||||
|     resolution: {integrity: sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg==} | ||||
|     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: | ||||
|     resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} | ||||
|     dev: true | ||||
| @ -2975,6 +3018,12 @@ packages: | ||||
|       '@types/node': 18.15.11 | ||||
|     dev: true | ||||
| 
 | ||||
|   /@types/hast@3.0.4: | ||||
|     resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} | ||||
|     dependencies: | ||||
|       '@types/unist': 2.0.6 | ||||
|     dev: false | ||||
| 
 | ||||
|   /@types/jsdom@21.1.0: | ||||
|     resolution: {integrity: sha512-leWreJOdnuIxq9Y70tBVm/bvTuh31DSlF/r4l7Cfi4uhVQqLHD0Q4v301GMisEMwwbMgF7ZKxuZ+Jbd4NcdmRw==} | ||||
|     dependencies: | ||||
| @ -3033,6 +3082,12 @@ packages: | ||||
|       '@types/unist': 2.0.6 | ||||
|     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: | ||||
|     resolution: {integrity: sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==} | ||||
| 
 | ||||
| @ -3118,14 +3173,17 @@ packages: | ||||
| 
 | ||||
|   /@types/unist@2.0.6: | ||||
|     resolution: {integrity: sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==} | ||||
|     dev: true | ||||
| 
 | ||||
|   /@types/unist@3.0.3: | ||||
|     resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /@types/uuid@9.0.0: | ||||
|     resolution: {integrity: sha512-kr90f+ERiQtKWMz5rP32ltJ/BtULDI5RVO0uavn1HQUOwjx0R1h0rnDYNL0CepF1zL5bSY6FISAfd9tOdDhU5Q==} | ||||
|     dev: true | ||||
| 
 | ||||
|   /@types/web-bluetooth@0.0.17: | ||||
|     resolution: {integrity: sha512-4p9vcSmxAayx72yn70joFoL44c9MO/0+iVEBIQXe3v2h2SiAsEIo/G5v6ObFWvNKRFjbrVadNf9LqEEZeQPzdA==} | ||||
|   /@types/web-bluetooth@0.0.20: | ||||
|     resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /@types/which@2.0.2: | ||||
| @ -3386,6 +3444,10 @@ packages: | ||||
|       eslint-visitor-keys: 3.4.3 | ||||
|     dev: true | ||||
| 
 | ||||
|   /@ungap/structured-clone@1.2.0: | ||||
|     resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /@unhead/dom@0.5.1: | ||||
|     resolution: {integrity: sha512-cdRzGbZVWTgbwl9HiG3RZzzPThXmhj5afGB2BLRwbE+3IiwqUpMjL6v8bDjE5qttvH4YrK9AD9O8fFP9XyZQpg==} | ||||
|     dependencies: | ||||
| @ -3412,7 +3474,7 @@ packages: | ||||
|     dependencies: | ||||
|       '@unhead/dom': 0.5.1 | ||||
|       '@unhead/schema': 0.5.1 | ||||
|       '@vueuse/shared': 11.0.3(vue@3.3.4) | ||||
|       '@vueuse/shared': 11.1.0(vue@3.3.4) | ||||
|       unhead: 0.5.1 | ||||
|       vue: 3.3.4 | ||||
|     transitivePeerDependencies: | ||||
| @ -3994,13 +4056,13 @@ packages: | ||||
|       - typescript | ||||
|     dev: false | ||||
| 
 | ||||
|   /@vueuse/core@10.3.0(vue@3.3.4): | ||||
|     resolution: {integrity: sha512-BEM5yxcFKb5btFjTSAFjTu5jmwoW66fyV9uJIP4wUXXU8aR5Hl44gndaaXp7dC5HSObmgbnR2RN+Un1p68Mf5Q==} | ||||
|   /@vueuse/core@10.11.1(vue@3.3.4): | ||||
|     resolution: {integrity: sha512-guoy26JQktXPcz+0n3GukWIy/JDNKti9v6VEMu6kV2sYBsWuGiTU8OWdg+ADfUbHg3/3DlqySDe7JmdHrktiww==} | ||||
|     dependencies: | ||||
|       '@types/web-bluetooth': 0.0.17 | ||||
|       '@vueuse/metadata': 10.3.0 | ||||
|       '@vueuse/shared': 10.3.0(vue@3.3.4) | ||||
|       vue-demi: 0.14.5(vue@3.3.4) | ||||
|       '@types/web-bluetooth': 0.0.20 | ||||
|       '@vueuse/metadata': 10.11.1 | ||||
|       '@vueuse/shared': 10.11.1(vue@3.3.4) | ||||
|       vue-demi: 0.14.10(vue@3.3.4) | ||||
|     transitivePeerDependencies: | ||||
|       - '@vue/composition-api' | ||||
|       - vue | ||||
| @ -4019,8 +4081,8 @@ packages: | ||||
|       - '@vue/composition-api' | ||||
|     dev: false | ||||
| 
 | ||||
|   /@vueuse/metadata@10.3.0: | ||||
|     resolution: {integrity: sha512-Ema3YhNOa4swDsV0V7CEY5JXvK19JI/o1szFO1iWxdFg3vhdFtCtSTP26PCvbUpnUtNHBY2wx5y3WDXND5Pvnw==} | ||||
|   /@vueuse/metadata@10.11.1: | ||||
|     resolution: {integrity: sha512-IGa5FXd003Ug1qAZmyE8wF3sJ81xGLSqTqtQ6jaVfkeZ4i5kS2mwQF61yhVqojRnenVew5PldLyRgvdl4YYuSw==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /@vueuse/router@10.0.0(vue-router@4.1.6)(vue@3.3.4): | ||||
| @ -4039,23 +4101,23 @@ packages: | ||||
|   /@vueuse/shared@10.0.0(vue@3.3.4): | ||||
|     resolution: {integrity: sha512-Zh3LgJqvUBWVY3SiMvXanTcfAneGbt63QPczBRDNgQ6jd/ehodO9a1lCFzaA6SWJJoI+ugVTjHFYJdoR656DVQ==} | ||||
|     dependencies: | ||||
|       vue-demi: 0.14.5(vue@3.3.4) | ||||
|       vue-demi: 0.14.10(vue@3.3.4) | ||||
|     transitivePeerDependencies: | ||||
|       - '@vue/composition-api' | ||||
|       - vue | ||||
|     dev: false | ||||
| 
 | ||||
|   /@vueuse/shared@10.3.0(vue@3.3.4): | ||||
|     resolution: {integrity: sha512-kGqCTEuFPMK4+fNWy6dUOiYmxGcUbtznMwBZLC1PubidF4VZY05B+Oht7Jh7/6x4VOWGpvu3R37WHi81cKpiqg==} | ||||
|   /@vueuse/shared@10.11.1(vue@3.3.4): | ||||
|     resolution: {integrity: sha512-LHpC8711VFZlDaYUXEBbFBCQ7GS3dVU9mjOhhMhXP6txTV4EhYQg/KGnQuvt/sPAtoUKq7VVUnL6mVtFoL42sA==} | ||||
|     dependencies: | ||||
|       vue-demi: 0.14.5(vue@3.3.4) | ||||
|       vue-demi: 0.14.10(vue@3.3.4) | ||||
|     transitivePeerDependencies: | ||||
|       - '@vue/composition-api' | ||||
|       - vue | ||||
|     dev: false | ||||
| 
 | ||||
|   /@vueuse/shared@11.0.3(vue@3.3.4): | ||||
|     resolution: {integrity: sha512-0rY2m6HS5t27n/Vp5cTDsKTlNnimCqsbh/fmT2LgE+aaU42EMfXo8+bNX91W9I7DDmxfuACXMmrd7d79JxkqWA==} | ||||
|   /@vueuse/shared@11.1.0(vue@3.3.4): | ||||
|     resolution: {integrity: sha512-YUtIpY122q7osj+zsNMFAfMTubGz0sn5QzE5gPzAIiCmtt2ha3uQUY1+JPyL4gRCTsLPX82Y9brNbo/aqlA91w==} | ||||
|     dependencies: | ||||
|       vue-demi: 0.14.10(vue@3.3.4) | ||||
|     transitivePeerDependencies: | ||||
| @ -4415,6 +4477,10 @@ packages: | ||||
|     engines: {node: '>=12.13'} | ||||
|     dev: false | ||||
| 
 | ||||
|   /ccount@2.0.1: | ||||
|     resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /chai@4.3.7: | ||||
|     resolution: {integrity: sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==} | ||||
|     engines: {node: '>=4'} | ||||
| @ -4489,10 +4555,18 @@ packages: | ||||
|       tslib: 2.5.0 | ||||
|     dev: false | ||||
| 
 | ||||
|   /character-entities-html4@2.1.0: | ||||
|     resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /character-entities-legacy@1.1.4: | ||||
|     resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} | ||||
|     dev: true | ||||
| 
 | ||||
|   /character-entities-legacy@3.0.0: | ||||
|     resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /character-entities@1.2.4: | ||||
|     resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==} | ||||
|     dev: true | ||||
| @ -4588,6 +4662,10 @@ packages: | ||||
|       delayed-stream: 1.0.0 | ||||
|     dev: true | ||||
| 
 | ||||
|   /comma-separated-tokens@2.0.3: | ||||
|     resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /commander@10.0.0: | ||||
|     resolution: {integrity: sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==} | ||||
|     engines: {node: '>=14'} | ||||
| @ -4914,10 +4992,21 @@ packages: | ||||
|     engines: {node: '>=0.4.0'} | ||||
|     dev: true | ||||
| 
 | ||||
|   /dequal@2.0.3: | ||||
|     resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} | ||||
|     engines: {node: '>=6'} | ||||
|     dev: false | ||||
| 
 | ||||
|   /destr@2.0.1: | ||||
|     resolution: {integrity: sha512-M1Ob1zPSIvlARiJUkKqvAZ3VAqQY6Jcuth/pBKQ2b1dX/Qx0OnJ8Vux6J2H5PTMQeRzWrrbTu70VxBfv/OPDJA==} | ||||
|     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: | ||||
|     resolution: {integrity: sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==} | ||||
|     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} | ||||
| @ -6047,6 +6136,28 @@ packages: | ||||
|       function-bind: 1.1.2 | ||||
|     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: | ||||
|     resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} | ||||
|     dev: false | ||||
| @ -6095,6 +6206,10 @@ packages: | ||||
|     engines: {node: '>=8'} | ||||
|     dev: true | ||||
| 
 | ||||
|   /html-void-elements@3.0.0: | ||||
|     resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /htmlparser2@8.0.2: | ||||
|     resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} | ||||
|     dependencies: | ||||
| @ -6932,6 +7047,20 @@ packages: | ||||
|       - supports-color | ||||
|     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: | ||||
|     resolution: {integrity: sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==} | ||||
|     dev: true | ||||
| @ -6959,6 +7088,33 @@ packages: | ||||
|     resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} | ||||
|     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: | ||||
|     resolution: {integrity: sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==} | ||||
|     dependencies: | ||||
| @ -7260,6 +7416,12 @@ packages: | ||||
|       mimic-fn: 2.1.0 | ||||
|     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: | ||||
|     resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} | ||||
|     engines: {node: '>=12'} | ||||
| @ -7589,6 +7751,10 @@ packages: | ||||
|       react-is: 18.2.0 | ||||
|     dev: true | ||||
| 
 | ||||
|   /property-information@6.5.0: | ||||
|     resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /prosemirror-changeset@2.2.1: | ||||
|     resolution: {integrity: sha512-J7msc6wbxB4ekDFj+n9gTW/jav/p53kdlivvuppHsrZXCaQdVgRghoZbSS3kwrRyAstRVQ4/+u5k7YfLgkkQvQ==} | ||||
|     dependencies: | ||||
| @ -7876,6 +8042,10 @@ packages: | ||||
|       '@babel/runtime': 7.23.2 | ||||
|     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: | ||||
|     resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} | ||||
|     hasBin: true | ||||
| @ -8182,6 +8352,17 @@ packages: | ||||
|     engines: {node: '>=8'} | ||||
|     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: | ||||
|     resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} | ||||
|     dependencies: | ||||
| @ -8264,6 +8445,10 @@ packages: | ||||
|     resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} | ||||
|     dev: true | ||||
| 
 | ||||
|   /space-separated-tokens@2.0.2: | ||||
|     resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /spdx-correct@3.2.0: | ||||
|     resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} | ||||
|     dependencies: | ||||
| @ -8382,6 +8567,13 @@ packages: | ||||
|       safe-buffer: 5.2.1 | ||||
|     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: | ||||
|     resolution: {integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==} | ||||
|     engines: {node: '>=4'} | ||||
| @ -8601,6 +8793,10 @@ packages: | ||||
|     resolution: {integrity: sha512-M8RGFoKtZ8dF+iwJfAJTOH/SM4KluKOKRJpjCMhI8bG3qB74zrFoArKZ62ll0Fr3mqkMJiQOmWYkdYgDeITYQg==} | ||||
|     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): | ||||
|     resolution: {integrity: sha512-lC/RGlPmwdrIBFTX59wwNzqh7aR2otPNPR/5brHZm/XKFYKsfqxihXUe9pU3JI+3vGkl+vyCoNNnPhJn3aLK1A==} | ||||
|     engines: {node: '>=16.13.0'} | ||||
| @ -8822,12 +9018,45 @@ packages: | ||||
|       crypto-random-string: 2.0.0 | ||||
|     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: | ||||
|     resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==} | ||||
|     dependencies: | ||||
|       '@types/unist': 2.0.6 | ||||
|     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: | ||||
|     resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} | ||||
|     engines: {node: '>= 4.0.0'} | ||||
| @ -8886,7 +9115,7 @@ packages: | ||||
|       - supports-color | ||||
|     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==} | ||||
|     engines: {node: '>=14'} | ||||
|     peerDependencies: | ||||
| @ -8900,7 +9129,7 @@ packages: | ||||
|     dependencies: | ||||
|       '@antfu/utils': 0.7.4 | ||||
|       '@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 | ||||
|       magic-string: 0.30.0 | ||||
|       minimatch: 9.0.1 | ||||
| @ -9072,6 +9301,20 @@ packages: | ||||
|       vue: 3.3.4 | ||||
|     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): | ||||
|     resolution: {integrity: sha512-rGZMvpb052rjUwJA/a17xMfOibzNF7byMdRSTcN2Lw8uxX08s5EfjWW5mBkm3MSFTPctMSVtT2yC+8ShrZbT5g==} | ||||
|     engines: {node: '>=v14.18.0'} | ||||
| @ -9776,6 +10019,10 @@ packages: | ||||
|     engines: {node: '>=12.20'} | ||||
|     dev: true | ||||
| 
 | ||||
|   /zwitch@2.0.4: | ||||
|     resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /zx@7.2.1: | ||||
|     resolution: {integrity: sha512-TgKwppaMLMNAXHhlhbBh7rMoOSx3/9qqnkv8frmhVlSomEuWkDijh/BCmYntkoS7ZQyemApAUyEi24jIrrS+hA==} | ||||
|     engines: {node: '>= 16.0.0'} | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| // eslint-disable-next-line no-restricted-imports
 | ||||
| import { useClipboard } from '@vueuse/core'; | ||||
| import { useClipboard, useClipboardItems } from '@vueuse/core'; | ||||
| import { useMessage } from 'naive-ui'; | ||||
| 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); | ||||
|       } | ||||
|     }, | ||||
|   }; | ||||
| } | ||||
|  | ||||
							
								
								
									
										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 basicAuthGenerator } from './basic-auth-generator'; | ||||
| import { tool as emailNormalizer } from './email-normalizer'; | ||||
| import { tool as codeHighlighter } from './code-highlighter'; | ||||
| 
 | ||||
| import { tool as asciiTextDrawer } from './ascii-text-drawer'; | ||||
| 
 | ||||
| @ -158,6 +159,7 @@ export const toolsByCategory: ToolCategory[] = [ | ||||
|       xmlFormatter, | ||||
|       yamlViewer, | ||||
|       emailNormalizer, | ||||
|       codeHighlighter, | ||||
|       regexTester, | ||||
|       regexMemo, | ||||
|     ], | ||||
|  | ||||
| @ -112,5 +112,8 @@ export default defineConfig({ | ||||
|   }, | ||||
|   build: { | ||||
|     target: 'esnext', | ||||
|     rollupOptions: { | ||||
|       external: ['regex'], | ||||
|     }, | ||||
|   }, | ||||
| }); | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user