create-evikit 2.3.0 → 2.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -25,7 +25,7 @@ for (const file of [...template, "eslint.config.js", "tsconfig.json"]) {
25
25
  path,
26
26
  readFileSync(join(ownRoot, file), "utf8")
27
27
  .replace(
28
- /<link\s+href="\/node_modules\/[^"]+.css"\s+media="[^"]+"\s+rel="stylesheet"\s+\/>\s+/g,
28
+ /<link\s+href="[^"]+"(\s+media="[^"]+")?\s+rel="[a-z]+"\s+\/>\s+/g,
29
29
  "",
30
30
  )
31
31
  .replace(', "uk"', ""),
package/index.html CHANGED
@@ -2,6 +2,7 @@
2
2
  <html lang="en">
3
3
  <head>
4
4
  <meta charset="utf-8" />
5
+ <link href="/static/favicon.svg" rel="icon" />
5
6
  <meta name="viewport" content="width=device-width, initial-scale=1" />
6
7
  <meta name="color-scheme" content="dark light" />
7
8
  <link href="/index.css" rel="stylesheet" />
package/index.js CHANGED
@@ -7,6 +7,7 @@ import { api } from "./src/api.js";
7
7
  import { prerender } from "./src/app.js";
8
8
 
9
9
  const app = express();
10
+ app.use("/static", express.static("./static"));
10
11
  app.use(api().onRequest);
11
12
  app.use("/openapi", swaggerUi.serve, swaggerUi.setup(api().openapi));
12
13
  app.use("/", express.static("./dist", { index: false, redirect: false }));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-evikit",
3
- "version": "2.3.0",
3
+ "version": "2.3.1",
4
4
  "type": "module",
5
5
  "bin": "bin/create-evikit.js",
