diff --git a/.gitignore b/.gitignore
index 1b6267f..e9fdd2f 100755
--- a/.gitignore
+++ b/.gitignore
@@ -62,9 +62,6 @@ nbdist/
*.tar.gz
*.rar
-### VSCode
-.vscode
-
### Local file
application-local.yml
application-local.yaml
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 0000000..b3c9625
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,9 @@
+{
+ "[typescript]": {
+ "editor.defaultFormatter": "biomejs.biome",
+ "editor.codeActionsOnSave": {
+ "source.fixAll.biome": "explicit",
+ "source.organizeImports.biome": "explicit"
+ }
+ }
+}
diff --git a/package.json b/package.json
index 887e57d..554465c 100644
--- a/package.json
+++ b/package.json
@@ -30,7 +30,18 @@
"husky": "^9.1.7",
"lint-staged": "^16.1.2",
"typescript": "~5.3.3",
- "vite": "^5.1.4"
+ "vite": "^7.0.6",
+ "vite-plugin-dts": "^4.5.4"
},
- "packageManager": "pnpm@10.10.0+sha512.d615db246fe70f25dcfea6d8d73dee782ce23e2245e3c4f6f888249fb568149318637dca73c2c5c8ef2a4ca0d5657fb9567188bfab47f566d1ee6ce987815c39"
+ "packageManager": "pnpm@10.10.0+sha512.d615db246fe70f25dcfea6d8d73dee782ce23e2245e3c4f6f888249fb568149318637dca73c2c5c8ef2a4ca0d5657fb9567188bfab47f566d1ee6ce987815c39",
+ "pnpm": {
+ "overrides": {
+ "vite": "npm:rolldown-vite@7.0.10"
+ }
+ },
+ "dependencies": {
+ "@tiptap/extensions": "^3.0.9",
+ "shiki": "^3.9.2",
+ "tiptap-extension-code-block-shiki": "^0.5.1"
+ }
}
diff --git a/packages/comment-widget/package.json b/packages/comment-widget/package.json
index 41ec396..f3c05e5 100644
--- a/packages/comment-widget/package.json
+++ b/packages/comment-widget/package.json
@@ -27,16 +27,19 @@
"var.css"
],
"scripts": {
- "build": "tsc",
- "dev": "tsc -w",
- "locale:extract": "lit-localize extract",
- "locale:build": "lit-localize build"
+ "build": "vite build",
+ "dev": "vite build --watch",
+ "locale:build": "lit-localize build",
+ "locale:extract": "lit-localize extract"
},
"dependencies": {
"@emoji-mart/data": "^1.2.1",
"@halo-dev/api-client": "^2.21.1",
"@lit/context": "^1.1.6",
"@lit/localize": "^0.12.2",
+ "@tiptap/core": "^3.0.9",
+ "@tiptap/pm": "^3.0.9",
+ "@tiptap/starter-kit": "^3.0.9",
"dayjs": "^1.11.13",
"emoji-mart": "^5.6.0",
"es-toolkit": "^1.39.8",
@@ -44,7 +47,9 @@
"lit": "^3.3.1"
},
"devDependencies": {
+ "@iconify/json": "^2.2.367",
"@lit/localize-tools": "^0.8.0",
- "lit-analyzer": "^2.0.3"
+ "lit-analyzer": "^2.0.3",
+ "unocss": "^66.4.1"
}
}
diff --git a/packages/comment-widget/src/base-comment-item.ts b/packages/comment-widget/src/base-comment-item.ts
index 30d9660..66f9982 100644
--- a/packages/comment-widget/src/base-comment-item.ts
+++ b/packages/comment-widget/src/base-comment-item.ts
@@ -1,8 +1,10 @@
import './user-avatar';
import { msg } from '@lit/localize';
-import { css, html, LitElement } from 'lit';
+import { css, html, LitElement, unsafeCSS } from 'lit';
import { property } from 'lit/decorators.js';
+import { unsafeHTML } from 'lit/directives/unsafe-html.js';
import baseStyles from './styles/base';
+import contentStyles from './styles/content.css?inline';
import varStyles from './styles/var';
import { formatDate, timeAgo } from './utils/date';
@@ -40,7 +42,11 @@ export class BaseCommentItem extends LitElement {
-
${this.content}
+
+
${unsafeHTML(this.content)}
@@ -67,6 +77,7 @@ export class BaseCommentItem extends LitElement {
static override styles = [
varStyles,
baseStyles,
+ unsafeCSS(contentStyles),
css`
.item {
display: flex;
diff --git a/packages/comment-widget/src/base-form.ts b/packages/comment-widget/src/base-form.ts
index 8f05a0e..17683a3 100644
--- a/packages/comment-widget/src/base-form.ts
+++ b/packages/comment-widget/src/base-form.ts
@@ -14,13 +14,14 @@ import {
nameContext,
toastContext,
} from './context';
-import './emoji-button';
import './icons/icon-loading';
import { msg } from '@lit/localize';
import type { ToastManager } from './lit-toast';
import baseStyles from './styles/base';
import varStyles from './styles/var';
import type { ConfigMapData } from './types';
+import './comment-editor';
+import type { CommentEditor } from './comment-editor';
export class BaseForm extends LitElement {
@consume({ context: baseUrlContext })
@@ -64,6 +65,8 @@ export class BaseForm extends LitElement {
textareaRef: Ref
= createRef();
+ editorRef: Ref = createRef();
+
get customAccount() {
return JSON.parse(
localStorage.getItem('halo-comment-custom-account') || '{}'
@@ -168,14 +171,6 @@ export class BaseForm extends LitElement {
target.style.height = `${target.scrollHeight}px`;
}
- onEmojiSelect(e: CustomEvent) {
- const data = e.detail;
- if (this.textareaRef.value) {
- this.textareaRef.value.value += data.native;
- this.textareaRef.value.focus();
- }
- }
-
onKeydown(e: KeyboardEvent) {
if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {
const form = this.shadowRoot?.querySelector('form');
@@ -197,15 +192,7 @@ export class BaseForm extends LitElement {
override render() {
return html`
`;
}
static override styles = [
@@ -121,6 +127,8 @@ export class EmojiButton extends LitElement {
display: inline-flex;
}
+ @unocss-placeholder;
+
em-emoji-picker {
--rgb-color: var(--component-emoji-picker-rgb-color);
--rgb-accent: var(--component-emoji-picker-rgb-accent);
@@ -130,16 +138,6 @@ export class EmojiButton extends LitElement {
--color-border-over: var(--component-emoji-picker-color-border-over);
}
- .emoji-button {
- color: var(--base-color);
- display: inline-flex;
- position: relative;
- }
-
- .emoji-button:hover icon-emoji {
- opacity: 0.8;
- }
-
.form__emoji-panel {
position: absolute;
top: 2em;
diff --git a/packages/comment-widget/src/generated/locales/es.ts b/packages/comment-widget/src/generated/locales/es.ts
index 9c2e674..009979c 100644
--- a/packages/comment-widget/src/generated/locales/es.ts
+++ b/packages/comment-widget/src/generated/locales/es.ts
@@ -16,10 +16,16 @@
's0fbf6dc6a1966408': `Siguiente`,
's1c6fefb092506753': `Error al cargar la lista de comentarios, por favor intente más tarde`,
's1e3e30a26025484c': `Error al cargar la lista de respuestas, por favor intente más tarde`,
+'s26e4d65f2801ac9c': `Por favor, ingrese el contenido`,
's299b10f3a58a09fd': `Haga clic en OK para ir a la página de cierre de sesión, Por favor, asegúrese de que el contenido editado haya sido guardado.`,
+'s35c3125c7750681e': `Cita`,
+'s3643189d1abbb7f4': `Código`,
's3fb33d17bad61aa9': `Comentario enviado con éxito, pendiente de revisión`,
's4c0e15f9073382e6': `Error al obtener el código de verificación`,
+'s523eb9043213ff0d': `Itálica`,
+'s58a3c1ecd4dd06cf': `Tachado`,
's67749057edb2586b': `Cerrar sesión`,
+'s6cb61eeccda272d5': `Bloque de código`,
's7437373e541a8037': `Apodo`,
's7584ded3d749c75e': `Cargar más`,
's82665b2ffabc9c0a': `Sitio web`,
@@ -28,6 +34,7 @@
's9f2ed66340f019c6': `Escribir un comentario`,
'sa10fbe3fcd6ae148': `Agregar respuesta`,
'sa8dddacbaa66f8e0': `Por favor, inicie sesión primero`,
+'sb206d700d26b14ff': `Subrayado`,
'sb3d4f79d9d8b71e5': `Enviar comentario`,
'sb5a28aa35006ff08': `Comentario enviado con éxito`,
'sc8da3cc71de63832': `Iniciar sesión`,
@@ -36,5 +43,6 @@
'sea7e567ed89dc0d7': `Seleccionar emoticono`,
'sf3ff78cc329d3528': `Anterior`,
'sf77128b082955d42': `(O iniciar sesión)`,
+'sf7c0eba7c822e3d6': `Negrita`,
};
\ No newline at end of file
diff --git a/packages/comment-widget/src/generated/locales/zh-CN.ts b/packages/comment-widget/src/generated/locales/zh-CN.ts
index 1135d08..eb4c7b2 100644
--- a/packages/comment-widget/src/generated/locales/zh-CN.ts
+++ b/packages/comment-widget/src/generated/locales/zh-CN.ts
@@ -16,10 +16,16 @@
's0fbf6dc6a1966408': `下一页`,
's1c6fefb092506753': `加载评论列表失败,请稍后重试`,
's1e3e30a26025484c': `加载回复列表失败,请稍后重试`,
+'s26e4d65f2801ac9c': `请输入内容`,
's299b10f3a58a09fd': `点击确定将跳转至退出登录页面,请确保正在编辑的内容已保存。`,
+'s35c3125c7750681e': `引用`,
+'s3643189d1abbb7f4': `代码`,
's3fb33d17bad61aa9': `评论成功,请等待审核`,
's4c0e15f9073382e6': `获取验证码失败`,
+'s523eb9043213ff0d': `斜体`,
+'s58a3c1ecd4dd06cf': `删除线`,
's67749057edb2586b': `退出登录`,
+'s6cb61eeccda272d5': `代码块`,
's7437373e541a8037': `昵称`,
's7584ded3d749c75e': `加载更多`,
's82665b2ffabc9c0a': `网站`,
@@ -28,6 +34,7 @@
's9f2ed66340f019c6': `编写评论`,
'sa10fbe3fcd6ae148': `加入回复`,
'sa8dddacbaa66f8e0': `请先登录`,
+'sb206d700d26b14ff': `下划线`,
'sb3d4f79d9d8b71e5': `提交评论`,
'sb5a28aa35006ff08': `评论成功`,
'sc8da3cc71de63832': `登录`,
@@ -36,5 +43,6 @@
'sea7e567ed89dc0d7': `选择表情`,
'sf3ff78cc329d3528': `上一页`,
'sf77128b082955d42': `(或登录账号)`,
+'sf7c0eba7c822e3d6': `粗体`,
};
\ No newline at end of file
diff --git a/packages/comment-widget/src/generated/locales/zh-TW.ts b/packages/comment-widget/src/generated/locales/zh-TW.ts
index 5e8c093..0155683 100644
--- a/packages/comment-widget/src/generated/locales/zh-TW.ts
+++ b/packages/comment-widget/src/generated/locales/zh-TW.ts
@@ -16,10 +16,16 @@
's0fbf6dc6a1966408': `下一頁`,
's1c6fefb092506753': `載入評論列表失敗,請稍後重試`,
's1e3e30a26025484c': `載入回覆列表失敗,請稍後重試`,
+'s26e4d65f2801ac9c': `請輸入內容`,
's299b10f3a58a09fd': `点击确定将跳转至退出登录页面,请确保正在编辑的内容已保存。`,
+'s35c3125c7750681e': `引用`,
+'s3643189d1abbb7f4': `程式碼`,
's3fb33d17bad61aa9': `評論成功,請等待審核`,
's4c0e15f9073382e6': `獲取驗證碼失敗`,
+'s523eb9043213ff0d': `斜體`,
+'s58a3c1ecd4dd06cf': `刪除線`,
's67749057edb2586b': `登出`,
+'s6cb61eeccda272d5': `程式碼區塊`,
's7437373e541a8037': `暱稱`,
's7584ded3d749c75e': `載入更多`,
's82665b2ffabc9c0a': `網站`,
@@ -28,6 +34,7 @@
's9f2ed66340f019c6': `撰寫評論`,
'sa10fbe3fcd6ae148': `新增回覆`,
'sa8dddacbaa66f8e0': `請先登入`,
+'sb206d700d26b14ff': `底線`,
'sb3d4f79d9d8b71e5': `提交評論`,
'sb5a28aa35006ff08': `評論成功`,
'sc8da3cc71de63832': `登入`,
@@ -36,5 +43,6 @@
'sea7e567ed89dc0d7': `選擇表情`,
'sf3ff78cc329d3528': `上一頁`,
'sf77128b082955d42': `(或登入帳號)`,
+'sf7c0eba7c822e3d6': `粗體`,
};
\ No newline at end of file
diff --git a/packages/comment-widget/src/icons/icon-emoji.ts b/packages/comment-widget/src/icons/icon-emoji.ts
deleted file mode 100644
index db3812b..0000000
--- a/packages/comment-widget/src/icons/icon-emoji.ts
+++ /dev/null
@@ -1,31 +0,0 @@
-import { css, html, LitElement } from 'lit';
-
-export class IconEmoji extends LitElement {
- override render() {
- return html`
`;
- }
-
- static override styles = css`
- :host {
- display: inline-flex;
- }
- svg {
- height: 1.25em;
- width: 1.25em;
- }
- `;
-}
-
-customElements.get('icon-emoji') ||
- customElements.define('icon-emoji', IconEmoji);
-
-declare global {
- interface HTMLElementTagNameMap {
- 'icon-emoji': IconEmoji;
- }
-}
diff --git a/packages/comment-widget/src/styles/content.css b/packages/comment-widget/src/styles/content.css
new file mode 100644
index 0000000..8da4c12
--- /dev/null
+++ b/packages/comment-widget/src/styles/content.css
@@ -0,0 +1,419 @@
+/* forked from https://github.com/sindresorhus/github-markdown-css/blob/main/github-markdown.css */
+.markdown-body {
+ color-scheme: light;
+ --base-size-16: 1rem;
+ --base-size-24: 1.5rem;
+ --base-size-40: 2.5rem;
+ --base-text-weight-semibold: 600;
+ --fontStack-monospace:
+ ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono,
+ monospace;
+
+ /* light */
+ --focus-outlineColor: #0969da;
+ --fgColor-default: #1f2328;
+ --fgColor-muted: #59636e;
+ --fgColor-accent: #0969da;
+ --bgColor-muted: #f6f8fa;
+ --bgColor-neutral-muted: #818b981f;
+ --bgColor-attention-muted: #fff8c5;
+ --borderColor-default: #d1d9e0;
+ --borderColor-muted: #d1d9e0b3;
+}
+
+.color-scheme-dark,
+.dark,
+[data-color-scheme="dark"] comment-widget {
+ /* dark */
+ color-scheme: dark;
+ --focus-outlineColor: #1f6feb;
+ --fgColor-default: #f0f6fc;
+ --fgColor-muted: #9198a1;
+ --fgColor-accent: #4493f8;
+ --bgColor-muted: #151b23;
+ --bgColor-neutral-muted: #656c7633;
+ --bgColor-attention-muted: #bb800926;
+ --borderColor-default: #3d444d;
+ --borderColor-muted: #3d444db3;
+}
+
+.markdown-body {
+ -ms-text-size-adjust: 100%;
+ -webkit-text-size-adjust: 100%;
+ margin: 0;
+ color: var(--fgColor-default);
+ font-family: var(--base-font-family);
+ font-size: 16px;
+ line-height: 1.5;
+ word-wrap: break-word;
+}
+
+.markdown-body details,
+.markdown-body figcaption,
+.markdown-body figure {
+ display: block;
+}
+
+.markdown-body summary {
+ display: list-item;
+}
+
+.markdown-body a {
+ background-color: transparent;
+ color: var(--fgColor-accent);
+ text-decoration: none;
+}
+
+.markdown-body b,
+.markdown-body strong {
+ font-weight: var(--base-text-weight-semibold, 600);
+}
+
+.markdown-body h1 {
+ margin: 0.67em 0;
+ font-weight: var(--base-text-weight-semibold, 600);
+ padding-bottom: 0.3em;
+ font-size: 2em;
+ border-bottom: 1px solid var(--borderColor-muted);
+}
+
+.markdown-body mark {
+ background-color: var(--bgColor-attention-muted);
+ color: var(--fgColor-default);
+}
+
+.markdown-body small {
+ font-size: 90%;
+}
+
+.markdown-body sub,
+.markdown-body sup {
+ font-size: 75%;
+ line-height: 0;
+ position: relative;
+ vertical-align: baseline;
+}
+
+.markdown-body sub {
+ bottom: -0.25em;
+}
+
+.markdown-body sup {
+ top: -0.5em;
+}
+
+.markdown-body img {
+ border-style: none;
+ max-width: 100%;
+ box-sizing: content-box;
+}
+
+.markdown-body code,
+.markdown-body pre {
+ font-family: monospace;
+ font-size: 1em;
+}
+
+.markdown-body figure {
+ margin: 1em var(--base-size-40);
+}
+
+.markdown-body hr {
+ box-sizing: content-box;
+ overflow: hidden;
+ background: transparent;
+ border-bottom: 1px solid var(--borderColor-muted);
+ height: 0.25em;
+ padding: 0;
+ margin: var(--base-size-24) 0;
+ background-color: var(--borderColor-default);
+ border: 0;
+}
+
+.markdown-body a:hover {
+ text-decoration: underline;
+}
+
+.markdown-body hr::before {
+ display: table;
+ content: "";
+}
+
+.markdown-body hr::after {
+ display: table;
+ clear: both;
+ content: "";
+}
+
+.markdown-body details summary {
+ cursor: pointer;
+}
+
+.markdown-body a:focus {
+ outline: 2px solid var(--focus-outlineColor);
+ outline-offset: -2px;
+ box-shadow: none;
+}
+
+.markdown-body a:focus:not(:focus-visible) {
+ outline: solid 1px transparent;
+}
+
+.markdown-body a:focus-visible {
+ outline: 2px solid var(--focus-outlineColor);
+ outline-offset: -2px;
+ box-shadow: none;
+}
+
+.markdown-body a:not([class]):focus,
+.markdown-body a:not([class]):focus-visible {
+ outline-offset: 0;
+}
+
+.markdown-body h1,
+.markdown-body h2,
+.markdown-body h3,
+.markdown-body h4,
+.markdown-body h5,
+.markdown-body h6 {
+ margin-top: var(--base-size-24);
+ margin-bottom: var(--base-size-16);
+ font-weight: var(--base-text-weight-semibold, 600);
+ line-height: 1.25;
+}
+
+.markdown-body h2 {
+ font-weight: var(--base-text-weight-semibold, 600);
+ padding-bottom: 0.3em;
+ font-size: 1.5em;
+ border-bottom: 1px solid var(--borderColor-muted);
+}
+
+.markdown-body h3 {
+ font-weight: var(--base-text-weight-semibold, 600);
+ font-size: 1.25em;
+}
+
+.markdown-body h4 {
+ font-weight: var(--base-text-weight-semibold, 600);
+ font-size: 1em;
+}
+
+.markdown-body h5 {
+ font-weight: var(--base-text-weight-semibold, 600);
+ font-size: 0.875em;
+}
+
+.markdown-body h6 {
+ font-weight: var(--base-text-weight-semibold, 600);
+ font-size: 0.85em;
+ color: var(--fgColor-muted);
+}
+
+.markdown-body p {
+ margin-top: 0;
+ margin-bottom: 10px;
+}
+
+.markdown-body blockquote {
+ margin: 0;
+ padding: 0 1em;
+ color: var(--fgColor-muted);
+ border-left: 0.25em solid var(--borderColor-default);
+}
+
+.markdown-body ul,
+.markdown-body ol {
+ margin-top: 0;
+ margin-bottom: 0;
+ padding-left: 2em;
+}
+
+.markdown-body ol ol,
+.markdown-body ul ol {
+ list-style-type: lower-roman;
+}
+
+.markdown-body ul ul ol,
+.markdown-body ul ol ol,
+.markdown-body ol ul ol,
+.markdown-body ol ol ol {
+ list-style-type: lower-alpha;
+}
+
+.markdown-body code {
+ font-family: var(
+ --fontStack-monospace,
+ ui-monospace,
+ SFMono-Regular,
+ SF Mono,
+ Menlo,
+ Consolas,
+ Liberation Mono,
+ monospace
+ );
+ font-size: 12px;
+}
+
+.markdown-body pre {
+ margin-top: 0;
+ margin-bottom: 0;
+ font-family: var(
+ --fontStack-monospace,
+ ui-monospace,
+ SFMono-Regular,
+ SF Mono,
+ Menlo,
+ Consolas,
+ Liberation Mono,
+ monospace
+ );
+ font-size: 12px;
+ word-wrap: normal;
+}
+
+.markdown-body::before {
+ display: table;
+ content: "";
+}
+
+.markdown-body::after {
+ display: table;
+ clear: both;
+ content: "";
+}
+
+.markdown-body > *:first-child {
+ margin-top: 0 !important;
+}
+
+.markdown-body > *:last-child {
+ margin-bottom: 0 !important;
+}
+
+.markdown-body a:not([href]) {
+ color: inherit;
+ text-decoration: none;
+}
+
+.markdown-body p,
+.markdown-body blockquote,
+.markdown-body ul,
+.markdown-body ol,
+.markdown-body dl,
+.markdown-body pre,
+.markdown-body details {
+ margin-top: 0;
+ margin-bottom: var(--base-size-16);
+}
+
+.markdown-body blockquote > :first-child {
+ margin-top: 0;
+}
+
+.markdown-body blockquote > :last-child {
+ margin-bottom: 0;
+}
+
+.markdown-body h1 code,
+.markdown-body h2 code,
+.markdown-body h3 code,
+.markdown-body h4 code,
+.markdown-body h5 code,
+.markdown-body h6 code {
+ padding: 0 0.2em;
+ font-size: inherit;
+}
+
+.markdown-body summary h1,
+.markdown-body summary h2,
+.markdown-body summary h3,
+.markdown-body summary h4,
+.markdown-body summary h5,
+.markdown-body summary h6 {
+ display: inline-block;
+}
+
+.markdown-body summary h1,
+.markdown-body summary h2 {
+ padding-bottom: 0;
+ border-bottom: 0;
+}
+
+.markdown-body ul ul,
+.markdown-body ul ol,
+.markdown-body ol ol,
+.markdown-body ol ul {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+
+.markdown-body li > p {
+ margin-top: var(--base-size-16);
+}
+
+.markdown-body li + li {
+ margin-top: 0.25em;
+}
+
+.markdown-body code {
+ padding: 0.2em 0.4em;
+ margin: 0;
+ font-size: 85%;
+ white-space: break-spaces;
+ background-color: var(--bgColor-neutral-muted);
+ border-radius: 6px;
+}
+
+.markdown-body code br {
+ display: none;
+}
+
+.markdown-body del code {
+ text-decoration: inherit;
+}
+
+.markdown-body pre code {
+ font-size: 100%;
+}
+
+.markdown-body pre > code {
+ padding: 0;
+ margin: 0;
+ word-break: normal;
+ white-space: pre;
+ background: transparent;
+ border: 0;
+}
+
+.markdown-body pre {
+ padding: var(--base-size-16);
+ overflow: auto;
+ font-size: 85%;
+ line-height: 1.45;
+ color: var(--fgColor-default);
+ background-color: var(--bgColor-muted);
+ border-radius: 6px;
+}
+
+.markdown-body pre code {
+ display: inline;
+ max-width: auto;
+ padding: 0;
+ margin: 0;
+ overflow: visible;
+ line-height: inherit;
+ word-wrap: normal;
+ background-color: transparent;
+ border: 0;
+}
+
+.markdown-body summary:focus:not(:focus-visible),
+.markdown-body a:focus:not(:focus-visible) {
+ outline: none;
+ box-shadow: none;
+}
+
+.markdown-body > *:first-child > .heading-element:first-child {
+ margin-top: 0 !important;
+}
diff --git a/packages/comment-widget/uno.config.ts b/packages/comment-widget/uno.config.ts
new file mode 100644
index 0000000..8f7625e
--- /dev/null
+++ b/packages/comment-widget/uno.config.ts
@@ -0,0 +1,4 @@
+import { defineConfig, presetIcons, presetWind3 } from 'unocss';
+export default defineConfig({
+ presets: [presetWind3(), presetIcons()],
+});
diff --git a/packages/comment-widget/vite.config.ts b/packages/comment-widget/vite.config.ts
new file mode 100644
index 0000000..8f43be8
--- /dev/null
+++ b/packages/comment-widget/vite.config.ts
@@ -0,0 +1,23 @@
+import UnoCSS from 'unocss/vite';
+import { defineConfig, type Plugin } from 'vite';
+import dts from 'vite-plugin-dts';
+
+export default defineConfig({
+ experimental: {
+ enableNativePlugin: true,
+ },
+ plugins: [
+ dts() as Plugin,
+ UnoCSS({
+ mode: 'shadow-dom',
+ configFile: './uno.config.ts',
+ }),
+ ],
+ build: {
+ lib: {
+ entry: ['src/index.ts'],
+ formats: ['es'],
+ fileName: 'index',
+ },
+ },
+});
diff --git a/packages/comment-widget/xliff/es.xlf b/packages/comment-widget/xliff/es.xlf
index 0ffafa4..dd99137 100644
--- a/packages/comment-widget/xliff/es.xlf
+++ b/packages/comment-widget/xliff/es.xlf
@@ -110,6 +110,38 @@
Click OK to jump to the logout page, Please make sure the content being edited has been saved.
Haga clic en OK para ir a la página de cierre de sesión, Por favor, asegúrese de que el contenido editado haya sido guardado.
+
+ Please enter content
+ Por favor, ingrese el contenido
+
+
+ Bold
+ Negrita
+
+
+ Italic
+ Itálica
+
+
+ Underline
+ Subrayado
+
+
+ Strike
+ Tachado
+
+
+ Code
+ Código
+
+
+ Blockquote
+ Cita
+
+
+ Code Block
+ Bloque de código
+