├── .gitignore
├── .npmrc
├── .prettierignore
├── .prettierrc
├── .vscode
└── settings.json
├── LICENSE
├── README.md
├── iframe.html
├── index.html
├── package.json
├── pnpm-lock.yaml
├── postcss.config.cjs
├── src
├── codemirror
│ └── hover-extension.ts
├── components
│ ├── App.vue
│ ├── AppHeader.vue
│ ├── BaseDialog.vue
│ ├── BoxHeader.vue
│ ├── DataEditor.vue
│ ├── HelpDialog.vue
│ ├── Preview.vue
│ ├── TemplateEditor.vue
│ └── UrlDialog.vue
├── css
│ ├── md.css
│ ├── prism.css
│ └── tailwind.css
├── iframe.ts
├── lib
│ ├── config.ts
│ ├── copy.ts
│ ├── examples.ts
│ ├── highlight.ts
│ ├── html-tag.ts
│ ├── use-copy.ts
│ ├── use-worker.ts
│ ├── useCodeMirror.ts
│ ├── utils.ts
│ └── worker.ts
└── main.ts
├── tailwind.config.cjs
├── tsconfig.json
└── vite.config.ts
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | node_modules
3 | .env
4 | .env.*
5 | !.env.example
6 | dist
7 | *.log
--------------------------------------------------------------------------------
/.npmrc:
--------------------------------------------------------------------------------
1 | engine-strict=true
2 |
--------------------------------------------------------------------------------
/.prettierignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | node_modules
3 | dist
4 | *.log
--------------------------------------------------------------------------------
/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "useTabs": true,
3 | "singleQuote": true,
4 | "trailingComma": "none",
5 | "printWidth": 100,
6 | "pluginSearchDirs": ["."]
7 | }
8 |
--------------------------------------------------------------------------------
/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | {}
2 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2022 EGOIST (Kevin)
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Banner Designer
2 |
3 | https://banner.browserku.com
4 |
5 | ## License
6 |
7 | MIT
8 |
--------------------------------------------------------------------------------
/iframe.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 | {{#expect prod }}
2 |
3 |
4 |
5 |
6 |
7 | Banner Designer by Browserku
8 |
9 |
10 |
11 |
12 | {{#if prod}}
13 |
19 | {{/if}}
20 |
21 |
22 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "browserku-banner",
3 | "version": "0.0.1",
4 | "private": true,
5 | "scripts": {
6 | "dev": "vite dev",
7 | "build": "vite build",
8 | "preview": "vite preview"
9 | },
10 | "devDependencies": {
11 | "@browserku/uno": "^0.0.5",
12 | "@codemirror/commands": "^6.1.0",
13 | "@codemirror/lang-html": "^6.1.0",
14 | "@codemirror/lang-javascript": "^6.0.2",
15 | "@codemirror/view": "^6.2.0",
16 | "@headlessui/vue": "^1.6.7",
17 | "@types/dedent": "^0.7.0",
18 | "@types/node": "^18.7.13",
19 | "@types/prettier": "^2.7.0",
20 | "@types/prismjs": "^1.26.0",
21 | "@types/splitpanes": "^2.2.1",
22 | "@vitejs/plugin-vue": "^3.0.3",
23 | "autoprefixer": "^10.4.8",
24 | "codemirror": "^6.0.1",
25 | "dom-to-image-retina": "^1.0.2",
26 | "fflate": "^0.7.3",
27 | "floating-vue": "2.0.0-beta.19",
28 | "prettier": "^2.7.1",
29 | "prismjs": "^1.29.0",
30 | "redent": "^4.0.0",
31 | "splitpanes": "^3.1.1",
32 | "strip-css-comments": "^5.0.0",
33 | "tailwindcss": "^3.1.8",
34 | "tempura": "^0.4.0",
35 | "typed-worker": "^1.0.2",
36 | "typescript": "^4.7.4",
37 | "vite": "^3.0.9",
38 | "vue": "^3.2.37"
39 | },
40 | "type": "module",
41 | "dependencies": {
42 | "petite-vue": "^0.4.1"
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/pnpm-lock.yaml:
--------------------------------------------------------------------------------
1 | lockfileVersion: 5.4
2 |
3 | specifiers:
4 | '@browserku/uno': ^0.0.5
5 | '@codemirror/commands': ^6.1.0
6 | '@codemirror/lang-html': ^6.1.0
7 | '@codemirror/lang-javascript': ^6.0.2
8 | '@codemirror/view': ^6.2.0
9 | '@headlessui/vue': ^1.6.7
10 | '@types/dedent': ^0.7.0
11 | '@types/node': ^18.7.13
12 | '@types/prettier': ^2.7.0
13 | '@types/prismjs': ^1.26.0
14 | '@types/splitpanes': ^2.2.1
15 | '@vitejs/plugin-vue': ^3.0.3
16 | autoprefixer: ^10.4.8
17 | codemirror: ^6.0.1
18 | dom-to-image-retina: ^1.0.2
19 | fflate: ^0.7.3
20 | floating-vue: 2.0.0-beta.19
21 | petite-vue: ^0.4.1
22 | prettier: ^2.7.1
23 | prismjs: ^1.29.0
24 | redent: ^4.0.0
25 | splitpanes: ^3.1.1
26 | strip-css-comments: ^5.0.0
27 | tailwindcss: ^3.1.8
28 | tempura: ^0.4.0
29 | typed-worker: ^1.0.2
30 | typescript: ^4.7.4
31 | vite: ^3.0.9
32 | vue: ^3.2.37
33 |
34 | dependencies:
35 | petite-vue: 0.4.1
36 |
37 | devDependencies:
38 | '@browserku/uno': 0.0.5
39 | '@codemirror/commands': 6.1.0
40 | '@codemirror/lang-html': 6.1.0
41 | '@codemirror/lang-javascript': 6.0.2
42 | '@codemirror/view': 6.2.0
43 | '@headlessui/vue': 1.6.7_vue@3.2.37
44 | '@types/dedent': 0.7.0
45 | '@types/node': 18.7.13
46 | '@types/prettier': 2.7.0
47 | '@types/prismjs': 1.26.0
48 | '@types/splitpanes': 2.2.1
49 | '@vitejs/plugin-vue': 3.0.3_vite@3.0.9+vue@3.2.37
50 | autoprefixer: 10.4.8
51 | codemirror: 6.0.1
52 | dom-to-image-retina: 1.0.2
53 | fflate: 0.7.3
54 | floating-vue: 2.0.0-beta.19_vue@3.2.37
55 | prettier: 2.7.1
56 | prismjs: 1.29.0
57 | redent: 4.0.0
58 | splitpanes: 3.1.1
59 | strip-css-comments: 5.0.0
60 | tailwindcss: 3.1.8
61 | tempura: 0.4.0
62 | typed-worker: 1.0.2
63 | typescript: 4.7.4
64 | vite: 3.0.9
65 | vue: 3.2.37
66 |
67 | packages:
68 |
69 | /@babel/helper-string-parser/7.18.10:
70 | resolution: {integrity: sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==}
71 | engines: {node: '>=6.9.0'}
72 | dev: true
73 |
74 | /@babel/helper-validator-identifier/7.18.6:
75 | resolution: {integrity: sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==}
76 | engines: {node: '>=6.9.0'}
77 | dev: true
78 |
79 | /@babel/parser/7.18.13:
80 | resolution: {integrity: sha512-dgXcIfMuQ0kgzLB2b9tRZs7TTFFaGM2AbtA4fJgUUYukzGH4jwsS7hzQHEGs67jdehpm22vkgKwvbU+aEflgwg==}
81 | engines: {node: '>=6.0.0'}
82 | hasBin: true
83 | dependencies:
84 | '@babel/types': 7.18.13
85 | dev: true
86 |
87 | /@babel/types/7.18.13:
88 | resolution: {integrity: sha512-ePqfTihzW0W6XAU+aMw2ykilisStJfDnsejDCXRchCcMJ4O0+8DhPXf2YUbZ6wjBlsEmZwLK/sPweWtu8hcJYQ==}
89 | engines: {node: '>=6.9.0'}
90 | dependencies:
91 | '@babel/helper-string-parser': 7.18.10
92 | '@babel/helper-validator-identifier': 7.18.6
93 | to-fast-properties: 2.0.0
94 | dev: true
95 |
96 | /@browserku/uno/0.0.5:
97 | resolution: {integrity: sha512-iVZgkDKKReW9Vj6s8xBYXcGsPpgCCt+U35QfzpfvkqC/WStlMRYvdva2wRMulHGhzb7IWnmfU8rnAHVDOLIYwQ==}
98 | dependencies:
99 | '@unocss/core': 0.45.12
100 | '@unocss/preset-attributify': 0.45.12
101 | '@unocss/preset-uno': 0.45.12
102 | dev: true
103 |
104 | /@codemirror/autocomplete/6.1.0:
105 | resolution: {integrity: sha512-wtO4O5WDyXhhCd4q4utDIDZxnQfmJ++3dGBCG9LMtI79+92OcA1DVk/n7BEupKmjIr8AzvptDz7YQ9ud6OkU+A==}
106 | dependencies:
107 | '@codemirror/language': 6.2.1
108 | '@codemirror/state': 6.1.1
109 | '@codemirror/view': 6.2.0
110 | '@lezer/common': 1.0.0
111 | dev: true
112 |
113 | /@codemirror/commands/6.1.0:
114 | resolution: {integrity: sha512-qCj2YqmbBjj0P1iumnlL5lBqZvJPzT+t2UvgjcaXErp5ZvMqFRVgQyrEfdXX6SX5UcvcHKBjXqno+MkUp0aYvQ==}
115 | dependencies:
116 | '@codemirror/language': 6.2.1
117 | '@codemirror/state': 6.1.1
118 | '@codemirror/view': 6.2.0
119 | '@lezer/common': 1.0.0
120 | dev: true
121 |
122 | /@codemirror/lang-css/6.0.0:
123 | resolution: {integrity: sha512-jBqc+BTuwhNOTlrimFghLlSrN6iFuE44HULKWoR4qKYObhOIl9Lci1iYj6zMIte1XTQmZguNvjXMyr43LUKwSw==}
124 | dependencies:
125 | '@codemirror/autocomplete': 6.1.0
126 | '@codemirror/language': 6.2.1
127 | '@codemirror/state': 6.1.1
128 | '@lezer/css': 1.0.0
129 | dev: true
130 |
131 | /@codemirror/lang-html/6.1.0:
132 | resolution: {integrity: sha512-gA7NmJxqvnhwza05CvR7W/39Ap9r/4Vs9uiC0IeFYo1hSlJzc/8N6Evviz6vTW1x8SpHcRYyqKOf6rpl6LfWtg==}
133 | dependencies:
134 | '@codemirror/autocomplete': 6.1.0
135 | '@codemirror/lang-css': 6.0.0
136 | '@codemirror/lang-javascript': 6.0.2
137 | '@codemirror/language': 6.2.1
138 | '@codemirror/state': 6.1.1
139 | '@lezer/common': 1.0.0
140 | '@lezer/html': 1.0.1
141 | dev: true
142 |
143 | /@codemirror/lang-javascript/6.0.2:
144 | resolution: {integrity: sha512-BZRJ9u/zl16hLkSpDAWm73mrfIR7HJrr0lvnhoSOCQVea5BglguWI/slxexhvUb0CB5cXgKWuo2bM+N9EhIaZw==}
145 | dependencies:
146 | '@codemirror/autocomplete': 6.1.0
147 | '@codemirror/language': 6.2.1
148 | '@codemirror/lint': 6.0.0
149 | '@codemirror/state': 6.1.1
150 | '@codemirror/view': 6.2.0
151 | '@lezer/common': 1.0.0
152 | '@lezer/javascript': 1.0.2
153 | dev: true
154 |
155 | /@codemirror/language/6.2.1:
156 | resolution: {integrity: sha512-MC3svxuvIj0MRpFlGHxLS6vPyIdbTr2KKPEW46kCoCXw2ktb4NTkpkPBI/lSP/FoNXLCBJ0mrnUi1OoZxtpW1Q==}
157 | dependencies:
158 | '@codemirror/state': 6.1.1
159 | '@codemirror/view': 6.2.0
160 | '@lezer/common': 1.0.0
161 | '@lezer/highlight': 1.0.0
162 | '@lezer/lr': 1.2.3
163 | style-mod: 4.0.0
164 | dev: true
165 |
166 | /@codemirror/lint/6.0.0:
167 | resolution: {integrity: sha512-nUUXcJW1Xp54kNs+a1ToPLK8MadO0rMTnJB8Zk4Z8gBdrN0kqV7uvUraU/T2yqg+grDNR38Vmy/MrhQN/RgwiA==}
168 | dependencies:
169 | '@codemirror/state': 6.1.1
170 | '@codemirror/view': 6.2.0
171 | crelt: 1.0.5
172 | dev: true
173 |
174 | /@codemirror/search/6.1.0:
175 | resolution: {integrity: sha512-ye6m0jFHSgQ4qnfWVwArvm7XrCMNppMYnL5f4M0WdBScslnckomf5eVacYCw8P0UBWeq72lCSXA0/eo1piZxLA==}
176 | dependencies:
177 | '@codemirror/state': 6.1.1
178 | '@codemirror/view': 6.2.0
179 | crelt: 1.0.5
180 | dev: true
181 |
182 | /@codemirror/state/6.1.1:
183 | resolution: {integrity: sha512-2s+aXsxmAwnR3Rd+JDHPG/1lw0YsA9PEwl7Re88gHJHGfxyfEzKBmsN4rr53RyPIR4lzbbhJX0DCq0WlqlBIRw==}
184 | dev: true
185 |
186 | /@codemirror/view/6.2.0:
187 | resolution: {integrity: sha512-3emW1symh+GoteFMBPsltjmF790U/trouLILATh3JodbF/z98HvcQh2g3+H6dfNIHx16uNonsAF4mNzVr1TJNA==}
188 | dependencies:
189 | '@codemirror/state': 6.1.1
190 | style-mod: 4.0.0
191 | w3c-keyname: 2.2.6
192 | dev: true
193 |
194 | /@esbuild/linux-loong64/0.14.54:
195 | resolution: {integrity: sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==}
196 | engines: {node: '>=12'}
197 | cpu: [loong64]
198 | os: [linux]
199 | requiresBuild: true
200 | dev: true
201 | optional: true
202 |
203 | /@floating-ui/core/0.3.1:
204 | resolution: {integrity: sha512-ensKY7Ub59u16qsVIFEo2hwTCqZ/r9oZZFh51ivcLGHfUwTn8l1Xzng8RJUe91H/UP8PeqeBronAGx0qmzwk2g==}
205 | dev: true
206 |
207 | /@floating-ui/dom/0.1.10:
208 | resolution: {integrity: sha512-4kAVoogvQm2N0XE0G6APQJuCNuErjOfPW8Ux7DFxh8+AfugWflwVJ5LDlHOwrwut7z/30NUvdtHzQ3zSip4EzQ==}
209 | dependencies:
210 | '@floating-ui/core': 0.3.1
211 | dev: true
212 |
213 | /@headlessui/vue/1.6.7_vue@3.2.37:
214 | resolution: {integrity: sha512-5sTCBpkUoFE7zhANn/6Z+pf3PUA7MD6BBaTsJcQybq9E4fnNiMM9agOJI9meXbtcawE6Dm8EeB5A8HAJEnZCbQ==}
215 | engines: {node: '>=10'}
216 | peerDependencies:
217 | vue: ^3.2.0
218 | dependencies:
219 | vue: 3.2.37
220 | dev: true
221 |
222 | /@lezer/common/1.0.0:
223 | resolution: {integrity: sha512-ohydQe+Hb+w4oMDvXzs8uuJd2NoA3D8YDcLiuDsLqH+yflDTPEpgCsWI3/6rH5C3BAedtH1/R51dxENldQceEA==}
224 | dev: true
225 |
226 | /@lezer/css/1.0.0:
227 | resolution: {integrity: sha512-616VqgDKumHmYIuxs3tnX1irEQmoDHgF/TlP4O5ICWwyHwLMErq+8iKVuzTkOdBqvYAVmObqThcDEAaaMJjAdg==}
228 | dependencies:
229 | '@lezer/highlight': 1.0.0
230 | '@lezer/lr': 1.2.3
231 | dev: true
232 |
233 | /@lezer/highlight/1.0.0:
234 | resolution: {integrity: sha512-nsCnNtim90UKsB5YxoX65v3GEIw3iCHw9RM2DtdgkiqAbKh9pCdvi8AWNwkYf10Lu6fxNhXPpkpHbW6mihhvJA==}
235 | dependencies:
236 | '@lezer/common': 1.0.0
237 | dev: true
238 |
239 | /@lezer/html/1.0.1:
240 | resolution: {integrity: sha512-sC00zEt3GBh3vVO6QaGX4YZCl41S9dHWN/WGBsDixy9G+sqOC7gsa4cxA/fmRVAiBvhqYkJk+5Ul4oul92CPVw==}
241 | dependencies:
242 | '@lezer/common': 1.0.0
243 | '@lezer/highlight': 1.0.0
244 | '@lezer/lr': 1.2.3
245 | dev: true
246 |
247 | /@lezer/javascript/1.0.2:
248 | resolution: {integrity: sha512-IjOVeIRhM8IuafWNnk+UzRz7p4/JSOKBNINLYLsdSGuJS9Ju7vFdc82AlTt0jgtV5D8eBZf4g0vK4d3ttBNz7A==}
249 | dependencies:
250 | '@lezer/highlight': 1.0.0
251 | '@lezer/lr': 1.2.3
252 | dev: true
253 |
254 | /@lezer/lr/1.2.3:
255 | resolution: {integrity: sha512-qpB7rBzH8f6Mzjv2AVZRahcm+2Cf7nbIH++uXbvVOL1yIRvVWQ3HAM/saeBLCyz/togB7LGo76qdJYL1uKQlqA==}
256 | dependencies:
257 | '@lezer/common': 1.0.0
258 | dev: true
259 |
260 | /@nodelib/fs.scandir/2.1.5:
261 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
262 | engines: {node: '>= 8'}
263 | dependencies:
264 | '@nodelib/fs.stat': 2.0.5
265 | run-parallel: 1.2.0
266 | dev: true
267 |
268 | /@nodelib/fs.stat/2.0.5:
269 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
270 | engines: {node: '>= 8'}
271 | dev: true
272 |
273 | /@nodelib/fs.walk/1.2.8:
274 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
275 | engines: {node: '>= 8'}
276 | dependencies:
277 | '@nodelib/fs.scandir': 2.1.5
278 | fastq: 1.13.0
279 | dev: true
280 |
281 | /@types/dedent/0.7.0:
282 | resolution: {integrity: sha512-EGlKlgMhnLt/cM4DbUSafFdrkeJoC9Mvnj0PUCU7tFmTjMjNRT957kXCx0wYm3JuEq4o4ZsS5vG+NlkM2DMd2A==}
283 | dev: true
284 |
285 | /@types/node/18.7.13:
286 | resolution: {integrity: sha512-46yIhxSe5xEaJZXWdIBP7GU4HDTG8/eo0qd9atdiL+lFpA03y8KS+lkTN834TWJj5767GbWv4n/P6efyTFt1Dw==}
287 | dev: true
288 |
289 | /@types/prettier/2.7.0:
290 | resolution: {integrity: sha512-RI1L7N4JnW5gQw2spvL7Sllfuf1SaHdrZpCHiBlCXjIlufi1SMNnbu2teze3/QE67Fg2tBlH7W+mi4hVNk4p0A==}
291 | dev: true
292 |
293 | /@types/prismjs/1.26.0:
294 | resolution: {integrity: sha512-ZTaqn/qSqUuAq1YwvOFQfVW1AR/oQJlLSZVustdjwI+GZ8kr0MSHBj0tsXPW1EqHubx50gtBEjbPGsdZwQwCjQ==}
295 | dev: true
296 |
297 | /@types/splitpanes/2.2.1:
298 | resolution: {integrity: sha512-H5BgO6UdJRzz5ddRzuGvLBiPSPEuuHXb5ET+7avLLrEx1uc7f5Ut5oLMDQsfvGtHBBAFczt1QNYuDf27wHbvDQ==}
299 | dependencies:
300 | vue: 2.7.10
301 | dev: true
302 |
303 | /@unocss/core/0.45.12:
304 | resolution: {integrity: sha512-21ri/IF/r82lYJTSZ8kBwesSPysaMopMbPy6AtHgCQIHQPsdx6lOzg9Wq5rh+5IjXywXSmuRMuHiYSPjI0yxdw==}
305 | dev: true
306 |
307 | /@unocss/preset-attributify/0.45.12:
308 | resolution: {integrity: sha512-Ypo0Y+2upQkjuNw6KCwzWgvQKbLyrKlLiFxSLdJ9DtHyWFSMHe6Ue9mI73pyqKSYngb5UHTSmdfs0+FbWGPmlQ==}
309 | dependencies:
310 | '@unocss/core': 0.45.12
311 | dev: true
312 |
313 | /@unocss/preset-mini/0.45.12:
314 | resolution: {integrity: sha512-2t+ia6CRnzYJQ9WSGpJgc6GOYY4BXU55TI7YdZMhNLB4+2fHt699W/EzEb8pAo+dHRcJob71Wu5RrGpF6F+HvA==}
315 | dependencies:
316 | '@unocss/core': 0.45.12
317 | dev: true
318 |
319 | /@unocss/preset-uno/0.45.12:
320 | resolution: {integrity: sha512-NkOHtzl/k81++I9y3rZV6SecHkp0bcF6bKTwNO4fDOStfarvg8NFgRR03K25Dc+2Jm/KTgT0OvOUplCTht6Xiw==}
321 | dependencies:
322 | '@unocss/core': 0.45.12
323 | '@unocss/preset-mini': 0.45.12
324 | '@unocss/preset-wind': 0.45.12
325 | dev: true
326 |
327 | /@unocss/preset-wind/0.45.12:
328 | resolution: {integrity: sha512-xZ8GNKEr4xWdbffBVgSxsWI86IMU/akvuDXMDBeA3C+yrkQFrohMn077ztF9PypXP6/CzTLtSc2x5HyHdFNQyA==}
329 | dependencies:
330 | '@unocss/core': 0.45.12
331 | '@unocss/preset-mini': 0.45.12
332 | dev: true
333 |
334 | /@vitejs/plugin-vue/3.0.3_vite@3.0.9+vue@3.2.37:
335 | resolution: {integrity: sha512-U4zNBlz9mg+TA+i+5QPc3N5lQvdUXENZLO2h0Wdzp56gI1MWhqJOv+6R+d4kOzoaSSq6TnGPBdZAXKOe4lXy6g==}
336 | engines: {node: ^14.18.0 || >=16.0.0}
337 | peerDependencies:
338 | vite: ^3.0.0
339 | vue: ^3.2.25
340 | dependencies:
341 | vite: 3.0.9
342 | vue: 3.2.37
343 | dev: true
344 |
345 | /@vue/compiler-core/3.2.37:
346 | resolution: {integrity: sha512-81KhEjo7YAOh0vQJoSmAD68wLfYqJvoiD4ulyedzF+OEk/bk6/hx3fTNVfuzugIIaTrOx4PGx6pAiBRe5e9Zmg==}
347 | dependencies:
348 | '@babel/parser': 7.18.13
349 | '@vue/shared': 3.2.37
350 | estree-walker: 2.0.2
351 | source-map: 0.6.1
352 | dev: true
353 |
354 | /@vue/compiler-dom/3.2.37:
355 | resolution: {integrity: sha512-yxJLH167fucHKxaqXpYk7x8z7mMEnXOw3G2q62FTkmsvNxu4FQSu5+3UMb+L7fjKa26DEzhrmCxAgFLLIzVfqQ==}
356 | dependencies:
357 | '@vue/compiler-core': 3.2.37
358 | '@vue/shared': 3.2.37
359 | dev: true
360 |
361 | /@vue/compiler-sfc/2.7.10:
362 | resolution: {integrity: sha512-55Shns6WPxlYsz4WX7q9ZJBL77sKE1ZAYNYStLs6GbhIOMrNtjMvzcob6gu3cGlfpCR4bT7NXgyJ3tly2+Hx8Q==}
363 | dependencies:
364 | '@babel/parser': 7.18.13
365 | postcss: 8.4.16
366 | source-map: 0.6.1
367 | dev: true
368 |
369 | /@vue/compiler-sfc/3.2.37:
370 | resolution: {integrity: sha512-+7i/2+9LYlpqDv+KTtWhOZH+pa8/HnX/905MdVmAcI/mPQOBwkHHIzrsEsucyOIZQYMkXUiTkmZq5am/NyXKkg==}
371 | dependencies:
372 | '@babel/parser': 7.18.13
373 | '@vue/compiler-core': 3.2.37
374 | '@vue/compiler-dom': 3.2.37
375 | '@vue/compiler-ssr': 3.2.37
376 | '@vue/reactivity-transform': 3.2.37
377 | '@vue/shared': 3.2.37
378 | estree-walker: 2.0.2
379 | magic-string: 0.25.9
380 | postcss: 8.4.16
381 | source-map: 0.6.1
382 | dev: true
383 |
384 | /@vue/compiler-ssr/3.2.37:
385 | resolution: {integrity: sha512-7mQJD7HdXxQjktmsWp/J67lThEIcxLemz1Vb5I6rYJHR5vI+lON3nPGOH3ubmbvYGt8xEUaAr1j7/tIFWiEOqw==}
386 | dependencies:
387 | '@vue/compiler-dom': 3.2.37
388 | '@vue/shared': 3.2.37
389 | dev: true
390 |
391 | /@vue/reactivity-transform/3.2.37:
392 | resolution: {integrity: sha512-IWopkKEb+8qpu/1eMKVeXrK0NLw9HicGviJzhJDEyfxTR9e1WtpnnbYkJWurX6WwoFP0sz10xQg8yL8lgskAZg==}
393 | dependencies:
394 | '@babel/parser': 7.18.13
395 | '@vue/compiler-core': 3.2.37
396 | '@vue/shared': 3.2.37
397 | estree-walker: 2.0.2
398 | magic-string: 0.25.9
399 | dev: true
400 |
401 | /@vue/reactivity/3.2.37:
402 | resolution: {integrity: sha512-/7WRafBOshOc6m3F7plwzPeCu/RCVv9uMpOwa/5PiY1Zz+WLVRWiy0MYKwmg19KBdGtFWsmZ4cD+LOdVPcs52A==}
403 | dependencies:
404 | '@vue/shared': 3.2.37
405 | dev: true
406 |
407 | /@vue/runtime-core/3.2.37:
408 | resolution: {integrity: sha512-JPcd9kFyEdXLl/i0ClS7lwgcs0QpUAWj+SKX2ZC3ANKi1U4DOtiEr6cRqFXsPwY5u1L9fAjkinIdB8Rz3FoYNQ==}
409 | dependencies:
410 | '@vue/reactivity': 3.2.37
411 | '@vue/shared': 3.2.37
412 | dev: true
413 |
414 | /@vue/runtime-dom/3.2.37:
415 | resolution: {integrity: sha512-HimKdh9BepShW6YozwRKAYjYQWg9mQn63RGEiSswMbW+ssIht1MILYlVGkAGGQbkhSh31PCdoUcfiu4apXJoPw==}
416 | dependencies:
417 | '@vue/runtime-core': 3.2.37
418 | '@vue/shared': 3.2.37
419 | csstype: 2.6.20
420 | dev: true
421 |
422 | /@vue/server-renderer/3.2.37_vue@3.2.37:
423 | resolution: {integrity: sha512-kLITEJvaYgZQ2h47hIzPh2K3jG8c1zCVbp/o/bzQOyvzaKiCquKS7AaioPI28GNxIsE/zSx+EwWYsNxDCX95MA==}
424 | peerDependencies:
425 | vue: 3.2.37
426 | dependencies:
427 | '@vue/compiler-ssr': 3.2.37
428 | '@vue/shared': 3.2.37
429 | vue: 3.2.37
430 | dev: true
431 |
432 | /@vue/shared/3.2.37:
433 | resolution: {integrity: sha512-4rSJemR2NQIo9Klm1vabqWjD8rs/ZaJSzMxkMNeJS6lHiUjjUeYFbooN19NgFjztubEKh3WlZUeOLVdbbUWHsw==}
434 | dev: true
435 |
436 | /acorn-node/1.8.2:
437 | resolution: {integrity: sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==}
438 | dependencies:
439 | acorn: 7.4.1
440 | acorn-walk: 7.2.0
441 | xtend: 4.0.2
442 | dev: true
443 |
444 | /acorn-walk/7.2.0:
445 | resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==}
446 | engines: {node: '>=0.4.0'}
447 | dev: true
448 |
449 | /acorn/7.4.1:
450 | resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==}
451 | engines: {node: '>=0.4.0'}
452 | hasBin: true
453 | dev: true
454 |
455 | /anymatch/3.1.2:
456 | resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==}
457 | engines: {node: '>= 8'}
458 | dependencies:
459 | normalize-path: 3.0.0
460 | picomatch: 2.3.1
461 | dev: true
462 |
463 | /arg/5.0.2:
464 | resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==}
465 | dev: true
466 |
467 | /autoprefixer/10.4.8:
468 | resolution: {integrity: sha512-75Jr6Q/XpTqEf6D2ltS5uMewJIx5irCU1oBYJrWjFenq/m12WRRrz6g15L1EIoYvPLXTbEry7rDOwrcYNj77xw==}
469 | engines: {node: ^10 || ^12 || >=14}
470 | hasBin: true
471 | peerDependencies:
472 | postcss: ^8.1.0
473 | dependencies:
474 | browserslist: 4.21.3
475 | caniuse-lite: 1.0.30001382
476 | fraction.js: 4.2.0
477 | normalize-range: 0.1.2
478 | picocolors: 1.0.0
479 | postcss-value-parser: 4.2.0
480 | dev: true
481 |
482 | /binary-extensions/2.2.0:
483 | resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==}
484 | engines: {node: '>=8'}
485 | dev: true
486 |
487 | /braces/3.0.2:
488 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==}
489 | engines: {node: '>=8'}
490 | dependencies:
491 | fill-range: 7.0.1
492 | dev: true
493 |
494 | /browserslist/4.21.3:
495 | resolution: {integrity: sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==}
496 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
497 | hasBin: true
498 | dependencies:
499 | caniuse-lite: 1.0.30001382
500 | electron-to-chromium: 1.4.228
501 | node-releases: 2.0.6
502 | update-browserslist-db: 1.0.5_browserslist@4.21.3
503 | dev: true
504 |
505 | /camelcase-css/2.0.1:
506 | resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==}
507 | engines: {node: '>= 6'}
508 | dev: true
509 |
510 | /caniuse-lite/1.0.30001382:
511 | resolution: {integrity: sha512-2rtJwDmSZ716Pxm1wCtbPvHtbDWAreTPxXbkc5RkKglow3Ig/4GNGazDI9/BVnXbG/wnv6r3B5FEbkfg9OcTGg==}
512 | dev: true
513 |
514 | /chokidar/3.5.3:
515 | resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==}
516 | engines: {node: '>= 8.10.0'}
517 | dependencies:
518 | anymatch: 3.1.2
519 | braces: 3.0.2
520 | glob-parent: 5.1.2
521 | is-binary-path: 2.1.0
522 | is-glob: 4.0.3
523 | normalize-path: 3.0.0
524 | readdirp: 3.6.0
525 | optionalDependencies:
526 | fsevents: 2.3.2
527 | dev: true
528 |
529 | /codemirror/6.0.1:
530 | resolution: {integrity: sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==}
531 | dependencies:
532 | '@codemirror/autocomplete': 6.1.0
533 | '@codemirror/commands': 6.1.0
534 | '@codemirror/language': 6.2.1
535 | '@codemirror/lint': 6.0.0
536 | '@codemirror/search': 6.1.0
537 | '@codemirror/state': 6.1.1
538 | '@codemirror/view': 6.2.0
539 | dev: true
540 |
541 | /color-name/1.1.4:
542 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
543 | dev: true
544 |
545 | /crelt/1.0.5:
546 | resolution: {integrity: sha512-+BO9wPPi+DWTDcNYhr/W90myha8ptzftZT+LwcmUbbok0rcP/fequmFYCw8NMoH7pkAZQzU78b3kYrlua5a9eA==}
547 | dev: true
548 |
549 | /cssesc/3.0.0:
550 | resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
551 | engines: {node: '>=4'}
552 | hasBin: true
553 | dev: true
554 |
555 | /csstype/2.6.20:
556 | resolution: {integrity: sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA==}
557 | dev: true
558 |
559 | /csstype/3.1.0:
560 | resolution: {integrity: sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==}
561 | dev: true
562 |
563 | /defined/1.0.0:
564 | resolution: {integrity: sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ==}
565 | dev: true
566 |
567 | /detective/5.2.1:
568 | resolution: {integrity: sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==}
569 | engines: {node: '>=0.8.0'}
570 | hasBin: true
571 | dependencies:
572 | acorn-node: 1.8.2
573 | defined: 1.0.0
574 | minimist: 1.2.6
575 | dev: true
576 |
577 | /didyoumean/1.2.2:
578 | resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==}
579 | dev: true
580 |
581 | /dlv/1.1.3:
582 | resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==}
583 | dev: true
584 |
585 | /dom-to-image-retina/1.0.2:
586 | resolution: {integrity: sha512-dVeLvEQLEPme/xYMLiBWS4EA5J98JllcXAaUISwgZXXyyuYbHPHpkYVvNNZLpvaH7EgES7J5s+dQEegpYdzZbQ==}
587 | dev: true
588 |
589 | /electron-to-chromium/1.4.228:
590 | resolution: {integrity: sha512-XfDHCvou7CsDMlFwb0WZ1tWmW48e7Sn7VBRyPfZsZZila9esRsJl1trO+OqDNV97GggFSt0ISbWslKXfQkG//g==}
591 | dev: true
592 |
593 | /esbuild-android-64/0.14.54:
594 | resolution: {integrity: sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==}
595 | engines: {node: '>=12'}
596 | cpu: [x64]
597 | os: [android]
598 | requiresBuild: true
599 | dev: true
600 | optional: true
601 |
602 | /esbuild-android-arm64/0.14.54:
603 | resolution: {integrity: sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==}
604 | engines: {node: '>=12'}
605 | cpu: [arm64]
606 | os: [android]
607 | requiresBuild: true
608 | dev: true
609 | optional: true
610 |
611 | /esbuild-darwin-64/0.14.54:
612 | resolution: {integrity: sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==}
613 | engines: {node: '>=12'}
614 | cpu: [x64]
615 | os: [darwin]
616 | requiresBuild: true
617 | dev: true
618 | optional: true
619 |
620 | /esbuild-darwin-arm64/0.14.54:
621 | resolution: {integrity: sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==}
622 | engines: {node: '>=12'}
623 | cpu: [arm64]
624 | os: [darwin]
625 | requiresBuild: true
626 | dev: true
627 | optional: true
628 |
629 | /esbuild-freebsd-64/0.14.54:
630 | resolution: {integrity: sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==}
631 | engines: {node: '>=12'}
632 | cpu: [x64]
633 | os: [freebsd]
634 | requiresBuild: true
635 | dev: true
636 | optional: true
637 |
638 | /esbuild-freebsd-arm64/0.14.54:
639 | resolution: {integrity: sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==}
640 | engines: {node: '>=12'}
641 | cpu: [arm64]
642 | os: [freebsd]
643 | requiresBuild: true
644 | dev: true
645 | optional: true
646 |
647 | /esbuild-linux-32/0.14.54:
648 | resolution: {integrity: sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==}
649 | engines: {node: '>=12'}
650 | cpu: [ia32]
651 | os: [linux]
652 | requiresBuild: true
653 | dev: true
654 | optional: true
655 |
656 | /esbuild-linux-64/0.14.54:
657 | resolution: {integrity: sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==}
658 | engines: {node: '>=12'}
659 | cpu: [x64]
660 | os: [linux]
661 | requiresBuild: true
662 | dev: true
663 | optional: true
664 |
665 | /esbuild-linux-arm/0.14.54:
666 | resolution: {integrity: sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==}
667 | engines: {node: '>=12'}
668 | cpu: [arm]
669 | os: [linux]
670 | requiresBuild: true
671 | dev: true
672 | optional: true
673 |
674 | /esbuild-linux-arm64/0.14.54:
675 | resolution: {integrity: sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==}
676 | engines: {node: '>=12'}
677 | cpu: [arm64]
678 | os: [linux]
679 | requiresBuild: true
680 | dev: true
681 | optional: true
682 |
683 | /esbuild-linux-mips64le/0.14.54:
684 | resolution: {integrity: sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==}
685 | engines: {node: '>=12'}
686 | cpu: [mips64el]
687 | os: [linux]
688 | requiresBuild: true
689 | dev: true
690 | optional: true
691 |
692 | /esbuild-linux-ppc64le/0.14.54:
693 | resolution: {integrity: sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==}
694 | engines: {node: '>=12'}
695 | cpu: [ppc64]
696 | os: [linux]
697 | requiresBuild: true
698 | dev: true
699 | optional: true
700 |
701 | /esbuild-linux-riscv64/0.14.54:
702 | resolution: {integrity: sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==}
703 | engines: {node: '>=12'}
704 | cpu: [riscv64]
705 | os: [linux]
706 | requiresBuild: true
707 | dev: true
708 | optional: true
709 |
710 | /esbuild-linux-s390x/0.14.54:
711 | resolution: {integrity: sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==}
712 | engines: {node: '>=12'}
713 | cpu: [s390x]
714 | os: [linux]
715 | requiresBuild: true
716 | dev: true
717 | optional: true
718 |
719 | /esbuild-netbsd-64/0.14.54:
720 | resolution: {integrity: sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==}
721 | engines: {node: '>=12'}
722 | cpu: [x64]
723 | os: [netbsd]
724 | requiresBuild: true
725 | dev: true
726 | optional: true
727 |
728 | /esbuild-openbsd-64/0.14.54:
729 | resolution: {integrity: sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==}
730 | engines: {node: '>=12'}
731 | cpu: [x64]
732 | os: [openbsd]
733 | requiresBuild: true
734 | dev: true
735 | optional: true
736 |
737 | /esbuild-sunos-64/0.14.54:
738 | resolution: {integrity: sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==}
739 | engines: {node: '>=12'}
740 | cpu: [x64]
741 | os: [sunos]
742 | requiresBuild: true
743 | dev: true
744 | optional: true
745 |
746 | /esbuild-windows-32/0.14.54:
747 | resolution: {integrity: sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==}
748 | engines: {node: '>=12'}
749 | cpu: [ia32]
750 | os: [win32]
751 | requiresBuild: true
752 | dev: true
753 | optional: true
754 |
755 | /esbuild-windows-64/0.14.54:
756 | resolution: {integrity: sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==}
757 | engines: {node: '>=12'}
758 | cpu: [x64]
759 | os: [win32]
760 | requiresBuild: true
761 | dev: true
762 | optional: true
763 |
764 | /esbuild-windows-arm64/0.14.54:
765 | resolution: {integrity: sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==}
766 | engines: {node: '>=12'}
767 | cpu: [arm64]
768 | os: [win32]
769 | requiresBuild: true
770 | dev: true
771 | optional: true
772 |
773 | /esbuild/0.14.54:
774 | resolution: {integrity: sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==}
775 | engines: {node: '>=12'}
776 | hasBin: true
777 | requiresBuild: true
778 | optionalDependencies:
779 | '@esbuild/linux-loong64': 0.14.54
780 | esbuild-android-64: 0.14.54
781 | esbuild-android-arm64: 0.14.54
782 | esbuild-darwin-64: 0.14.54
783 | esbuild-darwin-arm64: 0.14.54
784 | esbuild-freebsd-64: 0.14.54
785 | esbuild-freebsd-arm64: 0.14.54
786 | esbuild-linux-32: 0.14.54
787 | esbuild-linux-64: 0.14.54
788 | esbuild-linux-arm: 0.14.54
789 | esbuild-linux-arm64: 0.14.54
790 | esbuild-linux-mips64le: 0.14.54
791 | esbuild-linux-ppc64le: 0.14.54
792 | esbuild-linux-riscv64: 0.14.54
793 | esbuild-linux-s390x: 0.14.54
794 | esbuild-netbsd-64: 0.14.54
795 | esbuild-openbsd-64: 0.14.54
796 | esbuild-sunos-64: 0.14.54
797 | esbuild-windows-32: 0.14.54
798 | esbuild-windows-64: 0.14.54
799 | esbuild-windows-arm64: 0.14.54
800 | dev: true
801 |
802 | /escalade/3.1.1:
803 | resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==}
804 | engines: {node: '>=6'}
805 | dev: true
806 |
807 | /estree-walker/2.0.2:
808 | resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
809 | dev: true
810 |
811 | /fast-glob/3.2.11:
812 | resolution: {integrity: sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==}
813 | engines: {node: '>=8.6.0'}
814 | dependencies:
815 | '@nodelib/fs.stat': 2.0.5
816 | '@nodelib/fs.walk': 1.2.8
817 | glob-parent: 5.1.2
818 | merge2: 1.4.1
819 | micromatch: 4.0.5
820 | dev: true
821 |
822 | /fastq/1.13.0:
823 | resolution: {integrity: sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==}
824 | dependencies:
825 | reusify: 1.0.4
826 | dev: true
827 |
828 | /fflate/0.7.3:
829 | resolution: {integrity: sha512-0Zz1jOzJWERhyhsimS54VTqOteCNwRtIlh8isdL0AXLo0g7xNTfTL7oWrkmCnPhZGocKIkWHBistBrrpoNH3aw==}
830 | dev: true
831 |
832 | /fill-range/7.0.1:
833 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==}
834 | engines: {node: '>=8'}
835 | dependencies:
836 | to-regex-range: 5.0.1
837 | dev: true
838 |
839 | /floating-vue/2.0.0-beta.19_vue@3.2.37:
840 | resolution: {integrity: sha512-kWP0/JZM6Cwg959SUnVURDXFFKstGZIXDZJ5Ey77HNOvQete0rJnLntklCJzvLnwla8S3WiApH/EjupxS5ICBg==}
841 | peerDependencies:
842 | vue: ^3.2.0
843 | dependencies:
844 | '@floating-ui/dom': 0.1.10
845 | vue: 3.2.37
846 | vue-resize: 2.0.0-alpha.1_vue@3.2.37
847 | dev: true
848 |
849 | /fraction.js/4.2.0:
850 | resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==}
851 | dev: true
852 |
853 | /fsevents/2.3.2:
854 | resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
855 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
856 | os: [darwin]
857 | requiresBuild: true
858 | dev: true
859 | optional: true
860 |
861 | /function-bind/1.1.1:
862 | resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==}
863 | dev: true
864 |
865 | /glob-parent/5.1.2:
866 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
867 | engines: {node: '>= 6'}
868 | dependencies:
869 | is-glob: 4.0.3
870 | dev: true
871 |
872 | /glob-parent/6.0.2:
873 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
874 | engines: {node: '>=10.13.0'}
875 | dependencies:
876 | is-glob: 4.0.3
877 | dev: true
878 |
879 | /has/1.0.3:
880 | resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==}
881 | engines: {node: '>= 0.4.0'}
882 | dependencies:
883 | function-bind: 1.1.1
884 | dev: true
885 |
886 | /indent-string/5.0.0:
887 | resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==}
888 | engines: {node: '>=12'}
889 | dev: true
890 |
891 | /is-binary-path/2.1.0:
892 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
893 | engines: {node: '>=8'}
894 | dependencies:
895 | binary-extensions: 2.2.0
896 | dev: true
897 |
898 | /is-core-module/2.10.0:
899 | resolution: {integrity: sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==}
900 | dependencies:
901 | has: 1.0.3
902 | dev: true
903 |
904 | /is-extglob/2.1.1:
905 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
906 | engines: {node: '>=0.10.0'}
907 | dev: true
908 |
909 | /is-glob/4.0.3:
910 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
911 | engines: {node: '>=0.10.0'}
912 | dependencies:
913 | is-extglob: 2.1.1
914 | dev: true
915 |
916 | /is-number/7.0.0:
917 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
918 | engines: {node: '>=0.12.0'}
919 | dev: true
920 |
921 | /is-regexp/3.1.0:
922 | resolution: {integrity: sha512-rbku49cWloU5bSMI+zaRaXdQHXnthP6DZ/vLnfdSKyL4zUzuWnomtOEiZZOd+ioQ+avFo/qau3KPTc7Fjy1uPA==}
923 | engines: {node: '>=12'}
924 | dev: true
925 |
926 | /lilconfig/2.0.6:
927 | resolution: {integrity: sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==}
928 | engines: {node: '>=10'}
929 | dev: true
930 |
931 | /magic-string/0.25.9:
932 | resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==}
933 | dependencies:
934 | sourcemap-codec: 1.4.8
935 | dev: true
936 |
937 | /merge2/1.4.1:
938 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
939 | engines: {node: '>= 8'}
940 | dev: true
941 |
942 | /micromatch/4.0.5:
943 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==}
944 | engines: {node: '>=8.6'}
945 | dependencies:
946 | braces: 3.0.2
947 | picomatch: 2.3.1
948 | dev: true
949 |
950 | /min-indent/1.0.1:
951 | resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==}
952 | engines: {node: '>=4'}
953 | dev: true
954 |
955 | /minimist/1.2.6:
956 | resolution: {integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==}
957 | dev: true
958 |
959 | /mitt/3.0.0:
960 | resolution: {integrity: sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ==}
961 | dev: true
962 |
963 | /nanoid/3.3.4:
964 | resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==}
965 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
966 | hasBin: true
967 | dev: true
968 |
969 | /node-releases/2.0.6:
970 | resolution: {integrity: sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==}
971 | dev: true
972 |
973 | /normalize-path/3.0.0:
974 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
975 | engines: {node: '>=0.10.0'}
976 | dev: true
977 |
978 | /normalize-range/0.1.2:
979 | resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==}
980 | engines: {node: '>=0.10.0'}
981 | dev: true
982 |
983 | /object-hash/3.0.0:
984 | resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==}
985 | engines: {node: '>= 6'}
986 | dev: true
987 |
988 | /path-parse/1.0.7:
989 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
990 | dev: true
991 |
992 | /petite-vue/0.4.1:
993 | resolution: {integrity: sha512-/gtYKQe9r1OV4IEwn2RsPXAHgFTe1nVq4QhldAP6/l8DSe9I754K6Oe1+Ff6dbnT5P8X2XP7PTUZkGRz5uFnFQ==}
994 | dev: false
995 |
996 | /picocolors/1.0.0:
997 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==}
998 | dev: true
999 |
1000 | /picomatch/2.3.1:
1001 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
1002 | engines: {node: '>=8.6'}
1003 | dev: true
1004 |
1005 | /pify/2.3.0:
1006 | resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==}
1007 | engines: {node: '>=0.10.0'}
1008 | dev: true
1009 |
1010 | /postcss-import/14.1.0_postcss@8.4.16:
1011 | resolution: {integrity: sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==}
1012 | engines: {node: '>=10.0.0'}
1013 | peerDependencies:
1014 | postcss: ^8.0.0
1015 | dependencies:
1016 | postcss: 8.4.16
1017 | postcss-value-parser: 4.2.0
1018 | read-cache: 1.0.0
1019 | resolve: 1.22.1
1020 | dev: true
1021 |
1022 | /postcss-js/4.0.0_postcss@8.4.16:
1023 | resolution: {integrity: sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==}
1024 | engines: {node: ^12 || ^14 || >= 16}
1025 | peerDependencies:
1026 | postcss: ^8.3.3
1027 | dependencies:
1028 | camelcase-css: 2.0.1
1029 | postcss: 8.4.16
1030 | dev: true
1031 |
1032 | /postcss-load-config/3.1.4_postcss@8.4.16:
1033 | resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==}
1034 | engines: {node: '>= 10'}
1035 | peerDependencies:
1036 | postcss: '>=8.0.9'
1037 | ts-node: '>=9.0.0'
1038 | peerDependenciesMeta:
1039 | postcss:
1040 | optional: true
1041 | ts-node:
1042 | optional: true
1043 | dependencies:
1044 | lilconfig: 2.0.6
1045 | postcss: 8.4.16
1046 | yaml: 1.10.2
1047 | dev: true
1048 |
1049 | /postcss-nested/5.0.6_postcss@8.4.16:
1050 | resolution: {integrity: sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==}
1051 | engines: {node: '>=12.0'}
1052 | peerDependencies:
1053 | postcss: ^8.2.14
1054 | dependencies:
1055 | postcss: 8.4.16
1056 | postcss-selector-parser: 6.0.10
1057 | dev: true
1058 |
1059 | /postcss-selector-parser/6.0.10:
1060 | resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==}
1061 | engines: {node: '>=4'}
1062 | dependencies:
1063 | cssesc: 3.0.0
1064 | util-deprecate: 1.0.2
1065 | dev: true
1066 |
1067 | /postcss-value-parser/4.2.0:
1068 | resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
1069 | dev: true
1070 |
1071 | /postcss/8.4.16:
1072 | resolution: {integrity: sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==}
1073 | engines: {node: ^10 || ^12 || >=14}
1074 | dependencies:
1075 | nanoid: 3.3.4
1076 | picocolors: 1.0.0
1077 | source-map-js: 1.0.2
1078 | dev: true
1079 |
1080 | /prettier/2.7.1:
1081 | resolution: {integrity: sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==}
1082 | engines: {node: '>=10.13.0'}
1083 | hasBin: true
1084 | dev: true
1085 |
1086 | /prismjs/1.29.0:
1087 | resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==}
1088 | engines: {node: '>=6'}
1089 | dev: true
1090 |
1091 | /queue-microtask/1.2.3:
1092 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
1093 | dev: true
1094 |
1095 | /quick-lru/5.1.1:
1096 | resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==}
1097 | engines: {node: '>=10'}
1098 | dev: true
1099 |
1100 | /read-cache/1.0.0:
1101 | resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==}
1102 | dependencies:
1103 | pify: 2.3.0
1104 | dev: true
1105 |
1106 | /readdirp/3.6.0:
1107 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
1108 | engines: {node: '>=8.10.0'}
1109 | dependencies:
1110 | picomatch: 2.3.1
1111 | dev: true
1112 |
1113 | /redent/4.0.0:
1114 | resolution: {integrity: sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==}
1115 | engines: {node: '>=12'}
1116 | dependencies:
1117 | indent-string: 5.0.0
1118 | strip-indent: 4.0.0
1119 | dev: true
1120 |
1121 | /resolve/1.22.1:
1122 | resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==}
1123 | hasBin: true
1124 | dependencies:
1125 | is-core-module: 2.10.0
1126 | path-parse: 1.0.7
1127 | supports-preserve-symlinks-flag: 1.0.0
1128 | dev: true
1129 |
1130 | /reusify/1.0.4:
1131 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
1132 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
1133 | dev: true
1134 |
1135 | /rollup/2.77.3:
1136 | resolution: {integrity: sha512-/qxNTG7FbmefJWoeeYJFbHehJ2HNWnjkAFRKzWN/45eNBBF/r8lo992CwcJXEzyVxs5FmfId+vTSTQDb+bxA+g==}
1137 | engines: {node: '>=10.0.0'}
1138 | hasBin: true
1139 | optionalDependencies:
1140 | fsevents: 2.3.2
1141 | dev: true
1142 |
1143 | /run-parallel/1.2.0:
1144 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
1145 | dependencies:
1146 | queue-microtask: 1.2.3
1147 | dev: true
1148 |
1149 | /source-map-js/1.0.2:
1150 | resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==}
1151 | engines: {node: '>=0.10.0'}
1152 | dev: true
1153 |
1154 | /source-map/0.6.1:
1155 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
1156 | engines: {node: '>=0.10.0'}
1157 | dev: true
1158 |
1159 | /sourcemap-codec/1.4.8:
1160 | resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==}
1161 | dev: true
1162 |
1163 | /splitpanes/3.1.1:
1164 | resolution: {integrity: sha512-VUkxDJfIGSvTM/fm/+OSrx8ha9URwE/9B8FPvfzoBuAxVELIHBWpsfnJXIXv77zVwuex//QQL4kTU9SDBPeHjA==}
1165 | dev: true
1166 |
1167 | /strip-css-comments/5.0.0:
1168 | resolution: {integrity: sha512-943vUh0ZxvxO6eK+TzY2F4nVN7a+ZdRK4KIdwHaGMvMrXTrAsJBRudOR3Zi0bLTuVSbF0CQXis4uw04uCabWkg==}
1169 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
1170 | dependencies:
1171 | is-regexp: 3.1.0
1172 | dev: true
1173 |
1174 | /strip-indent/4.0.0:
1175 | resolution: {integrity: sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==}
1176 | engines: {node: '>=12'}
1177 | dependencies:
1178 | min-indent: 1.0.1
1179 | dev: true
1180 |
1181 | /style-mod/4.0.0:
1182 | resolution: {integrity: sha512-OPhtyEjyyN9x3nhPsu76f52yUGXiZcgvsrFVtvTkyGRQJ0XK+GPc6ov1z+lRpbeabka+MYEQxOYRnt5nF30aMw==}
1183 | dev: true
1184 |
1185 | /supports-preserve-symlinks-flag/1.0.0:
1186 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
1187 | engines: {node: '>= 0.4'}
1188 | dev: true
1189 |
1190 | /tailwindcss/3.1.8:
1191 | resolution: {integrity: sha512-YSneUCZSFDYMwk+TGq8qYFdCA3yfBRdBlS7txSq0LUmzyeqRe3a8fBQzbz9M3WS/iFT4BNf/nmw9mEzrnSaC0g==}
1192 | engines: {node: '>=12.13.0'}
1193 | hasBin: true
1194 | dependencies:
1195 | arg: 5.0.2
1196 | chokidar: 3.5.3
1197 | color-name: 1.1.4
1198 | detective: 5.2.1
1199 | didyoumean: 1.2.2
1200 | dlv: 1.1.3
1201 | fast-glob: 3.2.11
1202 | glob-parent: 6.0.2
1203 | is-glob: 4.0.3
1204 | lilconfig: 2.0.6
1205 | normalize-path: 3.0.0
1206 | object-hash: 3.0.0
1207 | picocolors: 1.0.0
1208 | postcss: 8.4.16
1209 | postcss-import: 14.1.0_postcss@8.4.16
1210 | postcss-js: 4.0.0_postcss@8.4.16
1211 | postcss-load-config: 3.1.4_postcss@8.4.16
1212 | postcss-nested: 5.0.6_postcss@8.4.16
1213 | postcss-selector-parser: 6.0.10
1214 | postcss-value-parser: 4.2.0
1215 | quick-lru: 5.1.1
1216 | resolve: 1.22.1
1217 | transitivePeerDependencies:
1218 | - ts-node
1219 | dev: true
1220 |
1221 | /tempura/0.4.0:
1222 | resolution: {integrity: sha512-ghCAK7t3Yuy40NUA/pmS1aDY8M5MfZT4+S465S8YvwwDdgk3jLm/5BGwtMG/rMICDYY8T7Owe1qm91ArBOKd6w==}
1223 | engines: {node: '>=10'}
1224 | dev: true
1225 |
1226 | /to-fast-properties/2.0.0:
1227 | resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==}
1228 | engines: {node: '>=4'}
1229 | dev: true
1230 |
1231 | /to-regex-range/5.0.1:
1232 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
1233 | engines: {node: '>=8.0'}
1234 | dependencies:
1235 | is-number: 7.0.0
1236 | dev: true
1237 |
1238 | /typed-worker/1.0.2:
1239 | resolution: {integrity: sha512-2XLho4WBv4jeE07le4x0fNYmX9ty9UzC2d9zuEh/VUoV6lF6NXmJylOu2xL/mt1Oo3wSpvz41aECF4W4H1d24A==}
1240 | dependencies:
1241 | mitt: 3.0.0
1242 | dev: true
1243 |
1244 | /typescript/4.7.4:
1245 | resolution: {integrity: sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==}
1246 | engines: {node: '>=4.2.0'}
1247 | hasBin: true
1248 | dev: true
1249 |
1250 | /update-browserslist-db/1.0.5_browserslist@4.21.3:
1251 | resolution: {integrity: sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==}
1252 | hasBin: true
1253 | peerDependencies:
1254 | browserslist: '>= 4.21.0'
1255 | dependencies:
1256 | browserslist: 4.21.3
1257 | escalade: 3.1.1
1258 | picocolors: 1.0.0
1259 | dev: true
1260 |
1261 | /util-deprecate/1.0.2:
1262 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
1263 | dev: true
1264 |
1265 | /vite/3.0.9:
1266 | resolution: {integrity: sha512-waYABTM+G6DBTCpYAxvevpG50UOlZuynR0ckTK5PawNVt7ebX6X7wNXHaGIO6wYYFXSM7/WcuFuO2QzhBB6aMw==}
1267 | engines: {node: ^14.18.0 || >=16.0.0}
1268 | hasBin: true
1269 | peerDependencies:
1270 | less: '*'
1271 | sass: '*'
1272 | stylus: '*'
1273 | terser: ^5.4.0
1274 | peerDependenciesMeta:
1275 | less:
1276 | optional: true
1277 | sass:
1278 | optional: true
1279 | stylus:
1280 | optional: true
1281 | terser:
1282 | optional: true
1283 | dependencies:
1284 | esbuild: 0.14.54
1285 | postcss: 8.4.16
1286 | resolve: 1.22.1
1287 | rollup: 2.77.3
1288 | optionalDependencies:
1289 | fsevents: 2.3.2
1290 | dev: true
1291 |
1292 | /vue-resize/2.0.0-alpha.1_vue@3.2.37:
1293 | resolution: {integrity: sha512-7+iqOueLU7uc9NrMfrzbG8hwMqchfVfSzpVlCMeJQe4pyibqyoifDNbKTZvwxZKDvGkB+PdFeKvnGZMoEb8esg==}
1294 | peerDependencies:
1295 | vue: ^3.0.0
1296 | dependencies:
1297 | vue: 3.2.37
1298 | dev: true
1299 |
1300 | /vue/2.7.10:
1301 | resolution: {integrity: sha512-HmFC70qarSHPXcKtW8U8fgIkF6JGvjEmDiVInTkKZP0gIlEPhlVlcJJLkdGIDiNkIeA2zJPQTWJUI4iWe+AVfg==}
1302 | dependencies:
1303 | '@vue/compiler-sfc': 2.7.10
1304 | csstype: 3.1.0
1305 | dev: true
1306 |
1307 | /vue/3.2.37:
1308 | resolution: {integrity: sha512-bOKEZxrm8Eh+fveCqS1/NkG/n6aMidsI6hahas7pa0w/l7jkbssJVsRhVDs07IdDq7h9KHswZOgItnwJAgtVtQ==}
1309 | dependencies:
1310 | '@vue/compiler-dom': 3.2.37
1311 | '@vue/compiler-sfc': 3.2.37
1312 | '@vue/runtime-dom': 3.2.37
1313 | '@vue/server-renderer': 3.2.37_vue@3.2.37
1314 | '@vue/shared': 3.2.37
1315 | dev: true
1316 |
1317 | /w3c-keyname/2.2.6:
1318 | resolution: {integrity: sha512-f+fciywl1SJEniZHD6H+kUO8gOnwIr7f4ijKA6+ZvJFjeGi1r4PDLl53Ayud9O/rk64RqgoQine0feoeOU0kXg==}
1319 | dev: true
1320 |
1321 | /xtend/4.0.2:
1322 | resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==}
1323 | engines: {node: '>=0.4'}
1324 | dev: true
1325 |
1326 | /yaml/1.10.2:
1327 | resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==}
1328 | engines: {node: '>= 6'}
1329 | dev: true
1330 |
--------------------------------------------------------------------------------
/postcss.config.cjs:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | plugins: {
3 | tailwindcss: {},
4 | autoprefixer: {}
5 | }
6 | };
7 |
--------------------------------------------------------------------------------
/src/codemirror/hover-extension.ts:
--------------------------------------------------------------------------------
1 | import { hoverTooltip } from '@codemirror/view';
2 |
3 | const RE = /[a-z0-9\-\[\]\/\:]/;
4 |
5 | export const hoverExtension = (getTooltip: (word: string) => string | Promise) =>
6 | hoverTooltip(async (view, pos, side) => {
7 | let { from, to, text } = view.state.doc.lineAt(pos);
8 | let start = pos,
9 | end = pos;
10 | while (start > from && RE.test(text[start - from - 1])) start--;
11 | while (end < to && RE.test(text[end - from])) end++;
12 | if ((start == pos && side < 0) || (end == pos && side > 0)) return null;
13 | const word = text.slice(start - from, end - from);
14 | const tooltip = await getTooltip(word);
15 | if (!tooltip) return null;
16 | return {
17 | pos: start,
18 | end,
19 | above: true,
20 | create(_view) {
21 | const dom = document.createElement('div');
22 | dom.innerHTML = tooltip;
23 | return { dom };
24 | }
25 | };
26 | });
27 |
--------------------------------------------------------------------------------
/src/components/App.vue:
--------------------------------------------------------------------------------
1 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
86 |
87 |
88 |
89 |
90 | (project.template = value)"
93 | />
94 | (project.stringifedData = value)"
98 | />
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
112 |
--------------------------------------------------------------------------------
/src/components/AppHeader.vue:
--------------------------------------------------------------------------------
1 |
11 |
12 |
13 |
58 |
59 |
--------------------------------------------------------------------------------
/src/components/BaseDialog.vue:
--------------------------------------------------------------------------------
1 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 | {{
37 | props.title
38 | }}
39 |
40 |
41 |
42 |
43 |
44 |
45 |
50 | Close
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
--------------------------------------------------------------------------------
/src/components/BoxHeader.vue:
--------------------------------------------------------------------------------
1 |
19 |
20 |
21 |
45 |
46 |
--------------------------------------------------------------------------------
/src/components/DataEditor.vue:
--------------------------------------------------------------------------------
1 |
37 |
38 |
39 |
43 |
44 |
--------------------------------------------------------------------------------
/src/components/HelpDialog.vue:
--------------------------------------------------------------------------------
1 |
16 |
17 |
18 |
19 |
20 |
21 | Template
22 |
23 |
24 | The template section supports Vue template syntax and TailwindCSS/UnoCSS class names,
25 | you can reference the data in the data section.
26 |
27 |
28 |
29 |
30 | Fonts
31 |
32 |
Some built-in font class names are available for you to use:
33 |
34 | font-sans
35 | font-mono
36 | font-roboto
37 | font-open-sans
38 | font-lobster
39 | font-lato
40 |
41 |
We are going to support using custom Google fonts soon.
42 |
43 |
44 |
45 |
46 |
47 |
--------------------------------------------------------------------------------
/src/components/Preview.vue:
--------------------------------------------------------------------------------
1 |
117 |
118 |
119 |
120 |
129 |
130 |
131 |
props.updateSelectedExampleName(value)"
134 | >
135 | {{ selectedExampleName }}
138 |
146 |
151 |
152 |
153 |
154 |
155 |
156 | Choose a template:
157 |
158 |
159 |
164 |
165 | {{ example.name }}
166 |
167 |
168 |
169 |
170 |
171 |
172 |
173 |
174 |
175 |
183 |
190 |
198 | {{ button.text }}
204 |
205 |
206 |
207 |
213 |
214 |
--------------------------------------------------------------------------------
/src/components/TemplateEditor.vue:
--------------------------------------------------------------------------------
1 |
49 |
50 |
51 |
55 |
56 |
--------------------------------------------------------------------------------
/src/components/UrlDialog.vue:
--------------------------------------------------------------------------------
1 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 | Get URL
63 |
64 | (tabIndex = index)">
65 |
66 | {{ tab }}
75 |
76 |
77 |
78 | Learn more about
79 |
Browserku's Banner API .
84 |
85 |
86 |
87 |
88 |
93 |
98 | {{ copied ? 'Copied' : 'Copy' }}
99 |
100 |
101 |
102 |
103 | {{ props.jsCode }}
107 |
108 |
109 |
110 |
111 |
112 |
113 |
118 | Close
119 |
120 |
121 |
122 |
123 |
124 |
125 |
126 |
--------------------------------------------------------------------------------
/src/css/md.css:
--------------------------------------------------------------------------------
1 | .md > * {
2 | @apply my-3;
3 | }
4 |
5 | .md > *:first-child {
6 | @apply mt-0;
7 | }
8 |
9 | .md > *:last-child {
10 | @apply mb-0;
11 | }
12 |
13 | .md ul {
14 | @apply list-disc pl-5;
15 | }
16 |
--------------------------------------------------------------------------------
/src/css/prism.css:
--------------------------------------------------------------------------------
1 | .token.comment,
2 | .token.prolog,
3 | .token.cdata {
4 | color: hsl(230, 4%, 64%);
5 | }
6 |
7 | .token.doctype,
8 | .token.punctuation,
9 | .token.entity {
10 | color: hsl(230, 8%, 24%);
11 | }
12 |
13 | .token.attr-name,
14 | .token.class-name,
15 | .token.boolean,
16 | .token.constant,
17 | .token.number,
18 | .token.atrule {
19 | color: hsl(35, 99%, 36%);
20 | }
21 |
22 | .token.keyword {
23 | color: hsl(301, 63%, 40%);
24 | }
25 |
26 | .token.property,
27 | .token.tag,
28 | .token.symbol,
29 | .token.deleted,
30 | .token.important {
31 | color: hsl(5, 74%, 59%);
32 | }
33 |
34 | .token.selector,
35 | .token.string,
36 | .token.char,
37 | .token.builtin,
38 | .token.inserted,
39 | .token.regex,
40 | .token.attr-value,
41 | .token.attr-value > .token.punctuation {
42 | color: hsl(119, 34%, 47%);
43 | }
44 |
45 | .token.variable,
46 | .token.operator,
47 | .token.function {
48 | color: hsl(221, 87%, 60%);
49 | }
50 |
51 | .token.url {
52 | color: hsl(198, 99%, 37%);
53 | }
54 |
55 | /* HTML overrides */
56 | .token.attr-value > .token.punctuation.attr-equals,
57 | .token.special-attr > .token.attr-value > .token.value.css {
58 | color: hsl(230, 8%, 24%);
59 | }
60 |
61 | /* CSS overrides */
62 | .language-css .token.selector {
63 | color: hsl(5, 74%, 59%);
64 | }
65 |
66 | .language-css .token.property {
67 | color: hsl(230, 8%, 24%);
68 | }
69 |
70 | .language-css .token.function,
71 | .language-css .token.url > .token.function {
72 | color: hsl(198, 99%, 37%);
73 | }
74 |
75 | .language-css .token.url > .token.string.url {
76 | color: hsl(119, 34%, 47%);
77 | }
78 |
79 | .language-css .token.important,
80 | .language-css .token.atrule .token.rule {
81 | color: hsl(301, 63%, 40%);
82 | }
83 |
84 | /* JS overrides */
85 | .language-javascript .token.operator {
86 | color: hsl(301, 63%, 40%);
87 | }
88 |
89 | .language-javascript
90 | .token.template-string
91 | > .token.interpolation
92 | > .token.interpolation-punctuation.punctuation {
93 | color: hsl(344, 84%, 43%);
94 | }
95 |
96 | /* JSON overrides */
97 | .language-json .token.operator {
98 | color: hsl(230, 8%, 24%);
99 | }
100 |
101 | .language-json .token.null.keyword {
102 | color: hsl(35, 99%, 36%);
103 | }
104 |
105 | /* MD overrides */
106 | .language-markdown .token.url,
107 | .language-markdown .token.url > .token.operator,
108 | .language-markdown .token.url-reference.url > .token.string {
109 | color: hsl(230, 8%, 24%);
110 | }
111 |
112 | .language-markdown .token.url > .token.content {
113 | color: hsl(221, 87%, 60%);
114 | }
115 |
116 | .language-markdown .token.url > .token.url,
117 | .language-markdown .token.url-reference.url {
118 | color: hsl(198, 99%, 37%);
119 | }
120 |
121 | .language-markdown .token.blockquote.punctuation,
122 | .language-markdown .token.hr.punctuation {
123 | color: hsl(230, 4%, 64%);
124 | font-style: italic;
125 | }
126 |
127 | .language-markdown .token.code-snippet {
128 | color: hsl(119, 34%, 47%);
129 | }
130 |
131 | .language-markdown .token.bold .token.content {
132 | color: hsl(35, 99%, 36%);
133 | }
134 |
135 | .language-markdown .token.italic .token.content {
136 | color: hsl(301, 63%, 40%);
137 | }
138 |
139 | .language-markdown .token.strike .token.content,
140 | .language-markdown .token.strike .token.punctuation,
141 | .language-markdown .token.list.punctuation,
142 | .language-markdown .token.title.important > .token.punctuation {
143 | color: hsl(5, 74%, 59%);
144 | }
145 |
146 | /* General */
147 | .token.bold {
148 | font-weight: bold;
149 | }
150 |
151 | .token.comment,
152 | .token.italic {
153 | font-style: italic;
154 | }
155 |
156 | .token.entity {
157 | cursor: help;
158 | }
159 |
160 | .token.namespace {
161 | opacity: 0.8;
162 | }
163 |
164 | /* Plugin overrides */
165 | /* Selectors should have higher specificity than those in the plugins' default stylesheets */
166 |
167 | /* Show Invisibles plugin overrides */
168 | .token.token.tab:not(:empty):before,
169 | .token.token.cr:before,
170 | .token.token.lf:before,
171 | .token.token.space:before {
172 | color: hsla(230, 8%, 24%, 0.2);
173 | }
174 |
--------------------------------------------------------------------------------
/src/css/tailwind.css:
--------------------------------------------------------------------------------
1 | @tailwind base;
2 | @tailwind components;
3 | @tailwind utilities;
4 |
5 | .tiny-button {
6 | @apply border inline-flex px-2 h-5 items-center rounded-lg bg-white hover:bg-zinc-50;
7 | }
8 |
9 | .v-popper--theme-info-tooltip {
10 | @apply text-xs;
11 | }
12 |
--------------------------------------------------------------------------------
/src/iframe.ts:
--------------------------------------------------------------------------------
1 | import { handleActions } from 'typed-worker';
2 | import { toPng } from 'dom-to-image-retina';
3 | import { createApp } from 'petite-vue';
4 | import { Config, defaultConfig } from './lib/config';
5 |
6 | const root = document.getElementById('root')!;
7 | const unoCSS = document.getElementById('uno-css')!;
8 |
9 | const download = async () => {
10 | const dataUrl = await toPng(root);
11 | const a = document.createElement('a');
12 | a.href = dataUrl;
13 | a.download = 'preview.png';
14 | a.click();
15 | };
16 |
17 | let app: ReturnType | undefined;
18 |
19 | const render = (payload: { data: any; template: string; css: string; config: Config }) => {
20 | if (app) {
21 | app.unmount();
22 | root.innerHTML = payload.template;
23 | }
24 | unoCSS.innerHTML = payload.css;
25 | root.style.height = `${payload.config.height || defaultConfig.height}px`;
26 | root.style.width = `${payload.config.width || defaultConfig.width}px`;
27 | app = createApp(payload.data).mount(root);
28 | };
29 |
30 | const actions = {
31 | download,
32 | render
33 | };
34 |
35 | handleActions(actions);
36 |
37 | export type Actions = typeof actions;
38 |
--------------------------------------------------------------------------------
/src/lib/config.ts:
--------------------------------------------------------------------------------
1 | export type Config = {
2 | width?: number;
3 | height?: number;
4 | };
5 |
6 | export const defaultConfig = {
7 | width: 640,
8 | height: 320
9 | };
10 |
--------------------------------------------------------------------------------
/src/lib/copy.ts:
--------------------------------------------------------------------------------
1 | // MIT licensed: https://github.com/feross/clipboard-copy/blob/master/index.js
2 |
3 | function makeError() {
4 | return new DOMException('The request is not allowed', 'NotAllowedError');
5 | }
6 |
7 | async function copyClipboardApi(text: string) {
8 | // Use the Async Clipboard API when available. Requires a secure browsing
9 | // context (i.e. HTTPS)
10 | if (!navigator.clipboard) {
11 | throw makeError();
12 | }
13 | return navigator.clipboard.writeText(text);
14 | }
15 |
16 | async function copyExecCommand(text: string) {
17 | // Put the text to copy into a
18 | const span = document.createElement('span');
19 | span.textContent = text;
20 |
21 | // Preserve consecutive spaces and newlines
22 | span.style.whiteSpace = 'pre';
23 | span.style.webkitUserSelect = 'auto';
24 | span.style.userSelect = 'all';
25 |
26 | // Add the to the page
27 | document.body.appendChild(span);
28 |
29 | // Make a selection object representing the range of text selected by the user
30 | const selection = window.getSelection();
31 | const range = window.document.createRange();
32 | selection?.removeAllRanges();
33 | range.selectNode(span);
34 | selection?.addRange(range);
35 |
36 | // Copy text to the clipboard
37 | let success = false;
38 | try {
39 | success = window.document.execCommand('copy');
40 | } finally {
41 | // Cleanup
42 | selection?.removeAllRanges();
43 | window.document.body.removeChild(span);
44 | }
45 |
46 | if (!success) throw makeError();
47 | }
48 |
49 | export async function clipboardCopy(text: string) {
50 | try {
51 | await copyClipboardApi(text);
52 | } catch (err) {
53 | // ...Otherwise, use document.execCommand() fallback
54 | try {
55 | await copyExecCommand(text);
56 | } catch (err2) {
57 | throw err2 || err || makeError();
58 | }
59 | }
60 | }
61 |
--------------------------------------------------------------------------------
/src/lib/examples.ts:
--------------------------------------------------------------------------------
1 | // a template tag that simply returns the html
2 |
3 | import { Config } from './config';
4 | import { html } from './html-tag';
5 |
6 | export const examples: {
7 | name: string;
8 | config?: Config;
9 | template: string;
10 | data: any;
11 | }[] = [
12 | {
13 | name: 'Default Template',
14 | config: {
15 | width: 640,
16 | height: 320
17 | },
18 | template: html`
19 |
23 |
26 |
27 |
{{title}}
28 |
{{description}}
29 |
30 |
31 |
32 |
{{author}}
33 |
34 |
-
35 |
April 4
36 |
37 |
38 |
39 | `,
40 | data: {
41 | title: 'Teachers Reveal Why They Are Quitting Their Jobs',
42 | description:
43 | 'Amid budget cuts, restrictive curricula, and increasing threats to their safety, more and more teachers are opting to switch careers. The Onion asked teachers to explain why they are quitting their jobs, and this is what they said.',
44 | author: 'The Onion',
45 | avatar: 'https://cdn.jsdelivr.net/gh/egoist-bot/images@main/upic/nIib90.png',
46 | bg: 'https://cdn.jsdelivr.net/gh/egoist-bot/images@main/upic/Fsohqo.jpg'
47 | }
48 | },
49 | {
50 | name: 'Zenn Blog Post',
51 | template: html`
52 |
55 |
56 |
{{ title }}
57 |
58 |
59 |
60 |
{{ author }}
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 | `,
69 | data: {
70 | title:
71 | 'Google Analytics is removing Universal Analytics and deleting all of your historical data',
72 | author: 'John Doe',
73 | logo: 'https://cdn.jsdelivr.net/gh/egoist-bot/images@main/upic/AMePnP.png',
74 | avatar:
75 | 'https://images.unsplash.com/photo-1570295999919-56ceb5ecca61?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=280&q=80'
76 | }
77 | }
78 | ];
79 |
--------------------------------------------------------------------------------
/src/lib/highlight.ts:
--------------------------------------------------------------------------------
1 | import Prism from 'prismjs';
2 |
3 | export const highlightCSS = (css: string) => {
4 | return Prism.highlight(css, Prism.languages.css, 'css');
5 | };
6 |
--------------------------------------------------------------------------------
/src/lib/html-tag.ts:
--------------------------------------------------------------------------------
1 | import redent from 'redent';
2 |
3 | // we use this so pretty can format the html inside
4 | export const html = (strings: TemplateStringsArray, ...values: any[]) => {
5 | return redent(
6 | strings.reduce((acc, str, i) => {
7 | return acc + str + (values[i] || '');
8 | }, '')
9 | ).trim();
10 | };
11 |
--------------------------------------------------------------------------------
/src/lib/use-copy.ts:
--------------------------------------------------------------------------------
1 | import { ref } from 'vue';
2 | import { clipboardCopy } from './copy';
3 |
4 | export const useCopy = (getText: () => string) => {
5 | const copied = ref(false);
6 | const timeoutId = ref(null);
7 |
8 | const copy = () => {
9 | if (timeoutId.value !== null) {
10 | window.clearTimeout(timeoutId.value);
11 | }
12 | clipboardCopy(getText());
13 | copied.value = true;
14 | timeoutId.value = window.setTimeout(() => {
15 | copied.value = false;
16 | timeoutId.value = null;
17 | }, 2000);
18 | };
19 |
20 | return { copied, copy };
21 | };
22 |
--------------------------------------------------------------------------------
/src/lib/use-worker.ts:
--------------------------------------------------------------------------------
1 | import { createWorker } from 'typed-worker';
2 | import type { Actions } from './worker';
3 |
4 | export const useWorker = () => {
5 | return createWorker(
6 | () =>
7 | new Worker(new URL('./worker.ts', import.meta.url), {
8 | type: 'module'
9 | })
10 | );
11 | };
12 |
--------------------------------------------------------------------------------
/src/lib/useCodeMirror.ts:
--------------------------------------------------------------------------------
1 | import { onMounted, Ref, ref, shallowRef, watchEffect } from 'vue';
2 | import { EditorView, minimalSetup } from 'codemirror';
3 | import { keymap } from '@codemirror/view';
4 | import { indentWithTab } from '@codemirror/commands';
5 |
6 | const lightTheme = EditorView.theme(
7 | {
8 | '&.cm-editor': {
9 | height: '100%'
10 | },
11 | '&.cm-editor.cm-focused ': {
12 | outline: 'none'
13 | }
14 | },
15 | {}
16 | );
17 |
18 | export const useCodeMirror = (options: {
19 | value: Ref;
20 | onChange: (value: string) => void;
21 | extensions: any[];
22 | }) => {
23 | const el = ref(null);
24 | const view = shallowRef(null);
25 |
26 | const handleUpdate = EditorView.updateListener.of((update) => {
27 | const newValue = update.state.doc.toString();
28 | options.onChange(newValue);
29 | });
30 |
31 | onMounted(() => {
32 | if (!el.value) return;
33 |
34 | view.value = new EditorView({
35 | doc: options.value.value,
36 | extensions: [
37 | minimalSetup,
38 | keymap.of([indentWithTab]),
39 | handleUpdate,
40 | lightTheme,
41 | EditorView.lineWrapping,
42 | ...(options.extensions || [])
43 | ],
44 | parent: el.value
45 | });
46 | });
47 |
48 | watchEffect(() => {
49 | if (!view.value) return;
50 |
51 | const currentValue = view.value.state.doc.toString();
52 | if (options.value.value === currentValue) return;
53 |
54 | view.value.dispatch(
55 | view.value.state.update({
56 | changes: {
57 | from: 0,
58 | to: view.value.state.doc.length,
59 | insert: options.value.value
60 | }
61 | })
62 | );
63 | });
64 |
65 | return {
66 | el
67 | };
68 | };
69 |
--------------------------------------------------------------------------------
/src/lib/utils.ts:
--------------------------------------------------------------------------------
1 | import { zlibSync, unzlibSync, strToU8, strFromU8 } from 'fflate';
2 |
3 | export function debounce(fn: Function, n = 100) {
4 | let handle: any;
5 | return (...args: any[]) => {
6 | if (handle) clearTimeout(handle);
7 | handle = setTimeout(() => {
8 | fn(...args);
9 | }, n);
10 | };
11 | }
12 |
13 | export function utoa(data: string): string {
14 | const buffer = strToU8(data);
15 | const zipped = zlibSync(buffer, { level: 9 });
16 | const binary = strFromU8(zipped, true);
17 | return btoa(binary);
18 | }
19 |
20 | export function atou(base64: string): string {
21 | const binary = atob(base64);
22 |
23 | // zlib header (x78), level 9 (xDA)
24 | if (binary.startsWith('\x78\xDA')) {
25 | const buffer = strToU8(binary, true);
26 | const unzipped = unzlibSync(buffer);
27 | return strFromU8(unzipped);
28 | }
29 |
30 | // old unicode hacks for backward compatibility
31 | // https://base64.guru/developers/javascript/examples/unicode-strings
32 | return decodeURIComponent(escape(binary));
33 | }
34 |
--------------------------------------------------------------------------------
/src/lib/worker.ts:
--------------------------------------------------------------------------------
1 | import { format } from 'prettier';
2 | import parserHtml from 'prettier/parser-html';
3 | import parserBabel from 'prettier/parser-babel';
4 | import parserPostcss from 'prettier/parser-postcss';
5 | import { handleActions } from 'typed-worker';
6 |
7 | const prettierFormat = (code: string, type: 'html' | 'vue' | 'babel' | 'json' | 'css') => {
8 | return format(code, {
9 | parser: type,
10 | plugins: [parserHtml, parserBabel, parserPostcss],
11 | embeddedLanguageFormatting: 'auto'
12 | });
13 | };
14 |
15 | const actions = {
16 | format(payload: { code: string; type: 'vue' | 'babel' | 'json' | 'css' }) {
17 | if (payload.type === 'vue') {
18 | const result = prettierFormat(`${payload.code} `, 'vue');
19 | return prettierFormat(result.replace('', '').replace(' ', ''), 'html');
20 | }
21 | return prettierFormat(payload.code, payload.type);
22 | }
23 | };
24 |
25 | handleActions(actions);
26 |
27 | export type Actions = typeof actions;
28 |
--------------------------------------------------------------------------------
/src/main.ts:
--------------------------------------------------------------------------------
1 | import 'floating-vue/dist/style.css';
2 | import './css/tailwind.css';
3 | import './css/md.css';
4 | import './css/prism.css';
5 | import 'splitpanes/dist/splitpanes.css';
6 | import { createApp } from 'vue';
7 | import FloatingVue from 'floating-vue';
8 | import App from './components/App.vue';
9 |
10 | const app = createApp(App);
11 |
12 | app.use(FloatingVue, {
13 | themes: {
14 | 'info-tooltip': {
15 | $extend: 'tooltip'
16 | // Other options (see the 'Global options' section)
17 | }
18 | }
19 | });
20 |
21 | app.mount('#app');
22 |
--------------------------------------------------------------------------------
/tailwind.config.cjs:
--------------------------------------------------------------------------------
1 | /** @type {import('tailwindcss').Config} */
2 | module.exports = {
3 | content: ['./src/**/*.vue', './src/codemirror/**/*.ts'],
4 | theme: {
5 | extend: {
6 | height: {
7 | 'box-header': '30px',
8 | 'box-body': 'calc(100% - 30px)',
9 | 'app-header': '44px',
10 | 'app-body': 'calc(100% - 44px)'
11 | }
12 | }
13 | },
14 | plugins: []
15 | };
16 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "allowJs": true,
4 | "checkJs": true,
5 | "esModuleInterop": true,
6 | "forceConsistentCasingInFileNames": true,
7 | "resolveJsonModule": true,
8 | "skipLibCheck": true,
9 | "sourceMap": true,
10 | "strict": true,
11 | "moduleResolution": "node",
12 | "module": "esnext",
13 | "target": "esnext",
14 | "alwaysStrict": true,
15 | "jsx": "preserve",
16 | "strictNullChecks": true,
17 | "noUnusedLocals": true
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/vite.config.ts:
--------------------------------------------------------------------------------
1 | import path from 'path';
2 | import vue from '@vitejs/plugin-vue';
3 | import { defineConfig } from 'vite';
4 | import { compile } from 'tempura';
5 |
6 | export default defineConfig({
7 | plugins: [
8 | vue(),
9 | {
10 | name: 'html',
11 | async transformIndexHtml(html, ctx) {
12 | const render = compile(html);
13 | return render({ prod: !ctx.server });
14 | }
15 | }
16 | ],
17 | build: {
18 | rollupOptions: {
19 | input: {
20 | index: path.resolve('index.html'),
21 | iframe: path.resolve('iframe.html')
22 | }
23 | },
24 | sourcemap: true
25 | }
26 | });
27 |
--------------------------------------------------------------------------------