6
6
  "scripts": {
@@ -37,7 +37,7 @@
37
37
  "@speed-highlight/core": "^1.2.17",
38
38
  "accept-language": "^3.0.20",
39
39
  "classnames": "^2.5.1",
40
- "evikit": "^2.3.1",
40
+ "evikit": "^2.3.2",
41
41
  "express": "^5.2.1",
42
42
  "file-type": "^22.0.1",
43
43
  "hoofd": "^1.7.3",
@@ -1,89 +1,92 @@
1
- # SOME DESCRIPTIVE TITLE.
2
- # Copyright (C) YEAR Denys Nykula <nykula@ukr.net>
3
- # This file is distributed under the same license as the create-evikit package.
4
- # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
5
- #
6
- #, fuzzy
7
- msgid ""
8
- msgstr ""
9
- "Project-Id-Version: create-evikit\n"
10
- "Report-Msgid-Bugs-To: \n"
11
- "POT-Creation-Date: 2026-07-08 01:57+0300\n"
12
- "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
13
- "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
14
- "Language-Team: LANGUAGE <LL@li.org>\n"
15
- "Language: \n"
16
- "MIME-Version: 1.0\n"
17
- "Content-Type: text/plain; charset=UTF-8\n"
18
- "Content-Transfer-Encoding: 8bit\n"
19
- "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
20
-
21
- msgid "EviKit: Preact SSR framework for small web apps"
22
- msgstr ""
23
-
24
- msgid "Preact SSR framework."
25
- msgstr ""
26
-
27
- msgid "For small web apps hosted on a <b>VPS</b> or in local network."
28
- msgstr ""
29
-
30
- msgid ""
31
- "Standard modern <b>JavaScript</b>, no JSX or TS. <b>Forms</b> accessible "
32
- "when JS doesn't load. Automatic <b>Swagger</b> specification. First-class "
33
- "API input/output <b>validation</b>. Built-in <b>node:sqlite ORM</b>. Support "
34
- "for UI <b>translation</b> through .po files."
35
- msgstr ""
36
-
37
- msgid "Documentation"
38
- msgstr ""
39
-
40
- msgid "Report <b>issue</b>"
41
- msgstr ""
42
-
43
- msgid ""
44
- "See <a href=\"{todo}\">live demo</a> of the example code from below. Todos "
45
- "are deleted every 10 minutes."
46
- msgstr ""
47
-
48
- msgid ""
49
- "<a href=\"{openapi}\" target=\"_top\">OpenAPI demo</a> (Swagger) is "
50
- "generated from API route schema."
51
- msgstr ""
52
-
53
- msgid "Quick start"
54
- msgstr ""
55
-
56
- msgid ""
57
- "There’s intentionally <b>not much API</b>. Documentation entirely fits in a "
58
- "long but straightforward <b>README</b>. Like the Django tutorial, it guides "
59
- "you through <b><a href=\"{documentation}\">writing an application</a></b> "
60
- "using all the primary features of the EviKit framework."
61
- msgstr ""
62
-
63
- msgid ""
64
- "<a href=\"{evikit}\"><b>Source code</b> at Codeberg</a> under <b>MIT</b> "
65
- "license"
66
- msgstr ""
67
-
68
- msgid "Discuss on <b>Fediverse</b>"
69
- msgstr ""
70
-
71
- msgid "%1 todo"
72
- msgid_plural "%1 todos"
73
- msgstr[0] ""
74
- msgstr[1] ""
75
-
76
- msgid "Todos"
77
- msgstr ""
78
-
79
- msgid "Text"
80
- msgstr ""
81
-
82
- msgid "Create todo"
83
- msgstr ""
84
-
85
- msgid "Back to plan"
86
- msgstr ""
87
-
88
- msgid "Done"
89
- msgstr ""
1
+ # SOME DESCRIPTIVE TITLE.
2
+ # Copyright (C) YEAR Denys Nykula <nykula@ukr.net>
3
+ # This file is distributed under the same license as the create-evikit package.
4
+ # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
5
+ #
6
+ #, fuzzy
7
+ msgid ""
8
+ msgstr ""
9
+ "Project-Id-Version: create-evikit\n"
10
+ "Report-Msgid-Bugs-To: \n"
11
+ "POT-Creation-Date: 2026-07-08 12:51+0300\n"
12
+ "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
13
+ "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
14
+ "Language-Team: LANGUAGE <LL@li.org>\n"
15
+ "Language: \n"
16
+ "MIME-Version: 1.0\n"
17
+ "Content-Type: text/plain; charset=UTF-8\n"
18
+ "Content-Transfer-Encoding: 8bit\n"
19
+ "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
20
+
21
+ msgid "EviKit: Preact SSR framework for small web apps"
22
+ msgstr ""
23
+
24
+ msgid ""
25
+ "Standard modern <b>JavaScript</b>, no JSX or TS. <b>Forms</b> accessible "
26
+ "when JS doesn't load. Automatic <b>Swagger</b> specification. First-class "
27
+ "API input/output <b>validation</b>. Built-in <b>node:sqlite ORM</b>. Support "
28
+ "for UI <b>translation</b> through .po files."
29
+ msgstr ""
30
+
31
+ msgid "Preact SSR framework."
32
+ msgstr ""
33
+
34
+ msgid "For small web apps hosted on a <b>VPS</b> or in local network."
35
+ msgstr ""
36
+
37
+ msgid "Documentation"
38
+ msgstr ""
39
+
40
+ msgid "Report <b>issue</b>"
41
+ msgstr ""
42
+
43
+ msgid ""
44
+ "See <a href=\"{todo}\">live demo</a> of the example code from below. Todos "
45
+ "are deleted every 10 minutes."
46
+ msgstr ""
47
+
48
+ msgid ""
49
+ "<a href=\"{openapi}\" target=\"_top\">OpenAPI demo</a> (Swagger) is "
50
+ "generated from API route schema."
51
+ msgstr ""
52
+
53
+ msgid "Quick start"
54
+ msgstr ""
55
+
56
+ msgid ""
57
+ "There’s intentionally <b>not much API</b>. Documentation entirely fits in a "
58
+ "long but straightforward <b>README</b>. Like the Django tutorial, it guides "
59
+ "you through <b><a href=\"{documentation}\">writing an application</a></b> "
60
+ "using all the primary features of the EviKit framework."
61
+ msgstr ""
62
+
63
+ msgid "Favicon by <a href=\"{artist}\">Solar Icons</a>"
64
+ msgstr ""
65
+
66
+ msgid ""
67
+ "<a href=\"{evikit}\"><b>Source code</b> at Codeberg</a> under <b>MIT</b> "
68
+ "license"
69
+ msgstr ""
70
+
71
+ msgid "Discuss on <b>Fediverse</b>"
72
+ msgstr ""
73
+
74
+ msgid "%1 todo"
75
+ msgid_plural "%1 todos"
76
+ msgstr[0] ""
77
+ msgstr[1] ""
78
+
79
+ msgid "Todos"
80
+ msgstr ""
81
+
82
+ msgid "Text"
83
+ msgstr ""
84
+
85
+ msgid "Create todo"
86
+ msgstr ""
87
+
88
+ msgid "Back to plan"
89
+ msgstr ""
90
+
91
+ msgid "Done"
92
+ msgstr ""
package/po/uk.po CHANGED
@@ -1,107 +1,110 @@
1
- # Ukrainian translations for create-evikit package.
2
- # Copyright (C) 2026 Denys Nykula <nykula@ukr.net>
3
- # This file is distributed under the same license as the create-evikit package.
4
- # Denys Nykula <nykula@ukr.net>, 2026.
5
- #
6
- msgid ""
7
- msgstr ""
8
- "Project-Id-Version: create-evikit\n"
9
- "Report-Msgid-Bugs-To: \n"
10
- "POT-Creation-Date: 2026-07-08 01:57+0300\n"
11
- "PO-Revision-Date: 2026-07-08 01:57+0300\n"
12
- "Last-Translator: EMAIL@ADDRESS\n"
13
- "Language-Team: Ukrainian\n"
14
- "Language: uk\n"
15
- "MIME-Version: 1.0\n"
16
- "Content-Type: text/plain; charset=UTF-8\n"
17
- "Content-Transfer-Encoding: 8bit\n"
18
- "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
19
- "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
20
- "X-Generator: Poedit 3.9\n"
21
-
22
- msgid "EviKit: Preact SSR framework for small web apps"
23
- msgstr "EviKit: Preact SSR-фреймворк для невеликих вебзастосунків"
24
-
25
- msgid "Preact SSR framework."
26
- msgstr "Preact SSR-фреймворк."
27
-
28
- msgid "For small web apps hosted on a <b>VPS</b> or in local network."
29
- msgstr ""
30
- "Для невеликих вебзастосунків, розміщених на <b>VPS</b> чи в локальній мережі."
31
-
32
- msgid ""
33
- "Standard modern <b>JavaScript</b>, no JSX or TS. <b>Forms</b> accessible "
34
- "when JS doesn't load. Automatic <b>Swagger</b> specification. First-class "
35
- "API input/output <b>validation</b>. Built-in <b>node:sqlite ORM</b>. Support "
36
- "for UI <b>translation</b> through .po files."
37
- msgstr ""
38
- "Стандартний сучасний <b>JavaScript</b>, без JSX чи TS. <b>Форми</b> "
39
- "доступні, навіть коли JS не запускається. <b>Swagger</b>-специфікація "
40
- "генерується автоматично. <b>Валідація</b> введення-виведення API - з "
41
- "коробки. Вбудована <b>ORM</b> на основі <b>node:sqlite</b>. Підтримується "
42
- "<b>переклад</b> інтерфейсу через .po-файли."
43
-
44
- msgid "Documentation"
45
- msgstr "Документація"
46
-
47
- msgid "Report <b>issue</b>"
48
- msgstr "Повідомити про <b>ваду</b>"
49
-
50
- msgid ""
51
- "See <a href=\"{todo}\">live demo</a> of the example code from below. Todos "
52
- "are deleted every 10 minutes."
53
- msgstr ""
54
- "Перегляньте <a href=\"{todo}\">живе демо</a> коду зразків, наведених унизу. "
55
- "Завдання видаляються кожні 10 хвилин."
56
-
57
- msgid ""
58
- "<a href=\"{openapi}\" target=\"_top\">OpenAPI demo</a> (Swagger) is "
59
- "generated from API route schema."
60
- msgstr ""
61
- "<a href=\"{openapi}\" target=\"_top\">Демо OpenAPI</a> (Swagger) генерується "
62
- "зі схеми API-шляхів."
63
-
64
- msgid "Quick start"
65
- msgstr "Швидкий початок"
66
-
67
- msgid ""
68
- "There’s intentionally <b>not much API</b>. Documentation entirely fits in a "
69
- "long but straightforward <b>README</b>. Like the Django tutorial, it guides "
70
- "you through <b><a href=\"{documentation}\">writing an application</a></b> "
71
- "using all the primary features of the EviKit framework."
72
- msgstr ""
73
- "<b>API навмисне небагато</b>. Документація повністю вміщається в довгий, але "
74
- "послідовний <b>README</b>-файл. Подібно до посібника Django, він містить "
75
- "покрокові інструкції з <b><a href=\"{documentation}\">написання застосунка</"
76
- "a></b>, що використовує всі основні функції фреймворка EviKit."
77
-
78
- msgid ""
79
- "<a href=\"{evikit}\"><b>Source code</b> at Codeberg</a> under <b>MIT</b> "
80
- "license"
81
- msgstr ""
82
- "<a href=\"{evikit}\"><b>Вихідний код</b> на Codeberg</a> на умовах ліцензії "
83
- "<b>MIT</b>"
84
-
85
- msgid "Discuss on <b>Fediverse</b>"
86
- msgstr "Обговорити в <b>Fediverse</b>"
87
-
88
- msgid "%1 todo"
89
- msgid_plural "%1 todos"
90
- msgstr[0] "%1 завдання"
91
- msgstr[1] "%1 завдання"
92
- msgstr[2] "%1 завдань"
93
-
94
- msgid "Todos"
95
- msgstr "Завдання"
96
-
97
- msgid "Text"
98
- msgstr "Текст"
99
-
100
- msgid "Create todo"
101
- msgstr "Створити завдання"
102
-
103
- msgid "Back to plan"
104
- msgstr "Назад до плану"
105
-
106
- msgid "Done"
107
- msgstr "Готово"
1
+ # Ukrainian translations for create-evikit package.
2
+ # Copyright (C) 2026 Denys Nykula <nykula@ukr.net>
3
+ # This file is distributed under the same license as the create-evikit package.
4
+ # Denys Nykula <nykula@ukr.net>, 2026.
5
+ #
6
+ msgid ""
7
+ msgstr ""
8
+ "Project-Id-Version: create-evikit\n"
9
+ "Report-Msgid-Bugs-To: \n"
10
+ "POT-Creation-Date: 2026-07-08 12:51+0300\n"
11
+ "PO-Revision-Date: 2026-07-08 03:11+0300\n"
12
+ "Last-Translator: EMAIL@ADDRESS\n"
13
+ "Language-Team: Ukrainian\n"
14
+ "Language: uk\n"
15
+ "MIME-Version: 1.0\n"
16
+ "Content-Type: text/plain; charset=UTF-8\n"
17
+ "Content-Transfer-Encoding: 8bit\n"
18
+ "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
19
+ "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
20
+ "X-Generator: Poedit 3.9\n"
21
+
22
+ msgid "EviKit: Preact SSR framework for small web apps"
23
+ msgstr "EviKit: Preact SSR-фреймворк для невеликих вебзастосунків"
24
+
25
+ msgid ""
26
+ "Standard modern <b>JavaScript</b>, no JSX or TS. <b>Forms</b> accessible "
27
+ "when JS doesn't load. Automatic <b>Swagger</b> specification. First-class "
28
+ "API input/output <b>validation</b>. Built-in <b>node:sqlite ORM</b>. Support "
29
+ "for UI <b>translation</b> through .po files."
30
+ msgstr ""
31
+ "Стандартний сучасний <b>JavaScript</b>, без JSX чи TS. <b>Форми</b> "
32
+ "доступні, навіть коли JS не запускається. <b>Swagger</b>-специфікація "
33
+ "генерується автоматично. <b>Валідація</b> введення-виведення API - з "
34
+ "коробки. Вбудована <b>ORM</b> на основі <b>node:sqlite</b>. Підтримується "
35
+ "<b>переклад</b> інтерфейсу через .po-файли."
36
+
37
+ msgid "Preact SSR framework."
38
+ msgstr "Preact SSR-фреймворк."
39
+
40
+ msgid "For small web apps hosted on a <b>VPS</b> or in local network."
41
+ msgstr ""
42
+ "Для невеликих вебзастосунків, розміщених на <b>VPS</b> чи в локальній мережі."
43
+
44
+ msgid "Documentation"
45
+ msgstr "Документація"
46
+
47
+ msgid "Report <b>issue</b>"
48
+ msgstr "Повідомити про <b>ваду</b>"
49
+
50
+ msgid ""
51
+ "See <a href=\"{todo}\">live demo</a> of the example code from below. Todos "
52
+ "are deleted every 10 minutes."
53
+ msgstr ""
54
+ "Перегляньте <a href=\"{todo}\">живе демо</a> коду зразків, наведених унизу. "
55
+ "Завдання видаляються кожні 10 хвилин."
56
+
57
+ msgid ""
58
+ "<a href=\"{openapi}\" target=\"_top\">OpenAPI demo</a> (Swagger) is "
59
+ "generated from API route schema."
60
+ msgstr ""
61
+ "<a href=\"{openapi}\" target=\"_top\">Демо OpenAPI</a> (Swagger) генерується "
62
+ "зі схеми API-шляхів."
63
+
64
+ msgid "Quick start"
65
+ msgstr "Швидкий початок"
66
+
67
+ msgid ""
68
+ "There’s intentionally <b>not much API</b>. Documentation entirely fits in a "
69
+ "long but straightforward <b>README</b>. Like the Django tutorial, it guides "
70
+ "you through <b><a href=\"{documentation}\">writing an application</a></b> "
71
+ "using all the primary features of the EviKit framework."
72
+ msgstr ""
73
+ "<b>API навмисне небагато</b>. Документація повністю вміщається в довгий, але "
74
+ "послідовний <b>README</b>-файл. Подібно до посібника Django, він містить "
75
+ "покрокові інструкції з <b><a href=\"{documentation}\">написання застосунка</"
76
+ "a></b>, що використовує всі основні функції фреймворка EviKit."
77
+
78
+ msgid "Favicon by <a href=\"{artist}\">Solar Icons</a>"
79
+ msgstr "Піктограма за авторством <a href=\"{artist}\">Solar Icons</a>"
80
+
81
+ msgid ""
82
+ "<a href=\"{evikit}\"><b>Source code</b> at Codeberg</a> under <b>MIT</b> "
83
+ "license"
84
+ msgstr ""
85
+ "<a href=\"{evikit}\"><b>Вихідний код</b> на Codeberg</a> на умовах ліцензії "
86
+ "<b>MIT</b>"
87
+
88
+ msgid "Discuss on <b>Fediverse</b>"
89
+ msgstr "Обговорити в <b>Fediverse</b>"
90
+
91
+ msgid "%1 todo"
92
+ msgid_plural "%1 todos"
93
+ msgstr[0] "%1 завдання"
94
+ msgstr[1] "%1 завдання"
95
+ msgstr[2] "%1 завдань"
96
+
97
+ msgid "Todos"
98
+ msgstr "Завдання"
99
+
100
+ msgid "Text"
101
+ msgstr "Текст"
102
+
103
+ msgid "Create todo"
104
+ msgstr "Створити завдання"
105
+
106
+ msgid "Back to plan"
107
+ msgstr "Назад до плану"
108
+
109
+ msgid "Done"
110
+ msgstr "Готово"
@@ -5,6 +5,7 @@ import {
5
5
  blockquote,
6
6
  br,
7
7
  code,
8
+ details,
8
9
  div,
9
10
  figcaption,
10
11
  figure,
@@ -16,6 +17,7 @@ import {
16
17
  p,
17
18
  pre,
18
19
  span,
20
+ summary,
19
21
  useApi,
20
22
  useI18n,
21
23
  } from "evikit";
@@ -32,11 +34,15 @@ export function HomePage() {
32
34
  const i18n = useI18n();
33
35
  const { data } = useApi(HomeGet);
34
36
  useTitle(i18n.gettext("EviKit: Preact SSR framework for small web apps"));
37
+ const description = i18n.gettext(
38
+ "Standard modern <b>JavaScript</b>, no JSX or TS. <b>Forms</b> accessible when JS doesn't load. Automatic <b>Swagger</b> specification. First-class API input/output <b>validation</b>. Built-in <b>node:sqlite ORM</b>. Support for UI <b>translation</b> through .po files.",
39
+ );
35
40
  useMeta({
36
- content:
37
- "Standard modern JavaScript, no JSX or TS. Forms accessible when JS doesn't load. Automatic Swagger specification. First-class API input/output validation. Built-in node:sqlite ORM. Support for UI translation through .po files.",
41
+ content: description.replace(/<[^>]+>/g, ""),
38
42
  name: "description",
39
43
  });
44
+ useMeta({ content: "/static/preact-ssr-framework.png", name: "og:image" });
45
+ useMeta({ content: "summary_large_image", name: "twitter:card" });
40
46
  useEffect(() => {
41
47
  highlightAll();
42
48
  }, [JSON.stringify(data?.File)]);
@@ -77,15 +83,7 @@ export function HomePage() {
77
83
  ),
78
84
  }),
79
85
  ),
