├── .gitignore
├── .vscode
└── extensions.json
├── README.md
├── dist
├── style.css
├── vue-input-highlighter.es.js
└── vue-input-highlighter.umd.js
├── index.html
├── package-lock.json
├── package.json
├── src
├── components
│ └── input-highlighter.vue
├── index.js
├── style.css
└── vite-env.d.ts
├── tsconfig.json
├── tsconfig.node.json
└── vite.config.ts
/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | pnpm-debug.log*
8 | lerna-debug.log*
9 |
10 | node_modules
11 | dist-ssr
12 | *.local
13 |
14 | # Editor directories and files
15 | .vscode/*
16 | !.vscode/extensions.json
17 | .idea
18 | .DS_Store
19 | *.suo
20 | *.ntvs*
21 | *.njsproj
22 | *.sln
23 | *.sw?
24 |
--------------------------------------------------------------------------------
/.vscode/extensions.json:
--------------------------------------------------------------------------------
1 | {
2 | "recommendations": ["Vue.volar", "Vue.vscode-typescript-vue-plugin"]
3 | }
4 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 | # Vue Input Highlighter
4 |
5 | Component that allows content highlighting within an input field based on specified regular expressions (regexes).
6 |
7 | It enhances user experience by providing visual feedback about specified patterns recognized and improves the interaction the user have with the input.
8 |
9 |
10 |
11 |
12 | # Table of contents
13 |
14 | - [Installation](#installation)
15 |
16 |
17 | - [Imports](#imports)
18 |
19 |
20 | - [Usage example](#usage-example)
21 |
22 |
23 | - [How it works](#how-it-works)
24 |
25 |
26 | - [Use Cases](#use-cases)
27 |
28 |
29 | - [Props](#props)
30 |
31 |
32 | - [Events](#events)
33 |
34 |
35 | - [Contribution](#contribution)
36 |
37 |
38 | - [Acknowledgments](#acknowledgments)
39 |
40 |
41 | # Installation
42 |
43 | Using npm :
44 |
45 | $ npm i @leyton-techlab/vue-input-highlighter
46 |
47 |
48 | Using yarn :
49 |
50 | $ yarn add @leyton-techlab/vue-input-highlighter
51 |
52 |
53 | # Imports
54 |
55 | Register the component globally :
56 |
57 | #### inside main.(js/ts)
58 | ````typescript
59 |
60 | import InputHighlighter from '@leyton-techlab/vue-input-highlighter';
61 | import '@leyton-techlab/vue-input-highlighter/style.css';
62 |
63 | const app = createApp(App)
64 |
65 | app.component("InputHighlighter", InputHighlighter);
66 |
67 | app.mount('#app')
68 |
69 | ````
70 | Import within the scope of a component
71 |
72 | #### Script Setup
73 | ````typescript
74 |
84 |
85 |
86 |
87 |
90 |
91 |
92 | ````
93 |
94 | #### Option Api
95 | ````typescript
96 |
110 |
111 |
112 |
113 |
116 |
117 |
118 |
119 | ````
120 | # Usage example
121 |
122 | Please refer to the following link content as usage example : [codesandbox](https://codesandbox.io/s/admiring-kilby-4h9swj?file=/src/App.vue)
123 |
124 |
125 |
126 |
127 | # How it works
128 |
129 | The component is based on a 'content editable' div that replicates the behavior of an input tag.
130 |
131 | As the user inputs content, the component evaluates the div's text and analyzes it using regular expressions (regex).
132 |
133 | Any fragment that matches the regex is encapsulated within an HTML tag, with the default being \ (or as specified) for which the relevant styles are then applied.
134 |
135 | # Use Cases
136 |
137 | Use cases example :
138 |
139 | - Highlight search operators (example : and, or, not, ") inside a search bar
140 |
141 | - Highlight id like entries (ex: company number, salesforce id, random code)
142 |
143 | - Highlight business specific keyword
144 |
145 | - Protocols : http/https
146 |
147 | - Language syntax : select, from, where
148 |
149 | - Auth methods : Basic, Bearer
150 |
151 | # Props
152 |
153 | List of component props :
154 |
155 | | Props | Description |
156 | |-------------|-----------------------------------------------------------------------------|
157 | | modelValue | allow v-model behavior for the component |
158 | | rules | array of rules as composed object defined in more details in the next table |
159 | | placeholder | string value displayed when input is empty as a placeholder for explanation |
160 |
161 |
162 | List of component "rules" props sub-elements :
163 |
164 | | Sub-element | Description |
165 | |-------------|---------------------------------------------------------------------------------|
166 | | regex | pattern to be matched |
167 | | style | string value to be mapped inside the style attribute of the matched element tag |
168 | | class | string value to be mapped inside the class attribute of the matched element tag |
169 | | tag | tag used when wrapping the matched element |
170 |
171 | # Events
172 |
173 | List of component custom events
174 |
175 | | Events | Description |
176 | |------------|-------------------------------------------------------------------------------------------|
177 | | highlight | fires whenever one or multiple highlights are matched. return list of newly matched text. |
178 | | highlights | fires at each input. return list of all matched text by the input. |
179 |
180 | # Contribution
181 |
182 | Every improvement of the package is welcome, just fork the project make the necessary changes and create a pull request.
183 |
184 | If you want to contact me (@GAliNor) here is a [link](https://www.linkedin.com/in/ali-guedda/) to my linkedin profile
185 |
186 | # Acknowledgments
187 |
188 | Many thanks to :
189 |
190 | - [@karimerrahli](https://github.com/karimerrahli)
191 | - [@afaddoul](https://github.com/afaddoul)
192 | - [@AdnaneAm](https://github.com/adnaneam)
193 | - [@akiyamaSM](https://github.com/akiyamaSM)
194 |
195 | for the reviews and advice
196 |
--------------------------------------------------------------------------------
/dist/style.css:
--------------------------------------------------------------------------------
1 | .input-highlighter{width:200px;padding:3px 5px;border:1px solid black;overflow-x:auto;white-space:nowrap;-ms-overflow-style:none;scrollbar-width:none}.input-highlighter::-webkit-scrollbar{display:none}.input-highlighter:focus{outline:0px solid transparent}.input-highlighter[placeholder]:empty:before{content:attr(placeholder);color:#000;opacity:.6}
2 |
--------------------------------------------------------------------------------
/dist/vue-input-highlighter.es.js:
--------------------------------------------------------------------------------
1 | import { toRefs as E, ref as p, onMounted as R, openBlock as $, createElementBlock as b, unref as T } from "vue";
2 | const V = ["placeholder"], f = "strong", w = {
3 | __name: "input-highlighter",
4 | props: {
5 | modelValue: String,
6 | rules: {
7 | type: Array,
8 | default: []
9 | },
10 | placeholder: {
11 | type: String,
12 | default: ""
13 | }
14 | },
15 | emits: ["update:modelValue", "highlight", "highlights"],
16 | setup(m, { emit: r }) {
17 | const _ = m, { modelValue: v, rules: x, placeholder: y } = E(_), s = p(""), c = p(v.value), g = [];
18 | let i = [];
19 | for (const e of x.value)
20 | e instanceof RegExp ? g.push({
21 | regex: e,
22 | class: "",
23 | style: "",
24 | tag: f
25 | }) : e instanceof Object && g.push({
26 | regex: e.regex,
27 | class: e.class ? e.class : "",
28 | style: e.style ? e.style : "",
29 | tag: e.tag ? e.tag : f
30 | });
31 | R(() => {
32 | a();
33 | });
34 | const H = (e) => e.replace(/&/g, "&").replace(//g, ">").replace(/"/g, """).replace(/'/g, "'"), u = (e, t, o, l) => {
35 | if (l.done)
36 | return l;
37 | let n = null;
38 | if (e.childNodes.length == 0)
39 | l.pos += e.textContent.length;
40 | else
41 | for (let h = 0; h < e.childNodes.length && !l.done; h++) {
42 | if (n = e.childNodes[h], n === t)
43 | return l.pos += o, l.done = !0, l;
44 | u(n, t, o, l);
45 | }
46 | return l;
47 | }, d = (e, t, o) => {
48 | if (o.done)
49 | return t;
50 | if (e.childNodes.length == 0)
51 | e.textContent.length >= o.pos ? (t.setStart(e, o.pos), o.done = !0) : o.pos = o.pos - e.textContent.length;
52 | else
53 | for (let l = 0; l < e.childNodes.length && !o.done; l++) {
54 | let n = e.childNodes[l];
55 | d(n, t, o);
56 | }
57 | return t;
58 | }, N = (e) => {
59 | for (const t of g)
60 | e = e.replaceAll(
61 | t.regex,
62 | `<${t.tag} class="${t.class}" style="${t.style}">$1${t.tag}>`
63 | );
64 | return e;
65 | }, a = () => {
66 | const e = H(c.value), t = N(e);
67 | s.value.innerHTML = t;
68 | }, S = (e) => {
69 | const t = Array.from(e);
70 | return i.forEach((o) => {
71 | const l = t.indexOf(o);
72 | l > -1 && t.splice(l, 1);
73 | }), t;
74 | }, C = () => {
75 | const e = Array.from(s.value.children).map((t) => t.innerHTML);
76 | e.length > i.length && r("highlight", S(e)), i = e, r("highlights", i);
77 | }, A = () => {
78 | c.value = s.value.textContent;
79 | const e = window.getSelection(), t = e.focusNode, o = e.focusOffset, l = u(s.value, t, o, { pos: 0, done: !1 });
80 | o === 0 && (l.pos += 0.5), a(), e.removeAllRanges();
81 | const n = d(s.value, document.createRange(), {
82 | pos: l.pos,
83 | done: !1
84 | });
85 | n.collapse(!0), e.addRange(n), C(), r("update:modelValue", c.value);
86 | };
87 | return (e, t) => ($(), b("div", {
88 | contenteditable: "true",
89 | ref_key: "editableElmt",
90 | ref: s,
91 | class: "input-highlighter",
92 | placeholder: T(y),
93 | onInput: A
94 | }, null, 40, V));
95 | }
96 | };
97 | export {
98 | w as default
99 | };
100 |
--------------------------------------------------------------------------------
/dist/vue-input-highlighter.umd.js:
--------------------------------------------------------------------------------
1 | (function(o,r){typeof exports=="object"&&typeof module<"u"?module.exports=r(require("vue")):typeof define=="function"&&define.amd?define(["vue"],r):(o=typeof globalThis<"u"?globalThis:o||self,o["vue-input-highlighter"]=r(o.Vue))})(this,function(o){"use strict";const r="",_=["placeholder"],f="strong";return{__name:"input-highlighter",props:{modelValue:String,rules:{type:Array,default:[]},placeholder:{type:String,default:""}},emits:["update:modelValue","highlight","highlights"],setup(x,{emit:h}){const y=x,{modelValue:v,rules:H,placeholder:N}=o.toRefs(y),i=o.ref(""),u=o.ref(v.value),g=[];let c=[];for(const e of H.value)e instanceof RegExp?g.push({regex:e,class:"",style:"",tag:f}):e instanceof Object&&g.push({regex:e.regex,class:e.class?e.class:"",style:e.style?e.style:"",tag:e.tag?e.tag:f});o.onMounted(()=>{m()});const S=e=>e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'"),a=(e,t,n,l)=>{if(l.done)return l;let s=null;if(e.childNodes.length==0)l.pos+=e.textContent.length;else for(let d=0;d{if(n.done)return t;if(e.childNodes.length==0)e.textContent.length>=n.pos?(t.setStart(e,n.pos),n.done=!0):n.pos=n.pos-e.textContent.length;else for(let l=0;l{for(const t of g)e=e.replaceAll(t.regex,`<${t.tag} class="${t.class}" style="${t.style}">$1${t.tag}>`);return e},m=()=>{const e=S(u.value),t=C(e);i.value.innerHTML=t},A=e=>{const t=Array.from(e);return c.forEach(n=>{const l=t.indexOf(n);l>-1&&t.splice(l,1)}),t},E=()=>{const e=Array.from(i.value.children).map(t=>t.innerHTML);e.length>c.length&&h("highlight",A(e)),c=e,h("highlights",c)},R=()=>{u.value=i.value.textContent;const e=window.getSelection(),t=e.focusNode,n=e.focusOffset,l=a(i.value,t,n,{pos:0,done:!1});n===0&&(l.pos+=.5),m(),e.removeAllRanges();const s=p(i.value,document.createRange(),{pos:l.pos,done:!1});s.collapse(!0),e.addRange(s),E(),h("update:modelValue",u.value)};return(e,t)=>(o.openBlock(),o.createElementBlock("div",{contenteditable:"true",ref_key:"editableElmt",ref:i,class:"input-highlighter",placeholder:o.unref(N),onInput:R},null,40,_))}}});
2 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Vite + Vue + TS
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "vue-input-highlighter",
3 | "version": "0.0.1",
4 | "lockfileVersion": 2,
5 | "requires": true,
6 | "packages": {
7 | "": {
8 | "name": "vue-input-highlighter",
9 | "version": "0.0.1",
10 | "dependencies": {
11 | "vue": "^3.3.4"
12 | },
13 | "devDependencies": {
14 | "@vitejs/plugin-vue": "^4.2.3",
15 | "typescript": "^5.0.2",
16 | "vite": "^4.4.5",
17 | "vue-tsc": "^1.8.5"
18 | }
19 | },
20 | "node_modules/@babel/parser": {
21 | "version": "7.22.7",
22 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz",
23 | "integrity": "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==",
24 | "bin": {
25 | "parser": "bin/babel-parser.js"
26 | },
27 | "engines": {
28 | "node": ">=6.0.0"
29 | }
30 | },
31 | "node_modules/@esbuild/android-arm": {
32 | "version": "0.18.16",
33 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.16.tgz",
34 | "integrity": "sha512-gCHjjQmA8L0soklKbLKA6pgsLk1byULuHe94lkZDzcO3/Ta+bbeewJioEn1Fr7kgy9NWNFy/C+MrBwC6I/WCug==",
35 | "cpu": [
36 | "arm"
37 | ],
38 | "dev": true,
39 | "optional": true,
40 | "os": [
41 | "android"
42 | ],
43 | "engines": {
44 | "node": ">=12"
45 | }
46 | },
47 | "node_modules/@esbuild/android-arm64": {
48 | "version": "0.18.16",
49 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.16.tgz",
50 | "integrity": "sha512-wsCqSPqLz+6Ov+OM4EthU43DyYVVyfn15S4j1bJzylDpc1r1jZFFfJQNfDuT8SlgwuqpmpJXK4uPlHGw6ve7eA==",
51 | "cpu": [
52 | "arm64"
53 | ],
54 | "dev": true,
55 | "optional": true,
56 | "os": [
57 | "android"
58 | ],
59 | "engines": {
60 | "node": ">=12"
61 | }
62 | },
63 | "node_modules/@esbuild/android-x64": {
64 | "version": "0.18.16",
65 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.16.tgz",
66 | "integrity": "sha512-ldsTXolyA3eTQ1//4DS+E15xl0H/3DTRJaRL0/0PgkqDsI0fV/FlOtD+h0u/AUJr+eOTlZv4aC9gvfppo3C4sw==",
67 | "cpu": [
68 | "x64"
69 | ],
70 | "dev": true,
71 | "optional": true,
72 | "os": [
73 | "android"
74 | ],
75 | "engines": {
76 | "node": ">=12"
77 | }
78 | },
79 | "node_modules/@esbuild/darwin-arm64": {
80 | "version": "0.18.16",
81 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.16.tgz",
82 | "integrity": "sha512-aBxruWCII+OtluORR/KvisEw0ALuw/qDQWvkoosA+c/ngC/Kwk0lLaZ+B++LLS481/VdydB2u6tYpWxUfnLAIw==",
83 | "cpu": [
84 | "arm64"
85 | ],
86 | "dev": true,
87 | "optional": true,
88 | "os": [
89 | "darwin"
90 | ],
91 | "engines": {
92 | "node": ">=12"
93 | }
94 | },
95 | "node_modules/@esbuild/darwin-x64": {
96 | "version": "0.18.16",
97 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.16.tgz",
98 | "integrity": "sha512-6w4Dbue280+rp3LnkgmriS1icOUZDyPuZo/9VsuMUTns7SYEiOaJ7Ca1cbhu9KVObAWfmdjUl4gwy9TIgiO5eA==",
99 | "cpu": [
100 | "x64"
101 | ],
102 | "dev": true,
103 | "optional": true,
104 | "os": [
105 | "darwin"
106 | ],
107 | "engines": {
108 | "node": ">=12"
109 | }
110 | },
111 | "node_modules/@esbuild/freebsd-arm64": {
112 | "version": "0.18.16",
113 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.16.tgz",
114 | "integrity": "sha512-x35fCebhe9s979DGKbVAwXUOcTmCIE32AIqB9CB1GralMIvxdnMLAw5CnID17ipEw9/3MvDsusj/cspYt2ZLNQ==",
115 | "cpu": [
116 | "arm64"
117 | ],
118 | "dev": true,
119 | "optional": true,
120 | "os": [
121 | "freebsd"
122 | ],
123 | "engines": {
124 | "node": ">=12"
125 | }
126 | },
127 | "node_modules/@esbuild/freebsd-x64": {
128 | "version": "0.18.16",
129 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.16.tgz",
130 | "integrity": "sha512-YM98f+PeNXF3GbxIJlUsj+McUWG1irguBHkszCIwfr3BXtXZsXo0vqybjUDFfu9a8Wr7uUD/YSmHib+EeGAFlg==",
131 | "cpu": [
132 | "x64"
133 | ],
134 | "dev": true,
135 | "optional": true,
136 | "os": [
137 | "freebsd"
138 | ],
139 | "engines": {
140 | "node": ">=12"
141 | }
142 | },
143 | "node_modules/@esbuild/linux-arm": {
144 | "version": "0.18.16",
145 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.16.tgz",
146 | "integrity": "sha512-b5ABb+5Ha2C9JkeZXV+b+OruR1tJ33ePmv9ZwMeETSEKlmu/WJ45XTTG+l6a2KDsQtJJ66qo/hbSGBtk0XVLHw==",
147 | "cpu": [
148 | "arm"
149 | ],
150 | "dev": true,
151 | "optional": true,
152 | "os": [
153 | "linux"
154 | ],
155 | "engines": {
156 | "node": ">=12"
157 | }
158 | },
159 | "node_modules/@esbuild/linux-arm64": {
160 | "version": "0.18.16",
161 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.16.tgz",
162 | "integrity": "sha512-XIqhNUxJiuy+zsR77+H5Z2f7s4YRlriSJKtvx99nJuG5ATuJPjmZ9n0ANgnGlPCpXGSReFpgcJ7O3SMtzIFeiQ==",
163 | "cpu": [
164 | "arm64"
165 | ],
166 | "dev": true,
167 | "optional": true,
168 | "os": [
169 | "linux"
170 | ],
171 | "engines": {
172 | "node": ">=12"
173 | }
174 | },
175 | "node_modules/@esbuild/linux-ia32": {
176 | "version": "0.18.16",
177 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.16.tgz",
178 | "integrity": "sha512-no+pfEpwnRvIyH+txbBAWtjxPU9grslmTBfsmDndj7bnBmr55rOo/PfQmRfz7Qg9isswt1FP5hBbWb23fRWnow==",
179 | "cpu": [
180 | "ia32"
181 | ],
182 | "dev": true,
183 | "optional": true,
184 | "os": [
185 | "linux"
186 | ],
187 | "engines": {
188 | "node": ">=12"
189 | }
190 | },
191 | "node_modules/@esbuild/linux-loong64": {
192 | "version": "0.18.16",
193 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.16.tgz",
194 | "integrity": "sha512-Zbnczs9ZXjmo0oZSS0zbNlJbcwKXa/fcNhYQjahDs4Xg18UumpXG/lwM2lcSvHS3mTrRyCYZvJbmzYc4laRI1g==",
195 | "cpu": [
196 | "loong64"
197 | ],
198 | "dev": true,
199 | "optional": true,
200 | "os": [
201 | "linux"
202 | ],
203 | "engines": {
204 | "node": ">=12"
205 | }
206 | },
207 | "node_modules/@esbuild/linux-mips64el": {
208 | "version": "0.18.16",
209 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.16.tgz",
210 | "integrity": "sha512-YMF7hih1HVR/hQVa/ot4UVffc5ZlrzEb3k2ip0nZr1w6fnYypll9td2qcoMLvd3o8j3y6EbJM3MyIcXIVzXvQQ==",
211 | "cpu": [
212 | "mips64el"
213 | ],
214 | "dev": true,
215 | "optional": true,
216 | "os": [
217 | "linux"
218 | ],
219 | "engines": {
220 | "node": ">=12"
221 | }
222 | },
223 | "node_modules/@esbuild/linux-ppc64": {
224 | "version": "0.18.16",
225 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.16.tgz",
226 | "integrity": "sha512-Wkz++LZ29lDwUyTSEnzDaaP5OveOgTU69q9IyIw9WqLRxM4BjTBjz9un4G6TOvehWpf/J3gYVFN96TjGHrbcNQ==",
227 | "cpu": [
228 | "ppc64"
229 | ],
230 | "dev": true,
231 | "optional": true,
232 | "os": [
233 | "linux"
234 | ],
235 | "engines": {
236 | "node": ">=12"
237 | }
238 | },
239 | "node_modules/@esbuild/linux-riscv64": {
240 | "version": "0.18.16",
241 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.16.tgz",
242 | "integrity": "sha512-LFMKZ30tk78/mUv1ygvIP+568bwf4oN6reG/uczXnz6SvFn4e2QUFpUpZY9iSJT6Qpgstrhef/nMykIXZtZWGQ==",
243 | "cpu": [
244 | "riscv64"
245 | ],
246 | "dev": true,
247 | "optional": true,
248 | "os": [
249 | "linux"
250 | ],
251 | "engines": {
252 | "node": ">=12"
253 | }
254 | },
255 | "node_modules/@esbuild/linux-s390x": {
256 | "version": "0.18.16",
257 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.16.tgz",
258 | "integrity": "sha512-3ZC0BgyYHYKfZo3AV2/66TD/I9tlSBaW7eWTEIkrQQKfJIifKMMttXl9FrAg+UT0SGYsCRLI35Gwdmm96vlOjg==",
259 | "cpu": [
260 | "s390x"
261 | ],
262 | "dev": true,
263 | "optional": true,
264 | "os": [
265 | "linux"
266 | ],
267 | "engines": {
268 | "node": ">=12"
269 | }
270 | },
271 | "node_modules/@esbuild/linux-x64": {
272 | "version": "0.18.16",
273 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.16.tgz",
274 | "integrity": "sha512-xu86B3647DihHJHv/wx3NCz2Dg1gjQ8bbf9cVYZzWKY+gsvxYmn/lnVlqDRazObc3UMwoHpUhNYaZset4X8IPA==",
275 | "cpu": [
276 | "x64"
277 | ],
278 | "dev": true,
279 | "optional": true,
280 | "os": [
281 | "linux"
282 | ],
283 | "engines": {
284 | "node": ">=12"
285 | }
286 | },
287 | "node_modules/@esbuild/netbsd-x64": {
288 | "version": "0.18.16",
289 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.16.tgz",
290 | "integrity": "sha512-uVAgpimx9Ffw3xowtg/7qQPwHFx94yCje+DoBx+LNm2ePDpQXHrzE+Sb0Si2VBObYz+LcRps15cq+95YM7gkUw==",
291 | "cpu": [
292 | "x64"
293 | ],
294 | "dev": true,
295 | "optional": true,
296 | "os": [
297 | "netbsd"
298 | ],
299 | "engines": {
300 | "node": ">=12"
301 | }
302 | },
303 | "node_modules/@esbuild/openbsd-x64": {
304 | "version": "0.18.16",
305 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.16.tgz",
306 | "integrity": "sha512-6OjCQM9wf7z8/MBi6BOWaTL2AS/SZudsZtBziXMtNI8r/U41AxS9x7jn0ATOwVy08OotwkPqGRMkpPR2wcTJXA==",
307 | "cpu": [
308 | "x64"
309 | ],
310 | "dev": true,
311 | "optional": true,
312 | "os": [
313 | "openbsd"
314 | ],
315 | "engines": {
316 | "node": ">=12"
317 | }
318 | },
319 | "node_modules/@esbuild/sunos-x64": {
320 | "version": "0.18.16",
321 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.16.tgz",
322 | "integrity": "sha512-ZoNkruFYJp9d1LbUYCh8awgQDvB9uOMZqlQ+gGEZR7v6C+N6u7vPr86c+Chih8niBR81Q/bHOSKGBK3brJyvkQ==",
323 | "cpu": [
324 | "x64"
325 | ],
326 | "dev": true,
327 | "optional": true,
328 | "os": [
329 | "sunos"
330 | ],
331 | "engines": {
332 | "node": ">=12"
333 | }
334 | },
335 | "node_modules/@esbuild/win32-arm64": {
336 | "version": "0.18.16",
337 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.16.tgz",
338 | "integrity": "sha512-+j4anzQ9hrs+iqO+/wa8UE6TVkKua1pXUb0XWFOx0FiAj6R9INJ+WE//1/Xo6FG1vB5EpH3ko+XcgwiDXTxcdw==",
339 | "cpu": [
340 | "arm64"
341 | ],
342 | "dev": true,
343 | "optional": true,
344 | "os": [
345 | "win32"
346 | ],
347 | "engines": {
348 | "node": ">=12"
349 | }
350 | },
351 | "node_modules/@esbuild/win32-ia32": {
352 | "version": "0.18.16",
353 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.16.tgz",
354 | "integrity": "sha512-5PFPmq3sSKTp9cT9dzvI67WNfRZGvEVctcZa1KGjDDu4n3H8k59Inbk0du1fz0KrAbKKNpJbdFXQMDUz7BG4rQ==",
355 | "cpu": [
356 | "ia32"
357 | ],
358 | "dev": true,
359 | "optional": true,
360 | "os": [
361 | "win32"
362 | ],
363 | "engines": {
364 | "node": ">=12"
365 | }
366 | },
367 | "node_modules/@esbuild/win32-x64": {
368 | "version": "0.18.16",
369 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.16.tgz",
370 | "integrity": "sha512-sCIVrrtcWN5Ua7jYXNG1xD199IalrbfV2+0k/2Zf2OyV2FtnQnMgdzgpRAbi4AWlKJj1jkX+M+fEGPQj6BQB4w==",
371 | "cpu": [
372 | "x64"
373 | ],
374 | "dev": true,
375 | "optional": true,
376 | "os": [
377 | "win32"
378 | ],
379 | "engines": {
380 | "node": ">=12"
381 | }
382 | },
383 | "node_modules/@jridgewell/sourcemap-codec": {
384 | "version": "1.4.15",
385 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
386 | "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg=="
387 | },
388 | "node_modules/@vitejs/plugin-vue": {
389 | "version": "4.2.3",
390 | "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.2.3.tgz",
391 | "integrity": "sha512-R6JDUfiZbJA9cMiguQ7jxALsgiprjBeHL5ikpXfJCH62pPHtI+JdJ5xWj6Ev73yXSlYl86+blXn1kZHQ7uElxw==",
392 | "dev": true,
393 | "engines": {
394 | "node": "^14.18.0 || >=16.0.0"
395 | },
396 | "peerDependencies": {
397 | "vite": "^4.0.0",
398 | "vue": "^3.2.25"
399 | }
400 | },
401 | "node_modules/@volar/language-core": {
402 | "version": "1.9.1",
403 | "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-1.9.1.tgz",
404 | "integrity": "sha512-FlllCDE0HdUYh66zS1S4u8WobqKFStOwkd3OCXCOhPmalfm4Fte3gHNXzqs+R8VlbjK7ZvBxrG9MSiaRGXZygg==",
405 | "dev": true,
406 | "dependencies": {
407 | "@volar/source-map": "1.9.1"
408 | }
409 | },
410 | "node_modules/@volar/source-map": {
411 | "version": "1.9.1",
412 | "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-1.9.1.tgz",
413 | "integrity": "sha512-KIttDVrbr3ACLzEP891uj+XdVaCnNErFNRGjNQio+gW2a9fDdz407usAJu6DHgIkJU1l18HyOxMU2VX1l2+D5g==",
414 | "dev": true,
415 | "dependencies": {
416 | "muggle-string": "^0.3.1"
417 | }
418 | },
419 | "node_modules/@volar/typescript": {
420 | "version": "1.9.1",
421 | "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-1.9.1.tgz",
422 | "integrity": "sha512-UO8bhflYMNuOpXeGYHSm3xItU4kEVhJQNGjwgw1ZqLr/sm1C7Y+pVQ/S01NpsojhFC8S+P6/p+jOTK6DO214kQ==",
423 | "dev": true,
424 | "dependencies": {
425 | "@volar/language-core": "1.9.1"
426 | }
427 | },
428 | "node_modules/@vue/compiler-core": {
429 | "version": "3.3.4",
430 | "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.3.4.tgz",
431 | "integrity": "sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==",
432 | "dependencies": {
433 | "@babel/parser": "^7.21.3",
434 | "@vue/shared": "3.3.4",
435 | "estree-walker": "^2.0.2",
436 | "source-map-js": "^1.0.2"
437 | }
438 | },
439 | "node_modules/@vue/compiler-dom": {
440 | "version": "3.3.4",
441 | "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.3.4.tgz",
442 | "integrity": "sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w==",
443 | "dependencies": {
444 | "@vue/compiler-core": "3.3.4",
445 | "@vue/shared": "3.3.4"
446 | }
447 | },
448 | "node_modules/@vue/compiler-sfc": {
449 | "version": "3.3.4",
450 | "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.3.4.tgz",
451 | "integrity": "sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ==",
452 | "dependencies": {
453 | "@babel/parser": "^7.20.15",
454 | "@vue/compiler-core": "3.3.4",
455 | "@vue/compiler-dom": "3.3.4",
456 | "@vue/compiler-ssr": "3.3.4",
457 | "@vue/reactivity-transform": "3.3.4",
458 | "@vue/shared": "3.3.4",
459 | "estree-walker": "^2.0.2",
460 | "magic-string": "^0.30.0",
461 | "postcss": "^8.1.10",
462 | "source-map-js": "^1.0.2"
463 | }
464 | },
465 | "node_modules/@vue/compiler-ssr": {
466 | "version": "3.3.4",
467 | "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.3.4.tgz",
468 | "integrity": "sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ==",
469 | "dependencies": {
470 | "@vue/compiler-dom": "3.3.4",
471 | "@vue/shared": "3.3.4"
472 | }
473 | },
474 | "node_modules/@vue/language-core": {
475 | "version": "1.8.6",
476 | "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-1.8.6.tgz",
477 | "integrity": "sha512-PyYDMArbR7hnhqw9OEupr0s4ut0/ZfITp7WEjigF58cd2R0lRLNM1HPvzFMuULpy3ImBEOZI11KRIDirqOe+tQ==",
478 | "dev": true,
479 | "dependencies": {
480 | "@volar/language-core": "~1.9.0",
481 | "@volar/source-map": "~1.9.0",
482 | "@vue/compiler-dom": "^3.3.0",
483 | "@vue/reactivity": "^3.3.0",
484 | "@vue/shared": "^3.3.0",
485 | "minimatch": "^9.0.0",
486 | "muggle-string": "^0.3.1",
487 | "vue-template-compiler": "^2.7.14"
488 | },
489 | "peerDependencies": {
490 | "typescript": "*"
491 | },
492 | "peerDependenciesMeta": {
493 | "typescript": {
494 | "optional": true
495 | }
496 | }
497 | },
498 | "node_modules/@vue/reactivity": {
499 | "version": "3.3.4",
500 | "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.3.4.tgz",
501 | "integrity": "sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ==",
502 | "dependencies": {
503 | "@vue/shared": "3.3.4"
504 | }
505 | },
506 | "node_modules/@vue/reactivity-transform": {
507 | "version": "3.3.4",
508 | "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.3.4.tgz",
509 | "integrity": "sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw==",
510 | "dependencies": {
511 | "@babel/parser": "^7.20.15",
512 | "@vue/compiler-core": "3.3.4",
513 | "@vue/shared": "3.3.4",
514 | "estree-walker": "^2.0.2",
515 | "magic-string": "^0.30.0"
516 | }
517 | },
518 | "node_modules/@vue/runtime-core": {
519 | "version": "3.3.4",
520 | "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.3.4.tgz",
521 | "integrity": "sha512-R+bqxMN6pWO7zGI4OMlmvePOdP2c93GsHFM/siJI7O2nxFRzj55pLwkpCedEY+bTMgp5miZ8CxfIZo3S+gFqvA==",
522 | "dependencies": {
523 | "@vue/reactivity": "3.3.4",
524 | "@vue/shared": "3.3.4"
525 | }
526 | },
527 | "node_modules/@vue/runtime-dom": {
528 | "version": "3.3.4",
529 | "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.3.4.tgz",
530 | "integrity": "sha512-Aj5bTJ3u5sFsUckRghsNjVTtxZQ1OyMWCr5dZRAPijF/0Vy4xEoRCwLyHXcj4D0UFbJ4lbx3gPTgg06K/GnPnQ==",
531 | "dependencies": {
532 | "@vue/runtime-core": "3.3.4",
533 | "@vue/shared": "3.3.4",
534 | "csstype": "^3.1.1"
535 | }
536 | },
537 | "node_modules/@vue/server-renderer": {
538 | "version": "3.3.4",
539 | "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.3.4.tgz",
540 | "integrity": "sha512-Q6jDDzR23ViIb67v+vM1Dqntu+HUexQcsWKhhQa4ARVzxOY2HbC7QRW/ggkDBd5BU+uM1sV6XOAP0b216o34JQ==",
541 | "dependencies": {
542 | "@vue/compiler-ssr": "3.3.4",
543 | "@vue/shared": "3.3.4"
544 | },
545 | "peerDependencies": {
546 | "vue": "3.3.4"
547 | }
548 | },
549 | "node_modules/@vue/shared": {
550 | "version": "3.3.4",
551 | "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.3.4.tgz",
552 | "integrity": "sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ=="
553 | },
554 | "node_modules/@vue/typescript": {
555 | "version": "1.8.6",
556 | "resolved": "https://registry.npmjs.org/@vue/typescript/-/typescript-1.8.6.tgz",
557 | "integrity": "sha512-sDQ5tltrSVS3lAkE3JtMRGJo91CLIxcWPy7yms/DT+ssxXpwxbVRD5Gok68HenEZBA4Klq7nW99sG/nTRnpPuQ==",
558 | "dev": true,
559 | "dependencies": {
560 | "@volar/typescript": "~1.9.0",
561 | "@vue/language-core": "1.8.6"
562 | }
563 | },
564 | "node_modules/balanced-match": {
565 | "version": "1.0.2",
566 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
567 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
568 | "dev": true
569 | },
570 | "node_modules/brace-expansion": {
571 | "version": "2.0.1",
572 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
573 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
574 | "dev": true,
575 | "dependencies": {
576 | "balanced-match": "^1.0.0"
577 | }
578 | },
579 | "node_modules/csstype": {
580 | "version": "3.1.2",
581 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz",
582 | "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ=="
583 | },
584 | "node_modules/de-indent": {
585 | "version": "1.0.2",
586 | "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz",
587 | "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==",
588 | "dev": true
589 | },
590 | "node_modules/esbuild": {
591 | "version": "0.18.16",
592 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.16.tgz",
593 | "integrity": "sha512-1xLsOXrDqwdHxyXb/x/SOyg59jpf/SH7YMvU5RNSU7z3TInaASNJWNFJ6iRvLvLETZMasF3d1DdZLg7sgRimRQ==",
594 | "dev": true,
595 | "hasInstallScript": true,
596 | "bin": {
597 | "esbuild": "bin/esbuild"
598 | },
599 | "engines": {
600 | "node": ">=12"
601 | },
602 | "optionalDependencies": {
603 | "@esbuild/android-arm": "0.18.16",
604 | "@esbuild/android-arm64": "0.18.16",
605 | "@esbuild/android-x64": "0.18.16",
606 | "@esbuild/darwin-arm64": "0.18.16",
607 | "@esbuild/darwin-x64": "0.18.16",
608 | "@esbuild/freebsd-arm64": "0.18.16",
609 | "@esbuild/freebsd-x64": "0.18.16",
610 | "@esbuild/linux-arm": "0.18.16",
611 | "@esbuild/linux-arm64": "0.18.16",
612 | "@esbuild/linux-ia32": "0.18.16",
613 | "@esbuild/linux-loong64": "0.18.16",
614 | "@esbuild/linux-mips64el": "0.18.16",
615 | "@esbuild/linux-ppc64": "0.18.16",
616 | "@esbuild/linux-riscv64": "0.18.16",
617 | "@esbuild/linux-s390x": "0.18.16",
618 | "@esbuild/linux-x64": "0.18.16",
619 | "@esbuild/netbsd-x64": "0.18.16",
620 | "@esbuild/openbsd-x64": "0.18.16",
621 | "@esbuild/sunos-x64": "0.18.16",
622 | "@esbuild/win32-arm64": "0.18.16",
623 | "@esbuild/win32-ia32": "0.18.16",
624 | "@esbuild/win32-x64": "0.18.16"
625 | }
626 | },
627 | "node_modules/estree-walker": {
628 | "version": "2.0.2",
629 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
630 | "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="
631 | },
632 | "node_modules/fsevents": {
633 | "version": "2.3.2",
634 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
635 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
636 | "dev": true,
637 | "hasInstallScript": true,
638 | "optional": true,
639 | "os": [
640 | "darwin"
641 | ],
642 | "engines": {
643 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
644 | }
645 | },
646 | "node_modules/he": {
647 | "version": "1.2.0",
648 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
649 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
650 | "dev": true,
651 | "bin": {
652 | "he": "bin/he"
653 | }
654 | },
655 | "node_modules/lru-cache": {
656 | "version": "6.0.0",
657 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
658 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
659 | "dev": true,
660 | "dependencies": {
661 | "yallist": "^4.0.0"
662 | },
663 | "engines": {
664 | "node": ">=10"
665 | }
666 | },
667 | "node_modules/magic-string": {
668 | "version": "0.30.1",
669 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.1.tgz",
670 | "integrity": "sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==",
671 | "dependencies": {
672 | "@jridgewell/sourcemap-codec": "^1.4.15"
673 | },
674 | "engines": {
675 | "node": ">=12"
676 | }
677 | },
678 | "node_modules/minimatch": {
679 | "version": "9.0.3",
680 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz",
681 | "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==",
682 | "dev": true,
683 | "dependencies": {
684 | "brace-expansion": "^2.0.1"
685 | },
686 | "engines": {
687 | "node": ">=16 || 14 >=14.17"
688 | },
689 | "funding": {
690 | "url": "https://github.com/sponsors/isaacs"
691 | }
692 | },
693 | "node_modules/muggle-string": {
694 | "version": "0.3.1",
695 | "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.3.1.tgz",
696 | "integrity": "sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==",
697 | "dev": true
698 | },
699 | "node_modules/nanoid": {
700 | "version": "3.3.6",
701 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz",
702 | "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==",
703 | "funding": [
704 | {
705 | "type": "github",
706 | "url": "https://github.com/sponsors/ai"
707 | }
708 | ],
709 | "bin": {
710 | "nanoid": "bin/nanoid.cjs"
711 | },
712 | "engines": {
713 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
714 | }
715 | },
716 | "node_modules/picocolors": {
717 | "version": "1.0.0",
718 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
719 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
720 | },
721 | "node_modules/postcss": {
722 | "version": "8.4.27",
723 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.27.tgz",
724 | "integrity": "sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ==",
725 | "funding": [
726 | {
727 | "type": "opencollective",
728 | "url": "https://opencollective.com/postcss/"
729 | },
730 | {
731 | "type": "tidelift",
732 | "url": "https://tidelift.com/funding/github/npm/postcss"
733 | },
734 | {
735 | "type": "github",
736 | "url": "https://github.com/sponsors/ai"
737 | }
738 | ],
739 | "dependencies": {
740 | "nanoid": "^3.3.6",
741 | "picocolors": "^1.0.0",
742 | "source-map-js": "^1.0.2"
743 | },
744 | "engines": {
745 | "node": "^10 || ^12 || >=14"
746 | }
747 | },
748 | "node_modules/rollup": {
749 | "version": "3.26.3",
750 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.26.3.tgz",
751 | "integrity": "sha512-7Tin0C8l86TkpcMtXvQu6saWH93nhG3dGQ1/+l5V2TDMceTxO7kDiK6GzbfLWNNxqJXm591PcEZUozZm51ogwQ==",
752 | "dev": true,
753 | "bin": {
754 | "rollup": "dist/bin/rollup"
755 | },
756 | "engines": {
757 | "node": ">=14.18.0",
758 | "npm": ">=8.0.0"
759 | },
760 | "optionalDependencies": {
761 | "fsevents": "~2.3.2"
762 | }
763 | },
764 | "node_modules/semver": {
765 | "version": "7.5.4",
766 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
767 | "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
768 | "dev": true,
769 | "dependencies": {
770 | "lru-cache": "^6.0.0"
771 | },
772 | "bin": {
773 | "semver": "bin/semver.js"
774 | },
775 | "engines": {
776 | "node": ">=10"
777 | }
778 | },
779 | "node_modules/source-map-js": {
780 | "version": "1.0.2",
781 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
782 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
783 | "engines": {
784 | "node": ">=0.10.0"
785 | }
786 | },
787 | "node_modules/typescript": {
788 | "version": "5.1.6",
789 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz",
790 | "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==",
791 | "dev": true,
792 | "bin": {
793 | "tsc": "bin/tsc",
794 | "tsserver": "bin/tsserver"
795 | },
796 | "engines": {
797 | "node": ">=14.17"
798 | }
799 | },
800 | "node_modules/vite": {
801 | "version": "4.4.6",
802 | "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.6.tgz",
803 | "integrity": "sha512-EY6Mm8vJ++S3D4tNAckaZfw3JwG3wa794Vt70M6cNJ6NxT87yhq7EC8Rcap3ahyHdo8AhCmV9PTk+vG1HiYn1A==",
804 | "dev": true,
805 | "dependencies": {
806 | "esbuild": "^0.18.10",
807 | "postcss": "^8.4.26",
808 | "rollup": "^3.25.2"
809 | },
810 | "bin": {
811 | "vite": "bin/vite.js"
812 | },
813 | "engines": {
814 | "node": "^14.18.0 || >=16.0.0"
815 | },
816 | "funding": {
817 | "url": "https://github.com/vitejs/vite?sponsor=1"
818 | },
819 | "optionalDependencies": {
820 | "fsevents": "~2.3.2"
821 | },
822 | "peerDependencies": {
823 | "@types/node": ">= 14",
824 | "less": "*",
825 | "lightningcss": "^1.21.0",
826 | "sass": "*",
827 | "stylus": "*",
828 | "sugarss": "*",
829 | "terser": "^5.4.0"
830 | },
831 | "peerDependenciesMeta": {
832 | "@types/node": {
833 | "optional": true
834 | },
835 | "less": {
836 | "optional": true
837 | },
838 | "lightningcss": {
839 | "optional": true
840 | },
841 | "sass": {
842 | "optional": true
843 | },
844 | "stylus": {
845 | "optional": true
846 | },
847 | "sugarss": {
848 | "optional": true
849 | },
850 | "terser": {
851 | "optional": true
852 | }
853 | }
854 | },
855 | "node_modules/vue": {
856 | "version": "3.3.4",
857 | "resolved": "https://registry.npmjs.org/vue/-/vue-3.3.4.tgz",
858 | "integrity": "sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw==",
859 | "dependencies": {
860 | "@vue/compiler-dom": "3.3.4",
861 | "@vue/compiler-sfc": "3.3.4",
862 | "@vue/runtime-dom": "3.3.4",
863 | "@vue/server-renderer": "3.3.4",
864 | "@vue/shared": "3.3.4"
865 | }
866 | },
867 | "node_modules/vue-template-compiler": {
868 | "version": "2.7.14",
869 | "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.14.tgz",
870 | "integrity": "sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ==",
871 | "dev": true,
872 | "dependencies": {
873 | "de-indent": "^1.0.2",
874 | "he": "^1.2.0"
875 | }
876 | },
877 | "node_modules/vue-tsc": {
878 | "version": "1.8.6",
879 | "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-1.8.6.tgz",
880 | "integrity": "sha512-8ffD4NGfwyATjw/s40Lw2EgB7L2/PAqnGlJBaVQLgblr3SU4EYdhJ67TNXXuDD8NMbDAFSM24V8i3ZIJgTs32Q==",
881 | "dev": true,
882 | "dependencies": {
883 | "@vue/language-core": "1.8.6",
884 | "@vue/typescript": "1.8.6",
885 | "semver": "^7.3.8"
886 | },
887 | "bin": {
888 | "vue-tsc": "bin/vue-tsc.js"
889 | },
890 | "peerDependencies": {
891 | "typescript": "*"
892 | }
893 | },
894 | "node_modules/yallist": {
895 | "version": "4.0.0",
896 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
897 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
898 | "dev": true
899 | }
900 | },
901 | "dependencies": {
902 | "@babel/parser": {
903 | "version": "7.22.7",
904 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz",
905 | "integrity": "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q=="
906 | },
907 | "@esbuild/android-arm": {
908 | "version": "0.18.16",
909 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.16.tgz",
910 | "integrity": "sha512-gCHjjQmA8L0soklKbLKA6pgsLk1byULuHe94lkZDzcO3/Ta+bbeewJioEn1Fr7kgy9NWNFy/C+MrBwC6I/WCug==",
911 | "dev": true,
912 | "optional": true
913 | },
914 | "@esbuild/android-arm64": {
915 | "version": "0.18.16",
916 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.16.tgz",
917 | "integrity": "sha512-wsCqSPqLz+6Ov+OM4EthU43DyYVVyfn15S4j1bJzylDpc1r1jZFFfJQNfDuT8SlgwuqpmpJXK4uPlHGw6ve7eA==",
918 | "dev": true,
919 | "optional": true
920 | },
921 | "@esbuild/android-x64": {
922 | "version": "0.18.16",
923 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.16.tgz",
924 | "integrity": "sha512-ldsTXolyA3eTQ1//4DS+E15xl0H/3DTRJaRL0/0PgkqDsI0fV/FlOtD+h0u/AUJr+eOTlZv4aC9gvfppo3C4sw==",
925 | "dev": true,
926 | "optional": true
927 | },
928 | "@esbuild/darwin-arm64": {
929 | "version": "0.18.16",
930 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.16.tgz",
931 | "integrity": "sha512-aBxruWCII+OtluORR/KvisEw0ALuw/qDQWvkoosA+c/ngC/Kwk0lLaZ+B++LLS481/VdydB2u6tYpWxUfnLAIw==",
932 | "dev": true,
933 | "optional": true
934 | },
935 | "@esbuild/darwin-x64": {
936 | "version": "0.18.16",
937 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.16.tgz",
938 | "integrity": "sha512-6w4Dbue280+rp3LnkgmriS1icOUZDyPuZo/9VsuMUTns7SYEiOaJ7Ca1cbhu9KVObAWfmdjUl4gwy9TIgiO5eA==",
939 | "dev": true,
940 | "optional": true
941 | },
942 | "@esbuild/freebsd-arm64": {
943 | "version": "0.18.16",
944 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.16.tgz",
945 | "integrity": "sha512-x35fCebhe9s979DGKbVAwXUOcTmCIE32AIqB9CB1GralMIvxdnMLAw5CnID17ipEw9/3MvDsusj/cspYt2ZLNQ==",
946 | "dev": true,
947 | "optional": true
948 | },
949 | "@esbuild/freebsd-x64": {
950 | "version": "0.18.16",
951 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.16.tgz",
952 | "integrity": "sha512-YM98f+PeNXF3GbxIJlUsj+McUWG1irguBHkszCIwfr3BXtXZsXo0vqybjUDFfu9a8Wr7uUD/YSmHib+EeGAFlg==",
953 | "dev": true,
954 | "optional": true
955 | },
956 | "@esbuild/linux-arm": {
957 | "version": "0.18.16",
958 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.16.tgz",
959 | "integrity": "sha512-b5ABb+5Ha2C9JkeZXV+b+OruR1tJ33ePmv9ZwMeETSEKlmu/WJ45XTTG+l6a2KDsQtJJ66qo/hbSGBtk0XVLHw==",
960 | "dev": true,
961 | "optional": true
962 | },
963 | "@esbuild/linux-arm64": {
964 | "version": "0.18.16",
965 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.16.tgz",
966 | "integrity": "sha512-XIqhNUxJiuy+zsR77+H5Z2f7s4YRlriSJKtvx99nJuG5ATuJPjmZ9n0ANgnGlPCpXGSReFpgcJ7O3SMtzIFeiQ==",
967 | "dev": true,
968 | "optional": true
969 | },
970 | "@esbuild/linux-ia32": {
971 | "version": "0.18.16",
972 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.16.tgz",
973 | "integrity": "sha512-no+pfEpwnRvIyH+txbBAWtjxPU9grslmTBfsmDndj7bnBmr55rOo/PfQmRfz7Qg9isswt1FP5hBbWb23fRWnow==",
974 | "dev": true,
975 | "optional": true
976 | },
977 | "@esbuild/linux-loong64": {
978 | "version": "0.18.16",
979 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.16.tgz",
980 | "integrity": "sha512-Zbnczs9ZXjmo0oZSS0zbNlJbcwKXa/fcNhYQjahDs4Xg18UumpXG/lwM2lcSvHS3mTrRyCYZvJbmzYc4laRI1g==",
981 | "dev": true,
982 | "optional": true
983 | },
984 | "@esbuild/linux-mips64el": {
985 | "version": "0.18.16",
986 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.16.tgz",
987 | "integrity": "sha512-YMF7hih1HVR/hQVa/ot4UVffc5ZlrzEb3k2ip0nZr1w6fnYypll9td2qcoMLvd3o8j3y6EbJM3MyIcXIVzXvQQ==",
988 | "dev": true,
989 | "optional": true
990 | },
991 | "@esbuild/linux-ppc64": {
992 | "version": "0.18.16",
993 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.16.tgz",
994 | "integrity": "sha512-Wkz++LZ29lDwUyTSEnzDaaP5OveOgTU69q9IyIw9WqLRxM4BjTBjz9un4G6TOvehWpf/J3gYVFN96TjGHrbcNQ==",
995 | "dev": true,
996 | "optional": true
997 | },
998 | "@esbuild/linux-riscv64": {
999 | "version": "0.18.16",
1000 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.16.tgz",
1001 | "integrity": "sha512-LFMKZ30tk78/mUv1ygvIP+568bwf4oN6reG/uczXnz6SvFn4e2QUFpUpZY9iSJT6Qpgstrhef/nMykIXZtZWGQ==",
1002 | "dev": true,
1003 | "optional": true
1004 | },
1005 | "@esbuild/linux-s390x": {
1006 | "version": "0.18.16",
1007 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.16.tgz",
1008 | "integrity": "sha512-3ZC0BgyYHYKfZo3AV2/66TD/I9tlSBaW7eWTEIkrQQKfJIifKMMttXl9FrAg+UT0SGYsCRLI35Gwdmm96vlOjg==",
1009 | "dev": true,
1010 | "optional": true
1011 | },
1012 | "@esbuild/linux-x64": {
1013 | "version": "0.18.16",
1014 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.16.tgz",
1015 | "integrity": "sha512-xu86B3647DihHJHv/wx3NCz2Dg1gjQ8bbf9cVYZzWKY+gsvxYmn/lnVlqDRazObc3UMwoHpUhNYaZset4X8IPA==",
1016 | "dev": true,
1017 | "optional": true
1018 | },
1019 | "@esbuild/netbsd-x64": {
1020 | "version": "0.18.16",
1021 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.16.tgz",
1022 | "integrity": "sha512-uVAgpimx9Ffw3xowtg/7qQPwHFx94yCje+DoBx+LNm2ePDpQXHrzE+Sb0Si2VBObYz+LcRps15cq+95YM7gkUw==",
1023 | "dev": true,
1024 | "optional": true
1025 | },
1026 | "@esbuild/openbsd-x64": {
1027 | "version": "0.18.16",
1028 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.16.tgz",
1029 | "integrity": "sha512-6OjCQM9wf7z8/MBi6BOWaTL2AS/SZudsZtBziXMtNI8r/U41AxS9x7jn0ATOwVy08OotwkPqGRMkpPR2wcTJXA==",
1030 | "dev": true,
1031 | "optional": true
1032 | },
1033 | "@esbuild/sunos-x64": {
1034 | "version": "0.18.16",
1035 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.16.tgz",
1036 | "integrity": "sha512-ZoNkruFYJp9d1LbUYCh8awgQDvB9uOMZqlQ+gGEZR7v6C+N6u7vPr86c+Chih8niBR81Q/bHOSKGBK3brJyvkQ==",
1037 | "dev": true,
1038 | "optional": true
1039 | },
1040 | "@esbuild/win32-arm64": {
1041 | "version": "0.18.16",
1042 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.16.tgz",
1043 | "integrity": "sha512-+j4anzQ9hrs+iqO+/wa8UE6TVkKua1pXUb0XWFOx0FiAj6R9INJ+WE//1/Xo6FG1vB5EpH3ko+XcgwiDXTxcdw==",
1044 | "dev": true,
1045 | "optional": true
1046 | },
1047 | "@esbuild/win32-ia32": {
1048 | "version": "0.18.16",
1049 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.16.tgz",
1050 | "integrity": "sha512-5PFPmq3sSKTp9cT9dzvI67WNfRZGvEVctcZa1KGjDDu4n3H8k59Inbk0du1fz0KrAbKKNpJbdFXQMDUz7BG4rQ==",
1051 | "dev": true,
1052 | "optional": true
1053 | },
1054 | "@esbuild/win32-x64": {
1055 | "version": "0.18.16",
1056 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.16.tgz",
1057 | "integrity": "sha512-sCIVrrtcWN5Ua7jYXNG1xD199IalrbfV2+0k/2Zf2OyV2FtnQnMgdzgpRAbi4AWlKJj1jkX+M+fEGPQj6BQB4w==",
1058 | "dev": true,
1059 | "optional": true
1060 | },
1061 | "@jridgewell/sourcemap-codec": {
1062 | "version": "1.4.15",
1063 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
1064 | "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg=="
1065 | },
1066 | "@vitejs/plugin-vue": {
1067 | "version": "4.2.3",
1068 | "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.2.3.tgz",
1069 | "integrity": "sha512-R6JDUfiZbJA9cMiguQ7jxALsgiprjBeHL5ikpXfJCH62pPHtI+JdJ5xWj6Ev73yXSlYl86+blXn1kZHQ7uElxw==",
1070 | "dev": true,
1071 | "requires": {}
1072 | },
1073 | "@volar/language-core": {
1074 | "version": "1.9.1",
1075 | "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-1.9.1.tgz",
1076 | "integrity": "sha512-FlllCDE0HdUYh66zS1S4u8WobqKFStOwkd3OCXCOhPmalfm4Fte3gHNXzqs+R8VlbjK7ZvBxrG9MSiaRGXZygg==",
1077 | "dev": true,
1078 | "requires": {
1079 | "@volar/source-map": "1.9.1"
1080 | }
1081 | },
1082 | "@volar/source-map": {
1083 | "version": "1.9.1",
1084 | "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-1.9.1.tgz",
1085 | "integrity": "sha512-KIttDVrbr3ACLzEP891uj+XdVaCnNErFNRGjNQio+gW2a9fDdz407usAJu6DHgIkJU1l18HyOxMU2VX1l2+D5g==",
1086 | "dev": true,
1087 | "requires": {
1088 | "muggle-string": "^0.3.1"
1089 | }
1090 | },
1091 | "@volar/typescript": {
1092 | "version": "1.9.1",
1093 | "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-1.9.1.tgz",
1094 | "integrity": "sha512-UO8bhflYMNuOpXeGYHSm3xItU4kEVhJQNGjwgw1ZqLr/sm1C7Y+pVQ/S01NpsojhFC8S+P6/p+jOTK6DO214kQ==",
1095 | "dev": true,
1096 | "requires": {
1097 | "@volar/language-core": "1.9.1"
1098 | }
1099 | },
1100 | "@vue/compiler-core": {
1101 | "version": "3.3.4",
1102 | "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.3.4.tgz",
1103 | "integrity": "sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==",
1104 | "requires": {
1105 | "@babel/parser": "^7.21.3",
1106 | "@vue/shared": "3.3.4",
1107 | "estree-walker": "^2.0.2",
1108 | "source-map-js": "^1.0.2"
1109 | }
1110 | },
1111 | "@vue/compiler-dom": {
1112 | "version": "3.3.4",
1113 | "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.3.4.tgz",
1114 | "integrity": "sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w==",
1115 | "requires": {
1116 | "@vue/compiler-core": "3.3.4",
1117 | "@vue/shared": "3.3.4"
1118 | }
1119 | },
1120 | "@vue/compiler-sfc": {
1121 | "version": "3.3.4",
1122 | "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.3.4.tgz",
1123 | "integrity": "sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ==",
1124 | "requires": {
1125 | "@babel/parser": "^7.20.15",
1126 | "@vue/compiler-core": "3.3.4",
1127 | "@vue/compiler-dom": "3.3.4",
1128 | "@vue/compiler-ssr": "3.3.4",
1129 | "@vue/reactivity-transform": "3.3.4",
1130 | "@vue/shared": "3.3.4",
1131 | "estree-walker": "^2.0.2",
1132 | "magic-string": "^0.30.0",
1133 | "postcss": "^8.1.10",
1134 | "source-map-js": "^1.0.2"
1135 | }
1136 | },
1137 | "@vue/compiler-ssr": {
1138 | "version": "3.3.4",
1139 | "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.3.4.tgz",
1140 | "integrity": "sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ==",
1141 | "requires": {
1142 | "@vue/compiler-dom": "3.3.4",
1143 | "@vue/shared": "3.3.4"
1144 | }
1145 | },
1146 | "@vue/language-core": {
1147 | "version": "1.8.6",
1148 | "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-1.8.6.tgz",
1149 | "integrity": "sha512-PyYDMArbR7hnhqw9OEupr0s4ut0/ZfITp7WEjigF58cd2R0lRLNM1HPvzFMuULpy3ImBEOZI11KRIDirqOe+tQ==",
1150 | "dev": true,
1151 | "requires": {
1152 | "@volar/language-core": "~1.9.0",
1153 | "@volar/source-map": "~1.9.0",
1154 | "@vue/compiler-dom": "^3.3.0",
1155 | "@vue/reactivity": "^3.3.0",
1156 | "@vue/shared": "^3.3.0",
1157 | "minimatch": "^9.0.0",
1158 | "muggle-string": "^0.3.1",
1159 | "vue-template-compiler": "^2.7.14"
1160 | }
1161 | },
1162 | "@vue/reactivity": {
1163 | "version": "3.3.4",
1164 | "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.3.4.tgz",
1165 | "integrity": "sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ==",
1166 | "requires": {
1167 | "@vue/shared": "3.3.4"
1168 | }
1169 | },
1170 | "@vue/reactivity-transform": {
1171 | "version": "3.3.4",
1172 | "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.3.4.tgz",
1173 | "integrity": "sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw==",
1174 | "requires": {
1175 | "@babel/parser": "^7.20.15",
1176 | "@vue/compiler-core": "3.3.4",
1177 | "@vue/shared": "3.3.4",
1178 | "estree-walker": "^2.0.2",
1179 | "magic-string": "^0.30.0"
1180 | }
1181 | },
1182 | "@vue/runtime-core": {
1183 | "version": "3.3.4",
1184 | "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.3.4.tgz",
1185 | "integrity": "sha512-R+bqxMN6pWO7zGI4OMlmvePOdP2c93GsHFM/siJI7O2nxFRzj55pLwkpCedEY+bTMgp5miZ8CxfIZo3S+gFqvA==",
1186 | "requires": {
1187 | "@vue/reactivity": "3.3.4",
1188 | "@vue/shared": "3.3.4"
1189 | }
1190 | },
1191 | "@vue/runtime-dom": {
1192 | "version": "3.3.4",
1193 | "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.3.4.tgz",
1194 | "integrity": "sha512-Aj5bTJ3u5sFsUckRghsNjVTtxZQ1OyMWCr5dZRAPijF/0Vy4xEoRCwLyHXcj4D0UFbJ4lbx3gPTgg06K/GnPnQ==",
1195 | "requires": {
1196 | "@vue/runtime-core": "3.3.4",
1197 | "@vue/shared": "3.3.4",
1198 | "csstype": "^3.1.1"
1199 | }
1200 | },
1201 | "@vue/server-renderer": {
1202 | "version": "3.3.4",
1203 | "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.3.4.tgz",
1204 | "integrity": "sha512-Q6jDDzR23ViIb67v+vM1Dqntu+HUexQcsWKhhQa4ARVzxOY2HbC7QRW/ggkDBd5BU+uM1sV6XOAP0b216o34JQ==",
1205 | "requires": {
1206 | "@vue/compiler-ssr": "3.3.4",
1207 | "@vue/shared": "3.3.4"
1208 | }
1209 | },
1210 | "@vue/shared": {
1211 | "version": "3.3.4",
1212 | "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.3.4.tgz",
1213 | "integrity": "sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ=="
1214 | },
1215 | "@vue/typescript": {
1216 | "version": "1.8.6",
1217 | "resolved": "https://registry.npmjs.org/@vue/typescript/-/typescript-1.8.6.tgz",
1218 | "integrity": "sha512-sDQ5tltrSVS3lAkE3JtMRGJo91CLIxcWPy7yms/DT+ssxXpwxbVRD5Gok68HenEZBA4Klq7nW99sG/nTRnpPuQ==",
1219 | "dev": true,
1220 | "requires": {
1221 | "@volar/typescript": "~1.9.0",
1222 | "@vue/language-core": "1.8.6"
1223 | }
1224 | },
1225 | "balanced-match": {
1226 | "version": "1.0.2",
1227 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
1228 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
1229 | "dev": true
1230 | },
1231 | "brace-expansion": {
1232 | "version": "2.0.1",
1233 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
1234 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
1235 | "dev": true,
1236 | "requires": {
1237 | "balanced-match": "^1.0.0"
1238 | }
1239 | },
1240 | "csstype": {
1241 | "version": "3.1.2",
1242 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz",
1243 | "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ=="
1244 | },
1245 | "de-indent": {
1246 | "version": "1.0.2",
1247 | "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz",
1248 | "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==",
1249 | "dev": true
1250 | },
1251 | "esbuild": {
1252 | "version": "0.18.16",
1253 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.16.tgz",
1254 | "integrity": "sha512-1xLsOXrDqwdHxyXb/x/SOyg59jpf/SH7YMvU5RNSU7z3TInaASNJWNFJ6iRvLvLETZMasF3d1DdZLg7sgRimRQ==",
1255 | "dev": true,
1256 | "requires": {
1257 | "@esbuild/android-arm": "0.18.16",
1258 | "@esbuild/android-arm64": "0.18.16",
1259 | "@esbuild/android-x64": "0.18.16",
1260 | "@esbuild/darwin-arm64": "0.18.16",
1261 | "@esbuild/darwin-x64": "0.18.16",
1262 | "@esbuild/freebsd-arm64": "0.18.16",
1263 | "@esbuild/freebsd-x64": "0.18.16",
1264 | "@esbuild/linux-arm": "0.18.16",
1265 | "@esbuild/linux-arm64": "0.18.16",
1266 | "@esbuild/linux-ia32": "0.18.16",
1267 | "@esbuild/linux-loong64": "0.18.16",
1268 | "@esbuild/linux-mips64el": "0.18.16",
1269 | "@esbuild/linux-ppc64": "0.18.16",
1270 | "@esbuild/linux-riscv64": "0.18.16",
1271 | "@esbuild/linux-s390x": "0.18.16",
1272 | "@esbuild/linux-x64": "0.18.16",
1273 | "@esbuild/netbsd-x64": "0.18.16",
1274 | "@esbuild/openbsd-x64": "0.18.16",
1275 | "@esbuild/sunos-x64": "0.18.16",
1276 | "@esbuild/win32-arm64": "0.18.16",
1277 | "@esbuild/win32-ia32": "0.18.16",
1278 | "@esbuild/win32-x64": "0.18.16"
1279 | }
1280 | },
1281 | "estree-walker": {
1282 | "version": "2.0.2",
1283 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
1284 | "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="
1285 | },
1286 | "fsevents": {
1287 | "version": "2.3.2",
1288 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
1289 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
1290 | "dev": true,
1291 | "optional": true
1292 | },
1293 | "he": {
1294 | "version": "1.2.0",
1295 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
1296 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
1297 | "dev": true
1298 | },
1299 | "lru-cache": {
1300 | "version": "6.0.0",
1301 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
1302 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
1303 | "dev": true,
1304 | "requires": {
1305 | "yallist": "^4.0.0"
1306 | }
1307 | },
1308 | "magic-string": {
1309 | "version": "0.30.1",
1310 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.1.tgz",
1311 | "integrity": "sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==",
1312 | "requires": {
1313 | "@jridgewell/sourcemap-codec": "^1.4.15"
1314 | }
1315 | },
1316 | "minimatch": {
1317 | "version": "9.0.3",
1318 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz",
1319 | "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==",
1320 | "dev": true,
1321 | "requires": {
1322 | "brace-expansion": "^2.0.1"
1323 | }
1324 | },
1325 | "muggle-string": {
1326 | "version": "0.3.1",
1327 | "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.3.1.tgz",
1328 | "integrity": "sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==",
1329 | "dev": true
1330 | },
1331 | "nanoid": {
1332 | "version": "3.3.6",
1333 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz",
1334 | "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA=="
1335 | },
1336 | "picocolors": {
1337 | "version": "1.0.0",
1338 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
1339 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
1340 | },
1341 | "postcss": {
1342 | "version": "8.4.27",
1343 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.27.tgz",
1344 | "integrity": "sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ==",
1345 | "requires": {
1346 | "nanoid": "^3.3.6",
1347 | "picocolors": "^1.0.0",
1348 | "source-map-js": "^1.0.2"
1349 | }
1350 | },
1351 | "rollup": {
1352 | "version": "3.26.3",
1353 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.26.3.tgz",
1354 | "integrity": "sha512-7Tin0C8l86TkpcMtXvQu6saWH93nhG3dGQ1/+l5V2TDMceTxO7kDiK6GzbfLWNNxqJXm591PcEZUozZm51ogwQ==",
1355 | "dev": true,
1356 | "requires": {
1357 | "fsevents": "~2.3.2"
1358 | }
1359 | },
1360 | "semver": {
1361 | "version": "7.5.4",
1362 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
1363 | "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
1364 | "dev": true,
1365 | "requires": {
1366 | "lru-cache": "^6.0.0"
1367 | }
1368 | },
1369 | "source-map-js": {
1370 | "version": "1.0.2",
1371 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
1372 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw=="
1373 | },
1374 | "typescript": {
1375 | "version": "5.1.6",
1376 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz",
1377 | "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==",
1378 | "dev": true
1379 | },
1380 | "vite": {
1381 | "version": "4.4.6",
1382 | "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.6.tgz",
1383 | "integrity": "sha512-EY6Mm8vJ++S3D4tNAckaZfw3JwG3wa794Vt70M6cNJ6NxT87yhq7EC8Rcap3ahyHdo8AhCmV9PTk+vG1HiYn1A==",
1384 | "dev": true,
1385 | "requires": {
1386 | "esbuild": "^0.18.10",
1387 | "fsevents": "~2.3.2",
1388 | "postcss": "^8.4.26",
1389 | "rollup": "^3.25.2"
1390 | }
1391 | },
1392 | "vue": {
1393 | "version": "3.3.4",
1394 | "resolved": "https://registry.npmjs.org/vue/-/vue-3.3.4.tgz",
1395 | "integrity": "sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw==",
1396 | "requires": {
1397 | "@vue/compiler-dom": "3.3.4",
1398 | "@vue/compiler-sfc": "3.3.4",
1399 | "@vue/runtime-dom": "3.3.4",
1400 | "@vue/server-renderer": "3.3.4",
1401 | "@vue/shared": "3.3.4"
1402 | }
1403 | },
1404 | "vue-template-compiler": {
1405 | "version": "2.7.14",
1406 | "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.14.tgz",
1407 | "integrity": "sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ==",
1408 | "dev": true,
1409 | "requires": {
1410 | "de-indent": "^1.0.2",
1411 | "he": "^1.2.0"
1412 | }
1413 | },
1414 | "vue-tsc": {
1415 | "version": "1.8.6",
1416 | "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-1.8.6.tgz",
1417 | "integrity": "sha512-8ffD4NGfwyATjw/s40Lw2EgB7L2/PAqnGlJBaVQLgblr3SU4EYdhJ67TNXXuDD8NMbDAFSM24V8i3ZIJgTs32Q==",
1418 | "dev": true,
1419 | "requires": {
1420 | "@vue/language-core": "1.8.6",
1421 | "@vue/typescript": "1.8.6",
1422 | "semver": "^7.3.8"
1423 | }
1424 | },
1425 | "yallist": {
1426 | "version": "4.0.0",
1427 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
1428 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
1429 | "dev": true
1430 | }
1431 | }
1432 | }
1433 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@leyton-techlab/vue-input-highlighter",
3 | "version": "0.0.6",
4 | "main": "./dist/vue-input-highlighter.umd.js",
5 | "module": "./dist/vue-input-highlighter.es.js",
6 | "exports": {
7 | ".": {
8 | "import": "./dist/vue-input-highlighter.es.js",
9 | "require": "./dist/vue-input-highlighter.umd.js"
10 | },
11 | "./style.css": "./dist/style.css"
12 | },
13 | "files": [
14 | "dist/"
15 | ],
16 | "type": "module",
17 | "scripts": {
18 | "dev": "vite",
19 | "build": "vue-tsc && vite build",
20 | "preview": "vite preview"
21 | },
22 | "dependencies": {
23 | "vue": "^3.3.4"
24 | },
25 | "devDependencies": {
26 | "@vitejs/plugin-vue": "^4.2.3",
27 | "typescript": "^5.0.2",
28 | "vite": "^4.4.5",
29 | "vue-tsc": "^1.8.5"
30 | },
31 | "description": "Vue component that let you highlight content inside an input according to regexes",
32 | "repository": {
33 | "type": "git",
34 | "url": "git+https://github.com/leyton-group/vue-input-highlighter.git"
35 | },
36 | "keywords": [
37 | "ux",
38 | "vue",
39 | "vue3",
40 | "input",
41 | "highlight",
42 | "highlighter"
43 | ],
44 | "author": "galinor",
45 | "bugs": {
46 | "url": "https://github.com/leyton-group/vue-input-highlighter/issues"
47 | },
48 | "homepage": "https://github.com/leyton-group/vue-input-highlighter#readme"
49 | }
50 |
--------------------------------------------------------------------------------
/src/components/input-highlighter.vue:
--------------------------------------------------------------------------------
1 |
2 |
9 |
10 |
11 |
12 |
177 |
178 |
205 |
--------------------------------------------------------------------------------
/src/index.js:
--------------------------------------------------------------------------------
1 | import InputHighlighter from './components/input-highlighter.vue';
2 |
3 | export default InputHighlighter;
4 |
--------------------------------------------------------------------------------
/src/style.css:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/leyton-group/vue-input-highlighter/1b104fe7cb840f32fb946561cd623ef18895ffc7/src/style.css
--------------------------------------------------------------------------------
/src/vite-env.d.ts:
--------------------------------------------------------------------------------
1 | ///
2 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "ES2020",
4 | "useDefineForClassFields": true,
5 | "module": "ESNext",
6 | "lib": ["ES2020", "DOM", "DOM.Iterable"],
7 | "skipLibCheck": true,
8 | "allowJs": true,
9 |
10 | /* Bundler mode */
11 | "moduleResolution": "bundler",
12 | "allowImportingTsExtensions": true,
13 | "resolveJsonModule": true,
14 | "isolatedModules": true,
15 | "noEmit": true,
16 | "jsx": "preserve",
17 |
18 | /* Linting */
19 | "strict": true,
20 | "noUnusedLocals": true,
21 | "noUnusedParameters": true,
22 | "noFallthroughCasesInSwitch": true
23 | },
24 | "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"],
25 | "references": [{ "path": "./tsconfig.node.json" }]
26 | }
27 |
--------------------------------------------------------------------------------
/tsconfig.node.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "composite": true,
4 | "skipLibCheck": true,
5 | "module": "ESNext",
6 | "moduleResolution": "bundler",
7 | "allowSyntheticDefaultImports": true
8 | },
9 | "include": ["vite.config.ts"]
10 | }
11 |
--------------------------------------------------------------------------------
/vite.config.ts:
--------------------------------------------------------------------------------
1 | import { resolve } from 'path'
2 | import { defineConfig } from 'vite'
3 | import vue from '@vitejs/plugin-vue'
4 |
5 | // https://vitejs.dev/config/
6 | export default defineConfig({
7 | build: {
8 | lib: {
9 | entry: resolve(__dirname, 'src/index.js'),
10 | name: 'vue-input-highlighter',
11 | fileName: (format) => `vue-input-highlighter.${format}.js`,
12 | },
13 | rollupOptions: {
14 | external: ['vue'],
15 | output: {
16 | globals: {
17 | vue: 'Vue'
18 | }
19 | }
20 | },
21 | },
22 | plugins: [vue()],
23 | })
24 |
--------------------------------------------------------------------------------