Emoji node (#8871)

Signed-off-by: Anton Alexeyev <alexeyev.anton@gmail.com>
This commit is contained in:
Anton Alexeyev
2025-05-13 14:19:14 +07:00
committed by GitHub
parent f98007b2e9
commit b0c30707d6
171 changed files with 2672 additions and 1293 deletions
+153 -10
View File
@@ -307,6 +307,15 @@ importers:
'@rush-temp/elastic':
specifier: file:./projects/elastic.tgz
version: file:projects/elastic.tgz(@babel/core@7.23.9)(@jest/types@29.6.3)(@types/node@20.11.19)(babel-jest@29.7.0(@babel/core@7.23.9))(esbuild@0.24.2)
'@rush-temp/emoji':
specifier: file:./projects/emoji.tgz
version: file:projects/emoji.tgz(@babel/core@7.23.9)(@jest/types@29.6.3)(@types/node@20.11.19)(babel-jest@29.7.0(@babel/core@7.23.9))(esbuild@0.24.2)(ts-node@10.9.2(@types/node@20.11.19)(typescript@5.3.3))
'@rush-temp/emoji-assets':
specifier: file:./projects/emoji-assets.tgz
version: file:projects/emoji-assets.tgz(@babel/core@7.23.9)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.23.9))(esbuild@0.24.2)(ts-node@10.9.2(@types/node@20.11.19)(typescript@5.3.3))
'@rush-temp/emoji-resources':
specifier: file:./projects/emoji-resources.tgz
version: file:projects/emoji-resources.tgz(@babel/core@7.23.9)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.23.9))(esbuild@0.24.2)(postcss-load-config@4.0.2(postcss@8.5.3)(ts-node@10.9.2(@types/node@20.11.19)(typescript@5.3.3)))(postcss@8.5.3)(ts-node@10.9.2(@types/node@20.11.19)(typescript@5.3.3))
'@rush-temp/export':
specifier: file:./projects/export.tgz
version: file:projects/export.tgz(@babel/core@7.23.9)(@jest/types@29.6.3)(@types/node@20.11.19)(babel-jest@29.7.0(@babel/core@7.23.9))(esbuild@0.24.2)(svelte@4.2.19)(ts-node@10.9.2(@types/node@20.11.19)(typescript@5.3.3))
@@ -511,6 +520,9 @@ importers:
'@rush-temp/model-drive':
specifier: file:./projects/model-drive.tgz
version: file:projects/model-drive.tgz
'@rush-temp/model-emoji':
specifier: file:./projects/model-emoji.tgz
version: file:projects/model-emoji.tgz
'@rush-temp/model-export':
specifier: file:./projects/model-export.tgz
version: file:projects/model-export.tgz
@@ -1756,6 +1768,9 @@ importers:
emojibase:
specifier: ^16.0.0
version: 16.0.0
emojibase-regex:
specifier: ^16.0.0
version: 16.0.0
esbuild:
specifier: ^0.24.2
version: 0.24.2
@@ -3948,7 +3963,7 @@ packages:
version: 0.0.0
'@rush-temp/activity-resources@file:projects/activity-resources.tgz':
resolution: {integrity: sha512-wgkR5K1ITM6du7LR5d/VuWTkwZprdqfkoFs39EtDC86rMhZoJywV3pwrPI7ASlz7cMb1VtzLR/6SKtENmB3FWg==, tarball: file:projects/activity-resources.tgz}
resolution: {integrity: sha512-D/V1RS70B/E7aBNzD2V+DJm7Ncr9DFrOAVXQVF+zU45QoUP98x16mkOfOvYMm72sfkPMZXt/dazzyMfDuidfIQ==, tarball: file:projects/activity-resources.tgz}
version: 0.0.0
'@rush-temp/activity@file:projects/activity.tgz':
@@ -4164,7 +4179,7 @@ packages:
version: 0.0.0
'@rush-temp/desktop@file:projects/desktop.tgz':
resolution: {integrity: sha512-2MuxT1ciufuMIFtWSoBJlO0uNhPmICCXRVnZZOQji4ByNWBvm4RSkPd97BQic8PxYe4H4FlPmIylRsvvVaeU7w==, tarball: file:projects/desktop.tgz}
resolution: {integrity: sha512-mj3Or3RObSw1iM1XVjuK+ecPRc3H/sxwKl5Lu92qg794LRA/tBt+GZaSFomZ27Oi9sU/OUoUbvtdXlgf2b40IQ==, tarball: file:projects/desktop.tgz}
version: 0.0.0
'@rush-temp/devmodel-resources@file:projects/devmodel-resources.tgz':
@@ -4215,6 +4230,18 @@ packages:
resolution: {integrity: sha512-WGiDJdr4on2TaKPfaKntlenxzUJ5uuxtibsd/ZkppUh0BghpFSH37C8WGps7kQRS4oqpb+mB3QhxVhxIz2IvGg==, tarball: file:projects/elastic.tgz}
version: 0.0.0
'@rush-temp/emoji-assets@file:projects/emoji-assets.tgz':
resolution: {integrity: sha512-HQ14d4cwZ0klYdy/wRepltE3uviJX4SNX8fXkyUXonnnQZ226JG0ZQZQjxeTmCBeX9U/fm/+3xT98atXkpGofw==, tarball: file:projects/emoji-assets.tgz}
version: 0.0.0
'@rush-temp/emoji-resources@file:projects/emoji-resources.tgz':
resolution: {integrity: sha512-ibOvCN3xgD/JTN5p4ILKI6lDe97Ut9fWdNxRlrl54Xi/lYqSzcR1qA3/9sRANc07QatKeCqiFeZSZUgPAGTv3A==, tarball: file:projects/emoji-resources.tgz}
version: 0.0.0
'@rush-temp/emoji@file:projects/emoji.tgz':
resolution: {integrity: sha512-Obbi4ccdBssdxagUm1zLtCGQhj5R0xOFNUqgOoRQDlcEqVvojA6EyQM6G+YtNLBllF+lnHGCqIs96GQ8G+AR4g==, tarball: file:projects/emoji.tgz}
version: 0.0.0
'@rush-temp/export-assets@file:projects/export-assets.tgz':
resolution: {integrity: sha512-PluN0E95WLNoRzQR5AMiB+yM3fIEOqd/pd7Z/iSm/MYtNwlaXvj1W0Y9jDDTGeRDBhG8JlsJx4QQAXrL/wvMrw==, tarball: file:projects/export-assets.tgz}
version: 0.0.0
@@ -4420,7 +4447,7 @@ packages:
version: 0.0.0
'@rush-temp/model-all@file:projects/model-all.tgz':
resolution: {integrity: sha512-apw/K0//cfSDJtJQ6h8Y9RmfYgpBq67AAr1hxPrSg8kYLMPzhro1u/0Iuj+jJGnbv874rVprV8VWZznoDD5m8A==, tarball: file:projects/model-all.tgz}
resolution: {integrity: sha512-5ggvhrxV+Dhwf4cqX/CLjE+NcDstaIVFrZ0aO9lUcfpX4txUgCCQK0ioAqZ8rL0XHjQ//gq78Fny76aWyuJnLw==, tarball: file:projects/model-all.tgz}
version: 0.0.0
'@rush-temp/model-analytics-collector@file:projects/model-analytics-collector.tgz':
@@ -4483,6 +4510,10 @@ packages:
resolution: {integrity: sha512-JG62skvnh8n7bBwsriHH6TE71W/gVm287OVnmy4VRJVf/tDC0/sCKlg+75qvcSu3CmAjaYqnnJz5q1Lz9EH3xw==, tarball: file:projects/model-drive.tgz}
version: 0.0.0
'@rush-temp/model-emoji@file:projects/model-emoji.tgz':
resolution: {integrity: sha512-o3HzefmauAMUKALu3SpLNEsdNdD/g3zWNT4NvnwXq0UU+l6OVJPOaj40cRZYgbW0J+PYVIA5kLgLmpaTj/3XLw==, tarball: file:projects/model-emoji.tgz}
version: 0.0.0
'@rush-temp/model-export@file:projects/model-export.tgz':
resolution: {integrity: sha512-BvWGwqaQW9aByGimHCl9tUQwzJcflcvXwb7oKLJlERSDthQIbbmiwCbk2hoxoV3JnZvFAP+EIKqU8Gx4JmbBHQ==, tarball: file:projects/model-export.tgz}
version: 0.0.0
@@ -4928,7 +4959,7 @@ packages:
version: 0.0.0
'@rush-temp/presentation@file:projects/presentation.tgz':
resolution: {integrity: sha512-xbOaATMslHsHV4sUFB+PKbMMWrattdYQi9aAXxuYylBCFMOeNbOD4din6fgYn/MuyerpUXuN/EH4gDoeFv8Udg==, tarball: file:projects/presentation.tgz}
resolution: {integrity: sha512-BIZsM8bDI2fpnw7r71lbLTUZNXk76T2X5Ni9yzy+reE/5/m4+JvCmayE9lOQwIESaKijZSvTJ72rNDYs2+wsoQ==, tarball: file:projects/presentation.tgz}
version: 0.0.0
'@rush-temp/print-assets@file:projects/print-assets.tgz':
@@ -4956,7 +4987,7 @@ packages:
version: 0.0.0
'@rush-temp/prod@file:projects/prod.tgz':
resolution: {integrity: sha512-sH+/06L2vJs2pfZD+n0Lir0YqObICbAlwOUjLMmJGWoQNGn5SrK85M9asNA5w4FbzKSHMLoSarNHebM7Th8ipQ==, tarball: file:projects/prod.tgz}
resolution: {integrity: sha512-GdZBIxyfe90BSJp2zRY77jkeyisNUL2i918qAo93lYsVrw1GFnMwuNxgK/Vw3a2fsLCVw9QIcUq6OLjfJTRDpA==, tarball: file:projects/prod.tgz}
version: 0.0.0
'@rush-temp/products-assets@file:projects/products-assets.tgz':
@@ -5412,7 +5443,7 @@ packages:
version: 0.0.0
'@rush-temp/task-resources@file:projects/task-resources.tgz':
resolution: {integrity: sha512-z+jiv045QZjtK9XdepXuvG3dgv5kZ0N1VVjLUfyzS+23PNChRJ5djF6WQjqvMVVUwtLd5xQmM97KG8U5GlbIVg==, tarball: file:projects/task-resources.tgz}
resolution: {integrity: sha512-hNQPRCjOf5j5O5j7RcOsWBWxGZE5tkrLZlq1zZRhUqK8Ms05g9yv0jZkiN7Ech1+PxGUCvqTJJ4ju6oB3zEghg==, tarball: file:projects/task-resources.tgz}
version: 0.0.0
'@rush-temp/task@file:projects/task.tgz':
@@ -5472,7 +5503,7 @@ packages:
version: 0.0.0
'@rush-temp/text-editor-resources@file:projects/text-editor-resources.tgz':
resolution: {integrity: sha512-MvBheskzm3x8NJCOJv12lYQV2OMPO57KcYvLMTjZ7uVmJyK7iZsBBY7Tuv9kmwVuOT++P+KOTYj1GVd/iwIOjg==, tarball: file:projects/text-editor-resources.tgz}
resolution: {integrity: sha512-graqZ0uS/Iwo3ioLjgR27wpTl0NVQ/IieRuGZFkAuMukFjBrgO3AUZJZETB0cm3Ma/KZ/HotJ0I1mOQBRHeCOw==, tarball: file:projects/text-editor-resources.tgz}
version: 0.0.0
'@rush-temp/text-editor@file:projects/text-editor.tgz':
@@ -5540,11 +5571,11 @@ packages:
version: 0.0.0
'@rush-temp/ui-next@file:projects/ui-next.tgz':
resolution: {integrity: sha512-5ZTDsqNUfXyCIVeeSMGhnxDSj+71eZSnHSSPz4l0QoH2FKtVa7fj01mXV7CXSMcIAz42S38gaXJfH1NB2TOcEw==, tarball: file:projects/ui-next.tgz}
resolution: {integrity: sha512-A3FSIrGhW7OIseHR5XIXglebYVOGmgq40yuGx68bV2XhCmN5KLiTA72MAJYxXmYG2uRS1L7GydCRTmdML+WlNA==, tarball: file:projects/ui-next.tgz}
version: 0.0.0
'@rush-temp/ui@file:projects/ui.tgz':
resolution: {integrity: sha512-0U0x2FrKQNlJteRKEqKkDhZNC/qOWO/rL3qK8cuqdYR7Gz5kCaQBnRRHYWGDTVtUKcyYrUN+2RTaB/OG5pgYhA==, tarball: file:projects/ui.tgz}
resolution: {integrity: sha512-1Qa4BqkJrIa/OAlhIk8KQQpejRJa65FHm9MEh0U5o1qy1TnScBVPY0VKtM5hYyBA2L6D7AypJ+K+4nvNTyIB2A==, tarball: file:projects/ui.tgz}
version: 0.0.0
'@rush-temp/uploader-assets@file:projects/uploader-assets.tgz':
@@ -5564,7 +5595,7 @@ packages:
version: 0.0.0
'@rush-temp/view-resources@file:projects/view-resources.tgz':
resolution: {integrity: sha512-7AFAEQlszTmRCzi9xfKegIhjzl76W8lLW4/LLygoH7a8JZPqoJhP1/l99QhNwa0tpUsXFTMg1EYMucFMrXhMdQ==, tarball: file:projects/view-resources.tgz}
resolution: {integrity: sha512-vOueglFyJvW7+13mDOKqFx3TQsMVq+vcIIxAoWQdvkcid8vypVg16TM5WPm1VbL3mF/XZ4Aa0q3DCmQKS+lmYQ==, tarball: file:projects/view-resources.tgz}
version: 0.0.0
'@rush-temp/view@file:projects/view.tgz':
@@ -8496,6 +8527,9 @@ packages:
emoji-regex@9.2.2:
resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
emojibase-regex@16.0.0:
resolution: {integrity: sha512-ZMp31BkzBWNW+T73of6NURL6nXQa5GkfKneOkr3cEwBDVllbW/2nuva7NO0J3RjaQ07+SZQNgPTGZ4JlIhmM2Q==}
emojibase@16.0.0:
resolution: {integrity: sha512-Nw2m7JLIO4Ou2X/yZPRNscHQXVbbr6SErjkJ7EooG7MbR3yDZszCv9KTizsXFc7yZl0n3WF+qUKIC/Lw6H9xaQ==}
engines: {node: '>=18.12.0'}
@@ -18599,6 +18633,98 @@ snapshots:
- node-notifier
- supports-color
'@rush-temp/emoji-assets@file:projects/emoji-assets.tgz(@babel/core@7.23.9)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.23.9))(esbuild@0.24.2)(ts-node@10.9.2(@types/node@20.11.19)(typescript@5.3.3))':
dependencies:
'@types/jest': 29.5.12
'@types/node': 20.11.19
'@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.3.3))(eslint@8.56.0)(typescript@5.7.3)
'@typescript-eslint/parser': 6.21.0(eslint@8.56.0)(typescript@5.7.3)
eslint: 8.56.0
eslint-config-standard-with-typescript: 40.0.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.3.3))(eslint@8.56.0)(typescript@5.3.3))(eslint-plugin-import@2.29.1(eslint@8.56.0))(eslint-plugin-n@15.7.0(eslint@8.56.0))(eslint-plugin-promise@6.1.1(eslint@8.56.0))(eslint@8.56.0)(typescript@5.7.3)
eslint-plugin-import: 2.29.1(eslint@8.56.0)
eslint-plugin-n: 15.7.0(eslint@8.56.0)
eslint-plugin-promise: 6.1.1(eslint@8.56.0)
jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2(@types/node@20.11.19)(typescript@5.3.3))
prettier: 3.2.5
ts-jest: 29.1.2(@babel/core@7.23.9)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.23.9))(esbuild@0.24.2)(jest@29.7.0(@types/node@20.11.19)(ts-node@10.9.2(@types/node@20.11.19)(typescript@5.3.3)))(typescript@5.7.3)
typescript: 5.7.3
transitivePeerDependencies:
- '@babel/core'
- '@jest/types'
- babel-jest
- babel-plugin-macros
- esbuild
- node-notifier
- supports-color
- ts-node
'@rush-temp/emoji-resources@file:projects/emoji-resources.tgz(@babel/core@7.23.9)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.23.9))(esbuild@0.24.2)(postcss-load-config@4.0.2(postcss@8.5.3)(ts-node@10.9.2(@types/node@20.11.19)(typescript@5.3.3)))(postcss@8.5.3)(ts-node@10.9.2(@types/node@20.11.19)(typescript@5.3.3))':
dependencies:
'@types/jest': 29.5.12
'@types/node': 20.11.19
'@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.3.3))(eslint@8.56.0)(typescript@5.7.3)
'@typescript-eslint/parser': 6.21.0(eslint@8.56.0)(typescript@5.7.3)
eslint: 8.56.0
eslint-config-standard-with-typescript: 40.0.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.3.3))(eslint@8.56.0)(typescript@5.3.3))(eslint-plugin-import@2.29.1(eslint@8.56.0))(eslint-plugin-n@15.7.0(eslint@8.56.0))(eslint-plugin-promise@6.1.1(eslint@8.56.0))(eslint@8.56.0)(typescript@5.7.3)
eslint-plugin-import: 2.29.1(eslint@8.56.0)
eslint-plugin-n: 15.7.0(eslint@8.56.0)
eslint-plugin-promise: 6.1.1(eslint@8.56.0)
eslint-plugin-svelte: 2.35.1(eslint@8.56.0)(svelte@4.2.19)(ts-node@10.9.2(@types/node@20.11.19)(typescript@5.3.3))
jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2(@types/node@20.11.19)(typescript@5.3.3))
prettier: 3.2.5
prettier-plugin-svelte: 3.2.2(prettier@3.2.5)(svelte@4.2.19)
sass: 1.71.1
svelte: 4.2.19
svelte-check: 3.6.9(@babel/core@7.23.9)(postcss-load-config@4.0.2(postcss@8.5.3)(ts-node@10.9.2(@types/node@20.11.19)(typescript@5.3.3)))(postcss@8.5.3)(sass@1.71.1)(svelte@4.2.19)
svelte-eslint-parser: 0.33.1(svelte@4.2.19)
svelte-loader: 3.2.0(svelte@4.2.19)
svelte-preprocess: 5.1.3(@babel/core@7.23.9)(postcss-load-config@4.0.2(postcss@8.5.3)(ts-node@10.9.2(@types/node@20.11.19)(typescript@5.3.3)))(postcss@8.5.3)(sass@1.71.1)(svelte@4.2.19)(typescript@5.7.3)
ts-jest: 29.1.2(@babel/core@7.23.9)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.23.9))(esbuild@0.24.2)(jest@29.7.0(@types/node@20.11.19)(ts-node@10.9.2(@types/node@20.11.19)(typescript@5.3.3)))(typescript@5.7.3)
typescript: 5.7.3
transitivePeerDependencies:
- '@babel/core'
- '@jest/types'
- babel-jest
- babel-plugin-macros
- coffeescript
- esbuild
- less
- node-notifier
- postcss
- postcss-load-config
- pug
- stylus
- sugarss
- supports-color
- ts-node
'@rush-temp/emoji@file:projects/emoji.tgz(@babel/core@7.23.9)(@jest/types@29.6.3)(@types/node@20.11.19)(babel-jest@29.7.0(@babel/core@7.23.9))(esbuild@0.24.2)(ts-node@10.9.2(@types/node@20.11.19)(typescript@5.3.3))':
dependencies:
'@types/jest': 29.5.12
'@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.3.3))(eslint@8.56.0)(typescript@5.7.3)
'@typescript-eslint/parser': 6.21.0(eslint@8.56.0)(typescript@5.7.3)
emojibase: 16.0.0
emojibase-regex: 16.0.0
eslint: 8.56.0
eslint-config-standard-with-typescript: 40.0.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.3.3))(eslint@8.56.0)(typescript@5.3.3))(eslint-plugin-import@2.29.1(eslint@8.56.0))(eslint-plugin-n@15.7.0(eslint@8.56.0))(eslint-plugin-promise@6.1.1(eslint@8.56.0))(eslint@8.56.0)(typescript@5.7.3)
eslint-plugin-import: 2.29.1(eslint@8.56.0)
eslint-plugin-n: 15.7.0(eslint@8.56.0)
eslint-plugin-promise: 6.1.1(eslint@8.56.0)
jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2(@types/node@20.11.19)(typescript@5.3.3))
prettier: 3.2.5
ts-jest: 29.1.2(@babel/core@7.23.9)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.23.9))(esbuild@0.24.2)(jest@29.7.0(@types/node@20.11.19)(ts-node@10.9.2(@types/node@20.11.19)(typescript@5.3.3)))(typescript@5.7.3)
typescript: 5.7.3
transitivePeerDependencies:
- '@babel/core'
- '@jest/types'
- '@types/node'
- babel-jest
- babel-plugin-macros
- esbuild
- node-notifier
- supports-color
- ts-node
'@rush-temp/export-assets@file:projects/export-assets.tgz(@babel/core@7.23.9)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.23.9))(esbuild@0.24.2)(svelte@4.2.19)(ts-node@10.9.2(@types/node@20.11.19)(typescript@5.3.3))':
dependencies:
'@types/jest': 29.5.12
@@ -20381,6 +20507,20 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@rush-temp/model-emoji@file:projects/model-emoji.tgz':
dependencies:
'@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.3.3))(eslint@8.56.0)(typescript@5.7.3)
'@typescript-eslint/parser': 6.21.0(eslint@8.56.0)(typescript@5.7.3)
eslint: 8.56.0
eslint-config-standard-with-typescript: 40.0.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.3.3))(eslint@8.56.0)(typescript@5.3.3))(eslint-plugin-import@2.29.1(eslint@8.56.0))(eslint-plugin-n@15.7.0(eslint@8.56.0))(eslint-plugin-promise@6.1.1(eslint@8.56.0))(eslint@8.56.0)(typescript@5.7.3)
eslint-plugin-import: 2.29.1(eslint@8.56.0)
eslint-plugin-n: 15.7.0(eslint@8.56.0)
eslint-plugin-promise: 6.1.1(eslint@8.56.0)
prettier: 3.2.5
typescript: 5.7.3
transitivePeerDependencies:
- supports-color
'@rush-temp/model-export@file:projects/model-export.tgz':
dependencies:
'@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.3.3))(eslint@8.56.0)(typescript@5.7.3)
@@ -27461,6 +27601,7 @@ snapshots:
date-fns-tz: 2.0.0(date-fns@2.30.0)
dompurify: 3.1.6
emojibase: 16.0.0
emojibase-regex: 16.0.0
eslint: 8.56.0
eslint-config-standard-with-typescript: 40.0.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.3.3))(eslint@8.56.0)(typescript@5.3.3))(eslint-plugin-import@2.29.1(eslint@8.56.0))(eslint-plugin-n@15.7.0(eslint@8.56.0))(eslint-plugin-promise@6.1.1(eslint@8.56.0))(eslint@8.56.0)(typescript@5.3.3)
eslint-plugin-import: 2.29.1(eslint@8.56.0)
@@ -31438,6 +31579,8 @@ snapshots:
emoji-regex@9.2.2: {}
emojibase-regex@16.0.0: {}
emojibase@16.0.0: {}
emojis-list@3.0.0: {}
+3
View File
@@ -243,6 +243,9 @@
"@hcengineering/communication": "^0.6.0",
"@hcengineering/communication-assets": "^0.6.0",
"@hcengineering/communication-resources": "^0.6.0",
"@hcengineering/emoji": "^0.6.0",
"@hcengineering/emoji-assets": "^0.6.0",
"@hcengineering/emoji-resources": "^0.6.0",
"electron-squirrel-startup": "~1.0.0",
"dotenv": "~16.0.0",
"electron-context-menu": "^4.0.4",
+4
View File
@@ -67,6 +67,7 @@ import { chatId } from '@hcengineering/chat'
import { inboxId } from '@hcengineering/inbox'
import { achievementId } from '@hcengineering/achievement'
import {communicationId} from '@hcengineering/communication'
import { emojiId } from '@hcengineering/emoji'
import '@hcengineering/activity-assets'
import '@hcengineering/analytics-collector-assets'
@@ -117,6 +118,7 @@ import '@hcengineering/mail-assets'
import '@hcengineering/chat-assets'
import '@hcengineering/inbox-assets'
import '@hcengineering/achievement-assets'
import '@hcengineering/emoji-assets'
import '@hcengineering/media-assets'
import '@hcengineering/communication-assets'
@@ -233,6 +235,7 @@ function configureI18n (): void {
addStringsLoader(processId, async (lang: string) => await import(`@hcengineering/process-assets/lang/${lang}.json`))
addStringsLoader(achievementId, async (lang: string) => await import(`@hcengineering/achievement-assets/lang/${lang}.json`))
addStringsLoader(communicationId, async (lang: string) => await import(`@hcengineering/communication-assets/lang/${lang}.json`))
addStringsLoader(emojiId, async (lang: string) => await import(`@hcengineering/emoji-assets/lang/${lang}.json`))
}
export async function configurePlatform (): Promise<void> {
@@ -374,6 +377,7 @@ export async function configurePlatform (): Promise<void> {
addLocation(processId, () => import(/* webpackChunkName: "process" */ '@hcengineering/process-resources'))
addLocation(achievementId, () => import(/* webpackChunkName: "achievement" */ '@hcengineering/achievement-resources'))
addLocation(communicationId, () => import(/* webpackChunkName: "communication" */ '@hcengineering/communication-resources'))
addLocation(emojiId, () => import(/* webpackChunkName: "achievement" */ '@hcengineering/emoji-resources'))
setMetadata(client.metadata.FilterModel, 'ui')
setMetadata(client.metadata.ExtraPlugins, ['preference' as Plugin])
+3
View File
@@ -274,6 +274,9 @@
"@hcengineering/communication": "^0.6.0",
"@hcengineering/communication-assets": "^0.6.0",
"@hcengineering/communication-resources": "^0.6.0",
"@hcengineering/emoji": "^0.6.0",
"@hcengineering/emoji-assets": "^0.6.0",
"@hcengineering/emoji-resources": "^0.6.0",
"@sentry/svelte": "^8.52.1",
"posthog-js": "~1.122.0",
"readable-stream": "^4.7.0",
+5 -1
View File
@@ -76,6 +76,7 @@ import { bitrixId } from '@hcengineering/bitrix'
import {inboxId} from '@hcengineering/inbox'
import {achievementId} from '@hcengineering/achievement'
import {communicationId} from '@hcengineering/communication'
import {emojiId} from '@hcengineering/emoji'
import '@hcengineering/activity-assets'
import '@hcengineering/analytics-collector-assets'
@@ -130,6 +131,7 @@ import '@hcengineering/mail-assets'
import '@hcengineering/github-assets'
import '@hcengineering/achievement-assets'
import '@hcengineering/communication-assets'
import '@hcengineering/emoji-assets'
import { coreId } from '@hcengineering/core'
import presentation, {
@@ -365,6 +367,7 @@ function configureI18n(): void {
addStringsLoader(inboxId, async (lang: string) => await import(`@hcengineering/inbox-assets/lang/${lang}.json`))
addStringsLoader(achievementId, async (lang: string) => await import(`@hcengineering/achievement-assets/lang/${lang}.json`))
addStringsLoader(communicationId, async (lang: string) => await import(`@hcengineering/communication-assets/lang/${lang}.json`))
addStringsLoader(emojiId, async (lang: string) => await import(`@hcengineering/emoji-assets/lang/${lang}.json`))
}
export async function configurePlatform() {
@@ -554,7 +557,7 @@ export async function configurePlatform() {
addLocation(uploaderId, () => import(/* webpackChunkName: "uploader" */ '@hcengineering/uploader-resources'))
addLocation(recorderId, () => import(/* webpackChunkName: "recorder" */ '@hcengineering/recorder-resources'))
addLocation(mediaId, () => import(/* webpackChunkName: "media" */ '@hcengineering/media-resources'))
addLocation(
testManagementId,
() => import(/* webpackChunkName: "test-management" */ '@hcengineering/test-management-resources')
@@ -568,6 +571,7 @@ export async function configurePlatform() {
addLocation(inboxId, () => import(/* webpackChunkName: "inbox" */ '@hcengineering/inbox-resources'))
addLocation(achievementId, () => import(/* webpackChunkName: "achievement" */ '@hcengineering/achievement-resources'))
addLocation(communicationId, () => import(/* webpackChunkName: "communication" */ '@hcengineering/communication-resources'))
addLocation(emojiId, () => import(/* webpackChunkName: "achievement" */ '@hcengineering/emoji-resources'))
setMetadata(client.metadata.FilterModel, 'ui')
setMetadata(client.metadata.ExtraPlugins, ['preference' as Plugin])
+2 -1
View File
@@ -124,6 +124,7 @@
"@hcengineering/model-server-process": "^0.6.0",
"@hcengineering/model-inbox": "^0.6.0",
"@hcengineering/model-achievement": "^0.6.0",
"@hcengineering/model-communication": "^0.6.0"
"@hcengineering/model-communication": "^0.6.0",
"@hcengineering/model-emoji": "^0.6.0"
}
}
+2
View File
@@ -117,6 +117,7 @@ import { chatId, createModel as chatModel } from '@hcengineering/model-chat'
import processes, { processId, createModel as processModel } from '@hcengineering/model-process'
import { createModel as inboxModel, inboxId } from '@hcengineering/model-inbox'
import { achievementId, createModel as achievementModel } from '@hcengineering/model-achievement'
import { emojiId, createModel as emojiModel } from '@hcengineering/model-emoji'
import { communicationId, createModel as communicationModel } from '@hcengineering/model-communication'
import { type Plugin } from '@hcengineering/platform'
@@ -458,6 +459,7 @@ export default function buildModel (): Builder {
[chatModel, chatId],
[inboxModel, inboxId],
[achievementModel, achievementId],
[emojiModel, emojiId],
[communicationModel, communicationId],
[mailModel, mailId],
+7
View File
@@ -0,0 +1,7 @@
module.exports = {
extends: ['./node_modules/@hcengineering/platform-rig/profiles/model/eslint.config.json'],
parserOptions: {
tsconfigRootDir: __dirname,
project: './tsconfig.json'
}
}
+4
View File
@@ -0,0 +1,4 @@
*
!/lib/**
!CHANGELOG.md
/lib/**/__tests__/
+5
View File
@@ -0,0 +1,5 @@
{
"$schema": "https://developer.microsoft.com/json-schemas/rig-package/rig.schema.json",
"rigPackageName": "@hcengineering/platform-rig",
"rigProfile": "model"
}
+44
View File
@@ -0,0 +1,44 @@
{
"name": "@hcengineering/model-emoji",
"version": "0.6.0",
"main": "lib/index.js",
"svelte": "src/index.ts",
"types": "types/index.d.ts",
"author": "Hardcore Engineering Inc.",
"template": "@hcengineering/model-package",
"license": "EPL-2.0",
"scripts": {
"build": "compile",
"build:watch": "compile",
"format": "format src",
"_phase:build": "compile transpile src",
"_phase:format": "format src",
"_phase:validate": "compile validate"
},
"devDependencies": {
"@hcengineering/platform-rig": "^0.6.0",
"@typescript-eslint/eslint-plugin": "^6.11.0",
"eslint-plugin-import": "^2.26.0",
"eslint-plugin-promise": "^6.1.1",
"eslint-plugin-n": "^15.4.0",
"eslint": "^8.54.0",
"@typescript-eslint/parser": "^6.11.0",
"eslint-config-standard-with-typescript": "^40.0.0",
"prettier": "^3.1.0",
"typescript": "^5.3.3"
},
"dependencies": {
"@hcengineering/core": "^0.6.32",
"@hcengineering/model": "^0.6.11",
"@hcengineering/model-core": "^0.6.0",
"@hcengineering/model-presentation": "^0.6.0",
"@hcengineering/platform": "^0.6.11",
"@hcengineering/ui": "^0.6.15",
"@hcengineering/emoji": "^0.6.0",
"@hcengineering/model-workbench": "^0.6.1",
"@hcengineering/setting": "^0.6.17",
"@hcengineering/view": "^0.6.13",
"@hcengineering/model-print": "^0.6.0",
"@hcengineering/model-tracker": "^0.6.0"
}
}
+59
View File
@@ -0,0 +1,59 @@
//
// Copyright © 2024-2025 Hardcore Engineering Inc.
//
// Licensed under the Eclipse Public License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. You may
// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//
// See the License for the specific language governing permissions and
// limitations under the License.
//
import { type Builder } from '@hcengineering/model'
import core from '@hcengineering/model-core'
import presentation from '@hcengineering/model-presentation'
import workbench from '@hcengineering/model-workbench'
import setting from '@hcengineering/setting'
import view from '@hcengineering/view'
import print from '@hcengineering/model-print'
import tracker from '@hcengineering/model-tracker'
import { DOMAIN_EMOJI, TCustomEmoji } from './models'
import emojiPlugin from './plugin'
import { AccountRole } from '@hcengineering/core'
export { emojiId } from '@hcengineering/emoji'
export { emojiPlugin as default }
export function createModel (builder: Builder): void {
builder.createModel(TCustomEmoji)
builder.createDoc(core.class.DomainIndexConfiguration, core.space.Model, {
domain: DOMAIN_EMOJI,
disabled: [{ space: 1 }, { modifiedOn: 1 }, { modifiedBy: 1 }, { createdBy: 1 }, { createdOn: -1 }]
})
builder.createDoc(setting.class.WorkspaceSettingCategory, core.space.Model, {
name: 'emojis',
label: emojiPlugin.string.CustomEmojis,
icon: emojiPlugin.icon.Emoji,
component: emojiPlugin.component.SettingsEmojiTable,
group: 'settings-editor',
role: AccountRole.User,
order: 5000
})
builder.mixin(emojiPlugin.class.CustomEmoji, core.class.Class, view.mixin.IgnoreActions, {
actions: [view.action.Open, view.action.OpenInNewTab, print.action.Print, tracker.action.NewRelatedIssue]
})
builder.createDoc(presentation.class.ComponentPointExtension, core.space.Model, {
extension: workbench.extensions.WorkbenchExtensions,
component: emojiPlugin.component.WorkbenchExtension
})
}
+32
View File
@@ -0,0 +1,32 @@
//
// Copyright © 2025 Hardcore Engineering Inc.
//
// Licensed under the Eclipse Public License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. You may
// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//
// See the License for the specific language governing permissions and
// limitations under the License.
//
import emojiPlugin from './plugin'
import { Model, Prop, ReadOnly, TypeRef, TypeString } from '@hcengineering/model'
import core, { TDoc } from '@hcengineering/model-core'
import type { Ref, Blob, Domain } from '@hcengineering/core'
import { type CustomEmoji } from '@hcengineering/emoji'
export const DOMAIN_EMOJI = 'emoji' as Domain
@Model(emojiPlugin.class.CustomEmoji, core.class.Doc, DOMAIN_EMOJI)
export class TCustomEmoji extends TDoc implements CustomEmoji {
@Prop(TypeString(), emojiPlugin.string.Shortcode)
@ReadOnly()
shortcode!: string
@Prop(TypeRef(core.class.Blob), emojiPlugin.string.Image)
@ReadOnly()
image!: Ref<Blob>
}
+9
View File
@@ -0,0 +1,9 @@
import { mergeIds } from '@hcengineering/platform'
import { type AnyComponent } from '@hcengineering/ui/src/types'
import emojiPlugin, { emojiId } from '@hcengineering/emoji'
export default mergeIds(emojiId, emojiPlugin, {
component: {
WorkbenchExtension: '' as AnyComponent
}
})
+10
View File
@@ -0,0 +1,10 @@
{
"extends": "./node_modules/@hcengineering/platform-rig/profiles/model/tsconfig.json",
"compilerOptions": {
"rootDir": "./src",
"outDir": "./lib",
"declarationDir": "./types",
"tsBuildInfoFile": ".build/build.tsbuildinfo"
}
}
@@ -13,20 +13,29 @@
// limitations under the License.
-->
<script lang="ts">
import { IconSize } from '../types'
import { fromCodePoint } from '../utils'
import { Ref, Blob } from '@hcengineering/core'
import { IconSize, fromCodePoint } from '@hcengineering/ui'
import { getBlobRef } from '../preview'
export let icon: number | number[]
export let icon: number | number[] | Ref<Blob>
export let size: IconSize
let value: string = ''
$: try {
value = Array.isArray(icon) ? fromCodePoint(...icon) : fromCodePoint(icon)
if (typeof icon !== 'string') {
value = Array.isArray(icon) ? fromCodePoint(...icon) : fromCodePoint(icon)
}
} catch (err) {}
</script>
<div class="emoji-{size} flex-row-center emoji">
{value}
{#if typeof icon !== 'string'}
{value}
{:else}
{#await getBlobRef(icon) then iconBlob}
<img src={iconBlob.src} srcset={iconBlob.srcset} alt="icon" />
{/await}
{/if}
</div>
<style lang="scss">
@@ -16,7 +16,8 @@
<script lang="ts">
import { notEmpty, SearchResultDoc } from '@hcengineering/core'
import { getResourceC } from '@hcengineering/platform'
import { Icon, type AnySvelteComponent, IconWithEmoji } from '@hcengineering/ui'
import { Icon, type AnySvelteComponent } from '@hcengineering/ui'
import IconWithEmoji from './IconWithEmoji.svelte'
export let value: SearchResultDoc
@@ -21,11 +21,11 @@
Icon,
IconFolder,
IconSize,
IconWithEmoji,
Label,
getPlatformColorDef,
themeStore
} from '@hcengineering/ui'
import IconWithEmoji from './IconWithEmoji.svelte'
import view, { IconProps } from '@hcengineering/view'
import presentation from '..'
@@ -46,7 +46,10 @@
iconProps={value.icon === iconWithEmoji && iconWithEmoji
? { icon: value.color }
: {
fill: value.color !== undefined ? getPlatformColorDef(value.color, $themeStore.dark).icon : 'currentColor'
fill:
value.color !== undefined && typeof value.color !== 'string'
? getPlatformColorDef(value.color, $themeStore.dark).icon
: 'currentColor'
}}
/>
</div>
@@ -25,7 +25,6 @@
ButtonShape,
ButtonSize,
IconFolder,
IconWithEmoji,
Label,
TooltipAlignment,
eventToHTMLElement,
@@ -41,6 +40,7 @@
import { ObjectCreate } from '../types'
import { getClient, reduceCalls } from '../utils'
import SpacesPopup from './SpacesPopup.svelte'
import IconWithEmoji from './IconWithEmoji.svelte'
export let _class: Ref<Class<Space>>
export let spaceQuery: DocumentQuery<Space> | undefined = { archived: false }
@@ -143,7 +143,7 @@
? undefined
: {
fill:
selected?.color !== undefined
selected?.color !== undefined && typeof selected?.color !== 'string'
? getPlatformColorDef(selected?.color ?? 0, $themeStore.dark).icon
: getPlatformColorForTextDef(selected?.name ?? '', $themeStore.dark).icon
}}
@@ -19,6 +19,7 @@
import NodeContent from './NodeContent.svelte'
export let node: MarkupNode
export let single = true
export let preview = false
</script>
@@ -27,9 +28,9 @@
{#if marks.length > 0}
<NodeMarks {marks}>
<NodeContent {node} {preview} />
<NodeContent {node} {single} {preview} />
</NodeMarks>
{:else}
<NodeContent {node} {preview} />
<NodeContent {node} {single} {preview} />
{/if}
{/if}
@@ -13,17 +13,23 @@
// limitations under the License.
-->
<script lang="ts">
import { Class, Doc, Ref } from '@hcengineering/core'
import { Class, Doc, Ref, Blob } from '@hcengineering/core'
import { AttrValue, MarkupNode, MarkupNodeType } from '@hcengineering/text'
import CodeBlockNode from './CodeBlockNode.svelte'
import ObjectNode from './ObjectNode.svelte'
import MarkdownNode from './MarkdownNode.svelte'
import Node from './Node.svelte'
import { getBlobRef } from '../../preview'
export let node: MarkupNode
export let single = true
export let preview = false
function toRefBlob (blobId: AttrValue): Ref<Blob> {
return blobId as Ref<Blob>
}
function toRef (objectId: string): Ref<Doc> {
return objectId as Ref<Doc>
}
@@ -78,11 +84,23 @@
{/if}
{:else if node.type === MarkupNodeType.text}
{node.text}
{:else if node.type === MarkupNodeType.emoji}
<span class="emoji" class:emojiOnly={single}>
{#if node.attrs?.kind === 'image'}
{@const blob = toRefBlob(attrs.image)}
{@const alt = toString(attrs.emoji)}
{#await getBlobRef(blob) then blobSrc}
<img src={blobSrc.src} {alt} />
{/await}
{:else}
{node.attrs?.emoji}
{/if}
</span>
{:else if node.type === MarkupNodeType.paragraph}
<p class="p-inline contrast" class:overflow-label={preview} class:emojiOnly={checkEmoji(nodes)}>
{#if nodes.length > 0}
{#each nodes as node}
<Node {node} {preview} />
<Node {node} {preview} single={nodes.length === 1} />
{/each}
{/if}
</p>
+1
View File
@@ -51,6 +51,7 @@ export { default as FileTypeIcon } from './components/FileTypeIcon.svelte'
export { default as DrawingBoard } from './components/DrawingBoard.svelte'
export { default as DrawingBoardToolbar } from './components/DrawingBoardToolbar.svelte'
export { default as Image } from './components/Image.svelte'
export { default as IconWithEmoji } from './components/IconWithEmoji.svelte'
export { default } from './plugin'
export * from './types'
export * from './utils'
+1
View File
@@ -25,6 +25,7 @@ export enum MarkupNodeType {
image = 'image',
file = 'file',
reference = 'reference',
emoji = 'emoji',
hard_break = 'hardBreak',
ordered_list = 'orderedList',
bullet_list = 'bulletList',
+1
View File
@@ -91,6 +91,7 @@ const nonEmptyNodes = [
MarkupNodeType.horizontal_rule,
MarkupNodeType.image,
MarkupNodeType.reference,
MarkupNodeType.emoji,
MarkupNodeType.subLink,
MarkupNodeType.table
]
+3
View File
@@ -267,6 +267,9 @@ export const storeNodes: Record<string, NodeProcessor> = {
// Check if test has reference mark, in this case we need to remove [[]]
state.text(node.text ?? '')
},
emoji: (state, node) => {
state.text(node.attrs?.emoji as string)
},
table: (state, node) => {
state.write(state.renderHtml(node))
state.closeBlock(node)
+2
View File
@@ -37,6 +37,7 @@ import { ImageNode, ImageOptions } from '../nodes/image'
import { MarkdownNode } from '../nodes/markdown'
import { MermaidExtension, mermaidOptions } from '../nodes/mermaid'
import { ReferenceNode } from '../nodes/reference'
import { EmojiNode } from '../nodes/emoji'
import { TodoItemNode, TodoListNode } from '../nodes/todo'
import { DefaultKit, DefaultKitOptions } from './default-kit'
@@ -103,6 +104,7 @@ export const ServerKit = Extension.create<ServerKitOptions>({
TodoItemNode,
TodoListNode,
ReferenceNode,
EmojiNode,
CommentNode,
MarkdownNode,
NodeUuid,
+144
View File
@@ -0,0 +1,144 @@
//
// Copyright © 2025 Hardcore Engineering Inc.
//
// Licensed under the Eclipse Public License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. You may
// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//
// See the License for the specific language governing permissions and
// limitations under the License.
//
import { Node, mergeAttributes } from '@tiptap/core'
import type { Blob, Ref } from '@hcengineering/core'
declare module '@tiptap/core' {
interface Commands<ReturnType> {
emoji: {
insertEmoji: (emoji: string, kind: 'unicode' | 'image', image?: Ref<Blob>) => ReturnType
}
}
}
export interface EmojiNodeOptions {
getBlobRef: (fileId: Ref<Blob>, filename?: string, size?: number) => Promise<{ src: string, srcset: string }>
}
export const EmojiNode = Node.create<EmojiNodeOptions>({
name: 'emoji',
group: 'inline',
inline: true,
atom: true,
selectable: false,
addAttributes () {
return {
emoji: {
default: ''
},
kind: {
default: 'unicode'
},
image: {
default: null
}
}
},
addCommands () {
return {
insertEmoji:
(emoji: string, kind: 'unicode' | 'image', image?: Ref<Blob>) =>
({ commands }) => {
if (kind === 'image') emoji = `:${emoji}:`
return commands.insertContent({
type: this.name,
attrs: { emoji, kind, image }
})
}
}
},
parseHTML () {
return [
{
tag: `span[data-type="${this.name}"]`
}
]
},
addNodeView () {
return ({ node, HTMLAttributes }) => {
console.log('Node view')
const container = document.createElement('span')
const containerAttributes = mergeAttributes(
{
'data-type': this.name,
class: 'emoji'
},
HTMLAttributes
)
for (const [k, v] of Object.entries(containerAttributes)) {
if (v !== null) {
container.setAttribute(k, v)
}
}
if (node.attrs.kind === 'image') {
const imgElement = document.createElement('img')
imgElement.alt = node.attrs.emoji
imgElement.setAttribute('data-type', this.name)
void this.options.getBlobRef(node.attrs.image).then((val) => {
imgElement.src = val.src
imgElement.srcset = val.srcset
})
container.append(imgElement)
} else {
container.append(node.attrs.emoji)
}
return {
dom: container
}
}
},
renderHTML ({ node, HTMLAttributes }) {
if (node.attrs.kind === 'image') {
return [
'span',
mergeAttributes(
{
'data-type': this.name,
class: 'emoji'
},
HTMLAttributes
),
[
'img',
mergeAttributes({
'data-type': this.name,
src: node.attrs.image,
alt: node.attrs.emoji
})
]
]
}
return [
'span',
mergeAttributes(
{
'data-type': this.name,
class: 'emoji'
},
HTMLAttributes
),
node.attrs.emoji
]
}
})
+1
View File
@@ -15,6 +15,7 @@
export * from './image'
export * from './reference'
export * from './emoji'
export * from './todo'
export * from './file'
export * from './codeblock'
+24 -14
View File
@@ -1,14 +1,14 @@
//
// Copyright © 2021 Anticrm Platform Contributors.
//
//
// Licensed under the Eclipse Public License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. You may
// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0
//
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//
//
// See the License for the specific language governing permissions and
// limitations under the License.
//
@@ -108,7 +108,7 @@
justify-content: space-between;
align-items: center;
background-color: var(--theme-navpanel-color);
&.vertical {
flex-direction: column;
min-width: var(--app-panel-width);
@@ -132,7 +132,7 @@
display: flex;
height: 100%;
min-height: 0;
&.header { background-color: var(--theme-comp-header-color); }
&.filled { background-color: var(--theme-bg-color); }
&.filledNav { background-color: var(--theme-navpanel-color) !important; }
@@ -144,13 +144,13 @@
min-width: 12.5rem;
max-width: 22.5rem;
width: 17.5rem;
&:not(.second) { background-color: var(--theme-navpanel-color); }
&.second.float {
background-color: var(--theme-navpanel-color);
filter: drop-shadow(2px 0 5px rgba(0, 0, 0, .2));
z-index: 460;
&:not(.inner) {
position: fixed;
top: calc(var(--status-bar-height) + 3.5rem + 1px);
@@ -301,7 +301,7 @@
width: 1rem;
height: 1rem;
border-radius: .25rem;
&.arrow {
color: var(--theme-trans-color);
@@ -446,7 +446,7 @@
width: 15rem;
padding-right: 1rem;
color: var(--theme-caption-color);
&.withDesciption {
display: flex;
flex-direction: column;
@@ -598,7 +598,7 @@
height: 2.5rem;
min-height: 2.5rem;
border-bottom: 1px solid var(--theme-divider-color);
&.high {
padding-right: 1rem;
height: 3.5rem;
@@ -619,7 +619,7 @@
min-width: 0;
font-size: 1rem;
color: var(--caption-color);
&:not(.short) { flex-grow: 1; }
}
&__header {
@@ -638,7 +638,7 @@
}
&__counter {
color: var(--theme-darker-color);
}
}
&__tag {
display: flex;
align-items: center;
@@ -668,7 +668,7 @@
display: flex;
min-width: 0;
min-height: 0;
&:not(.none-appearance) {
justify-content: center;
align-items: center;
@@ -825,7 +825,7 @@
}
&:hover .caption.hasAttachments { margin-bottom: .5rem; }
}
&:first-child {
border-top-left-radius: .75rem;
border-top-right-radius: .75rem;
@@ -861,3 +861,13 @@
padding-top: 0;
.message.outcoming { border-radius: 0.75rem 0.125rem 0.125rem 0.75rem; }
}
.emoji > img {
display: inline-block;
vertical-align: sub;
height: 1.3em;
width: auto;
margin: 0 0.05em 0 0.1em;
padding: 0;
line-height: 1;
}
+2
View File
@@ -60,6 +60,8 @@
"@hcengineering/ui": "^0.6.15",
"@hcengineering/view": "^0.6.13",
"@hcengineering/view-resources": "^0.6.0",
"@hcengineering/emoji": "^0.6.0",
"@hcengineering/emoji-resources": "^0.6.0",
"@tiptap/core": "^2.11.7",
"@tiptap/pm": "^2.11.7",
"fast-equals": "^5.2.2",
@@ -20,6 +20,9 @@
import ReactionsTooltip from './ReactionsTooltip.svelte'
import Icon from './Icon.svelte'
import { IconSize, IconComponent } from '../types'
import emojiPlugin, { emojiRegex } from '@hcengineering/emoji'
import { getBlobRef } from '@hcengineering/presentation'
import { getResource } from '@hcengineering/platform'
export let icon: IconComponent | undefined = undefined
export let iconSize: IconSize | undefined = undefined
@@ -43,7 +46,19 @@
{#if icon}
<Icon {icon} size={iconSize} />
{:else}
{emoji}
{#await getResource(emojiPlugin.functions.GetCustomEmoji) then getCustomEmojiFunction}
{@const customEmoji = getCustomEmojiFunction(emoji)}
{#if customEmoji === undefined}
{emoji}
{:else}
{@const alt = emoji}
{#await getBlobRef(customEmoji.image) then blobSrc}
<span class="emoji">
<img src={blobSrc.src} {alt} />
</span>
{/await}
{/if}
{/await}
{/if}
</div>
{#if count !== undefined}
@@ -15,12 +15,12 @@
<script lang="ts">
import { createEventDispatcher } from 'svelte'
import { EmojiPopup, showPopup } from '@hcengineering/ui'
import { showPopup } from '@hcengineering/ui'
import { getCurrentAccount, groupByArray } from '@hcengineering/core'
import { Reaction } from '@hcengineering/communication-types'
import emojiPlugin from '@hcengineering/emoji'
import ReactionPresenter from './ReactionPresenter.svelte'
import IconEmojiAdd from './icons/IconEmojiAdd.svelte'
export let reactions: Reaction[] = []
@@ -34,11 +34,11 @@
event.stopPropagation()
emojiPopupOpened = true
showPopup(
EmojiPopup,
emojiPlugin.component.EmojiPopup,
{},
event.target as HTMLElement,
(result) => {
const emoji = result?.emoji
const emoji = result?.text
emojiPopupOpened = false
if (emoji == null) {
return
@@ -63,7 +63,7 @@
on:click={() => dispatch('click', emoji)}
/>
{/each}
<ReactionPresenter icon={IconEmojiAdd} iconSize="small" active={emojiPopupOpened} on:click={handleAdd} />
<ReactionPresenter icon={emojiPlugin.icon.EmojiAdd} iconSize="small" active={emojiPopupOpened} on:click={handleAdd} />
</div>
<style lang="scss">
@@ -13,7 +13,7 @@
// limitations under the License.
-->
<script lang="ts">
import { Markup } from '@hcengineering/core'
import { Markup, type Ref, type Blob } from '@hcengineering/core'
import { IntlString } from '@hcengineering/platform'
import { EmptyMarkup, isEmptyMarkup, areEqualMarkups } from '@hcengineering/text'
import { TextEditorHandler } from '@hcengineering/text-editor'
@@ -77,6 +77,9 @@
insertText: (text) => {
editor?.insertText(text)
},
insertEmoji: (text: string, image?: Ref<Blob>) => {
editor?.insertEmoji(text, image)
},
insertMarkup: (markup) => {
editor?.insertMarkup(markup)
},
@@ -1,38 +0,0 @@
<!--
// Copyright © 2025 Hardcore Engineering Inc.
//
// Licensed under the Eclipse Public License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. You may
// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//
// See the License for the specific language governing permissions and
// limitations under the License.
-->
<script lang="ts">
import { IconSize } from '../../types'
export let size: IconSize = 'small'
</script>
<svg class="next-svg__{size}" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M12 2.75C6.89137 2.75 2.75 6.89137 2.75 12C2.75 17.1086 6.89137 21.25 12 21.25C17.1086 21.25 21.25 17.1086 21.25 12C21.25 6.89137 17.1086 2.75 12 2.75ZM1.25 12C1.25 6.06294 6.06294 1.25 12 1.25C17.9371 1.25 22.75 6.06294 22.75 12C22.75 17.9371 17.9371 22.75 12 22.75C6.06294 22.75 1.25 17.9371 1.25 12Z"
/>
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M7.54958 14.4003C7.88078 14.1516 8.35093 14.2184 8.59968 14.5496C9.37627 15.5835 10.6102 16.25 12 16.25C13.3898 16.25 14.6237 15.5835 15.4003 14.5496C15.6491 14.2184 16.1192 14.1516 16.4504 14.4003C16.7816 14.6491 16.8484 15.1192 16.5997 15.4504C15.552 16.8453 13.8816 17.75 12 17.75C10.1184 17.75 8.44797 16.8453 7.40031 15.4504C7.15155 15.1192 7.21838 14.6491 7.54958 14.4003Z"
/>
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M7 9C7 8.44772 7.44772 8 8 8H8.00897C8.56125 8 9.00897 8.44772 9.00897 9C9.00897 9.55228 8.56125 10 8.00897 10H8C7.44772 10 7 9.55228 7 9ZM14.991 9C14.991 8.44772 15.4387 8 15.991 8H16C16.5523 8 17 8.44772 17 9C17 9.55228 16.5523 10 16 10H15.991C15.4387 10 14.991 9.55228 14.991 9Z"
/>
</svg>
@@ -1,38 +0,0 @@
<!--
// Copyright © 2025 Hardcore Engineering Inc.
//
// Licensed under the Eclipse Public License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. You may
// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//
// See the License for the specific language governing permissions and
// limitations under the License.
-->
<script lang="ts">
import { IconSize } from '../../types'
export let size: IconSize = 'small'
</script>
<svg class="next-svg__{size}" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
<path
d="M20.2502 0.99996C20.2502 0.585746 19.9143 0.249978 19.5001 0.25C19.0859 0.250022 18.7502 0.585826 18.7502 1.00004L18.7503 3.75032L16 3.75019C15.5858 3.75017 15.25 4.08594 15.25 4.50015C15.25 4.91436 15.5857 5.25017 16 5.25019L18.7504 5.25032L18.7505 8.00004C18.7506 8.41425 19.0864 8.75002 19.5006 8.75C19.9148 8.74998 20.2506 8.41417 20.2505 7.99996L20.2504 5.2504L23 5.25054C23.4142 5.25056 23.75 4.91479 23.75 4.50057C23.75 4.08636 23.4143 3.75056 23 3.75054L20.2503 3.7504L20.2502 0.99996Z"
/>
<path
d="M6.02763 3.0617C7.79545 1.88048 9.87386 1.25 12 1.25C12.4142 1.25 12.75 1.58579 12.75 2C12.75 2.41421 12.4142 2.75 12 2.75C10.1705 2.75 8.38213 3.2925 6.86098 4.30891C5.33983 5.32531 4.15423 6.76996 3.45412 8.46018C2.75401 10.1504 2.57083 12.0103 2.92774 13.8046C3.28465 15.5989 4.16563 17.2471 5.45927 18.5407C6.7529 19.8344 8.40109 20.7154 10.1954 21.0723C11.9897 21.4292 13.8496 21.246 15.5398 20.5459C17.23 19.8458 18.6747 18.6602 19.6911 17.139C20.7075 15.6179 21.25 13.8295 21.25 12C21.25 11.5858 21.5858 11.25 22 11.25C22.4142 11.25 22.75 11.5858 22.75 12C22.75 14.1261 22.1195 16.2046 20.9383 17.9724C19.7571 19.7402 18.0782 21.1181 16.1139 21.9317C14.1495 22.7453 11.9881 22.9582 9.90278 22.5434C7.81749 22.1287 5.90202 21.1048 4.39861 19.6014C2.89519 18.098 1.87135 16.1825 1.45656 14.0972C1.04177 12.0119 1.25466 9.85046 2.0683 7.88615C2.88194 5.92185 4.2598 4.24293 6.02763 3.0617Z"
/>
<path
d="M12 19C13.8962 19 15.4889 17.7202 15.9362 15.9899C16.1443 15.1848 15.8422 15 15.0461 15H8.95386C8.15776 15 7.8557 15.1848 8.0638 15.9899C8.51109 17.7202 10.1038 19 12 19Z"
/>
<path
d="M8.5 12C9.32843 12 10 11.3284 10 10.5C10 9.67157 9.32843 9 8.5 9C7.67157 9 7 9.67157 7 10.5C7 11.3284 7.67157 12 8.5 12Z"
/>
<path
d="M17 10.5C17 11.3284 16.3284 12 15.5 12C14.6716 12 14 11.3284 14 10.5C14 9.67157 14.6716 9 15.5 9C16.3284 9 17 9.67157 17 10.5Z"
/>
</svg>
@@ -14,11 +14,11 @@
-->
<script lang="ts">
import { showPopup, EmojiPopup } from '@hcengineering/ui'
import { showPopup } from '@hcengineering/ui'
import { Message } from '@hcengineering/communication-types'
import { createEventDispatcher } from 'svelte'
import emojiPlugin from '@hcengineering/emoji'
import IconEmoji from '../icons/IconEmoji.svelte'
import IconMessageMultiple from '../icons/IconMessageMultiple.svelte'
import IconPen from '../icons/IconPen.svelte'
import uiNext from '../../plugin'
@@ -41,17 +41,17 @@
id: 'emoji',
label: uiNext.string.Emoji,
icon: IconEmoji,
icon: emojiPlugin.icon.Emoji,
order: 10,
action: (event: MouseEvent): void => {
isOpened = true
showPopup(
EmojiPopup,
emojiPlugin.component.EmojiPopup,
{},
event.target as HTMLElement,
async (result) => {
isOpened = false
const emoji = result?.emoji
const emoji = result?.text
if (emoji == null) {
return
}
@@ -18,12 +18,13 @@
import { getClient } from '@hcengineering/presentation'
import cardPlugin, { Card } from '@hcengineering/card'
import { getCurrentAccount, Ref } from '@hcengineering/core'
import { EmojiPopup, getEventPositionElement, showPopup, Action as MenuAction } from '@hcengineering/ui'
import { getEventPositionElement, showPopup, Action as MenuAction } from '@hcengineering/ui'
import { personByPersonIdStore } from '@hcengineering/contact-resources'
import type { SocialID } from '@hcengineering/communication-types'
import { AttachmentPreview } from '@hcengineering/attachment-resources'
import { Message, MessageType } from '@hcengineering/communication-types'
import { openDoc } from '@hcengineering/view-resources'
import emojiPlugin from '@hcengineering/emoji'
import ReactionsList from '../ReactionsList.svelte'
import Menu from '../Menu.svelte'
@@ -31,7 +32,6 @@
import MessageReplies from './MessageReplies.svelte'
import { toggleReaction, replyToThread } from '../../utils'
import MessageActionsPanel from './MessageActionsPanel.svelte'
import IconEmoji from '../icons/IconEmoji.svelte'
import IconMessageMultiple from '../icons/IconMessageMultiple.svelte'
import IconPen from '../icons/IconPen.svelte'
import MessageBody from './MessageBody.svelte'
@@ -120,14 +120,14 @@
if (message.thread == null) {
actions.push({
label: uiNext.string.Emoji,
icon: IconEmoji,
icon: emojiPlugin.icon.Emoji,
action: async (): Promise<void> => {
showPopup(
EmojiPopup,
emojiPlugin.component.EmojiPopup,
{},
event.target as HTMLElement,
async (result) => {
const emoji = result?.emoji
const emoji = result?.text
if (emoji == null) {
return
}
+5 -5
View File
@@ -12,7 +12,6 @@
// See the License for the specific language governing permissions and
// limitations under the License.
//
import { EmojiPopup, showPopup } from '@hcengineering/ui'
import {
fillDefaults,
generateId,
@@ -23,6 +22,7 @@ import {
SortingOrder
} from '@hcengineering/core'
import { markupToJSON, jsonToMarkup, markupToText } from '@hcengineering/text'
import { showPopup } from '@hcengineering/ui'
import { markupToMarkdown, markdownToMarkup } from '@hcengineering/text-markdown'
import { type Message } from '@hcengineering/communication-types'
import { getClient, getCommunicationClient } from '@hcengineering/presentation'
@@ -33,19 +33,19 @@ import { getEmployeeBySocialId } from '@hcengineering/contact'
import { get } from 'svelte/store'
import chat from '@hcengineering/chat'
import { makeRank } from '@hcengineering/rank'
import emojiPlugin from '@hcengineering/emoji'
import IconAt from './components/icons/IconAt.svelte'
import IconEmoji from './components/icons/IconEmoji.svelte'
import { type TextInputAction } from './types'
import uiNext from './plugin'
export const defaultMessageInputActions: TextInputAction[] = [
{
label: uiNext.string.Emoji,
icon: IconEmoji,
icon: emojiPlugin.icon.Emoji,
action: (element, editorHandler) => {
showPopup(
EmojiPopup,
emojiPlugin.component.EmojiPopup,
{},
element,
(emoji) => {
@@ -53,7 +53,7 @@ export const defaultMessageInputActions: TextInputAction[] = [
return
}
editorHandler.insertText(emoji)
editorHandler.insertEmoji(emoji.text, emoji.image)
editorHandler.focus()
},
() => {}
-18
View File
@@ -77,24 +77,6 @@
"MM": "MM",
"YYYY": "RRRR",
"HH": "HH",
"SmileysAndPeople": "Smajlíky & Lidé",
"Components": "Součást",
"AnimalsAndNature": "Zvířata & Příroda",
"FoodAndDrink": "Jídlo & Pití",
"TravelAndPlaces": "Cestování a místa",
"Activities": "Aktivita",
"Objects": "Objekty",
"Symbols": "Symboly",
"Flags": "Příznak",
"FrequentlyUsed": "Často používané",
"GettingWorkDone": "Dokončování práce",
"DefaultSkinTone": "Výchozí tón pleti",
"NoTone": "Žádný tón",
"Light": "Světlo",
"MediumLight": "Středně světlý",
"Medium": "Střední",
"MediumDark": "Středně tmavý",
"Dark": "Tmavý",
"Remove": "Odstranit",
"NoResults": "Žádné Výsledky",
"MoreCount": "Ještě {count}",
-18
View File
@@ -77,24 +77,6 @@
"MM": "MM",
"YYYY": "JJJJ",
"HH": "HH",
"SmileysAndPeople": "Smileys & Personen",
"Components": "Hauptkomponenten",
"AnimalsAndNature": "Tiere & Natur",
"FoodAndDrink": "Essen & Trinken",
"TravelAndPlaces": "Reisen & Orte",
"Activities": "Aktivitäten",
"Objects": "Objekte",
"Symbols": "Symbole",
"Flags": "Flags",
"FrequentlyUsed": "Häufig verwendet",
"GettingWorkDone": "Arbeit erledigen",
"DefaultSkinTone": "Standard-Hautton",
"NoTone": "Kein Ton",
"Light": "Leicht",
"MediumLight": "Mittelhell",
"Medium": "Mittel",
"MediumDark": "Mitteldunkel",
"Dark": "Dunkel",
"Remove": "Entfernen",
"NoResults": "Keine Ergebnisse",
"MoreCount": "{count} weitere",
-18
View File
@@ -77,24 +77,6 @@
"MM": "MM",
"YYYY": "YYYY",
"HH": "HH",
"SmileysAndPeople": "Smileys & People",
"Components": "Components",
"AnimalsAndNature": "Animals & Nature",
"FoodAndDrink": "Food & Drink",
"TravelAndPlaces": "Travel & Places",
"Activities": "Activities",
"Objects": "Objects",
"Symbols": "Symbols",
"Flags": "Flags",
"FrequentlyUsed": "Frequently used",
"GettingWorkDone": "Getting work done",
"DefaultSkinTone": "Default skin tone",
"NoTone": "No tone",
"Light": "Light",
"MediumLight": "Medium-light",
"Medium": "Medium",
"MediumDark": "Medium-dark",
"Dark": "Dark",
"Remove": "Remove",
"NoResults": "No Results",
"MoreCount": "{count} more",
-18
View File
@@ -77,24 +77,6 @@
"MM": "MM",
"YYYY": "AAAA",
"HH": "HH",
"SmileysAndPeople": "Emoticonos y Personas",
"Components": "Componentes",
"AnimalsAndNature": "Animales y Naturaleza",
"FoodAndDrink": "Comida y Bebida",
"TravelAndPlaces": "Viajes y lugares",
"Activities": "Actividades",
"Objects": "Objetos",
"Symbols": "Símbolos",
"Flags": "Banderas",
"FrequentlyUsed": "De uso frecuente",
"GettingWorkDone": "Haciendo el trabajo",
"DefaultSkinTone": "Tono de piel predeterminado",
"NoTone": "Sin tono",
"Light": "Claro",
"MediumLight": "Medio-Сlaro",
"Medium": "Medio",
"MediumDark": "Medio-Oscuro",
"Dark": "Oscuro",
"Remove": "Eliminar",
"NoResults": "Sin Resultados",
"MoreCount": "{count} más",
-18
View File
@@ -77,24 +77,6 @@
"MM": "MM",
"YYYY": "AAAA",
"HH": "HH",
"SmileysAndPeople": "Smileys & Personnes",
"Components": "Composants",
"AnimalsAndNature": "Animaux & Nature",
"FoodAndDrink": "Nourriture & Boissons",
"TravelAndPlaces": "Voyages & Lieux",
"Activities": "Activités",
"Objects": "Objets",
"Symbols": "Symboles",
"Flags": "Drapeaux",
"FrequentlyUsed": "Fréquemment utilisé",
"GettingWorkDone": "Faire le travail",
"DefaultSkinTone": "Teint par défaut",
"NoTone": "Pas de tonalité",
"Light": "Clair",
"MediumLight": "Moyen-clair",
"Medium": "Moyen",
"MediumDark": "Moyen-foncé",
"Dark": "Foncé",
"Remove": "Supprimer",
"NoResults": "Aucun Résultat",
"MoreCount": "{count} de plus",
-18
View File
@@ -77,24 +77,6 @@
"MM": "MM",
"YYYY": "AAAA",
"HH": "HH",
"SmileysAndPeople": "Faccine & Persone",
"Components": "Componente",
"AnimalsAndNature": "Animali & Natura",
"FoodAndDrink": "Cibo & Bevande",
"TravelAndPlaces": "Viaggi e luoghi",
"Activities": "Attivita",
"Objects": "Oggetti",
"Symbols": "Simboli",
"Flags": "Bandiera",
"FrequentlyUsed": "Usato frequentemente",
"GettingWorkDone": "Completamento del lavoro",
"DefaultSkinTone": "Tono della pelle predefinito",
"NoTone": "Nessun tono",
"Light": "Chiaro",
"MediumLight": "Medio-chiaro",
"Medium": "Medio",
"MediumDark": "Medio-scuro",
"Dark": "Scuro",
"Remove": "Rimuovere",
"NoResults": "Nessun risultato",
"MoreCount": "{count} in più",
-19
View File
@@ -77,24 +77,6 @@
"MM": "MM",
"YYYY": "YYYY",
"HH": "HH",
"SmileysAndPeople": "スマイリーと人",
"Components": "構成要素",
"AnimalsAndNature": "動物と自然",
"FoodAndDrink": "食べ物と飲み物",
"TravelAndPlaces": "旅行と場所",
"Activities": "アクティビティ",
"Objects": "物",
"Symbols": "記号",
"Flags": "旗",
"FrequentlyUsed": "よく使う絵文字",
"GettingWorkDone": "仕事でよく使う絵文字",
"DefaultSkinTone": "デフォルトの肌の色",
"NoTone": "トーンなし",
"Light": "明るい",
"MediumLight": "やや明るい",
"Medium": "中間",
"MediumDark": "やや暗い",
"Dark": "暗い",
"Remove": "削除",
"NoResults": "結果なし",
"MoreCount": "他 {count} 件",
@@ -119,4 +101,3 @@
"MonthsWOValue": "{months, plural, =1 {か月} other {か月}}"
}
}
-18
View File
@@ -77,24 +77,6 @@
"MM": "MM",
"YYYY": "AAAA",
"HH": "HH",
"SmileysAndPeople": "Carinhas & Pessoas",
"Components": "Componentes",
"AnimalsAndNature": "Animais & Natureza",
"FoodAndDrink": "Alimentos & Bebidas",
"TravelAndPlaces": "Viagens e Locais",
"Activities": "Actividades",
"Objects": "Objetos",
"Symbols": "Símbolos",
"Flags": "Bandeiras",
"FrequentlyUsed": "Frequentemente utilizado",
"GettingWorkDone": "A fazer",
"DefaultSkinTone": "Tom de pele padrão",
"NoTone": "Sem tom",
"Light": "Claro",
"MediumLight": "Médio Claro",
"Medium": "Médio",
"MediumDark": "Médio Escuro",
"Dark": "Escuro",
"Remove": "Remover",
"NoResults": "Sem Resultados",
"MoreCount": "{count} mais",
-18
View File
@@ -77,24 +77,6 @@
"MM": "ММ",
"YYYY": "ГГГГ",
"HH": "ЧЧ",
"SmileysAndPeople": "Эмоции & Люди",
"Components": "Компоненты",
"AnimalsAndNature": "Животные & Природа",
"FoodAndDrink": "Еда & Напитки",
"TravelAndPlaces": "Путешествия & Места",
"Activities": "Варианты досуга",
"Objects": "Объекты",
"Symbols": "Символы",
"Flags": "Флаги",
"FrequentlyUsed": "Часто используемые",
"GettingWorkDone": "Для работы",
"DefaultSkinTone": "Тон кожи по умолчанию",
"NoTone": "Без тона",
"Light": "Cветлый",
"MediumLight": "Cредне-светлый",
"Medium": "Средний",
"MediumDark": "Средне-темный",
"Dark": "Темный",
"Remove": "Удалить",
"NoResults": "Никаких результатов",
"MoreCount": "Ещё {count}",
-18
View File
@@ -77,24 +77,6 @@
"MM": "月",
"YYYY": "年",
"HH": "小时",
"SmileysAndPeople": "微笑与人",
"Components": "组件",
"AnimalsAndNature": "动物与自然",
"FoodAndDrink": "食物及饮品",
"TravelAndPlaces": "旅行和地点",
"Activities": "活动",
"Objects": "物体",
"Symbols": "符号",
"Flags": "旗帜",
"FrequentlyUsed": "经常使用",
"GettingWorkDone": "完成工作",
"DefaultSkinTone": "默认肤色",
"NoTone": "违约情况",
"Light": "光",
"MediumLight": "中光",
"Medium": "中等",
"MediumDark": "中暗",
"Dark": "黑暗",
"Remove": "移走",
"NoResults": "没有结果",
"MoreCount": "还有 {count} 个",
+1
View File
@@ -48,6 +48,7 @@
"date-fns-tz": "^2.0.0",
"dompurify": "^3.1.6",
"emojibase": "^16.0.0",
"emojibase-regex": "^16.0.0",
"fast-equals": "^5.2.2",
"hls.js": "^1.5.20",
"plyr": "^3.7.8",
@@ -1,20 +0,0 @@
<script lang="ts">
//
// © 2025 Hardcore Engineering, Inc. All Rights Reserved.
// Licensed under the Eclipse Public License v2.0 (SPDX: EPL-2.0).
//
export let size: 'small' | 'medium' | 'large' | 'x-large'
const fill: string = 'currentColor'
</script>
<svg class="svg-{size}" viewBox="0 0 24 24" {fill} xmlns="http://www.w3.org/2000/svg">
<path
d="M12,7.8c0.4,0,0.8-0.3,0.8-0.8S12.4,6.2,12,6.2c-3.2,0-5.8,2.6-5.8,5.8c0,3.2,2.6,5.8,5.8,5.8c3.2,0,5.8-2.6,5.8-5.8c0-0.4-0.3-0.8-0.8-0.8s-0.8,0.3-0.8,0.8c0,2.3-1.9,4.2-4.2,4.2c-2.3,0-4.2-1.9-4.2-4.2C7.8,9.7,9.7,7.8,12,7.8z"
/>
<path
d="M21.7,10.9c0-0.4-0.4-0.7-0.8-0.7c-0.4,0-0.7,0.4-0.7,0.8c0.1,0.6,0.1,1.2,0,1.8c-0.2,2.2-1.3,4.2-3.1,5.5c-1.7,1.4-3.9,2-6.1,1.8c-2.2-0.2-4.2-1.3-5.5-3.1c-1.4-1.7-2-3.9-1.8-6.1C4,8.9,5.1,6.9,6.8,5.6s3.9-2,6.1-1.8c0.4,0.1,0.8-0.2,0.8-0.7c0-0.4-0.2-0.8-0.7-0.8C10.5,2,7.9,2.8,5.9,4.4c-2,1.6-3.3,3.9-3.6,6.5C2,13.5,2.8,16,4.4,18.1c1.6,2,3.9,3.3,6.5,3.6c0.4,0,0.7,0.1,1.1,0.1c2.2,0,4.3-0.7,6.1-2.1c2-1.6,3.3-3.9,3.6-6.5C21.8,12.4,21.8,11.6,21.7,10.9z"
/>
<path
d="M12.6,10.4c-0.2-0.1-0.4-0.1-0.6-0.1c-1,0-1.8,0.8-1.8,1.8s0.8,1.8,1.8,1.8s1.8-0.8,1.8-1.8c0-0.2,0-0.4-0.1-0.6l1.7-1.7H18c0.2,0,0.4-0.1,0.5-0.2l3-3c0.2-0.2,0.3-0.5,0.2-0.8c-0.1-0.3-0.4-0.5-0.7-0.5h-2.2V3c0-0.3-0.2-0.6-0.5-0.7c-0.3-0.1-0.6-0.1-0.8,0.2l-3,3c-0.1,0.1-0.2,0.3-0.2,0.5v2.7L12.6,10.4z M15.8,6.3l1.5-1.5V6c0,0.4,0.3,0.8,0.8,0.8h1.2l-1.5,1.5h-1.9V6.3z"
/>
</svg>
@@ -1,16 +0,0 @@
<script lang="ts">
//
// © 2025 Hardcore Engineering, Inc. All Rights Reserved.
// Licensed under the Eclipse Public License v2.0 (SPDX: EPL-2.0).
//
export let size: 'small' | 'medium' | 'large' | 'x-large'
const fill: string = 'currentColor'
</script>
<svg class="svg-{size}" viewBox="0 0 24 24" {fill} xmlns="http://www.w3.org/2000/svg">
<path d="M10,9.8c-0.7,0-1.2,0.6-1.2,1.3s0.6,1.2,1.2,1.2s1.2-0.6,1.2-1.2v0C11.2,10.3,10.7,9.8,10,9.8z" />
<path d="M14,9.8c-0.7,0-1.2,0.6-1.2,1.3s0.6,1.2,1.2,1.2s1.2-0.6,1.2-1.2v0C15.2,10.3,14.7,9.8,14,9.8z" />
<path
d="M21.7,10.6l-2-6.8c-0.1-0.4-0.5-0.6-0.8-0.5l-6,1c0,0,0,0,0,0h-1.7c0,0,0,0,0,0l-6-1C4.7,3.2,4.4,3.4,4.3,3.8l-2,6.9c-0.1,0.6,0.1,1.3,0.6,1.7c0.3,0.3,0.7,0.4,1.1,0.4c0.1,0,0.2,0,0.3,0c0.8,5.3,2.7,8,5.7,8h4c3,0,4.9-2.7,5.7-8c0.1,0,0.2,0,0.3,0c0.4,0,0.8-0.1,1.1-0.4C21.6,11.9,21.9,11.3,21.7,10.6z M3.8,11.2c-0.1,0-0.1-0.1-0.1-0.2l1.8-6.2l4,0.6l-5.3,5.7C4.1,11.3,3.9,11.3,3.8,11.2z M14,19.2h-1.2V18c0-0.1,0-0.2-0.1-0.4c0.7-0.2,1.1-0.8,1.1-1.6c0-0.4-0.3-0.8-0.8-0.8h-2c-0.4,0-0.8,0.3-0.8,0.8c0,0.8,0.4,1.4,1.1,1.6c-0.1,0.1-0.1,0.2-0.1,0.4v1.2H10c-2.2,0-3.6-2.5-4.3-7.3c0-0.1,0-0.1,0-0.1l5.6-6h1.4l5.6,6c0,0,0,0.1,0,0.1C17.6,16.8,16.2,19.2,14,19.2z M20.2,11.2c-0.1,0.1-0.3,0.1-0.4,0l-5.3-5.7l4-0.6l1.8,6.1C20.3,11.1,20.2,11.1,20.2,11.2z"
/>
</svg>
@@ -1,14 +0,0 @@
<script lang="ts">
//
// © 2025 Hardcore Engineering, Inc. All Rights Reserved.
// Licensed under the Eclipse Public License v2.0 (SPDX: EPL-2.0).
//
export let size: 'small' | 'medium' | 'large' | 'x-large'
const fill: string = 'currentColor'
</script>
<svg class="svg-{size}" viewBox="0 0 24 24" {fill} xmlns="http://www.w3.org/2000/svg">
<path
d="M19.3,4.3c-0.3-0.1-0.6-0.1-0.8,0.2c-1.6,1.6-4.3,1.6-5.9,0c-2.2-2.2-5.8-2.2-8,0C4.3,4.6,4.2,4.8,4.2,5v9v7c0,0.4,0.3,0.8,0.8,0.8s0.8-0.3,0.8-0.8v-6.6c1.7-1.4,4.2-1.4,5.7,0.2c1.1,1.1,2.6,1.6,4,1.6s2.9-0.5,4-1.6c0.1-0.1,0.2-0.3,0.2-0.5V5C19.8,4.7,19.6,4.4,19.3,4.3z M18.2,13.7c-1.7,1.4-4.2,1.3-5.7-0.2c-1.1-1.1-2.6-1.6-4-1.6c-0.9,0-1.9,0.2-2.8,0.7V5.3C7.4,3.9,9.9,4,11.5,5.5c1.8,1.8,4.6,2.1,6.8,0.9V13.7z"
/>
</svg>
@@ -1,20 +0,0 @@
<script lang="ts">
//
// © 2025 Hardcore Engineering, Inc. All Rights Reserved.
// Licensed under the Eclipse Public License v2.0 (SPDX: EPL-2.0).
//
export let size: 'small' | 'medium' | 'large' | 'x-large'
const fill: string = 'currentColor'
</script>
<svg class="svg-{size}" viewBox="0 0 24 24" {fill} xmlns="http://www.w3.org/2000/svg">
<path
d="M7.6,7.6C7.7,7.7,7.8,7.8,8,7.8c0.2,0,0.5-0.1,0.6-0.3c0.2-0.3,0.2-0.8-0.2-1C8,6.1,7.7,5.6,7.8,5c0-0.5,0.2-1.1,0.7-1.4c0.3-0.2,0.4-0.7,0.2-1c-0.2-0.3-0.7-0.4-1-0.2C6.7,3,6.2,4,6.2,5C6.2,6,6.7,7,7.6,7.6z"
/>
<path
d="M11.6,7.6c0.1,0.1,0.3,0.1,0.4,0.1c0.2,0,0.5-0.1,0.6-0.3c0.2-0.3,0.2-0.8-0.2-1C12,6.1,11.7,5.6,11.8,5c0-0.5,0.2-1.1,0.7-1.4c0.3-0.2,0.4-0.7,0.2-1c-0.2-0.3-0.7-0.4-1-0.2C10.7,3,10.2,4,10.2,5C10.2,6,10.7,7,11.6,7.6z"
/>
<path
d="M19.6,10.6c-0.6-0.3-1.2-0.4-1.8-0.3V10c0-0.4-0.3-0.8-0.8-0.8H3c-0.4,0-0.8,0.3-0.8,0.8v5c0,3.7,3,6.8,6.8,6.8h2c2.8,0,5.2-1.7,6.2-4.1c0.3,0.1,0.5,0.1,0.8,0.1c0.4,0,0.9-0.1,1.3-0.2c0.9-0.3,1.7-1,2.1-2C22.3,13.7,21.4,11.5,19.6,10.6zM16.2,10.8v0.4c0,0,0,0,0,0v1.6c-0.8-0.3-1.7-0.5-2.7-0.5c-1.5,0-3,0.4-4,1.2c-0.7,0.5-1.8,0.8-3.1,0.8c-1.1,0-2-0.2-2.7-0.7v-2.8H16.2z M11,20.2H9c-2.8,0-5.1-2.2-5.2-5c0.8,0.3,1.7,0.5,2.6,0.5c0.1,0,0.1,0,0.2,0c1.5,0,2.9-0.4,3.9-1.2c0.7-0.5,1.8-0.8,3-0.8c0.1,0,0.1,0,0.2,0c1,0,2,0.2,2.7,0.7V15C16.2,17.9,13.9,20.2,11,20.2z M20,14.9c-0.2,0.5-0.7,1-1.3,1.2c-0.4,0.1-0.8,0.2-1.1,0.1c0.1-0.4,0.1-0.8,0.1-1.2v-3.2c0.4,0,0.8,0,1.2,0.2C20.1,12.5,20.6,13.8,20,14.9z"
/>
</svg>
@@ -1,17 +0,0 @@
<script lang="ts">
//
// © 2025 Hardcore Engineering, Inc. All Rights Reserved.
// Licensed under the Eclipse Public License v2.0 (SPDX: EPL-2.0).
//
export let size: 'small' | 'medium' | 'large' | 'x-large'
const fill: string = 'currentColor'
</script>
<svg class="svg-{size}" viewBox="0 0 24 24" {fill} xmlns="http://www.w3.org/2000/svg">
<path
d="M12,7.2c-0.4,0-0.8,0.3-0.8,0.8v4c0,0.2,0.1,0.4,0.2,0.5l2,2c0.1,0.1,0.3,0.2,0.5,0.2s0.4-0.1,0.5-0.2c0.3-0.3,0.3-0.8,0-1.1l-1.8-1.8V8C12.8,7.6,12.4,7.2,12,7.2z"
/>
<path
d="M19.6,5.8c-1.6-2-4-3.3-6.6-3.5C7.6,1.7,2.8,5.6,2.3,10.9c0,0.4,0.3,0.8,0.7,0.8c0.4,0,0.8-0.3,0.8-0.7c0.5-4.5,4.5-7.8,9-7.4C15,3.9,17,5,18.4,6.7c1.4,1.7,2,3.9,1.8,6c-0.2,2.2-1.3,4.2-3,5.6c-1.7,1.4-3.9,2-6,1.8c-2.8-0.3-5.2-2-6.5-4.4H8c0.4,0,0.8-0.3,0.8-0.8S8.5,14.2,8,14.2H3.6c0,0,0,0,0,0H3c-0.4,0-0.8,0.3-0.8,0.8v5c0,0.4,0.3,0.8,0.8,0.8s0.8-0.3,0.8-0.8v-2.8c1.6,2.5,4.2,4.1,7.2,4.4c0.3,0,0.7,0.1,1,0.1c2.2,0,4.4-0.8,6.1-2.2c2-1.6,3.3-4,3.5-6.6C22,10.3,21.2,7.8,19.6,5.8z"
/>
</svg>
@@ -1,14 +0,0 @@
<script lang="ts">
//
// © 2025 Hardcore Engineering, Inc. All Rights Reserved.
// Licensed under the Eclipse Public License v2.0 (SPDX: EPL-2.0).
//
export let size: 'small' | 'medium' | 'large' | 'x-large'
const fill: string = 'currentColor'
</script>
<svg class="svg-{size}" viewBox="0 0 24 24" {fill} xmlns="http://www.w3.org/2000/svg">
<path
d="M11,21.8c-0.1,0-0.2,0-0.2,0c-0.3-0.1-0.5-0.4-0.5-0.7v-6.2H5c-0.3,0-0.5-0.2-0.7-0.4c-0.1-0.3-0.1-0.6,0.1-0.8l8-11c0.2-0.3,0.5-0.4,0.8-0.3c0.3,0.1,0.5,0.4,0.5,0.7v6.2H19c0.3,0,0.5,0.2,0.7,0.4s0.1,0.6-0.1,0.8l-8,11C11.5,21.6,11.2,21.8,11,21.8z M6.5,13.2H11c0.4,0,0.8,0.3,0.8,0.8v4.7l5.8-7.9H13c-0.4,0-0.8-0.3-0.8-0.8V5.3L6.5,13.2z"
/>
</svg>
@@ -1,15 +0,0 @@
<script lang="ts">
//
// © 2025 Hardcore Engineering, Inc. All Rights Reserved.
// Licensed under the Eclipse Public License v2.0 (SPDX: EPL-2.0).
//
export let size: 'small' | 'medium' | 'large' | 'x-large'
const fill: string = 'currentColor'
</script>
<svg class="svg-{size}" viewBox="0 0 24 24" {fill} xmlns="http://www.w3.org/2000/svg">
<path
d="M20.7,6.9l-3.6-3.6c-1.4-1.4-3.7-1.4-5.1,0L9.3,6C8.6,6.6,8.2,7.6,8.2,8.5c0,0.9,0.3,1.7,0.8,2.3l-1.6,1.6c-0.1,0.1-0.2,0.3-0.2,0.5v1.2H6c-0.4,0-0.8,0.3-0.8,0.8v1.2H4c-0.2,0-0.4,0.1-0.5,0.2l-0.6,0.6c-0.4,0.5-0.6,1.1-0.6,1.8l0,1.2l0,0.2c0.1,0.9,0.9,1.5,1.7,1.5l1.2,0l0.2,0c0.6-0.1,1.2-0.3,1.7-0.8l6-6c1.4,1.2,3.6,1.1,4.9-0.2l2.6-2.6C22.1,10.6,22.1,8.3,20.7,6.9z M19.6,11L17,13.6c-0.8,0.8-2.2,0.8-3,0l-0.3-0.3c-0.3-0.3-0.8-0.3-1.1,0l-6.6,6.6c-0.2,0.2-0.5,0.3-0.7,0.4l-1.3,0c-0.1,0-0.2-0.1-0.2-0.2l0-1.2c0-0.3,0.1-0.6,0.3-0.8l0.3-0.3H6c0.4,0,0.8-0.3,0.8-0.8v-1.2H8c0.4,0,0.8-0.3,0.8-0.8v-1.7l1.9-1.9c0.1-0.1,0.2-0.3,0.2-0.5c0-0.2-0.1-0.4-0.2-0.5L10.4,10c-0.8-0.8-0.8-2.2,0-3L13,4.4c0.8-0.8,2.2-0.8,3,0L19.6,8C20.5,8.8,20.5,10.2,19.6,11z"
/>
<path d="M15,7.8L15,7.8c-0.7,0-1.3,0.6-1.3,1.2s0.6,1.2,1.3,1.2s1.2-0.6,1.2-1.2S15.7,7.8,15,7.8z" />
</svg>
@@ -1,14 +0,0 @@
<script lang="ts">
//
// © 2025 Hardcore Engineering, Inc. All Rights Reserved.
// Licensed under the Eclipse Public License v2.0 (SPDX: EPL-2.0).
//
export let size: 'small' | 'medium' | 'large' | 'x-large'
const fill: string = 'currentColor'
</script>
<svg class="svg-{size}" viewBox="0 0 24 24" {fill} xmlns="http://www.w3.org/2000/svg">
<path
d="M21.5,20.5L16,14.9c1.1-1.3,1.8-3.1,1.8-4.9c0-4.3-3.5-7.8-7.8-7.8S2.2,5.7,2.2,10s3.5,7.8,7.8,7.8c1.9,0,3.6-0.7,4.9-1.8l5.5,5.5c0.1,0.1,0.3,0.2,0.5,0.2s0.4-0.1,0.5-0.2C21.8,21.2,21.8,20.8,21.5,20.5z M3.8,10c0-3.4,2.8-6.2,6.2-6.2s6.2,2.8,6.2,6.2s-2.8,6.2-6.2,6.2S3.8,13.4,3.8,10z"
/>
</svg>
@@ -1,23 +0,0 @@
<script lang="ts">
//
// © 2025 Hardcore Engineering, Inc. All Rights Reserved.
// Licensed under the Eclipse Public License v2.0 (SPDX: EPL-2.0).
//
export let size: 'small' | 'medium' | 'large' | 'x-large'
const fill: string = 'currentColor'
</script>
<svg class="svg-{size}" viewBox="0 0 24 24" {fill} xmlns="http://www.w3.org/2000/svg">
<path
d="M12,2.2c-5.4,0-9.8,4.4-9.8,9.8s4.4,9.8,9.8,9.8s9.8-4.4,9.8-9.8S17.4,2.2,12,2.2z M12,20.2c-4.5,0-8.2-3.7-8.2-8.2S7.5,3.8,12,3.8s8.2,3.7,8.2,8.2S16.5,20.2,12,20.2z"
/>
<path
d="M7.8,9.5c0,0.1,0.1,0.1,0.1,0.2c0,0.1,0.1,0.1,0.2,0.2c0.2,0.2,0.6,0.4,0.9,0.4c0.1,0,0.2,0,0.2,0c0.1,0,0.1,0,0.2-0.1c0.1,0,0.1-0.1,0.2-0.1c0.1,0,0.1-0.1,0.2-0.2C9.9,9.8,10,9.8,10,9.7c0-0.1,0.1-0.1,0.1-0.2c0-0.1,0.1-0.2,0.1-0.2c0-0.1,0-0.2,0-0.2c0-0.3-0.1-0.7-0.4-0.9C9.8,8.1,9.8,8,9.7,8c-0.1,0-0.1-0.1-0.2-0.1c-0.1,0-0.2-0.1-0.2-0.1c-0.4-0.1-0.8,0-1.1,0.3C7.9,8.3,7.8,8.7,7.8,9c0,0.1,0,0.2,0,0.2C7.8,9.3,7.8,9.4,7.8,9.5z"
/>
<path
d="M14.3,10c0.1,0,0.1,0.1,0.2,0.1c0.1,0,0.2,0.1,0.2,0.1c0.1,0,0.2,0,0.2,0s0.2,0,0.2,0c0.1,0,0.2,0,0.2-0.1c0.1,0,0.2-0.1,0.2-0.1c0.1-0.1,0.1-0.1,0.2-0.2c0.2-0.2,0.4-0.6,0.4-0.9c0-0.3-0.1-0.7-0.4-0.9c0-0.1-0.1-0.1-0.2-0.2c-0.1,0-0.1-0.1-0.2-0.1c-0.1,0-0.2-0.1-0.2-0.1c-0.2,0-0.3,0-0.5,0c-0.1,0-0.2,0-0.2,0.1c-0.1,0-0.1,0.1-0.2,0.1c-0.1,0-0.1,0.1-0.2,0.2c-0.2,0.2-0.4,0.6-0.4,0.9c0,0.3,0.1,0.6,0.4,0.9C14.2,9.9,14.2,10,14.3,10z"
/>
<path
d="M16,12.2H8c-0.4,0-0.8,0.3-0.8,0.8c0,2.6,2.1,4.8,4.8,4.8s4.8-2.1,4.8-4.8C16.8,12.6,16.4,12.2,16,12.2z M12,16.2c-1.5,0-2.8-1.1-3.2-2.5h6.3C14.8,15.2,13.5,16.2,12,16.2z"
/>
</svg>
@@ -1,23 +0,0 @@
<script lang="ts">
//
// © 2025 Hardcore Engineering, Inc. All Rights Reserved.
// Licensed under the Eclipse Public License v2.0 (SPDX: EPL-2.0).
//
export let size: 'small' | 'medium' | 'large' | 'x-large'
const fill: string = 'currentColor'
</script>
<svg class="svg-{size}" viewBox="0 0 24 24" {fill} xmlns="http://www.w3.org/2000/svg">
<path
d="M6.5,10.8c2.3,0,4.2-1.9,4.2-4.2S8.8,2.2,6.5,2.2S2.2,4.2,2.2,6.5S4.2,10.8,6.5,10.8z M6.5,3.8C8,3.8,9.2,5,9.2,6.5S8,9.2,6.5,9.2S3.8,8,3.8,6.5S5,3.8,6.5,3.8z"
/>
<path
d="M7.2,13.6c-0.3-0.5-1-0.5-1.3,0l-4,7c-0.1,0.2-0.1,0.5,0,0.7c0.1,0.2,0.4,0.4,0.6,0.4h8c0.3,0,0.5-0.1,0.6-0.4c0.1-0.2,0.1-0.5,0-0.7L7.2,13.6z M3.8,20.2l2.7-4.7l2.7,4.7H3.8z"
/>
<path
d="M18.6,6.5l3-3c0.3-0.3,0.3-0.8,0-1.1s-0.8-0.3-1.1,0l-3,3l-3-3c-0.3-0.3-0.8-0.3-1.1,0s-0.3,0.8,0,1.1l3,3l-3,3c-0.3,0.3-0.3,0.8,0,1.1c0.1,0.1,0.3,0.2,0.5,0.2s0.4-0.1,0.5-0.2l3-3l3,3c0.1,0.1,0.3,0.2,0.5,0.2s0.4-0.1,0.5-0.2c0.3-0.3,0.3-0.8,0-1.1L18.6,6.5z"
/>
<path
d="M21,13.2h-7c-0.4,0-0.8,0.3-0.8,0.8v7c0,0.4,0.3,0.8,0.8,0.8h7c0.4,0,0.8-0.3,0.8-0.8v-7C21.8,13.6,21.4,13.2,21,13.2zM20.2,20.2h-5.5v-5.5h5.5V20.2z"
/>
</svg>
@@ -1,17 +0,0 @@
<script lang="ts">
//
// © 2025 Hardcore Engineering, Inc. All Rights Reserved.
// Licensed under the Eclipse Public License v2.0 (SPDX: EPL-2.0).
//
export let size: 'small' | 'medium' | 'large' | 'x-large'
const fill: string = 'currentColor'
</script>
<svg class="svg-{size}" viewBox="0 0 24 24" {fill} xmlns="http://www.w3.org/2000/svg">
<path
d="M21.5,11.5l-9-9c-0.3-0.3-0.8-0.3-1.1,0l-9,9c-0.2,0.2-0.3,0.5-0.2,0.8s0.4,0.5,0.7,0.5h1.2V19c0,1.5,1.2,2.8,2.8,2.8h10c1.5,0,2.8-1.2,2.8-2.8v-6.2H21c0.3,0,0.6-0.2,0.7-0.5C21.8,12,21.7,11.7,21.5,11.5z M18.2,19c0,0.7-0.6,1.2-1.2,1.2H7c-0.7,0-1.2-0.6-1.2-1.2v-7c0-0.4-0.3-0.8-0.8-0.8H4.8L12,4.1l7.2,7.2H19c-0.4,0-0.8,0.3-0.8,0.8V19z"
/>
<path
d="M14,11.2h-4c-0.4,0-0.8,0.3-0.8,0.8v4c0,0.4,0.3,0.8,0.8,0.8h4c0.4,0,0.8-0.3,0.8-0.8v-4C14.8,11.6,14.4,11.2,14,11.2zM13.2,15.2h-2.5v-2.5h2.5V15.2z"
/>
</svg>
-97
View File
@@ -1,97 +0,0 @@
//
// Copyright © 2025 Hardcore Engineering Inc.
//
// Licensed under the Eclipse Public License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. You may
// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//
// See the License for the specific language governing permissions and
// limitations under the License.
//
import type { IntlString } from '@hcengineering/platform'
import IconFrequentlyUsed from './icons/FrequentlyUsed.svelte'
import IconGettingWorkDone from './icons/GettingWorkDone.svelte'
import IconSmileysAndPeople from './icons/SmileysAndPeople.svelte'
import IconAnimalsAndNature from './icons/AnimalsAndNature.svelte'
import IconFoodAndDrink from './icons/FoodAndDrink.svelte'
import IconTravelAndPlaces from './icons/TravelAndPlaces.svelte'
import IconActivities from './icons/Activities.svelte'
import IconObjects from './icons/Objects.svelte'
import IconSymbols from './icons/Symbols.svelte'
import IconFlags from './icons/Flags.svelte'
import plugin from '../../plugin'
import type { EmojiCategory } from './types'
export * from './types'
export * from './store'
export * from './utils'
export { default as EmojiPopup } from './EmojiPopup.svelte'
export { default as EmojiButton } from './EmojiButton.svelte'
export const emojiCategories: EmojiCategory[] = [
{ id: 'frequently-used', label: plugin.string.FrequentlyUsed, icon: IconFrequentlyUsed },
{
id: 'getting-work-done',
label: plugin.string.GettingWorkDone,
icon: IconGettingWorkDone,
emojisString: [
'2705',
'1F440',
'1F64C',
'1F64F',
'2795',
'2796',
'1F44F',
'1F4A1',
'1F3AF',
'1F44B',
'1F44D',
'1F389',
'0031-FE0F-20E3',
'0032-FE0F-20E3',
'0033-FE0F-20E3',
'1F4E3',
'26AA',
'1F535',
'1F534',
'1F3CE'
]
},
{
id: 'smileys-people',
label: plugin.string.SmileysAndPeople,
icon: IconSmileysAndPeople,
categories: ['smileys-emotion', 'people-body']
},
{
id: 'animals-nature',
label: plugin.string.AnimalsAndNature,
icon: IconAnimalsAndNature,
categories: 'animals-nature'
},
{ id: 'food-drink', label: plugin.string.FoodAndDrink, icon: IconFoodAndDrink, categories: 'food-drink' },
{ id: 'travel-places', label: plugin.string.TravelAndPlaces, icon: IconTravelAndPlaces, categories: 'travel-places' },
{ id: 'activities', label: plugin.string.Activities, icon: IconActivities, categories: 'activities' },
{ id: 'objects', label: plugin.string.Objects, icon: IconObjects, categories: 'objects' },
{ id: 'symbols', label: plugin.string.Symbols, icon: IconSymbols, categories: 'symbols' },
{ id: 'flags', label: plugin.string.Flags, icon: IconFlags, categories: 'flags' }
]
export const skinTonesCodes = [0x1f3fb, 0x1f3fc, 0x1f3fd, 0x1f3fe, 0x1f3ff]
export const skinTones: Map<number, IntlString> = new Map<number, IntlString>(
[
plugin.string.NoTone,
plugin.string.Light,
plugin.string.MediumLight,
plugin.string.Medium,
plugin.string.MediumDark,
plugin.string.Dark
].map((label, index) => [index, label])
)
-44
View File
@@ -1,44 +0,0 @@
//
// Copyright © 2025 Hardcore Engineering Inc.
//
// Licensed under the Eclipse Public License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. You may
// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//
// See the License for the specific language governing permissions and
// limitations under the License.
//
import { writable, derived } from 'svelte/store'
import type { Emoji } from 'emojibase'
import type { EmojiWithGroup } from '.'
export const emojiStore = writable<EmojiWithGroup[]>([])
export const emojiComponents = writable<Emoji[]>([])
export const searchEmoji = writable<string>('')
export const resultEmojis = derived([emojiStore, searchEmoji], ([emojis, search]) => {
return search !== ''
? emojis.filter(
(emoji) =>
(emoji.tags?.some((tag: string) => tag.toLowerCase().startsWith(search.toLowerCase())) ?? false) ||
emoji.label.toLowerCase().includes(search.toLowerCase())
)
: emojis
})
export const groupsResultEmojis = derived(resultEmojis, (result) => {
const keys = new Set(result.map((res) => res?.key ?? ''))
const groups: string[] = keys?.size > 0 ? [...keys] : ['']
return {
emojis: new Map<string, EmojiWithGroup[]>(
groups.map((group) => {
return [group, result.filter((res) => res.key === group)]
})
),
groups
}
})
-182
View File
@@ -1,182 +0,0 @@
//
// Copyright © 2025 Hardcore Engineering Inc.
//
// Licensed under the Eclipse Public License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. You may
// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//
// See the License for the specific language governing permissions and
// limitations under the License.
//
import { get } from 'svelte/store'
import { fetchEmojis, fetchMessages } from 'emojibase'
import type { Emoji, Locale } from 'emojibase'
import { getCurrentAccount } from '@hcengineering/core'
import { deviceOptionsStore as deviceInfo } from '../..'
import { emojiStore, emojiComponents, emojiCategories, skinTonesCodes } from '.'
import type { EmojiWithGroup, EmojiHierarchy } from '.'
export async function loadEmojis (lang?: string): Promise<{
emojis: EmojiWithGroup[]
components: Emoji[]
}> {
const local = lang ?? get(deviceInfo).language ?? 'en'
const englishEmojis =
local === 'en'
? await fetchEmojis('en', { version: '15.0' })
: await fetchEmojis('en', { compact: true, version: '15.0' })
const languageEmojis = local === 'en' ? null : await fetchEmojis(local as Locale, { version: '15.0' })
const messages = await fetchMessages(local as Locale)
const groups = messages.groups
const groupKeys = new Map<number, string>(groups.map((group, index) => [index, group.key]))
const categories = new Map<string, string>()
emojiCategories.forEach((cat) => {
if (Array.isArray(cat.categories)) cat.categories.forEach((c) => categories.set(c, cat.id))
else if (typeof cat.categories === 'string') categories.set(cat.categories, cat.id)
})
const emojis =
languageEmojis !== null
? languageEmojis.map((langEmoji, index) => {
return {
...langEmoji,
tags: [...(englishEmojis[index]?.tags ?? []), ...(langEmoji?.tags ?? [])]
}
})
: (englishEmojis as Emoji[])
return {
emojis: emojis
.filter((e) => e.group !== 2 && e.group !== undefined)
.map((e) => {
return { ...e, key: categories.get(groupKeys.get(e?.group ?? 0) ?? '') ?? '' }
}),
components: emojis.filter((e) => e.group === 2)
}
}
export async function updateEmojis (lang?: string): Promise<void> {
const { emojis, components } = await loadEmojis(lang)
emojiStore.set(emojis)
emojiComponents.set(components)
}
function getEmojisLocalStorageKey (suffix: string = 'frequently'): string {
const me = getCurrentAccount()
return `emojis.${suffix}.${me.uuid}`
}
export const removeFrequentlyEmojis = (_hexcode: string): void => {
const emoji = getEmoji(_hexcode)
const hexcode = emoji?.parent?.hexcode ?? emoji?.emoji.hexcode
if (hexcode === undefined) return
const frequentlyEmojisKey = getEmojisLocalStorageKey()
const frequentlyEmojis = window.localStorage.getItem(frequentlyEmojisKey)
if (frequentlyEmojis != null) {
const parsedEmojis = JSON.parse(frequentlyEmojis)
if (Array.isArray(parsedEmojis)) {
window.localStorage.setItem(
frequentlyEmojisKey,
JSON.stringify(parsedEmojis.filter((pe) => pe.hexcode !== hexcode))
)
}
}
}
export const addFrequentlyEmojis = (_hexcode: string): void => {
const emoji = getEmoji(_hexcode)
const hexcode = emoji?.parent?.hexcode ?? emoji?.emoji.hexcode
if (hexcode === undefined) return
const frequentlyEmojisKey = getEmojisLocalStorageKey()
const frequentlyEmojis = window.localStorage.getItem(frequentlyEmojisKey)
const empty = frequentlyEmojis == null
if (!empty) {
const parsedEmojis = JSON.parse(frequentlyEmojis)
if (Array.isArray(parsedEmojis)) {
const index = parsedEmojis.findIndex((pe) => pe.hexcode === hexcode)
if (index === -1) parsedEmojis.push({ hexcode, count: 1 })
else parsedEmojis[index].count++
parsedEmojis.sort((a, b) => b.count - a.count)
window.localStorage.setItem(frequentlyEmojisKey, JSON.stringify(parsedEmojis))
return undefined
}
}
window.localStorage.setItem(frequentlyEmojisKey, JSON.stringify([{ hexcode, count: 1 }]))
}
export const getFrequentlyEmojis = (): EmojiWithGroup[] | undefined => {
const frequentlyEmojisKey = getEmojisLocalStorageKey()
const frequentlyEmojis = window.localStorage.getItem(frequentlyEmojisKey)
if (frequentlyEmojis == null) return undefined
try {
const parsedEmojis = JSON.parse(frequentlyEmojis)
if (!Array.isArray(parsedEmojis)) return undefined
const res: EmojiWithGroup[] = []
for (const val of parsedEmojis) {
const map = getEmoji(val.hexcode)
const emoji = map?.parent ?? map?.emoji
if (emoji !== undefined) {
res.push(emoji)
}
}
return res
} catch (e) {
console.error(e)
return undefined
}
}
export const setSkinTone = (skinTone: number): void => {
const skinToneKey = getEmojisLocalStorageKey('skinTone')
window.localStorage.setItem(skinToneKey, JSON.stringify(skinTone))
}
export const getSkinTone = (): number => {
const skinToneKey = getEmojisLocalStorageKey('skinTone')
const skinTone = window.localStorage.getItem(skinToneKey)
if (skinTone == null) return 0
try {
return JSON.parse(skinTone)
} catch (e) {
console.error(e)
return 0
}
}
export const generateSkinToneEmojis = (baseEmoji: number | number[]): string[] => {
const isArray = Array.isArray(baseEmoji)
return [
String.fromCodePoint(...(isArray ? baseEmoji : [baseEmoji])),
...skinTonesCodes.map((skinTone) => {
return String.fromCodePoint(...(isArray ? baseEmoji : [baseEmoji]), skinTone)
})
]
}
export const getEmojiMap = (): Map<string, EmojiHierarchy> | undefined => {
const result = new Map<string, EmojiHierarchy>()
const emojis = get(emojiStore)
emojis.forEach((emoji) => {
result.set(emoji.hexcode, { emoji })
emoji.skins?.forEach((skin) => result.set(skin.hexcode, { emoji: { ...skin, key: emoji.key }, parent: emoji }))
})
return result
}
export const getEmoji = (hexcode: string): EmojiHierarchy | undefined => {
return getEmojiMap()?.get(hexcode)
}
export const getEmojiCode = (e: number | number[] | string | Emoji | EmojiWithGroup): number | number[] => {
return typeof e === 'number' || Array.isArray(e)
? e
: (typeof e === 'object' ? e.hexcode : e).split('-').map((h) => parseInt(h, 16))
}
@@ -1,10 +0,0 @@
<script lang="ts">
export let size: 'small' | 'medium' | 'large'
const fill: string = 'currentColor'
</script>
<svg class="svg-{size}" {fill} xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20">
<path
d="M10,2c4.4,0,8,3.6,8,8c0,4.4-3.6,8-8,8c-4.4,0-8-3.6-8-8C2,5.6,5.6,2,10,2z M10,3c-3.9,0-7,3.1-7,7c0,3.9,3.1,7,7,7c3.9,0,7-3.1,7-7C17,6.1,13.9,3,10,3z M7.2,12.4c1.5,1.5,3.9,1.6,5.5,0.2l0.2-0.2c0.2-0.2,0.5-0.2,0.7,0c0.2,0.2,0.2,0.4,0.1,0.6l-0.1,0.1l0,0c-2,2-5.1,1.9-7.1,0c-0.2-0.2-0.2-0.5,0-0.7C6.6,12.2,7,12.2,7.2,12.4z M12.5,7.5c0.6,0,1,0.4,1,1s-0.4,1-1,1s-1-0.4-1-1S11.9,7.5,12.5,7.5z M7.5,7.5c0.6,0,1,0.4,1,1s-0.4,1-1,1s-1-0.4-1-1S6.9,7.5,7.5,7.5z"
/>
</svg>
@@ -11,8 +11,7 @@
checkMobile,
deviceOptionsStore as deviceInfo,
checkAdaptiveMatching,
getLocalWeekStart,
updateEmojis
getLocalWeekStart
} from '../../'
import { desktopPlatform, getCurrentLocation, location, locationStorageKeyId, navigate } from '../../location'
import uiPlugin from '../../plugin'
@@ -93,8 +92,6 @@
$: document.documentElement.style.setProperty('--app-height', `${docHeight}px`)
$: void updateEmojis($themeStore.language)
let doubleTouchStartTimestamp = 0
document.addEventListener('touchstart', (event) => {
const now = +new Date()
-3
View File
@@ -216,7 +216,6 @@ export { default as IconMixin } from './components/icons/Mixin.svelte'
export { default as IconCircles } from './components/icons/Circles.svelte'
export { default as IconLike } from './components/icons/Like.svelte'
export { default as IconCollapseArrow } from './components/icons/CollapseArrow.svelte'
export { default as IconEmoji } from './components/icons/Emoji.svelte'
export { default as IconUndo } from './components/icons/Undo.svelte'
export { default as IconRedo } from './components/icons/Redo.svelte'
export { default as IconOpenedArrow } from './components/icons/OpenedArrow.svelte'
@@ -270,7 +269,6 @@ export { NotificationSeverity } from './components/notifications/NotificationSev
export type { Notification } from './components/notifications/Notification'
export { default as Wizard } from './components/wizard/Wizard.svelte'
export { default as StepsDialog } from './components/StepsDialog.svelte'
export { default as IconWithEmoji } from './components/IconWithEmoji.svelte'
export { default as ModeSelector } from './components/ModeSelector.svelte'
export { default as SimpleTimePopup } from './components/calendar/SimpleTimePopup.svelte'
export { default as NumberInput } from './components/NumberInput.svelte'
@@ -302,7 +300,6 @@ export * from './colors'
export * from './focus'
export * from './resize'
export * from './lazy'
export * from './components/emoji'
export function createApp (target: HTMLElement): SvelteComponent {
return new Root({ target })
+2 -2
View File
@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
//
import { type Timestamp } from '@hcengineering/core'
import type { Blob, Ref, Timestamp } from '@hcengineering/core'
import type {
Asset,
IntlString,
@@ -262,7 +262,7 @@ export type IconSize =
| '2x-large'
| 'full'
export interface IconProps {
icon?: number | number[]
icon?: number | number[] | Ref<Blob>
size?: IconSize
fill?: string
filled?: boolean
+2
View File
@@ -52,6 +52,8 @@
"@hcengineering/view": "^0.6.13",
"@hcengineering/view-resources": "^0.6.0",
"@hcengineering/communication-types": "0.1.180",
"@hcengineering/emoji": "^0.6.0",
"@hcengineering/emoji-resources": "^0.6.0",
"svelte": "^4.2.19"
}
}
@@ -16,11 +16,14 @@
import { createEventDispatcher } from 'svelte'
import { Reaction } from '@hcengineering/activity'
import { Doc, getCurrentAccount, PersonId } from '@hcengineering/core'
import { EmojiPopup, IconAdd, showPopup, tooltip, type Emojis } from '@hcengineering/ui'
import { IconAdd, showPopup, tooltip } from '@hcengineering/ui'
import { includesAny } from '@hcengineering/contact'
import emojiPlugin from '@hcengineering/emoji'
import ReactionsTooltip from './ReactionsTooltip.svelte'
import { updateDocReactions } from '../../utils'
import { getResource } from '@hcengineering/platform'
import { getBlobRef } from '@hcengineering/presentation'
export let reactions: Reaction[] = []
export let object: Doc | undefined = undefined
@@ -55,8 +58,8 @@
ev.preventDefault()
ev.stopPropagation()
opened = true
showPopup(EmojiPopup, {}, ev.target as HTMLElement, async (emoji: Emojis) => {
if (emoji?.emoji !== undefined) await updateDocReactions(reactions, object, emoji.emoji)
showPopup(emojiPlugin.component.EmojiPopup, {}, ev.target as HTMLElement, async (emoji) => {
if (emoji?.text !== undefined) await updateDocReactions(reactions, object, emoji.text)
opened = false
})
}
@@ -73,7 +76,19 @@
use:tooltip={{ component: ReactionsTooltip, props: { reactionAccounts: persons } }}
on:click={getClickHandler(emoji)}
>
<span class="emoji">{emoji}</span>
{#await getResource(emojiPlugin.functions.GetCustomEmoji) then getCustomEmojiFunction}
{@const customEmoji = getCustomEmojiFunction(emoji)}
<span class="emoji">
{#if customEmoji === undefined}
{emoji}
{:else}
{@const alt = emoji}
{#await getBlobRef(customEmoji.image) then blobSrc}
<img src={blobSrc.src} {alt} />
{/await}
{/if}
</span>
{/await}
<span class="counter">{persons.length}</span>
</div>
{/each}
@@ -118,6 +133,10 @@
.emoji {
font-size: 1rem;
}
.emoji > img {
height: 1.05em;
margin: 0 0.05em 0.08em 0.1em;
}
&.highlight {
background: var(--global-ui-highlight-BackgroundColor);
border-color: var(--global-accent-BackgroundColor);
@@ -16,8 +16,9 @@
<script lang="ts">
import activity, { ActivityMessage, Reaction } from '@hcengineering/activity'
import { createQuery, getClient } from '@hcengineering/presentation'
import { EmojiPopup, showPopup, type Emojis } from '@hcengineering/ui'
import { showPopup } from '@hcengineering/ui'
import { SortingOrder } from '@hcengineering/core'
import emojiPlugin from '@hcengineering/emoji'
import { updateDocReactions } from '../../utils'
@@ -65,8 +66,8 @@
e.stopPropagation()
e.preventDefault()
showPopup(EmojiPopup, {}, e.target as HTMLElement, (emoji: Emojis) => {
if (emoji?.emoji !== undefined) void updateDocReactions(reactions, message, emoji.emoji)
showPopup(emojiPlugin.component.EmojiPopup, {}, e.target as HTMLElement, (emoji) => {
if (emoji?.text !== undefined) void updateDocReactions(reactions, message, emoji.text)
})
}
</script>
+4 -5
View File
@@ -2,15 +2,14 @@ import type { ActivityMessage, Reaction } from '@hcengineering/activity'
import core, { getCurrentAccount, isOtherHour, type Doc, type Ref, type Space } from '@hcengineering/core'
import { getClient, isSpace } from '@hcengineering/presentation'
import {
EmojiPopup,
closePopup,
getCurrentResolvedLocation,
getEventPositionElement,
showPopup,
type Location,
type Emojis
type Location
} from '@hcengineering/ui'
import { type AttributeModel } from '@hcengineering/view'
import emojiPlugin from '@hcengineering/emoji'
import { get } from 'svelte/store'
import { savedMessagesStore } from './activity'
@@ -61,8 +60,8 @@ export async function addReactionAction (
closePopup()
showPopup(EmojiPopup, {}, element, (emoji: Emojis) => {
if (emoji?.emoji !== undefined) void updateDocReactions(reactions, message, emoji.emoji)
showPopup(emojiPlugin.component.EmojiPopup, {}, element, (emoji) => {
if (emoji?.text !== undefined) void updateDocReactions(reactions, message, emoji.text)
params?.onClose?.()
})
params?.onOpen?.()
@@ -16,16 +16,8 @@
import { Card, MasterTag } from '@hcengineering/card'
import { AnyAttribute, ArrOf, Ref, RefTo, Type } from '@hcengineering/core'
import { IntlString } from '@hcengineering/platform'
import { createQuery, getClient } from '@hcengineering/presentation'
import {
Button,
ButtonKind,
ButtonSize,
eventToHTMLElement,
IconWithEmoji,
Label,
showPopup
} from '@hcengineering/ui'
import { IconWithEmoji, createQuery, getClient } from '@hcengineering/presentation'
import { Button, ButtonKind, ButtonSize, eventToHTMLElement, Label, showPopup } from '@hcengineering/ui'
import view from '@hcengineering/view'
import { createEventDispatcher } from 'svelte'
import card from '../plugin'
@@ -16,16 +16,8 @@
import { Card, MasterTag } from '@hcengineering/card'
import { AnyAttribute, Class, Ref, RefTo } from '@hcengineering/core'
import { IntlString } from '@hcengineering/platform'
import { createQuery, getClient } from '@hcengineering/presentation'
import {
Button,
ButtonKind,
ButtonSize,
eventToHTMLElement,
IconWithEmoji,
Label,
showPopup
} from '@hcengineering/ui'
import { IconWithEmoji, createQuery, getClient } from '@hcengineering/presentation'
import { Button, ButtonKind, ButtonSize, eventToHTMLElement, Label, showPopup } from '@hcengineering/ui'
import view from '@hcengineering/view'
import { createEventDispatcher } from 'svelte'
import card from '../plugin'
@@ -14,7 +14,7 @@
-->
<script lang="ts">
import { Card, MasterTag } from '@hcengineering/card'
import { getClient } from '@hcengineering/presentation'
import { IconWithEmoji, getClient } from '@hcengineering/presentation'
import setting, { settingId } from '@hcengineering/setting'
import {
Button,
@@ -23,7 +23,6 @@
getCurrentResolvedLocation,
Icon,
IconAdd,
IconWithEmoji,
Label,
navigate,
showPopup
@@ -15,12 +15,12 @@
<script lang="ts">
import view from '@hcengineering/view'
import { IconWithEmoji, IconAdd } from '@hcengineering/ui'
import { IconAdd } from '@hcengineering/ui'
import { Ref } from '@hcengineering/core'
import { createEventDispatcher } from 'svelte'
import { CardSpace, MasterTag } from '@hcengineering/card'
import { Section, Action } from '@hcengineering/ui-next'
import { getClient } from '@hcengineering/presentation'
import { IconWithEmoji, getClient } from '@hcengineering/presentation'
import type { NavigatorConfig } from '../../types'
import cardPlugin from '../../plugin'
@@ -15,8 +15,8 @@
<script lang="ts">
import { MasterTag } from '@hcengineering/card'
import { Class, Doc, Ref, Space } from '@hcengineering/core'
import { getClient } from '@hcengineering/presentation'
import { IconWithEmoji, NavItem, getCurrentLocation, navigate } from '@hcengineering/ui'
import { IconWithEmoji, getClient } from '@hcengineering/presentation'
import { NavItem, getCurrentLocation, navigate } from '@hcengineering/ui'
import card from '../../plugin'
import view from '@hcengineering/view'
@@ -15,12 +15,11 @@
<script lang="ts">
import { MasterTag } from '@hcengineering/card'
import { getEmbeddedLabel, translateCB } from '@hcengineering/platform'
import { getClient } from '@hcengineering/presentation'
import { IconWithEmoji, getClient } from '@hcengineering/presentation'
import {
ButtonIcon,
getCurrentLocation,
IconDelete,
IconWithEmoji,
ModernEditbox,
navigate,
showPopup,
@@ -15,12 +15,11 @@
<script lang="ts">
import { MasterTag } from '@hcengineering/card'
import { Ref } from '@hcengineering/core'
import { createQuery } from '@hcengineering/presentation'
import { IconWithEmoji, createQuery } from '@hcengineering/presentation'
import { clearSettingsStore } from '@hcengineering/setting-resources'
import {
Icon,
IconOpenedArrow,
IconWithEmoji,
Label,
Location,
getCurrentResolvedLocation,
@@ -15,8 +15,8 @@
<script lang="ts">
import cardPlugin, { MasterTag } from '@hcengineering/card'
import core, { Class, ClassifierKind, Doc, Ref } from '@hcengineering/core'
import { createQuery, getClient } from '@hcengineering/presentation'
import { Icon, IconWithEmoji, Label } from '@hcengineering/ui'
import { IconWithEmoji, createQuery, getClient } from '@hcengineering/presentation'
import { Icon, Label } from '@hcengineering/ui'
import view from '@hcengineering/view'
import { createEventDispatcher } from 'svelte'
@@ -18,14 +18,13 @@
import { Analytics } from '@hcengineering/analytics'
import { Data, generateId, Ref } from '@hcengineering/core'
import { Document, DocumentEvents, Teamspace } from '@hcengineering/document'
import { Card, getClient, SpaceSelector } from '@hcengineering/presentation'
import { IconWithEmoji, Card, getClient, SpaceSelector } from '@hcengineering/presentation'
import {
Button,
createFocusManager,
EditBox,
FocusHandler,
getPlatformColorDef,
IconWithEmoji,
showPopup,
themeStore
} from '@hcengineering/ui'
@@ -134,7 +133,9 @@
? { icon: object.color, size: 'medium' }
: {
fill:
object.color !== undefined ? getPlatformColorDef(object.color, $themeStore.dark).icon : 'currentColor'
object.color !== undefined && typeof object.color !== 'string'
? getPlatformColorDef(object.color, $themeStore.dark).icon
: 'currentColor'
}}
on:click={chooseIcon}
/>
@@ -14,7 +14,8 @@
-->
<script lang="ts">
import { Asset } from '@hcengineering/platform'
import { AnySvelteComponent, Icon, IconSize, IconWithEmoji, getPlatformColorDef, themeStore } from '@hcengineering/ui'
import { AnySvelteComponent, Icon, IconSize, getPlatformColorDef, themeStore } from '@hcengineering/ui'
import { IconWithEmoji } from '@hcengineering/presentation'
import view, { IconProps } from '@hcengineering/view'
import document from '@hcengineering/document'
@@ -32,6 +33,9 @@
iconProps={value?.icon === iconWithEmoji && iconWithEmoji
? { icon: value?.color }
: {
fill: value?.color !== undefined ? getPlatformColorDef(value?.color, $themeStore.dark).icon : 'currentColor'
fill:
value?.color !== undefined && typeof value?.color !== 'string'
? getPlatformColorDef(value?.color, $themeStore.dark).icon
: 'currentColor'
}}
/>
@@ -21,7 +21,7 @@
import notification from '@hcengineering/notification'
import { Panel } from '@hcengineering/panel'
import { getResource, setPlatformStatus, unknownError } from '@hcengineering/platform'
import { copyTextToClipboard, createQuery, getClient } from '@hcengineering/presentation'
import { IconWithEmoji, copyTextToClipboard, createQuery, getClient } from '@hcengineering/presentation'
import tags from '@hcengineering/tags'
import { Heading } from '@hcengineering/text-editor'
import { TableOfContents } from '@hcengineering/text-editor-resources'
@@ -31,7 +31,6 @@
Component,
FocusHandler,
IconMoreH,
IconWithEmoji,
Label,
TimeSince,
createFocusManager,
@@ -332,7 +331,10 @@
? { icon: doc.color, size: 'large' }
: {
size: 'large',
fill: doc.color !== undefined ? getPlatformColorDef(doc.color, $themeStore.dark).icon : 'currentColor'
fill:
doc.color !== undefined && typeof doc.color !== 'string'
? getPlatformColorDef(doc.color, $themeStore.dark).icon
: 'currentColor'
}}
disabled={readonly}
showTooltip={{ label: document.string.Icon, direction: 'bottom' }}
@@ -17,8 +17,8 @@
import { Ref, generateId } from '@hcengineering/core'
import { Document } from '@hcengineering/document'
import { getResource } from '@hcengineering/platform'
import { getClient } from '@hcengineering/presentation'
import { Action, IconAdd, IconEdit, IconWithEmoji, getPlatformColorDef, themeStore } from '@hcengineering/ui'
import { IconWithEmoji, getClient } from '@hcengineering/presentation'
import { Action, IconAdd, IconEdit, getPlatformColorDef, themeStore } from '@hcengineering/ui'
import view from '@hcengineering/view'
import { getActions as getContributedActions, openDoc } from '@hcengineering/view-resources'
@@ -107,7 +107,10 @@
iconProps={doc.icon === view.ids.IconWithEmoji
? { icon: doc.color }
: {
fill: doc.color !== undefined ? getPlatformColorDef(doc.color, $themeStore.dark).icon : 'currentColor'
fill:
doc.color !== undefined && typeof doc.color !== 'string'
? getPlatformColorDef(doc.color, $themeStore.dark).icon
: 'currentColor'
}}
title={doc.title}
selected={selected === doc._id && draggedItem === undefined}
@@ -16,9 +16,8 @@
import { Analytics } from '@hcengineering/analytics'
import { Ref, SortingOrder, Space, generateId } from '@hcengineering/core'
import { Document, DocumentEvents, Teamspace } from '@hcengineering/document'
import { createQuery, getClient } from '@hcengineering/presentation'
import { IconWithEmoji, createQuery, getClient } from '@hcengineering/presentation'
import {
IconWithEmoji,
IconEdit,
getPlatformColorDef,
getPlatformColorForTextDef,
@@ -270,7 +269,7 @@
? { icon: space.color }
: {
fill:
space.color !== undefined
space.color !== undefined && typeof space.color !== 'string'
? getPlatformColorDef(space.color, $themeStore.dark).icon
: getPlatformColorForTextDef(space.name, $themeStore.dark).icon
}}
@@ -313,7 +312,10 @@
iconProps={item.icon === view.ids.IconWithEmoji
? { icon: visibleItem.color }
: {
fill: item.color !== undefined ? getPlatformColorDef(item.color, $themeStore.dark).icon : 'currentColor'
fill:
item.color !== undefined && typeof item.color !== 'string'
? getPlatformColorDef(item.color, $themeStore.dark).icon
: 'currentColor'
}}
title={item.title}
selected
@@ -30,11 +30,10 @@
} from '@hcengineering/core'
import document, { Teamspace, DocumentEvents } from '@hcengineering/document'
import { Asset } from '@hcengineering/platform'
import presentation, { Card, getClient, reduceCalls } from '@hcengineering/presentation'
import presentation, { IconWithEmoji, Card, getClient, reduceCalls } from '@hcengineering/presentation'
import {
Button,
EditBox,
IconWithEmoji,
Label,
Toggle,
getColorNumberByText,
@@ -363,7 +362,7 @@
? { icon: color }
: {
fill:
color !== undefined
color !== undefined && typeof color !== 'string'
? getPlatformColorDef(color, $themeStore.dark).icon
: getPlatformColorForTextDef(name, $themeStore.dark).icon
}}
@@ -14,7 +14,8 @@
-->
<script lang="ts">
import { Teamspace } from '@hcengineering/document'
import { Icon, IconWithEmoji, getPlatformColorDef, getPlatformColorForTextDef, themeStore } from '@hcengineering/ui'
import { IconWithEmoji } from '@hcengineering/presentation'
import { Icon, getPlatformColorDef, getPlatformColorForTextDef, themeStore } from '@hcengineering/ui'
import view from '@hcengineering/view'
import document from '../../plugin'
@@ -32,7 +33,7 @@
? { icon: value.color }
: {
fill:
value.color !== undefined
value.color !== undefined && typeof value.color !== 'string'
? getPlatformColorDef(value.color, $themeStore.dark).icon
: getPlatformColorForTextDef(value.name, $themeStore.dark).icon
}}
+7
View File
@@ -0,0 +1,7 @@
module.exports = {
extends: ['./node_modules/@hcengineering/platform-rig/profiles/assets/eslint.config.json'],
parserOptions: {
tsconfigRootDir: __dirname,
project: './tsconfig.json'
}
}
+66
View File
@@ -0,0 +1,66 @@
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
<symbol id="emoji" viewBox="0 0 24 24">
<path fill-rule="evenodd" clip-rule="evenodd" d="M12 2.75C6.89137 2.75 2.75 6.89137 2.75 12C2.75 17.1086 6.89137 21.25 12 21.25C17.1086 21.25 21.25 17.1086 21.25 12C21.25 6.89137 17.1086 2.75 12 2.75ZM1.25 12C1.25 6.06294 6.06294 1.25 12 1.25C17.9371 1.25 22.75 6.06294 22.75 12C22.75 17.9371 17.9371 22.75 12 22.75C6.06294 22.75 1.25 17.9371 1.25 12Z"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M7.54958 14.4003C7.88078 14.1516 8.35093 14.2184 8.59968 14.5496C9.37627 15.5835 10.6102 16.25 12 16.25C13.3898 16.25 14.6237 15.5835 15.4003 14.5496C15.6491 14.2184 16.1192 14.1516 16.4504 14.4003C16.7816 14.6491 16.8484 15.1192 16.5997 15.4504C15.552 16.8453 13.8816 17.75 12 17.75C10.1184 17.75 8.44797 16.8453 7.40031 15.4504C7.15155 15.1192 7.21838 14.6491 7.54958 14.4003Z"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M7 9C7 8.44772 7.44772 8 8 8H8.00897C8.56125 8 9.00897 8.44772 9.00897 9C9.00897 9.55228 8.56125 10 8.00897 10H8C7.44772 10 7 9.55228 7 9ZM14.991 9C14.991 8.44772 15.4387 8 15.991 8H16C16.5523 8 17 8.44772 17 9C17 9.55228 16.5523 10 16 10H15.991C15.4387 10 14.991 9.55228 14.991 9Z"/>
</symbol>
<symbol id="emoji-add" viewBox="0 0 24 24">
<path d="M20.2502 0.99996C20.2502 0.585746 19.9143 0.249978 19.5001 0.25C19.0859 0.250022 18.7502 0.585826 18.7502 1.00004L18.7503 3.75032L16 3.75019C15.5858 3.75017 15.25 4.08594 15.25 4.50015C15.25 4.91436 15.5857 5.25017 16 5.25019L18.7504 5.25032L18.7505 8.00004C18.7506 8.41425 19.0864 8.75002 19.5006 8.75C19.9148 8.74998 20.2506 8.41417 20.2505 7.99996L20.2504 5.2504L23 5.25054C23.4142 5.25056 23.75 4.91479 23.75 4.50057C23.75 4.08636 23.4143 3.75056 23 3.75054L20.2503 3.7504L20.2502 0.99996Z"/>
<path d="M6.02763 3.0617C7.79545 1.88048 9.87386 1.25 12 1.25C12.4142 1.25 12.75 1.58579 12.75 2C12.75 2.41421 12.4142 2.75 12 2.75C10.1705 2.75 8.38213 3.2925 6.86098 4.30891C5.33983 5.32531 4.15423 6.76996 3.45412 8.46018C2.75401 10.1504 2.57083 12.0103 2.92774 13.8046C3.28465 15.5989 4.16563 17.2471 5.45927 18.5407C6.7529 19.8344 8.40109 20.7154 10.1954 21.0723C11.9897 21.4292 13.8496 21.246 15.5398 20.5459C17.23 19.8458 18.6747 18.6602 19.6911 17.139C20.7075 15.6179 21.25 13.8295 21.25 12C21.25 11.5858 21.5858 11.25 22 11.25C22.4142 11.25 22.75 11.5858 22.75 12C22.75 14.1261 22.1195 16.2046 20.9383 17.9724C19.7571 19.7402 18.0782 21.1181 16.1139 21.9317C14.1495 22.7453 11.9881 22.9582 9.90278 22.5434C7.81749 22.1287 5.90202 21.1048 4.39861 19.6014C2.89519 18.098 1.87135 16.1825 1.45656 14.0972C1.04177 12.0119 1.25466 9.85046 2.0683 7.88615C2.88194 5.92185 4.2598 4.24293 6.02763 3.0617Z"/>
<path d="M12 19C13.8962 19 15.4889 17.7202 15.9362 15.9899C16.1443 15.1848 15.8422 15 15.0461 15H8.95386C8.15776 15 7.8557 15.1848 8.0638 15.9899C8.51109 17.7202 10.1038 19 12 19Z"/>
<path d="M8.5 12C9.32843 12 10 11.3284 10 10.5C10 9.67157 9.32843 9 8.5 9C7.67157 9 7 9.67157 7 10.5C7 11.3284 7.67157 12 8.5 12Z"/>
<path d="M17 10.5C17 11.3284 16.3284 12 15.5 12C14.6716 12 14 11.3284 14 10.5C14 9.67157 14.6716 9 15.5 9C16.3284 9 17 9.67157 17 10.5Z"/>
</symbol>
<symbol id="activities" viewBox="0 0 24 24">
<path d="M12,7.8c0.4,0,0.8-0.3,0.8-0.8S12.4,6.2,12,6.2c-3.2,0-5.8,2.6-5.8,5.8c0,3.2,2.6,5.8,5.8,5.8c3.2,0,5.8-2.6,5.8-5.8c0-0.4-0.3-0.8-0.8-0.8s-0.8,0.3-0.8,0.8c0,2.3-1.9,4.2-4.2,4.2c-2.3,0-4.2-1.9-4.2-4.2C7.8,9.7,9.7,7.8,12,7.8z"/>
<path d="M21.7,10.9c0-0.4-0.4-0.7-0.8-0.7c-0.4,0-0.7,0.4-0.7,0.8c0.1,0.6,0.1,1.2,0,1.8c-0.2,2.2-1.3,4.2-3.1,5.5c-1.7,1.4-3.9,2-6.1,1.8c-2.2-0.2-4.2-1.3-5.5-3.1c-1.4-1.7-2-3.9-1.8-6.1C4,8.9,5.1,6.9,6.8,5.6s3.9-2,6.1-1.8c0.4,0.1,0.8-0.2,0.8-0.7c0-0.4-0.2-0.8-0.7-0.8C10.5,2,7.9,2.8,5.9,4.4c-2,1.6-3.3,3.9-3.6,6.5C2,13.5,2.8,16,4.4,18.1c1.6,2,3.9,3.3,6.5,3.6c0.4,0,0.7,0.1,1.1,0.1c2.2,0,4.3-0.7,6.1-2.1c2-1.6,3.3-3.9,3.6-6.5C21.8,12.4,21.8,11.6,21.7,10.9z"/>
<path d="M12.6,10.4c-0.2-0.1-0.4-0.1-0.6-0.1c-1,0-1.8,0.8-1.8,1.8s0.8,1.8,1.8,1.8s1.8-0.8,1.8-1.8c0-0.2,0-0.4-0.1-0.6l1.7-1.7H18c0.2,0,0.4-0.1,0.5-0.2l3-3c0.2-0.2,0.3-0.5,0.2-0.8c-0.1-0.3-0.4-0.5-0.7-0.5h-2.2V3c0-0.3-0.2-0.6-0.5-0.7c-0.3-0.1-0.6-0.1-0.8,0.2l-3,3c-0.1,0.1-0.2,0.3-0.2,0.5v2.7L12.6,10.4z M15.8,6.3l1.5-1.5V6c0,0.4,0.3,0.8,0.8,0.8h1.2l-1.5,1.5h-1.9V6.3z"/>
</symbol>
<symbol id="animals-and-nature" viewBox="0 0 24 24">
<path d="M10,9.8c-0.7,0-1.2,0.6-1.2,1.3s0.6,1.2,1.2,1.2s1.2-0.6,1.2-1.2v0C11.2,10.3,10.7,9.8,10,9.8z" />
<path d="M14,9.8c-0.7,0-1.2,0.6-1.2,1.3s0.6,1.2,1.2,1.2s1.2-0.6,1.2-1.2v0C15.2,10.3,14.7,9.8,14,9.8z" />
<path d="M21.7,10.6l-2-6.8c-0.1-0.4-0.5-0.6-0.8-0.5l-6,1c0,0,0,0,0,0h-1.7c0,0,0,0,0,0l-6-1C4.7,3.2,4.4,3.4,4.3,3.8l-2,6.9c-0.1,0.6,0.1,1.3,0.6,1.7c0.3,0.3,0.7,0.4,1.1,0.4c0.1,0,0.2,0,0.3,0c0.8,5.3,2.7,8,5.7,8h4c3,0,4.9-2.7,5.7-8c0.1,0,0.2,0,0.3,0c0.4,0,0.8-0.1,1.1-0.4C21.6,11.9,21.9,11.3,21.7,10.6z M3.8,11.2c-0.1,0-0.1-0.1-0.1-0.2l1.8-6.2l4,0.6l-5.3,5.7C4.1,11.3,3.9,11.3,3.8,11.2z M14,19.2h-1.2V18c0-0.1,0-0.2-0.1-0.4c0.7-0.2,1.1-0.8,1.1-1.6c0-0.4-0.3-0.8-0.8-0.8h-2c-0.4,0-0.8,0.3-0.8,0.8c0,0.8,0.4,1.4,1.1,1.6c-0.1,0.1-0.1,0.2-0.1,0.4v1.2H10c-2.2,0-3.6-2.5-4.3-7.3c0-0.1,0-0.1,0-0.1l5.6-6h1.4l5.6,6c0,0,0,0.1,0,0.1C17.6,16.8,16.2,19.2,14,19.2z M20.2,11.2c-0.1,0.1-0.3,0.1-0.4,0l-5.3-5.7l4-0.6l1.8,6.1C20.3,11.1,20.2,11.1,20.2,11.2z" />
</symbol>
<symbol id="flags" viewBox="0 0 24 24">
<path d="M19.3,4.3c-0.3-0.1-0.6-0.1-0.8,0.2c-1.6,1.6-4.3,1.6-5.9,0c-2.2-2.2-5.8-2.2-8,0C4.3,4.6,4.2,4.8,4.2,5v9v7c0,0.4,0.3,0.8,0.8,0.8s0.8-0.3,0.8-0.8v-6.6c1.7-1.4,4.2-1.4,5.7,0.2c1.1,1.1,2.6,1.6,4,1.6s2.9-0.5,4-1.6c0.1-0.1,0.2-0.3,0.2-0.5V5C19.8,4.7,19.6,4.4,19.3,4.3z M18.2,13.7c-1.7,1.4-4.2,1.3-5.7-0.2c-1.1-1.1-2.6-1.6-4-1.6c-0.9,0-1.9,0.2-2.8,0.7V5.3C7.4,3.9,9.9,4,11.5,5.5c1.8,1.8,4.6,2.1,6.8,0.9V13.7z"/>
</symbol>
<symbol id="food-and-drink" viewBox="0 0 24 24">
<path d="M7.6,7.6C7.7,7.7,7.8,7.8,8,7.8c0.2,0,0.5-0.1,0.6-0.3c0.2-0.3,0.2-0.8-0.2-1C8,6.1,7.7,5.6,7.8,5c0-0.5,0.2-1.1,0.7-1.4c0.3-0.2,0.4-0.7,0.2-1c-0.2-0.3-0.7-0.4-1-0.2C6.7,3,6.2,4,6.2,5C6.2,6,6.7,7,7.6,7.6z"/>
<path d="M11.6,7.6c0.1,0.1,0.3,0.1,0.4,0.1c0.2,0,0.5-0.1,0.6-0.3c0.2-0.3,0.2-0.8-0.2-1C12,6.1,11.7,5.6,11.8,5c0-0.5,0.2-1.1,0.7-1.4c0.3-0.2,0.4-0.7,0.2-1c-0.2-0.3-0.7-0.4-1-0.2C10.7,3,10.2,4,10.2,5C10.2,6,10.7,7,11.6,7.6z"/>
<path d="M19.6,10.6c-0.6-0.3-1.2-0.4-1.8-0.3V10c0-0.4-0.3-0.8-0.8-0.8H3c-0.4,0-0.8,0.3-0.8,0.8v5c0,3.7,3,6.8,6.8,6.8h2c2.8,0,5.2-1.7,6.2-4.1c0.3,0.1,0.5,0.1,0.8,0.1c0.4,0,0.9-0.1,1.3-0.2c0.9-0.3,1.7-1,2.1-2C22.3,13.7,21.4,11.5,19.6,10.6zM16.2,10.8v0.4c0,0,0,0,0,0v1.6c-0.8-0.3-1.7-0.5-2.7-0.5c-1.5,0-3,0.4-4,1.2c-0.7,0.5-1.8,0.8-3.1,0.8c-1.1,0-2-0.2-2.7-0.7v-2.8H16.2z M11,20.2H9c-2.8,0-5.1-2.2-5.2-5c0.8,0.3,1.7,0.5,2.6,0.5c0.1,0,0.1,0,0.2,0c1.5,0,2.9-0.4,3.9-1.2c0.7-0.5,1.8-0.8,3-0.8c0.1,0,0.1,0,0.2,0c1,0,2,0.2,2.7,0.7V15C16.2,17.9,13.9,20.2,11,20.2z M20,14.9c-0.2,0.5-0.7,1-1.3,1.2c-0.4,0.1-0.8,0.2-1.1,0.1c0.1-0.4,0.1-0.8,0.1-1.2v-3.2c0.4,0,0.8,0,1.2,0.2C20.1,12.5,20.6,13.8,20,14.9z"/>
</symbol>
<symbol id="frequently-used" viewBox="0 0 24 24">
<path d="M12,7.2c-0.4,0-0.8,0.3-0.8,0.8v4c0,0.2,0.1,0.4,0.2,0.5l2,2c0.1,0.1,0.3,0.2,0.5,0.2s0.4-0.1,0.5-0.2c0.3-0.3,0.3-0.8,0-1.1l-1.8-1.8V8C12.8,7.6,12.4,7.2,12,7.2z"/>
<path d="M19.6,5.8c-1.6-2-4-3.3-6.6-3.5C7.6,1.7,2.8,5.6,2.3,10.9c0,0.4,0.3,0.8,0.7,0.8c0.4,0,0.8-0.3,0.8-0.7c0.5-4.5,4.5-7.8,9-7.4C15,3.9,17,5,18.4,6.7c1.4,1.7,2,3.9,1.8,6c-0.2,2.2-1.3,4.2-3,5.6c-1.7,1.4-3.9,2-6,1.8c-2.8-0.3-5.2-2-6.5-4.4H8c0.4,0,0.8-0.3,0.8-0.8S8.5,14.2,8,14.2H3.6c0,0,0,0,0,0H3c-0.4,0-0.8,0.3-0.8,0.8v5c0,0.4,0.3,0.8,0.8,0.8s0.8-0.3,0.8-0.8v-2.8c1.6,2.5,4.2,4.1,7.2,4.4c0.3,0,0.7,0.1,1,0.1c2.2,0,4.4-0.8,6.1-2.2c2-1.6,3.3-4,3.5-6.6C22,10.3,21.2,7.8,19.6,5.8z"/>
</symbol>
<symbol id="getting-work-done" viewBox="0 0 24 24">
<path d="M11,21.8c-0.1,0-0.2,0-0.2,0c-0.3-0.1-0.5-0.4-0.5-0.7v-6.2H5c-0.3,0-0.5-0.2-0.7-0.4c-0.1-0.3-0.1-0.6,0.1-0.8l8-11c0.2-0.3,0.5-0.4,0.8-0.3c0.3,0.1,0.5,0.4,0.5,0.7v6.2H19c0.3,0,0.5,0.2,0.7,0.4s0.1,0.6-0.1,0.8l-8,11C11.5,21.6,11.2,21.8,11,21.8z M6.5,13.2H11c0.4,0,0.8,0.3,0.8,0.8v4.7l5.8-7.9H13c-0.4,0-0.8-0.3-0.8-0.8V5.3L6.5,13.2z"/>
</symbol>
<symbol id="objects" viewBox="0 0 24 24">
<path d="M20.7,6.9l-3.6-3.6c-1.4-1.4-3.7-1.4-5.1,0L9.3,6C8.6,6.6,8.2,7.6,8.2,8.5c0,0.9,0.3,1.7,0.8,2.3l-1.6,1.6c-0.1,0.1-0.2,0.3-0.2,0.5v1.2H6c-0.4,0-0.8,0.3-0.8,0.8v1.2H4c-0.2,0-0.4,0.1-0.5,0.2l-0.6,0.6c-0.4,0.5-0.6,1.1-0.6,1.8l0,1.2l0,0.2c0.1,0.9,0.9,1.5,1.7,1.5l1.2,0l0.2,0c0.6-0.1,1.2-0.3,1.7-0.8l6-6c1.4,1.2,3.6,1.1,4.9-0.2l2.6-2.6C22.1,10.6,22.1,8.3,20.7,6.9z M19.6,11L17,13.6c-0.8,0.8-2.2,0.8-3,0l-0.3-0.3c-0.3-0.3-0.8-0.3-1.1,0l-6.6,6.6c-0.2,0.2-0.5,0.3-0.7,0.4l-1.3,0c-0.1,0-0.2-0.1-0.2-0.2l0-1.2c0-0.3,0.1-0.6,0.3-0.8l0.3-0.3H6c0.4,0,0.8-0.3,0.8-0.8v-1.2H8c0.4,0,0.8-0.3,0.8-0.8v-1.7l1.9-1.9c0.1-0.1,0.2-0.3,0.2-0.5c0-0.2-0.1-0.4-0.2-0.5L10.4,10c-0.8-0.8-0.8-2.2,0-3L13,4.4c0.8-0.8,2.2-0.8,3,0L19.6,8C20.5,8.8,20.5,10.2,19.6,11z"/>
<path d="M15,7.8L15,7.8c-0.7,0-1.3,0.6-1.3,1.2s0.6,1.2,1.3,1.2s1.2-0.6,1.2-1.2S15.7,7.8,15,7.8z" />
</symbol>
<symbol id="search" viewBox="0 0 24 24">
<path d="M21.5,20.5L16,14.9c1.1-1.3,1.8-3.1,1.8-4.9c0-4.3-3.5-7.8-7.8-7.8S2.2,5.7,2.2,10s3.5,7.8,7.8,7.8c1.9,0,3.6-0.7,4.9-1.8l5.5,5.5c0.1,0.1,0.3,0.2,0.5,0.2s0.4-0.1,0.5-0.2C21.8,21.2,21.8,20.8,21.5,20.5z M3.8,10c0-3.4,2.8-6.2,6.2-6.2s6.2,2.8,6.2,6.2s-2.8,6.2-6.2,6.2S3.8,13.4,3.8,10z"/>
</symbol>
<symbol id="smileys-and-people" viewBox="0 0 24 24">
<path d="M12,2.2c-5.4,0-9.8,4.4-9.8,9.8s4.4,9.8,9.8,9.8s9.8-4.4,9.8-9.8S17.4,2.2,12,2.2z M12,20.2c-4.5,0-8.2-3.7-8.2-8.2S7.5,3.8,12,3.8s8.2,3.7,8.2,8.2S16.5,20.2,12,20.2z"/>
<path d="M7.8,9.5c0,0.1,0.1,0.1,0.1,0.2c0,0.1,0.1,0.1,0.2,0.2c0.2,0.2,0.6,0.4,0.9,0.4c0.1,0,0.2,0,0.2,0c0.1,0,0.1,0,0.2-0.1c0.1,0,0.1-0.1,0.2-0.1c0.1,0,0.1-0.1,0.2-0.2C9.9,9.8,10,9.8,10,9.7c0-0.1,0.1-0.1,0.1-0.2c0-0.1,0.1-0.2,0.1-0.2c0-0.1,0-0.2,0-0.2c0-0.3-0.1-0.7-0.4-0.9C9.8,8.1,9.8,8,9.7,8c-0.1,0-0.1-0.1-0.2-0.1c-0.1,0-0.2-0.1-0.2-0.1c-0.4-0.1-0.8,0-1.1,0.3C7.9,8.3,7.8,8.7,7.8,9c0,0.1,0,0.2,0,0.2C7.8,9.3,7.8,9.4,7.8,9.5z"/>
<path d="M14.3,10c0.1,0,0.1,0.1,0.2,0.1c0.1,0,0.2,0.1,0.2,0.1c0.1,0,0.2,0,0.2,0s0.2,0,0.2,0c0.1,0,0.2,0,0.2-0.1c0.1,0,0.2-0.1,0.2-0.1c0.1-0.1,0.1-0.1,0.2-0.2c0.2-0.2,0.4-0.6,0.4-0.9c0-0.3-0.1-0.7-0.4-0.9c0-0.1-0.1-0.1-0.2-0.2c-0.1,0-0.1-0.1-0.2-0.1c-0.1,0-0.2-0.1-0.2-0.1c-0.2,0-0.3,0-0.5,0c-0.1,0-0.2,0-0.2,0.1c-0.1,0-0.1,0.1-0.2,0.1c-0.1,0-0.1,0.1-0.2,0.2c-0.2,0.2-0.4,0.6-0.4,0.9c0,0.3,0.1,0.6,0.4,0.9C14.2,9.9,14.2,10,14.3,10z"/>
<path d="M16,12.2H8c-0.4,0-0.8,0.3-0.8,0.8c0,2.6,2.1,4.8,4.8,4.8s4.8-2.1,4.8-4.8C16.8,12.6,16.4,12.2,16,12.2z M12,16.2c-1.5,0-2.8-1.1-3.2-2.5h6.3C14.8,15.2,13.5,16.2,12,16.2z"/>
</symbol>
<symbol id="symbols" viewBox="0 0 24 24">
<path d="M6.5,10.8c2.3,0,4.2-1.9,4.2-4.2S8.8,2.2,6.5,2.2S2.2,4.2,2.2,6.5S4.2,10.8,6.5,10.8z M6.5,3.8C8,3.8,9.2,5,9.2,6.5S8,9.2,6.5,9.2S3.8,8,3.8,6.5S5,3.8,6.5,3.8z"/>
<path d="M7.2,13.6c-0.3-0.5-1-0.5-1.3,0l-4,7c-0.1,0.2-0.1,0.5,0,0.7c0.1,0.2,0.4,0.4,0.6,0.4h8c0.3,0,0.5-0.1,0.6-0.4c0.1-0.2,0.1-0.5,0-0.7L7.2,13.6z M3.8,20.2l2.7-4.7l2.7,4.7H3.8z"/>
<path d="M18.6,6.5l3-3c0.3-0.3,0.3-0.8,0-1.1s-0.8-0.3-1.1,0l-3,3l-3-3c-0.3-0.3-0.8-0.3-1.1,0s-0.3,0.8,0,1.1l3,3l-3,3c-0.3,0.3-0.3,0.8,0,1.1c0.1,0.1,0.3,0.2,0.5,0.2s0.4-0.1,0.5-0.2l3-3l3,3c0.1,0.1,0.3,0.2,0.5,0.2s0.4-0.1,0.5-0.2c0.3-0.3,0.3-0.8,0-1.1L18.6,6.5z"/>
<path d="M21,13.2h-7c-0.4,0-0.8,0.3-0.8,0.8v7c0,0.4,0.3,0.8,0.8,0.8h7c0.4,0,0.8-0.3,0.8-0.8v-7C21.8,13.6,21.4,13.2,21,13.2zM20.2,20.2h-5.5v-5.5h5.5V20.2z"/>
</symbol>
<symbol id="travel-and-places" viewBox="0 0 24 24">
<path d="M21.5,11.5l-9-9c-0.3-0.3-0.8-0.3-1.1,0l-9,9c-0.2,0.2-0.3,0.5-0.2,0.8s0.4,0.5,0.7,0.5h1.2V19c0,1.5,1.2,2.8,2.8,2.8h10c1.5,0,2.8-1.2,2.8-2.8v-6.2H21c0.3,0,0.6-0.2,0.7-0.5C21.8,12,21.7,11.7,21.5,11.5z M18.2,19c0,0.7-0.6,1.2-1.2,1.2H7c-0.7,0-1.2-0.6-1.2-1.2v-7c0-0.4-0.3-0.8-0.8-0.8H4.8L12,4.1l7.2,7.2H19c-0.4,0-0.8,0.3-0.8,0.8V19z"/>
<path d="M14,11.2h-4c-0.4,0-0.8,0.3-0.8,0.8v4c0,0.4,0.3,0.8,0.8,0.8h4c0.4,0,0.8-0.3,0.8-0.8v-4C14.8,11.6,14.4,11.2,14,11.2zM13.2,15.2h-2.5v-2.5h2.5V15.2z"/>
</symbol>
<symbol id="custom" viewBox="0 0 16 16">
<path fill-rule="evenodd" clip-rule="evenodd" d="M9.6678 3.79452L9.31385 2.37873C9.2582 2.15615 9.05821 2 8.82878 2H7.17111C6.94167 2 6.74168 2.15615 6.68604 2.37873L6.33209 3.79452L5.93172 4.00216C5.80906 4.06577 5.68965 4.1349 5.57382 4.20922L5.19337 4.45333L3.78866 4.0515C3.56807 3.9884 3.33285 4.08352 3.21813 4.28221L2.38929 5.7178C2.27458 5.9165 2.30981 6.16777 2.47475 6.32725L3.5249 7.34265L3.50459 7.79313C3.50151 7.86163 3.49994 7.9306 3.49994 8C3.49994 8.0694 3.50151 8.13837 3.50459 8.20687L3.5249 8.65735L2.47475 9.67275C2.30981 9.83223 2.27458 10.0835 2.38929 10.2822L3.21813 11.7178C3.33285 11.9165 3.56807 12.0116 3.78866 11.9485L5.19337 11.5467L5.57382 11.7908C5.68966 11.8651 5.80907 11.9342 5.93172 11.9978L6.33209 12.2055L6.68604 13.6213C6.74168 13.8439 6.94167 14 7.17111 14H8.82878C9.05821 14 9.2582 13.8439 9.31385 13.6213L9.6678 12.2055L10.0682 11.9978C10.1908 11.9342 10.3102 11.8651 10.4261 11.7908L10.8065 11.5467L12.2112 11.9485C12.4318 12.0116 12.667 11.9165 12.7818 11.7178L13.6106 10.2822C13.7253 10.0835 13.6901 9.83225 13.5251 9.67276L12.475 8.65736L12.4953 8.20688C12.4984 8.13837 12.4999 8.0694 12.4999 8C12.4999 7.9306 12.4984 7.86163 12.4953 7.79312L12.475 7.34264L13.5251 6.32724C13.6901 6.16775 13.7253 5.91648 13.6106 5.71779L12.7818 4.2822C12.667 4.0835 12.4318 3.98838 12.2112 4.05148L10.8065 4.45332L10.4261 4.20921C10.3102 4.13489 10.1908 4.06577 10.0682 4.00216L9.6678 3.79452ZM10.5286 3.11444L10.284 2.1362C10.1171 1.46845 9.51708 1 8.82878 1H7.17111C6.48281 1 5.88283 1.46845 5.71589 2.1362L5.47133 3.11444C5.32132 3.19224 5.17534 3.27675 5.03379 3.36757L4.06369 3.09006C3.40193 2.90076 2.69626 3.18613 2.3521 3.78221L1.52327 5.2178C1.17912 5.81389 1.28482 6.5677 1.77964 7.04615L2.50561 7.7481C2.50185 7.8316 2.49994 7.91558 2.49994 8C2.49994 8.08442 2.50185 8.1684 2.50561 8.2519L1.77964 8.95385C1.28482 9.4323 1.17912 10.1861 1.52327 10.7822L2.3521 12.2178C2.69626 12.8139 3.40193 13.0992 4.06369 12.9099L5.03379 12.6324C5.17534 12.7232 5.32132 12.8078 5.47133 12.8856L5.71589 13.8638C5.88283 14.5316 6.48281 15 7.17111 15H8.82878C9.51708 15 10.1171 14.5316 10.284 13.8638L10.5286 12.8856C10.6786 12.8078 10.8245 12.7233 10.9661 12.6324L11.9362 12.91C12.598 13.0993 13.3036 12.8139 13.6478 12.2178L14.4766 10.7822C14.8208 10.1861 14.7151 9.43231 14.2202 8.95386L13.4943 8.25191C13.498 8.16841 13.4999 8.08443 13.4999 8C13.4999 7.91557 13.498 7.83159 13.4943 7.74809L14.2202 7.04614C14.7151 6.56769 14.8208 5.81387 14.4766 5.21779L13.6478 3.7822C13.3036 3.18611 12.598 2.90074 11.9362 3.09005L10.9661 3.36756C10.8245 3.27675 10.6786 3.19224 10.5286 3.11444Z" />
<path fill-rule="evenodd" clip-rule="evenodd" d="M7.99994 10C9.10451 10 9.99994 9.10457 9.99994 8C9.99994 6.89543 9.10451 6 7.99994 6C6.89537 6 5.99994 6.89543 5.99994 8C5.99994 9.10457 6.89537 10 7.99994 10ZM7.99994 11C9.6568 11 10.9999 9.65685 10.9999 8C10.9999 6.34315 9.6568 5 7.99994 5C6.34309 5 4.99994 6.34315 4.99994 8C4.99994 9.65685 6.34309 11 7.99994 11Z" />
</symbol>
</svg>

After

Width:  |  Height:  |  Size: 15 KiB

+5
View File
@@ -0,0 +1,5 @@
{
"$schema": "https://developer.microsoft.com/json-schemas/rig-package/rig.schema.json",
"rigPackageName": "@hcengineering/platform-rig",
"rigProfile": "assets"
}
+7
View File
@@ -0,0 +1,7 @@
module.exports = {
preset: 'ts-jest',
testEnvironment: 'node',
testMatch: ['**/?(*.)+(spec|test).[jt]s?(x)'],
roots: ["./src"],
coverageReporters: ["text-summary", "html"]
}
+41
View File
@@ -0,0 +1,41 @@
{
"string": {
"SmileysAndPeople": "Smajlíky & Lidé",
"Components": "Součást",
"AnimalsAndNature": "Zvířata & Příroda",
"FoodAndDrink": "Jídlo & Pití",
"TravelAndPlaces": "Cestování a místa",
"Activities": "Aktivita",
"Objects": "Objekty",
"Symbols": "Symboly",
"Flags": "Příznak",
"FrequentlyUsed": "Často používané",
"GettingWorkDone": "Dokončování práce",
"DefaultSkinTone": "Výchozí tón pleti",
"NoTone": "Žádný tón",
"Light": "Světlo",
"MediumLight": "Středně světlý",
"Medium": "Střední",
"MediumDark": "Středně tmavý",
"Dark": "Tmavý",
"Remove": "Odstranit",
"SearchDots": "Hledám...",
"SearchResults": "Výsledky vyhledávání",
"CustomEmojis": "Vlastní emoji",
"Shortcode": "Název",
"ShortcodeDescription": "Může obsahovat písmena, číslice a symboly '-', '+' a '_'.",
"Image": "Obrázek",
"ImageDescription": "Zadejte soubor .gif, .png nebo .jpg pro vaše emoji.",
"UploadImage": "Nahrát",
"Preview": "Náhled",
"PreviewTextBegin": "Toto je věta s ",
"PreviewTextEnd": " uvnitř.",
"CreateTitle": "Vytvořit vlastní emoji",
"Create": "Vytvořit",
"ImageAspectError": "Obrázek musí mít poměr stran 1:1.",
"ShortcodeMatchError": "Může obsahovat písmena, číslice a symboly '-', '+' a '_'.",
"ShortcodeExistsError": "Tento název je již používán. Zvolte jiný název.",
"NewCustomEmojiDialogClose": "Zavřít dialogové okno?",
"NewCustomEmojiDialogCloseNote": "Všechny změny budou ztraceny"
}
}
+41
View File
@@ -0,0 +1,41 @@
{
"string": {
"SmileysAndPeople": "Smileys & Personen",
"Components": "Hauptkomponenten",
"AnimalsAndNature": "Tiere & Natur",
"FoodAndDrink": "Essen & Trinken",
"TravelAndPlaces": "Reisen & Orte",
"Activities": "Aktivitäten",
"Objects": "Objekte",
"Symbols": "Symbole",
"Flags": "Flags",
"FrequentlyUsed": "Häufig verwendet",
"GettingWorkDone": "Arbeit erledigen",
"DefaultSkinTone": "Standard-Hautton",
"NoTone": "Kein Ton",
"Light": "Leicht",
"MediumLight": "Mittelhell",
"Medium": "Mittel",
"MediumDark": "Mitteldunkel",
"Dark": "Dunkel",
"Remove": "Entfernen",
"SearchDots": "Suchen...",
"SearchResults": "Suchergebnisse",
"CustomEmojis": "Benutzerdefinierte Emojis",
"Shortcode": "Name",
"ShortcodeDescription": "Kann Buchstaben, Zahlen und die Symbole '-', '+' und '_' enthalten.",
"Image": "Bild",
"ImageDescription": "Geben Sie eine .gif-, .png- oder .jpg-Datei für Ihr Emoji an.",
"UploadImage": "Hochladen",
"Preview": "Vorschau",
"PreviewTextBegin": "Dies ist ein Satz mit ",
"PreviewTextEnd": " darin.",
"CreateTitle": "Benutzerdefiniertes Emoji erstellen",
"Create": "Erstellen",
"ImageAspectError": "Das Bild muss ein Seitenverhältnis von 1:1 haben.",
"ShortcodeMatchError": "Kann Buchstaben, Zahlen und die Symbole '-', '+' und '_' enthalten.",
"ShortcodeExistsError": "Dieser Name wird bereits verwendet. Bitte wählen Sie einen anderen.",
"NewCustomEmojiDialogClose": "Dialog schließen?",
"NewCustomEmojiDialogCloseNote": "Alle Änderungen gehen verloren"
}
}
+41
View File
@@ -0,0 +1,41 @@
{
"string": {
"SmileysAndPeople": "Smileys & People",
"Components": "Components",
"AnimalsAndNature": "Animals & Nature",
"FoodAndDrink": "Food & Drink",
"TravelAndPlaces": "Travel & Places",
"Activities": "Activities",
"Objects": "Objects",
"Symbols": "Symbols",
"Flags": "Flags",
"FrequentlyUsed": "Frequently used",
"GettingWorkDone": "Getting work done",
"DefaultSkinTone": "Default skin tone",
"NoTone": "No tone",
"Light": "Light",
"MediumLight": "Medium-light",
"Medium": "Medium",
"MediumDark": "Medium-dark",
"Dark": "Dark",
"Remove": "Remove",
"SearchDots": "Search...",
"SearchResults": "Search Results",
"CustomEmojis": "Custom Emojis",
"Shortcode": "Name",
"ShortcodeDescription": "It can contain letters, numbers, and the symbols '-', '+' and '_'.",
"Image": "Image",
"ImageDescription": "Specify a .gif, .png, or .jpg file for your emoji.",
"UploadImage": "Upload",
"Preview": "Preview",
"PreviewTextBegin": "This is a sentence with ",
"PreviewTextEnd": " in it.",
"CreateTitle": "Create a custom Emoji",
"Create": "Create",
"ImageAspectError": "The image must have an aspect ratio of 1:1.",
"ShortcodeMatchError": "It can contain letters, numbers, and the symbols '-', '+' and '_'.",
"ShortcodeExistsError": "This name is already in use. Please choose another name.",
"NewCustomEmojiDialogClose": "Do you want to close this dialog?",
"NewCustomEmojiDialogCloseNote": "All changes will be lost"
}
}
+41
View File
@@ -0,0 +1,41 @@
{
"string": {
"SmileysAndPeople": "Emoticonos y Personas",
"Components": "Componentes",
"AnimalsAndNature": "Animales y Naturaleza",
"FoodAndDrink": "Comida y Bebida",
"TravelAndPlaces": "Viajes y lugares",
"Activities": "Actividades",
"Objects": "Objetos",
"Symbols": "Símbolos",
"Flags": "Banderas",
"FrequentlyUsed": "De uso frecuente",
"GettingWorkDone": "Haciendo el trabajo",
"DefaultSkinTone": "Tono de piel predeterminado",
"NoTone": "Sin tono",
"Light": "Claro",
"MediumLight": "Medio-Сlaro",
"Medium": "Medio",
"MediumDark": "Medio-Oscuro",
"Dark": "Oscuro",
"Remove": "Eliminar",
"SearchDots": "Buscar...",
"SearchResults": "Resultados de la búsqueda",
"CustomEmojis": "Emojis personalizados",
"Shortcode": "Nombre",
"ShortcodeDescription": "Puede contener letras, números y los símbolos '-', '+' y '_'.",
"Image": "Imagen",
"ImageDescription": "Especifique un archivo .gif, .png o .jpg para su emoji.",
"UploadImage": "Subir",
"Preview": "Vista previa",
"PreviewTextBegin": "Esta es una oración con ",
"PreviewTextEnd": " dentro.",
"CreateTitle": "Crear emoji personalizado",
"Create": "Crear",
"ImageAspectError": "La imagen debe tener una relación de aspecto 1:1.",
"ShortcodeMatchError": "Puede contener letras, números y los símbolos '-', '+' y '_'.",
"ShortcodeExistsError": "Este nombre ya está en uso. Elija otro nombre.",
"NewCustomEmojiDialogClose": "¿Cerrar el diálogo?",
"NewCustomEmojiDialogCloseNote": "Todos los cambios se perderán"
}
}
+41
View File
@@ -0,0 +1,41 @@
{
"string": {
"SmileysAndPeople": "Smileys & Personnes",
"Components": "Composants",
"AnimalsAndNature": "Animaux & Nature",
"FoodAndDrink": "Nourriture & Boissons",
"TravelAndPlaces": "Voyages & Lieux",
"Activities": "Activités",
"Objects": "Objets",
"Symbols": "Symboles",
"Flags": "Drapeaux",
"FrequentlyUsed": "Fréquemment utilisé",
"GettingWorkDone": "Faire le travail",
"DefaultSkinTone": "Teint par défaut",
"NoTone": "Pas de tonalité",
"Light": "Clair",
"MediumLight": "Moyen-clair",
"Medium": "Moyen",
"MediumDark": "Moyen-foncé",
"Dark": "Foncé",
"Remove": "Supprimer",
"SearchDots": "Recherche...",
"SearchResults": "Résultats de la recherche",
"CustomEmojis": "Émojis personnalisés",
"Shortcode": "Nom",
"ShortcodeDescription": "Peut contenir des lettres, chiffres et symboles '-', '+' et '_'.",
"Image": "Image",
"ImageDescription": "Spécifiez un fichier .gif, .png ou .jpg pour votre émoji.",
"UploadImage": "Télécharger",
"Preview": "Aperçu",
"PreviewTextBegin": "Ceci est une phrase avec ",
"PreviewTextEnd": " à l'intérieur.",
"CreateTitle": "Créer un émoji personnalisé",
"Create": "Créer",
"ImageAspectError": "L'image doit avoir un rapport d'aspect 1:1.",
"ShortcodeMatchError": "Peut contenir des lettres, chiffres et symboles '-', '+' et '_'.",
"ShortcodeExistsError": "Ce nom est déjà utilisé. Veuillez en choisir un autre.",
"NewCustomEmojiDialogClose": "Fermer la boîte de dialogue ?",
"NewCustomEmojiDialogCloseNote": "Toutes les modifications seront perdues"
}
}
+41
View File
@@ -0,0 +1,41 @@
{
"string": {
"SmileysAndPeople": "Faccine & Persone",
"Components": "Componente",
"AnimalsAndNature": "Animali & Natura",
"FoodAndDrink": "Cibo & Bevande",
"TravelAndPlaces": "Viaggi e luoghi",
"Activities": "Attivita",
"Objects": "Oggetti",
"Symbols": "Simboli",
"Flags": "Bandiera",
"FrequentlyUsed": "Usato frequentemente",
"GettingWorkDone": "Completamento del lavoro",
"DefaultSkinTone": "Tono della pelle predefinito",
"NoTone": "Nessun tono",
"Light": "Chiaro",
"MediumLight": "Medio-chiaro",
"Medium": "Medio",
"MediumDark": "Medio-scuro",
"Dark": "Scuro",
"Remove": "Rimuovere",
"SearchDots": "Cerca...",
"SearchResults": "Risultati ricerca",
"CustomEmojis": "Emoji personalizzati",
"Shortcode": "Nome",
"ShortcodeDescription": "Può contenere lettere, numeri e i simboli '-', '+' e '_'.",
"Image": "Immagine",
"ImageDescription": "Specifica un file .gif, .png o .jpg per la tua emoji.",
"UploadImage": "Carica",
"Preview": "Anteprima",
"PreviewTextBegin": "Questa è una frase con ",
"PreviewTextEnd": " all'interno.",
"CreateTitle": "Crea emoji personalizzato",
"Create": "Crea",
"ImageAspectError": "L'immagine deve avere un rapporto 1:1.",
"ShortcodeMatchError": "Può contenere lettere, numeri e i simboli '-', '+' e '_'.",
"ShortcodeExistsError": "Questo nome è già in uso. Scegli un altro nome.",
"NewCustomEmojiDialogClose": "Chiudere la finestra?",
"NewCustomEmojiDialogCloseNote": "Tutte le modifiche andranno perse"
}
}
+41
View File
@@ -0,0 +1,41 @@
{
"string": {
"SmileysAndPeople": "スマイリーと人",
"Components": "構成要素",
"AnimalsAndNature": "動物と自然",
"FoodAndDrink": "食べ物と飲み物",
"TravelAndPlaces": "旅行と場所",
"Activities": "アクティビティ",
"Objects": "物",
"Symbols": "記号",
"Flags": "旗",
"FrequentlyUsed": "よく使う絵文字",
"GettingWorkDone": "仕事でよく使う絵文字",
"DefaultSkinTone": "デフォルトの肌の色",
"NoTone": "トーンなし",
"Light": "明るい",
"MediumLight": "やや明るい",
"Medium": "中間",
"MediumDark": "やや暗い",
"Dark": "暗い",
"Remove": "削除",
"SearchDots": "検索...",
"SearchResults": "検索結果",
"CustomEmojis": "カスタム絵文字",
"Shortcode": "名前",
"ShortcodeDescription": "文字、数字、記号「-」「+」「_」が使用できます。",
"Image": "画像",
"ImageDescription": "絵文字用の.gif、.png、.jpgファイルを指定してください。",
"UploadImage": "アップロード",
"Preview": "プレビュー",
"PreviewTextBegin": "これは",
"PreviewTextEnd": "を含む文です。",
"CreateTitle": "カスタム絵文字の作成",
"Create": "作成",
"ImageAspectError": "画像は1:1のアスペクト比が必要です。",
"ShortcodeMatchError": "文字、数字、記号「-」「+」「_」が使用できます。",
"ShortcodeExistsError": "この名前は既に使用されています。別の名前を選択してください。",
"NewCustomEmojiDialogClose": "ダイアログを閉じますか?",
"NewCustomEmojiDialogCloseNote": "すべての変更が失われます"
}
}
+41
View File
@@ -0,0 +1,41 @@
{
"string": {
"SmileysAndPeople": "Carinhas & Pessoas",
"Components": "Componentes",
"AnimalsAndNature": "Animais & Natureza",
"FoodAndDrink": "Alimentos & Bebidas",
"TravelAndPlaces": "Viagens e Locais",
"Activities": "Actividades",
"Objects": "Objetos",
"Symbols": "Símbolos",
"Flags": "Bandeiras",
"FrequentlyUsed": "Frequentemente utilizado",
"GettingWorkDone": "A fazer",
"DefaultSkinTone": "Tom de pele padrão",
"NoTone": "Sem tom",
"Light": "Claro",
"MediumLight": "Médio Claro",
"Medium": "Médio",
"MediumDark": "Médio Escuro",
"Dark": "Escuro",
"Remove": "Remover",
"SearchDots": "Pesquisar...",
"SearchResults": "Resultados da pesquisa",
"CustomEmojis": "Emojis personalizados",
"Shortcode": "Nome",
"ShortcodeDescription": "Pode conter letras, números e os símbolos '-', '+' e '_'.",
"Image": "Imagem",
"ImageDescription": "Especifique um arquivo .gif, .png ou .jpg para seu emoji.",
"UploadImage": "Carregar",
"Preview": "Pré-visualização",
"PreviewTextBegin": "Esta é uma frase com ",
"PreviewTextEnd": " dentro.",
"CreateTitle": "Criar emoji personalizado",
"Create": "Criar",
"ImageAspectError": "A imagem deve ter proporção 1:1.",
"ShortcodeMatchError": "Pode conter letras, números e os símbolos '-', '+' e '_'.",
"ShortcodeExistsError": "Este nome já está em uso. Escolha outro nome.",
"NewCustomEmojiDialogClose": "Fechar diálogo?",
"NewCustomEmojiDialogCloseNote": "Todas as alterações serão perdidas"
}
}
+41
View File
@@ -0,0 +1,41 @@
{
"string": {
"SmileysAndPeople": "Эмоции & Люди",
"Components": "Компоненты",
"AnimalsAndNature": "Животные & Природа",
"FoodAndDrink": "Еда & Напитки",
"TravelAndPlaces": "Путешествия & Места",
"Activities": "Варианты досуга",
"Objects": "Объекты",
"Symbols": "Символы",
"Flags": "Флаги",
"FrequentlyUsed": "Часто используемые",
"GettingWorkDone": "Для работы",
"DefaultSkinTone": "Тон кожи по умолчанию",
"NoTone": "Без тона",
"Light": "Cветлый",
"MediumLight": "Cредне-светлый",
"Medium": "Средний",
"MediumDark": "Средне-темный",
"Dark": "Темный",
"Remove": "Удалить",
"SearchDots": "Поиск...",
"SearchResults": "Результаты поиска",
"CustomEmojis": "Пользовательские эмодзи",
"Shortcode": "Имя",
"ShortcodeDescription": "Может содержать буквы, цифры и символы '-', '+' и '_'.",
"Image": "Изображение",
"ImageDescription": "Укажите файл .gif, .png или .jpg для вашего эмодзи.",
"UploadImage": "Загрузить",
"Preview": "Предпросмотр",
"PreviewTextBegin": "Это предложение содержит ",
"PreviewTextEnd": " внутри.",
"CreateTitle": "Создать пользовательский эмодзи",
"Create": "Создать",
"ImageAspectError": "Изображение должно иметь соотношение сторон 1:1.",
"ShortcodeMatchError": "Может содержать буквы, цифры и символы '-', '+' и '_'.",
"ShortcodeExistsError": "Это имя уже используется. Выберите другое.",
"NewCustomEmojiDialogClose": "Закрыть диалоговое окно?",
"NewCustomEmojiDialogCloseNote": "Все изменения будут потеряны"
}
}
+41
View File
@@ -0,0 +1,41 @@
{
"string": {
"SmileysAndPeople": "微笑与人",
"Components": "组件",
"AnimalsAndNature": "动物与自然",
"FoodAndDrink": "食物及饮品",
"TravelAndPlaces": "旅行和地点",
"Activities": "活动",
"Objects": "物体",
"Symbols": "符号",
"Flags": "旗帜",
"FrequentlyUsed": "经常使用",
"GettingWorkDone": "完成工作",
"DefaultSkinTone": "默认肤色",
"NoTone": "违约情况",
"Light": "光",
"MediumLight": "中光",
"Medium": "中等",
"MediumDark": "中暗",
"Dark": "黑暗",
"Remove": "移走",
"SearchDots": "搜索...",
"SearchResults": "搜寻结果",
"CustomEmojis": "自定义表情",
"Shortcode": "名称",
"ShortcodeDescription": "可包含字母、数字及符号'-', '+'和'_'。",
"Image": "图像",
"ImageDescription": "请指定.gif、.png或.jpg格式的图片文件。",
"UploadImage": "上传",
"Preview": "预览",
"PreviewTextBegin": "这是一个包含",
"PreviewTextEnd": "的示例句子。",
"CreateTitle": "创建自定义表情",
"Create": "创建",
"ImageAspectError": "图像必须为1:1比例。",
"ShortcodeMatchError": "可包含字母、数字及符号'-', '+'和'_'。",
"ShortcodeExistsError": "该名称已被使用,请选择其他名称。",
"NewCustomEmojiDialogClose": "要关闭对话框吗?",
"NewCustomEmojiDialogCloseNote": "所有更改将丢失"
}
}

Some files were not shown because too many files have changed in this diff Show More