80
-
81
- p({
82
- class: "lg:text-center",
83
- ...sanitize(
84
- i18n.gettext(
85
- "Standard modern <b>JavaScript</b>, no JSX or TS. <b>Forms</b> accessible when JS doesn't load. Automatic <b>Swagger</b> specification. First-class API input/output <b>validation</b>. Built-in <b>node:sqlite ORM</b>. Support for UI <b>translation</b> through .po files.",
86
- ),
87
- ),
88
- }),
86
+ p({ class: "lg:text-center", ...sanitize(description) }),
89
87
 
90
88
  nav(
91
89
  { class: "gap-4 grid grid-cols-2 max-w-lg mx-auto mt-6 text-center" },
@@ -255,6 +253,17 @@ npm run dev
255
253
  "Copyright © 2026 ",
256
254
  a({ href: "https://libre.net.ua" }, "Denys Nykula"),
257
255
  ),
256
+ p({
257
+ class: "mb-4",
258
+ ...sanitize(
259
+ i18n
260
+ .gettext('Favicon by <a href="{artist}">Solar Icons</a>')
261
+ .replace(
262
+ "{artist}",
263
+ "https://www.svgrepo.com/author/Solar%20Icons/",
264
+ ),
265
+ ),
266
+ }),
258
267
  p({
259
268
  class: "mb-4",
260
269
  ...sanitize(
@@ -290,14 +299,14 @@ function Code({ children, file, lang, tag }) {
290
299
  .replace(/.*HomeServer.*\r?\n/g, "")
291
300
  .replace(/.*HomePage.*\r?\n/g, "")
292
301
  .replace(
293
- /<link\s+href="\/node_modules\/[^"]+.css"\s+media="[^"]+"\s+rel="stylesheet"\s+\/>\s+/g,
302
+ /<link\s+href="[^"]+"(\s+media="[^"]+")?\s+rel="[a-z]+"\s+\/>\s+/g,
294
303
  "",
295
304
  ),
296
305
  ),
297
306
  );
298
307
  const style = `${darkBg} mb-4 mx-0 overflow-hidden p-4 rounded-xl`;
299
308
  return tag == "details"
300
- ? h("details", { class: style }, h("summary", null, children), inner)
309
+ ? details({ class: style }, summary(null, children), inner)
301
310
  : figure({ class: style }, figcaption(null, children), inner);
302
311
  }
303
312
 
@@ -307,7 +316,7 @@ function sanitize(html) {
307
316
  dangerouslySetInnerHTML: {
308
317
  __html: html.replace(/<([^>]*)>/g, (match) =>
309
318
  /^<\/?[a-z]+>$/.test(match) ||
310
- /^<a href="[a-z:/.#]*"( target="_top")?>$/.test(match)
319
+ /^<a href="[0-9A-Za-z:/.#%]*"( target="_top")?>$/.test(match)
311
320
  ? match
312
321
  : "",
313
322
  ),
@@ -0,0 +1,15 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <svg width="800px" height="800px" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
3
+ <style>
4
+ #app { fill: #84f }
5
+ #api { fill: #7d8 }
6
+ @media (prefers-color-scheme: dark) {
7
+ #app { fill: #c678dd }
8
+ #api { fill: #61afef }
9
+ }
10
+ </style>
11
+ <rect fill="#fff" width="18" height="6" x="3" y="4" />
12
+ <rect fill="#fff" width="18" height="6" x="3" y="14" />
13
+ <path id="app" fill-rule="evenodd" clip-rule="evenodd" d="M2.58579 3.58579C2 4.17157 2 5.11438 2 7C2 8.88562 2 9.82843 2.58579 10.4142C3.17157 11 4.11438 11 6 11H18C19.8856 11 20.8284 11 21.4142 10.4142C22 9.82843 22 8.88562 22 7C22 5.11438 22 4.17157 21.4142 3.58579C20.8284 3 19.8856 3 18 3H6C4.11438 3 3.17157 3 2.58579 3.58579ZM9 8.75C8.58579 8.75 8.25 8.41421 8.25 8V6C8.25 5.58579 8.58579 5.25 9 5.25C9.41421 5.25 9.75 5.58579 9.75 6V8C9.75 8.41421 9.41421 8.75 9 8.75ZM13.5 6.25C13.0858 6.25 12.75 6.58579 12.75 7C12.75 7.41421 13.0858 7.75 13.5 7.75H18C18.4142 7.75 18.75 7.41421 18.75 7C18.75 6.58579 18.4142 6.25 18 6.25H13.5ZM6 8.75C5.58579 8.75 5.25 8.41421 5.25 8L5.25 6C5.25 5.58579 5.58579 5.25 6 5.25C6.41421 5.25 6.75 5.58579 6.75 6V8C6.75 8.41421 6.41421 8.75 6 8.75Z"/>
14
+ <path id="api" fill-rule="evenodd" clip-rule="evenodd" d="M2.58579 13.5858C2 14.1716 2 15.1144 2 17C2 18.8856 2 19.8284 2.58579 20.4142C3.17157 21 4.11438 21 6 21H18C19.8856 21 20.8284 21 21.4142 20.4142C22 19.8284 22 18.8856 22 17C22 15.1144 22 14.1716 21.4142 13.5858C20.8284 13 19.8856 13 18 13H6C4.11438 13 3.17157 13 2.58579 13.5858ZM12.75 17C12.75 16.5858 13.0858 16.25 13.5 16.25H18C18.4142 16.25 18.75 16.5858 18.75 17C18.75 17.4142 18.4142 17.75 18 17.75H13.5C13.0858 17.75 12.75 17.4142 12.75 17ZM5.25 18C5.25 18.4142 5.58579 18.75 6 18.75C6.41421 18.75 6.75 18.4142 6.75 18V16C6.75 15.5858 6.41421 15.25 6 15.25C5.58579 15.25 5.25 15.5858 5.25 16L5.25 18ZM9 18.75C8.58579 18.75 8.25 18.4142 8.25 18V16C8.25 15.5858 8.58579 15.25 9 15.25C9.41421 15.25 9.75 15.5858 9.75 16V18C9.75 18.4142 9.41421 18.75 9 18.75Z"/>
15
+ </svg>
Binary file
Binary file