@omnsight/osint-entity-components 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +76 -0
  3. package/package.json +82 -0
  4. package/src/App.tsx +245 -0
  5. package/src/assets/icons/generated/basil-document-solid.tsx +8 -0
  6. package/src/assets/icons/generated/boxicons-announcement.tsx +8 -0
  7. package/src/assets/icons/generated/boxicons-book.tsx +8 -0
  8. package/src/assets/icons/generated/codicon-organization.tsx +8 -0
  9. package/src/assets/icons/generated/emojione-monotone-ship.tsx +8 -0
  10. package/src/assets/icons/generated/fa-solid-ship.tsx +8 -0
  11. package/src/assets/icons/generated/flowbite-truck-solid.tsx +8 -0
  12. package/src/assets/icons/generated/fluent-emoji-high-contrast-broken-chain.tsx +8 -0
  13. package/src/assets/icons/generated/fluent-emoji-high-contrast-military-helmet.tsx +8 -0
  14. package/src/assets/icons/generated/game-icons-bombing-run.tsx +8 -0
  15. package/src/assets/icons/generated/game-icons-missile-launcher.tsx +8 -0
  16. package/src/assets/icons/generated/game-icons-pistol-gun.tsx +8 -0
  17. package/src/assets/icons/generated/gg-website.tsx +8 -0
  18. package/src/assets/icons/generated/hugeicons-trade-up.tsx +8 -0
  19. package/src/assets/icons/generated/ic-sharp-oil-barrel.tsx +8 -0
  20. package/src/assets/icons/generated/ion-train-sharp.tsx +8 -0
  21. package/src/assets/icons/generated/mdi-account-school.tsx +8 -0
  22. package/src/assets/icons/generated/mdi-account-tie-hat.tsx +8 -0
  23. package/src/assets/icons/generated/mdi-account-tie.tsx +19 -0
  24. package/src/assets/icons/generated/mdi-airplane.tsx +8 -0
  25. package/src/assets/icons/generated/mdi-factory.tsx +19 -0
  26. package/src/assets/icons/generated/mdi-forum.tsx +8 -0
  27. package/src/assets/icons/generated/mdi-handcuffs.tsx +8 -0
  28. package/src/assets/icons/generated/mdi-tank.tsx +19 -0
  29. package/src/assets/icons/generated/mingcute-government-line.tsx +25 -0
  30. package/src/assets/icons/generated/mingcute-phone-call-fill.tsx +8 -0
  31. package/src/assets/icons/generated/pixel-technology.tsx +8 -0
  32. package/src/assets/icons/generated/ri-exchange-box-fill.tsx +8 -0
  33. package/src/assets/icons/generated/ri-seedling-line.tsx +8 -0
  34. package/src/assets/icons/generated/ri-spy-fill.tsx +8 -0
  35. package/src/assets/icons/generated/streamline-cyber-newspaper-2.tsx +8 -0
  36. package/src/assets/icons/generated/streamline-flex-deepfake-technology-1-solid.tsx +8 -0
  37. package/src/assets/icons/generated/uit-social-media-logo.tsx +8 -0
  38. package/src/avatars/EmptyAvatar.tsx +12 -0
  39. package/src/avatars/EventAvatar.tsx +40 -0
  40. package/src/avatars/OrganizationAvatar.tsx +43 -0
  41. package/src/avatars/PersonAvatar.tsx +41 -0
  42. package/src/avatars/SourceAvatar.tsx +67 -0
  43. package/src/avatars/WebsiteAvatar.tsx +40 -0
  44. package/src/avatars/index.ts +12 -0
  45. package/src/avatars/layouts/AvatarDropdown.tsx +48 -0
  46. package/src/avatars/layouts/AvatarRowList.tsx +23 -0
  47. package/src/avatars/layouts/AvatarSpan.tsx +11 -0
  48. package/src/avatars/layouts/EntityStyles.css +10 -0
  49. package/src/avatars/layouts/RelationTooltip.tsx +75 -0
  50. package/src/cards/EventCard.tsx +46 -0
  51. package/src/cards/OrganizationCard.tsx +38 -0
  52. package/src/cards/PersonCard.tsx +46 -0
  53. package/src/cards/SourceCard.tsx +63 -0
  54. package/src/cards/WebsiteCard.tsx +63 -0
  55. package/src/cards/index.ts +5 -0
  56. package/src/env.d.ts +2 -0
  57. package/src/i18n.ts +22 -0
  58. package/src/icons/Event/Icon.tsx +32 -0
  59. package/src/icons/Event/Select.tsx +61 -0
  60. package/src/icons/Event/icons.ts +118 -0
  61. package/src/icons/Organization/Icon.tsx +41 -0
  62. package/src/icons/Organization/Select.tsx +61 -0
  63. package/src/icons/Organization/icons.ts +53 -0
  64. package/src/icons/Person/Icon.tsx +34 -0
  65. package/src/icons/Person/Select.tsx +55 -0
  66. package/src/icons/Person/icons.ts +27 -0
  67. package/src/icons/Source/Icon.tsx +35 -0
  68. package/src/icons/Source/Select.tsx +61 -0
  69. package/src/icons/Source/icons.ts +40 -0
  70. package/src/icons/Website/Icon.tsx +39 -0
  71. package/src/icons/Website/Select.tsx +61 -0
  72. package/src/icons/Website/icons.ts +35 -0
  73. package/src/icons/index.ts +10 -0
  74. package/src/index.tsx +3 -0
  75. package/src/locales/en.json +75 -0
  76. package/src/locales/zh.json +76 -0
  77. package/src/main.tsx +22 -0
@@ -0,0 +1,8 @@
1
+ // From: https://icon-sets.iconify.design/flowbite/truck-solid
2
+ import type { SVGProps } from 'react';
3
+ export const IconFlowbiteTruckSolid = ({
4
+ size = 24,
5
+ ...props
6
+ }: SVGProps<SVGSVGElement> & {
7
+ size?: number | string;
8
+ }) => <svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 24 24" width={size} height={size} {...props}><path fillRule="evenodd" d="M4 4a2 2 0 0 0-2 2v9a1 1 0 0 0 1 1h.535a3.5 3.5 0 1 0 6.93 0h3.07a3.5 3.5 0 1 0 6.93 0H21a1 1 0 0 0 1-1v-4a1 1 0 0 0-.106-.447l-2-4A1 1 0 0 0 19 6h-5a2 2 0 0 0-2-2zm14.192 11.59.016.02a1.5 1.5 0 1 1-.016-.021Zm-10 0 .016.02a1.5 1.5 0 1 1-.016-.021Zm5.806-5.572v-2.02h4.396l1 2.02z" clipRule="evenodd" /></svg>;
@@ -0,0 +1,8 @@
1
+ // From: https://icon-sets.iconify.design/fluent-emoji-high-contrast/broken-chain
2
+ import type { SVGProps } from 'react';
3
+ export const IconFluentEmojiHighContrastBrokenChain = ({
4
+ size = 24,
5
+ ...props
6
+ }: SVGProps<SVGSVGElement> & {
7
+ size?: number | string;
8
+ }) => <svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 32 32" width={size} height={size} {...props}><path d="M28.457 3.54a5.26 5.26 0 0 0-7.44 0L18.04 6.518a5.27 5.27 0 0 0-1.301 5.293l2.484-2.484c.329-.329.722-.55 1.14-.666l2.886-2.887a2.104 2.104 0 1 1 2.976 2.977l-2.585 2.585a2.58 2.58 0 0 1-.753 1.654l-2.365 2.364a5.26 5.26 0 0 0 4.959-1.393l2.976-2.977a5.26 5.26 0 0 0 0-7.442" /><path d="m22.18 12.282-3.927 3.926-.003.002c-.47.469-1.355.343-1.974-.28-.62-.623-.74-1.507-.27-1.976l.038-.035 3.886-3.886a1.59 1.59 0 0 1 2.25 0 1.59 1.59 0 0 1 0 2.249M11.782 16.73a5.26 5.26 0 0 0-5.266 1.31L3.54 21.018a5.263 5.263 0 0 0 7.44 7.442l2.977-2.976a5.26 5.26 0 0 0 1.388-4.989L12.85 22.99a2.58 2.58 0 0 1-1.612.747l-2.49 2.49a2.11 2.11 0 0 1-2.976 0 2.11 2.11 0 0 1 0-2.977l2.737-2.737a2.6 2.6 0 0 1 .678-1.186z" /><path d="M9.894 20.034a1.59 1.59 0 0 0 0 2.249 1.595 1.595 0 0 0 2.249 0l3.231-3.232.052-.047c.471-.469.35-1.354-.27-1.977-.619-.623-1.503-.748-1.974-.28l-.042.045-.003-.002zM12.01 4.762a1 1 0 1 0-1.94.487l.96 2.964a1 1 0 1 0 1.94-.487zm-7.717.487a.996.996 0 0 1 1.414 0l4 4.02a1.01 1.01 0 0 1 0 1.421.996.996 0 0 1-1.414 0l-4-4.02a1.01 1.01 0 0 1 0-1.421m-.018 5.774a1.006 1.006 0 0 0-.55 1.933l3.5 1.005a1.006 1.006 0 0 0 .55-1.933zm24.686 9.263a1 1 0 0 1-1.236.69l-3.5-1.004a1.006 1.006 0 0 1 .55-1.933l3.5 1.005c.53.152.838.709.686 1.242m-2.668 6.465a.996.996 0 0 0 1.414 0 1.01 1.01 0 0 0 0-1.421l-4-4.02a.996.996 0 0 0-1.414 0 1.01 1.01 0 0 0 0 1.42zm-5.09 1.219a1 1 0 0 1-1.213-.732l-.96-2.964a1 1 0 1 1 1.94-.488l.96 2.965a1.005 1.005 0 0 1-.727 1.219" /></svg>;
@@ -0,0 +1,8 @@
1
+ // From: https://icon-sets.iconify.design/fluent-emoji-high-contrast/military-helmet
2
+ import type { SVGProps } from 'react';
3
+ export const IconFluentEmojiHighContrastMilitaryHelmet = ({
4
+ size = 24,
5
+ ...props
6
+ }: SVGProps<SVGSVGElement> & {
7
+ size?: number | string;
8
+ }) => <svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 32 32" width={size} height={size} {...props}><path d="M30 12.46c-.019-.762-.624-1.368-1.367-1.45a20 20 0 0 0-1.6.104c-1.016.106-2.044.284-2.714.515-.615.212-1.87.775-3.484 1.527-.91.424-1.92.902-2.978 1.402-.81.383-1.647.779-2.488 1.174-1.937.91-3.889 1.811-5.537 2.521-1.63.702-3.017 1.241-3.798 1.394-.964.189-2.438.357-3.563.408q-.152.44-.341.865c-.09.18-.13.38-.13.6A1.5 1.5 0 0 0 3.5 23c2.813 0 4.099-.576 6.607-1.701l.153-.069 12.7-5.72.614-.278C25.373 14.416 26.288 14 28.49 14c.85 0 1.53-.69 1.51-1.54" /><path d="m26.93 10.12.26-.026C25.413 5.364 20.848 2 15.5 2 8.65 2 3 7.67 3 14.5v2.56a8.7 8.7 0 0 1-.234 1.978c1.006-.063 2.24-.209 3.075-.372.657-.129 1.942-.62 3.595-1.331 1.633-.703 3.572-1.6 5.508-2.508.835-.392 1.671-.788 2.48-1.17l.002-.001c1.061-.502 2.077-.982 2.987-1.406 1.596-.744 2.904-1.333 3.58-1.566.78-.27 1.898-.456 2.937-.564M18.836 26l-.6-2.1H13.26L14 26z" /><path d="M17.685 21.9h.575c.882 0 1.678.592 1.921 1.445l.599 2.095a1.99 1.99 0 0 1-.324 1.765c-.264.348-.636.6-1.05.718l.364 1.277c.12.4-.18.8-.6.8h-3.61a.75.75 0 0 1-.72-.54L14.424 28H14a2.02 2.02 0 0 1-1.886-1.319l-.004-.01-.748-2.121-.004-.013a2.01 2.01 0 0 1 .275-1.807 2.04 2.04 0 0 1 1.073-.75l-.19-.669 4.43-1.996zM18.86 27h.017a1.02 1.02 0 0 0 .783-.4 1 1 0 0 0 .16-.88l-.6-2.1a1.01 1.01 0 0 0-.96-.72h-5a1.03 1.03 0 0 0-.82.42 1 1 0 0 0-.13.91l.74 2.1q.015.042.035.083c.169.354.525.587.915.587z" /></svg>;
@@ -0,0 +1,8 @@
1
+ // From: https://icon-sets.iconify.design/game-icons/bombing-run
2
+ import type { SVGProps } from 'react';
3
+ export const IconGameIconsBombingRun = ({
4
+ size = 24,
5
+ ...props
6
+ }: SVGProps<SVGSVGElement> & {
7
+ size?: number | string;
8
+ }) => <svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 512 512" width={size} height={size} {...props}><path d="M288.625 19.625C252.95 45.54 233.16 81.95 226.655 126.938l41.095 23.687c9.348-5.82 17.33-12.415 24.22-19.656 4.383 22.757 20.633 45.578 39.874 56.686l65.5 37.813c24.465 14.124 54.433 9.697 73.812-8.907l7.97 4.593 17.312-30-7.938-4.594c6.426-26.087-4.752-54.28-29.22-68.406l-65.5-37.812c-19.76-11.41-48.63-13.89-70.78-5.53 2.947-10.077 5.108-20.605 6.688-31.47l-41.063-23.72zm12.313 174.97c-49.957 19.17-84.558 55.62-106.313 106.31l40.688 40.72c12.79-3.888 24.24-9.11 34.593-15.438-2 28.05 9.847 59.878 28.906 78.938l64.907 64.906c24.242 24.245 60.782 28.477 89.342 12.75l7.875 7.876 29.72-29.72-7.844-7.873c15.736-28.564 11.465-65.097-12.782-89.344l-64.905-64.908c-19.58-19.58-52.628-31.56-81.22-28.718 6.62-10.884 12.457-22.543 17.72-34.78l-40.688-40.72zm-182.157.655c-35.453-.015-68.357 12.318-99 35.22l12.72 47.468c11.113 2.584 21.805 3.602 32.156 3.343-13.452 19.88-18.267 48.465-12.312 70.69l20.28 75.686c7.576 28.27 32.77 46.972 60.595 47.53l2.468 9.19 34.656-9.282-2.47-9.188c23.81-14.4 36.262-43.205 28.69-71.47l-20.25-75.686c-6.117-22.822-25.445-45.77-47.783-55.875 9.534-5.22 18.83-11.36 27.94-18.156l-12.72-47.44c-8.458-1.34-16.787-2.027-24.97-2.03" /></svg>;
@@ -0,0 +1,8 @@
1
+ // From: https://icon-sets.iconify.design/game-icons/missile-launcher
2
+ import type { SVGProps } from 'react';
3
+ export const IconGameIconsMissileLauncher = ({
4
+ size = 24,
5
+ ...props
6
+ }: SVGProps<SVGSVGElement> & {
7
+ size?: number | string;
8
+ }) => <svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 512 512" width={size} height={size} {...props}><path d="M490.74 21.411c-8.947.782-20.72 3.22-33.566 7.781-16.386 5.82-34.345 14.758-50.969 25.893l26.783 36.525c15.712-12.52 29.853-26.925 40.428-40.757 8.265-10.811 14.055-21.243 17.324-29.442m-99.265 44.026L57.609 310.24l8.28 11.291 83.062-60.906 10.643 14.516-83.063 60.906 8.28 11.29 333.865-244.806zm-18.252 92.746L203.164 282.876l13.924 7.15L375.855 173.61zm-48.602 75.316-35.775 26.234c3.899 3.046 8.821 4.856 14.213 4.856 12.809 0 23-10.191 23-23 0-2.855-.51-5.579-1.438-8.09m-255.267 7.527L21.26 260.67l25.705 35.057 65.54-48.057zm226.705 40.948v30.615h14v-30.615a41 41 0 0 1-7 .615c-2.386 0-4.723-.219-7-.615m-135.065 31.822-65.54 48.058 25.706 35.06 33.194-39.964zm-117.9 7.09-11.291 8.279 27.2 37.096 11.29-8.28zm236.965 9.703v78h46v-78zm-18 54.336-61.426 71.664h23.709l37.717-44.004zm82 0v27.66l37.716 44.004h23.71zm-192 89.664v16h94v-16zm208 0v16h94v-16z" /></svg>;
@@ -0,0 +1,8 @@
1
+ // From: https://icon-sets.iconify.design/game-icons/pistol-gun
2
+ import type { SVGProps } from 'react';
3
+ export const IconGameIconsPistolGun = ({
4
+ size = 24,
5
+ ...props
6
+ }: SVGProps<SVGSVGElement> & {
7
+ size?: number | string;
8
+ }) => <svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 512 512" width={size} height={size} {...props}><path d="m79.238 115.768-28.51 67.863h406.15l-.273-67.862h-263.83v55.605h-15v-55.605h-16.68v55.605H146.1v-55.605h-17.434v55.605h-15v-55.605H79.238zm387.834 15.96v40.66h18.688v-40.66zM56.768 198.63l20.566 32.015L28.894 406.5l101.68 7.174 21.54-97.996h115.74l14.664-80.252 174.55-3.873-.13-32.922H56.767zm206.672 37.22-11.17 61.142h-96.05l12.98-59.05 12.53-.278-2.224 35.5 14.262 13.576 1.003-33.65 24.69-16.264 43.98-.976z" /></svg>;
@@ -0,0 +1,8 @@
1
+ // From: https://icon-sets.iconify.design/gg/website
2
+ import type { SVGProps } from 'react';
3
+ export const IconGgWebsite = ({
4
+ size = 24,
5
+ ...props
6
+ }: SVGProps<SVGSVGElement> & {
7
+ size?: number | string;
8
+ }) => <svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 24 24" width={size} height={size} {...props}><path fillRule="evenodd" d="M14 7a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h4a1 1 0 0 0 1-1V8a1 1 0 0 0-1-1zm3 2h-2v6h2z" clipRule="evenodd" /><path d="M6 7a1 1 0 0 0 0 2h4a1 1 0 1 0 0-2zm0 4a1 1 0 1 0 0 2h4a1 1 0 1 0 0-2zm-1 5a1 1 0 0 1 1-1h4a1 1 0 1 1 0 2H6a1 1 0 0 1-1-1" /><path fillRule="evenodd" d="M4 3a3 3 0 0 0-3 3v12a3 3 0 0 0 3 3h16a3 3 0 0 0 3-3V6a3 3 0 0 0-3-3zm16 2H4a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h16a1 1 0 0 0 1-1V6a1 1 0 0 0-1-1" clipRule="evenodd" /></svg>;
@@ -0,0 +1,8 @@
1
+ // From: https://icon-sets.iconify.design/hugeicons/trade-up
2
+ import type { SVGProps } from 'react';
3
+ export const IconHugeiconsTradeUp = ({
4
+ size = 24,
5
+ ...props
6
+ }: SVGProps<SVGSVGElement> & {
7
+ size?: number | string;
8
+ }) => <svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 24 24" width={size} height={size} {...props}><g fill="none" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" strokeWidth={1.5}><path d="M20 13V8h-5" /><path d="m20 8-5 5c-.883.883-1.324 1.324-1.865 1.373q-.135.012-.27 0c-.541-.05-.982-.49-1.865-1.373s-1.324-1.324-1.865-1.373a1.5 1.5 0 0 0-.27 0c-.541.05-.982.49-1.865 1.373l-3 3" /></g></svg>;
@@ -0,0 +1,8 @@
1
+ // From: https://icon-sets.iconify.design/ic/sharp-oil-barrel
2
+ import type { SVGProps } from 'react';
3
+ export const IconIcSharpOilBarrel = ({
4
+ size = 24,
5
+ ...props
6
+ }: SVGProps<SVGSVGElement> & {
7
+ size?: number | string;
8
+ }) => <svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 24 24" width={size} height={size} {...props}><path d="M21 13v-2h-2V5h2V3H3v2h2v6H3v2h2v6H3v2h18v-2h-2v-6zm-9 3c-1.66 0-3-1.32-3-2.95 0-1.3.52-1.67 3-4.55 2.47 2.86 3 3.24 3 4.55 0 1.63-1.34 2.95-3 2.95" /></svg>;
@@ -0,0 +1,8 @@
1
+ // From: https://icon-sets.iconify.design/ion/train-sharp
2
+ import type { SVGProps } from 'react';
3
+ export const IconIonTrainSharp = ({
4
+ size = 24,
5
+ ...props
6
+ }: SVGProps<SVGSVGElement> & {
7
+ size?: number | string;
8
+ }) => <svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 512 512" width={size} height={size} {...props}><path d="M384 32h-64a16 16 0 0 0-16-16h-96a16 16 0 0 0-16 16h-64c-16 0-32 16-32 32v288c0 23.92 160 80 160 80s160-56.74 160-80V64c0-16-16-32-32-32M256 352a48 48 0 1 1 48-48 48 48 0 0 1-48 48m112-152a8 8 0 0 1-8 8H152a8 8 0 0 1-8-8v-80a8 8 0 0 1 8-8h208a8 8 0 0 1 8 8Z" /><path d="m314 432 15.32 16H182.58L198 432l-32-13-76.62 77h45.2l16-16h210.74l16 16h45.3l-76.36-77.75z" /></svg>;
@@ -0,0 +1,8 @@
1
+ // From: https://icon-sets.iconify.design/mdi/account-school
2
+ import type { SVGProps } from 'react';
3
+ export const IconMdiAccountSchool = ({
4
+ size = 24,
5
+ ...props
6
+ }: SVGProps<SVGSVGElement> & {
7
+ size?: number | string;
8
+ }) => <svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 24 24" width={size} height={size} {...props}><path d="M16 8c0 2.21-1.79 4-4 4s-4-1.79-4-4l.11-.94L5 5.5 12 2l7 3.5v5h-1V6l-2.11 1.06zm-4 6c4.42 0 8 1.79 8 4v2H4v-2c0-2.21 3.58-4 8-4" /></svg>;
@@ -0,0 +1,8 @@
1
+ // From: https://icon-sets.iconify.design/mdi/account-tie-hat
2
+ import type { SVGProps } from 'react';
3
+ export const IconMdiAccountTieHat = ({
4
+ size = 24,
5
+ ...props
6
+ }: SVGProps<SVGSVGElement> & {
7
+ size?: number | string;
8
+ }) => <svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 24 24" width={size} height={size} {...props}><path d="M16 14.5c0 1.1-.3 3.5-2.2 6.3L13 16l.9-1.9c-.6 0-1.2-.1-1.9-.1s-1.3.1-1.9.1L11 16l-.8 4.8C8.3 18.1 8 15.6 8 14.5c-2.4.7-4 2-4 3.5v4h16v-4c0-1.5-1.6-2.8-4-3.5M6 4.5C6 3.1 8.7 2 12 2s6 1.1 6 2.5c0 .4-.2.7-.5 1-.9-.9-3-1.5-5.5-1.5s-4.6.6-5.5 1.5c-.3-.3-.5-.6-.5-1m9.9 2.9c.1.2.1.4.1.6 0 2.2-1.8 4-4 4s-4-1.8-4-4c0-.2 0-.4.1-.6 1 .4 2.4.6 3.9.6s2.9-.2 3.9-.6m.7-1.3c-1.1.5-2.7.9-4.6.9s-3.5-.4-4.6-.9C8.1 5.5 9.8 5 12 5s3.9.5 4.6 1.1" /></svg>;
@@ -0,0 +1,19 @@
1
+ // From: https://icon-sets.iconify.design/mdi/account-tie
2
+ import type { SVGProps } from "react";
3
+ export const IconMdiAccountTie = ({
4
+ size = 24,
5
+ ...props
6
+ }: SVGProps<SVGSVGElement> & {
7
+ size?: number | string;
8
+ }) => (
9
+ <svg
10
+ xmlns="http://www.w3.org/2000/svg"
11
+ fill="currentColor"
12
+ viewBox="0 0 24 24"
13
+ width={size}
14
+ height={size}
15
+ {...props}
16
+ >
17
+ <path d="M12 3c2.21 0 4 1.79 4 4s-1.79 4-4 4-4-1.79-4-4 1.79-4 4-4m4 10.54c0 1.06-.28 3.53-2.19 6.29L13 15l.94-1.88c-.62-.07-1.27-.12-1.94-.12s-1.32.05-1.94.12L11 15l-.81 4.83C8.28 17.07 8 14.6 8 13.54c-2.39.7-4 1.96-4 3.46v4h16v-4c0-1.5-1.6-2.76-4-3.46" />
18
+ </svg>
19
+ );
@@ -0,0 +1,8 @@
1
+ // From: https://icon-sets.iconify.design/mdi/airplane
2
+ import type { SVGProps } from 'react';
3
+ export const IconMdiAirplane = ({
4
+ size = 24,
5
+ ...props
6
+ }: SVGProps<SVGSVGElement> & {
7
+ size?: number | string;
8
+ }) => <svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 24 24" width={size} height={size} {...props}><path d="M20.56 3.91c.59.59.59 1.54 0 2.12l-3.89 3.89 2.12 9.19-1.41 1.42-3.88-7.43L9.6 17l.36 2.47-1.07 1.06-1.76-3.18-3.19-1.77L5 14.5l2.5.37L11.37 11 3.94 7.09l1.42-1.41 9.19 2.12 3.89-3.89c.56-.58 1.56-.58 2.12 0" /></svg>;
@@ -0,0 +1,19 @@
1
+ // From: https://icon-sets.iconify.design/mdi/factory
2
+ import type { SVGProps } from "react";
3
+ export const IconMdiFactory = ({
4
+ size = 24,
5
+ ...props
6
+ }: SVGProps<SVGSVGElement> & {
7
+ size?: number | string;
8
+ }) => (
9
+ <svg
10
+ xmlns="http://www.w3.org/2000/svg"
11
+ fill="currentColor"
12
+ viewBox="0 0 24 24"
13
+ width={size}
14
+ height={size}
15
+ {...props}
16
+ >
17
+ <path d="M4 18v2h4v-2zm0-4v2h10v-2zm6 4v2h4v-2zm6-4v2h4v-2zm0 4v2h4v-2zM2 22V8l5 4V8l5 4V8l5 4 1-10h3l1 10v10z" />
18
+ </svg>
19
+ );
@@ -0,0 +1,8 @@
1
+ // From: https://icon-sets.iconify.design/mdi/forum
2
+ import type { SVGProps } from 'react';
3
+ export const IconMdiForum = ({
4
+ size = 24,
5
+ ...props
6
+ }: SVGProps<SVGSVGElement> & {
7
+ size?: number | string;
8
+ }) => <svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 24 24" width={size} height={size} {...props}><path d="M17 12V3a1 1 0 0 0-1-1H3a1 1 0 0 0-1 1v14l4-4h10a1 1 0 0 0 1-1m4-6h-2v9H6v2a1 1 0 0 0 1 1h11l4 4V7a1 1 0 0 0-1-1" /></svg>;
@@ -0,0 +1,8 @@
1
+ // From: https://icon-sets.iconify.design/mdi/handcuffs
2
+ import type { SVGProps } from 'react';
3
+ export const IconMdiHandcuffs = ({
4
+ size = 24,
5
+ ...props
6
+ }: SVGProps<SVGSVGElement> & {
7
+ size?: number | string;
8
+ }) => <svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 24 24" width={size} height={size} {...props}><path d="M20.24 6.76c-1.84-1.85-4.59-2.23-6.82-1.17l-.96-.96a.996.996 0 0 0-1.41 0l-.08.09C10.83 3.75 10 3 9 3c-1.1 0-2 .9-2 2 0 .09 0 .18.03.26C6.42 5.61 6 6.25 6 7c0 .46.16.87.42 1.21A.97.97 0 0 0 6 9v1.35c-2.33.82-4 3.04-4 5.65 0 3.31 2.69 6 6 6s6-2.69 6-6a5.99 5.99 0 0 0-4-5.65V9a.97.97 0 0 0-.42-.79c.26-.34.42-.75.42-1.21 0-.09 0-.18-.03-.26.18-.1.33-.24.46-.36C11.36 6.88 12 7.86 12 9v.08c.13.07.25.17.38.25.19-.42.45-.83.79-1.16a4.01 4.01 0 0 1 5.66 0 4.01 4.01 0 0 1 0 5.66c-.8.8-1.83 1.17-2.9 1.17.07.32.07.66.07 1s-.03.67-.07 1c1.57 0 3.12-.57 4.31-1.76a5.98 5.98 0 0 0 0-8.48M9 4c.55 0 1 .45 1 1 0 .33-.17.61-.42.79C9.22 5.31 8.65 5 8 5c0-.55.45-1 1-1M7.42 6.21c.36.48.93.79 1.58.79 0 .55-.45 1-1 1s-1-.45-1-1c0-.33.17-.61.42-.79M12 16c0 2.21-1.79 4-4 4s-4-1.79-4-4 1.79-4 4-4 4 1.79 4 4" /></svg>;
@@ -0,0 +1,19 @@
1
+ // From: https://icon-sets.iconify.design/mdi/tank
2
+ import type { SVGProps } from "react";
3
+ export const IconMdiTank = ({
4
+ size = 24,
5
+ ...props
6
+ }: SVGProps<SVGSVGElement> & {
7
+ size?: number | string;
8
+ }) => (
9
+ <svg
10
+ xmlns="http://www.w3.org/2000/svg"
11
+ fill="currentColor"
12
+ viewBox="0 0 24 24"
13
+ width={size}
14
+ height={size}
15
+ {...props}
16
+ >
17
+ <path d="M20 12H4v-1h2l1-5h5l1 5h7zm-6.78-5 .4 2H22V7zM22 16a3 3 0 0 1-3 3H5a3 3 0 0 1-3-3 3 3 0 0 1 3-3h14a3 3 0 0 1 3 3M6 16a1 1 0 0 0-1-1 1 1 0 0 0-1 1 1 1 0 0 0 1 1 1 1 0 0 0 1-1m7 0a1 1 0 0 0-1-1 1 1 0 0 0-1 1 1 1 0 0 0 1 1 1 1 0 0 0 1-1m7 0a1 1 0 0 0-1-1 1 1 0 0 0-1 1 1 1 0 0 0 1 1 1 1 0 0 0 1-1" />
18
+ </svg>
19
+ );
@@ -0,0 +1,25 @@
1
+ // From: https://icon-sets.iconify.design/mingcute/government-line
2
+ import type { SVGProps } from "react";
3
+ export const IconMingcuteGovernmentLine = ({
4
+ size = 24,
5
+ ...props
6
+ }: SVGProps<SVGSVGElement> & {
7
+ size?: number | string;
8
+ }) => (
9
+ <svg
10
+ xmlns="http://www.w3.org/2000/svg"
11
+ fill="currentColor"
12
+ viewBox="0 0 24 24"
13
+ width={size}
14
+ height={size}
15
+ {...props}
16
+ >
17
+ <g fill="none">
18
+ <path d="m12.593 23.258-.011.002-.071.035-.02.004-.014-.004-.071-.035q-.016-.005-.024.005l-.004.01-.017.428.005.02.01.013.104.074.015.004.012-.004.104-.074.012-.016.004-.017-.017-.427q-.004-.016-.017-.018m.265-.113-.013.002-.185.093-.01.01-.003.011.018.43.005.012.008.007.201.093q.019.005.029-.008l.004-.014-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014-.034.614q.001.018.017.024l.015-.002.201-.093.01-.008.004-.011.017-.43-.003-.012-.01-.01z" />
19
+ <path
20
+ fill="currentColor"
21
+ d="M21 7a1 1 0 0 1 .117 1.993L21 9v10a1 1 0 0 1 .117 1.993L21 21H3a1 1 0 0 1-.117-1.993L3 19V9a1 1 0 0 1-.117-1.993L3 7zm-2 2H5v10h2v-7a1 1 0 1 1 2 0v7h2v-7a1 1 0 1 1 2 0v7h2v-7a1 1 0 1 1 2 0v7h2zm-1-5a1 1 0 1 1 0 2H6a1 1 0 0 1 0-2z"
22
+ />
23
+ </g>
24
+ </svg>
25
+ );
@@ -0,0 +1,8 @@
1
+ // From: https://icon-sets.iconify.design/mingcute/phone-call-fill
2
+ import type { SVGProps } from 'react';
3
+ export const IconMingcutePhoneCallFill = ({
4
+ size = 24,
5
+ ...props
6
+ }: SVGProps<SVGSVGElement> & {
7
+ size?: number | string;
8
+ }) => <svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 24 24" width={size} height={size} {...props}><g fill="none"><path d="m12.593 23.258-.011.002-.071.035-.02.004-.014-.004-.071-.035q-.016-.005-.024.005l-.004.01-.017.428.005.02.01.013.104.074.015.004.012-.004.104-.074.012-.016.004-.017-.017-.427q-.004-.016-.017-.018m.265-.113-.013.002-.185.093-.01.01-.003.011.018.43.005.012.008.007.201.093q.019.005.029-.008l.004-.014-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014-.034.614q.001.018.017.024l.015-.002.201-.093.01-.008.004-.011.017-.43-.003-.012-.01-.01z" /><path fill="currentColor" d="M6.857 2.445C8 3.278 8.89 4.415 9.65 5.503l.442.644.417.615a1.504 1.504 0 0 1-.256 1.986l-1.951 1.449a.48.48 0 0 0-.142.616c.442.803 1.228 1.999 2.128 2.899s2.153 1.738 3.012 2.23a.483.483 0 0 0 .644-.162l1.27-1.933a1.503 1.503 0 0 1 2.056-.332l.663.459c1.239.86 2.57 1.837 3.588 3.14a1.47 1.47 0 0 1 .189 1.484c-.837 1.953-2.955 3.616-5.158 3.535l-.3-.017-.233-.02-.258-.03-.281-.038-.305-.05-.16-.03-.336-.072-.176-.04-.366-.094-.385-.11-.402-.13c-1.846-.626-4.189-1.856-6.593-4.26s-3.633-4.746-4.259-6.592l-.13-.402-.11-.385-.094-.366-.078-.346a12 12 0 0 1-.063-.326l-.05-.305-.04-.281-.029-.258-.02-.233-.016-.3c-.081-2.196 1.6-4.329 3.544-5.162a1.47 1.47 0 0 1 1.445.159m8.135 3.595.116.013a3.5 3.5 0 0 1 2.858 2.96 1 1 0 0 1-1.958.393l-.023-.115a1.5 1.5 0 0 0-1.07-1.233l-.155-.035a1 1 0 0 1 .232-1.983M15 3a6 6 0 0 1 6 6 1 1 0 0 1-1.993.117L19 9a4 4 0 0 0-3.738-3.991L15 5a1 1 0 1 1 0-2" /></g></svg>;
@@ -0,0 +1,8 @@
1
+ // From: https://icon-sets.iconify.design/pixel/technology
2
+ import type { SVGProps } from 'react';
3
+ export const IconPixelTechnology = ({
4
+ size = 24,
5
+ ...props
6
+ }: SVGProps<SVGSVGElement> & {
7
+ size?: number | string;
8
+ }) => <svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 24 24" width={size} height={size} {...props}><path d="M17.504 7.501H7.5v10.003h10.003z" /><path d="M21.505 5.5v-2h-2v-2h-2.001v2h-2v-2h-2.001v2h-2v-2H9.501v2h-2v-2H5.5v2h-2v2h-2v2.001h2v2h-2v2.001h2v2h-2v2.001h2v2h-2v2.001h2v2h2v2.001h2.001v-2h2v2h2.001v-2h2v2h2.001v-2h2v2h2.001v-2h2v-2h2.001v-2.001h-2v-2h2v-2.001h-2v-2h2V9.501h-2v-2h2V5.5zm-2 14.004H5.5V5.501h14.003z" /></svg>;
@@ -0,0 +1,8 @@
1
+ // From: https://icon-sets.iconify.design/ri/exchange-box-fill
2
+ import type { SVGProps } from 'react';
3
+ export const IconRiExchangeBoxFill = ({
4
+ size = 24,
5
+ ...props
6
+ }: SVGProps<SVGSVGElement> & {
7
+ size?: number | string;
8
+ }) => <svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 24 24" width={size} height={size} {...props}><path d="M3.005 3.003h18a1 1 0 0 1 1 1v16a1 1 0 0 1-1 1h-18a1 1 0 0 1-1-1v-16a1 1 0 0 1 1-1m9 6h-4v2h9l-5-5zm-5 4 5 5v-3h4v-2z" /></svg>;
@@ -0,0 +1,8 @@
1
+ // From: https://icon-sets.iconify.design/ri/seedling-line
2
+ import type { SVGProps } from 'react';
3
+ export const IconRiSeedlingLine = ({
4
+ size = 24,
5
+ ...props
6
+ }: SVGProps<SVGSVGElement> & {
7
+ size?: number | string;
8
+ }) => <svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 24 24" width={size} height={size} {...props}><path d="M5.998 3a7 7 0 0 1 6.913 5.895A6.48 6.48 0 0 1 17.498 7h4.5v2.5a6.5 6.5 0 0 1-6.5 6.5h-2.5v5h-2v-8h-2a7 7 0 0 1-7-7V3zm14 6h-2.5a4.5 4.5 0 0 0-4.5 4.5v.5h2.5a4.5 4.5 0 0 0 4.5-4.5zm-14-4h-2v1a5 5 0 0 0 5 5h2v-1a5 5 0 0 0-5-5" /></svg>;
@@ -0,0 +1,8 @@
1
+ // From: https://icon-sets.iconify.design/ri/spy-fill
2
+ import type { SVGProps } from 'react';
3
+ export const IconRiSpyFill = ({
4
+ size = 24,
5
+ ...props
6
+ }: SVGProps<SVGSVGElement> & {
7
+ size?: number | string;
8
+ }) => <svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 24 24" width={size} height={size} {...props}><path d="M17 13a4 4 0 0 1 0 8c-2.142 0-4-1.79-4-4h-2a4 4 0 1 1-.535-2h3.07A4 4 0 0 1 17 13M2 12v-2h2V7a4 4 0 0 1 4-4h8a4 4 0 0 1 4 4v3h2v2z" /></svg>;
@@ -0,0 +1,8 @@
1
+ // From: https://icon-sets.iconify.design/streamline-cyber/newspaper-2
2
+ import type { SVGProps } from 'react';
3
+ export const IconStreamlineCyberNewspaper2 = ({
4
+ size = 24,
5
+ ...props
6
+ }: SVGProps<SVGSVGElement> & {
7
+ size?: number | string;
8
+ }) => <svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 24 24" width={size} height={size} {...props}><g fill="none" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" strokeMiterlimit={10}><path d="M2.5 23.5h19l2-2v-20h-19v20zm0 0-2-2v-13h2v11" /><path d="M13.5 4.5h-6v7h6zm3 1h4m-4 3h4m-4 3h4m-13 3h13m-13 3h13m-13 3h13" /></g></svg>;
@@ -0,0 +1,8 @@
1
+ // From: https://icon-sets.iconify.design/streamline-flex/deepfake-technology-1-solid
2
+ import type { SVGProps } from 'react';
3
+ export const IconStreamlineFlexDeepfakeTechnology1Solid = ({
4
+ size = 24,
5
+ ...props
6
+ }: SVGProps<SVGSVGElement> & {
7
+ size?: number | string;
8
+ }) => <svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 14 14" width={size} height={size} {...props}><path fillRule="evenodd" d="M6.58.39a.5.5 0 0 0-.5.5v1.62H4.1c-.188-.49-.627-.757-1.272-.757-.88 0-1.375.495-1.375 1.375s.495 1.376 1.375 1.376c.64 0 1.077-.263 1.267-.745H6.08v.969H4.912a.625.625 0 0 0 0 1.25h1.167v.632H2.731c-.193-.474-.627-.732-1.262-.732-.88 0-1.375.495-1.375 1.375S.589 8.63 1.469 8.63c.651 0 1.091-.271 1.276-.769H6.08v2.851h-.817V9.297a.625.625 0 0 0-.625-.625H3.52a.625.625 0 1 0 0 1.25h.492v.79h-.72c-.19-.484-.627-.748-1.268-.748-.88 0-1.376.495-1.376 1.376s.495 1.375 1.376 1.375c.644 0 1.082-.266 1.27-.754H6.08v1.148a.5.5 0 0 0 .5.5h3.75a2 2 0 0 0 2-2V9.848q.16-.013.31-.045a1.9 1.9 0 0 0 .709-.32c.514-.36.646-.998.505-1.516-.428-1.566-.937-3.207-1.78-4.557a8 8 0 0 0-.383-.56C10.585 1.378 8.987.39 6.58.39m4.13 6.11a.625.625 0 0 0-1.25 0v.165a.625.625 0 0 0 1.25 0z" clipRule="evenodd" /></svg>;
@@ -0,0 +1,8 @@
1
+ // From: https://icon-sets.iconify.design/uit/social-media-logo
2
+ import type { SVGProps } from 'react';
3
+ export const IconUitSocialMediaLogo = ({
4
+ size = 24,
5
+ ...props
6
+ }: SVGProps<SVGSVGElement> & {
7
+ size?: number | string;
8
+ }) => <svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 24 24" width={size} height={size} {...props}><path fill="none" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" strokeMiterlimit={10} strokeWidth={0.5} d="M19.2 7.3c-1.9-.4-3.3-2-3.4-3.9v-.3h-3.1v12.5c0 1.5-1.2 2.6-2.6 2.6-.8 0-1.6-.4-2.1-1h0c-1-1.2-.8-2.9.4-3.8.6-.4 1.1-.4 1.8-.4V9.8c-3.2-.4-5.5 1.8-6 4.9-.2 1.8.3 3.5 1.6 4.8 2.2 2.3 5.9 2.3 8.2.1 1.1-1.1 1.7-2.6 1.7-4.1V9.2c1.3.9 2.8 1.4 4.4 1.4V7.4c-.3 0-.6 0-.9-.1" /></svg>;
@@ -0,0 +1,12 @@
1
+ import { Avatar, Tooltip } from '@mantine/core';
2
+ import { XMarkIcon } from '@heroicons/react/16/solid';
3
+
4
+ export const EmptyAvatar: React.FC = () => {
5
+ return (
6
+ <Tooltip key="notfound" label="X" withArrow>
7
+ <Avatar size="md" radius="xl" color="gray" variant="light">
8
+ <XMarkIcon />
9
+ </Avatar>
10
+ </Tooltip>
11
+ );
12
+ };
@@ -0,0 +1,40 @@
1
+ import "@/avatars/layouts/EntityStyles.css";
2
+ import { Avatar, Tooltip } from "@mantine/core";
3
+ import type { Event, Relation } from "omni-osint-crud-client";
4
+ import { RelationTooltip } from "@/avatars/layouts/RelationTooltip";
5
+ import { EventIcon } from "@/icons";
6
+ import { EventCard } from "@/cards";
7
+
8
+ interface Props {
9
+ data: Event;
10
+ relation?: Relation;
11
+ renderTooltip?: (data: Event, relation?: Relation) => React.ReactNode;
12
+ }
13
+
14
+ const defaultRenderEventTooltip = (data: Event, relation?: Relation) => {
15
+ return (
16
+ <RelationTooltip relation={relation}>
17
+ <EventCard event={data} withBorder={false} background="transparent" />
18
+ </RelationTooltip>
19
+ );
20
+ };
21
+
22
+ export const EventAvatar: React.FC<Props> = ({
23
+ data,
24
+ relation,
25
+ renderTooltip = defaultRenderEventTooltip,
26
+ }) => {
27
+ return (
28
+ <Tooltip
29
+ key={data._id}
30
+ label={renderTooltip(data, relation)}
31
+ withArrow
32
+ withinPortal
33
+ multiline
34
+ >
35
+ <Avatar className="entity-avatar" size="md" radius="xl">
36
+ <EventIcon event={data} />
37
+ </Avatar>
38
+ </Tooltip>
39
+ );
40
+ };
@@ -0,0 +1,43 @@
1
+ import "@/avatars/layouts/EntityStyles.css";
2
+ import { Avatar, Tooltip } from "@mantine/core";
3
+ import type { Organization, Relation } from "omni-osint-crud-client";
4
+ import { RelationTooltip } from "@/avatars/layouts/RelationTooltip";
5
+ import { OrganizationIcon } from "@/icons";
6
+ import { OrganizationCard } from "@/cards";
7
+
8
+ interface Props {
9
+ data: Organization;
10
+ relation?: Relation;
11
+ renderTooltip?: (data: Organization, relation?: Relation) => React.ReactNode;
12
+ }
13
+
14
+ const defaultRenderOrganizationTooltip = (
15
+ data: Organization,
16
+ relation?: Relation
17
+ ) => {
18
+ return (
19
+ <RelationTooltip relation={relation}>
20
+ <OrganizationCard organization={data} withBorder={false} background="transparent" />
21
+ </RelationTooltip>
22
+ );
23
+ };
24
+
25
+ export const OrganizationAvatar: React.FC<Props> = ({
26
+ data,
27
+ relation,
28
+ renderTooltip = defaultRenderOrganizationTooltip,
29
+ }) => {
30
+ return (
31
+ <Tooltip
32
+ key={data._id}
33
+ label={renderTooltip(data, relation)}
34
+ withArrow
35
+ withinPortal
36
+ multiline
37
+ >
38
+ <Avatar alt={data.name || ""} className="entity-avatar" size="md" radius="xl">
39
+ <OrganizationIcon organization={data} />
40
+ </Avatar>
41
+ </Tooltip>
42
+ );
43
+ };
@@ -0,0 +1,41 @@
1
+ import "@/avatars/layouts/EntityStyles.css";
2
+ import { Avatar, Tooltip } from "@mantine/core";
3
+ import type { Person, Relation } from "omni-osint-crud-client";
4
+ import { RelationTooltip } from "@/avatars/layouts/RelationTooltip";
5
+ import { PersonIcon } from "@/icons";
6
+ import { PersonCard } from "@/cards";
7
+
8
+ interface Props {
9
+ data: Person;
10
+ relation?: Relation;
11
+ renderTooltip?: (data: Person, relation?: Relation) => React.ReactNode;
12
+ }
13
+
14
+ const defaultRenderPersonTooltip = (data: Person, relation?: Relation) => {
15
+ return (
16
+ <RelationTooltip relation={relation}>
17
+ <PersonCard person={data} withBorder={false} background="transparent" />
18
+ </RelationTooltip>
19
+ );
20
+ };
21
+
22
+ export const PersonAvatar: React.FC<Props> = ({
23
+ data,
24
+ relation,
25
+ renderTooltip = defaultRenderPersonTooltip,
26
+ }) => {
27
+ return (
28
+ <Tooltip
29
+ key={data._id}
30
+ label={renderTooltip(data, relation)}
31
+ position="top"
32
+ withArrow
33
+ withinPortal
34
+ multiline
35
+ >
36
+ <Avatar alt={data.name || ""} className="entity-avatar" radius="xl" size="md">
37
+ <PersonIcon person={data} />
38
+ </Avatar>
39
+ </Tooltip>
40
+ );
41
+ };
@@ -0,0 +1,67 @@
1
+ import "@/avatars/layouts/EntityStyles.css";
2
+ import { ActionIcon, Avatar, Group, Tooltip, Text } from "@mantine/core";
3
+ import type { Source, Relation } from "omni-osint-crud-client";
4
+ import { RelationTooltip } from "@/avatars/layouts/RelationTooltip";
5
+ import { SourceIcon } from "@/icons";
6
+ import { SourceCard } from "@/cards";
7
+
8
+ interface Props {
9
+ data: Source;
10
+ relation?: Relation;
11
+ renderTooltip?: (data: Source, relation?: Relation) => React.ReactNode;
12
+ }
13
+
14
+ const defaultRenderSourceTooltip = (data: Source, relation?: Relation) => {
15
+ return (
16
+ <RelationTooltip relation={relation}>
17
+ <SourceCard source={data} withBorder={false} background="transparent" />
18
+ </RelationTooltip>
19
+ );
20
+ };
21
+
22
+ export const SourceAvatar: React.FC<Props> = ({
23
+ data,
24
+ relation,
25
+ renderTooltip = defaultRenderSourceTooltip,
26
+ }) => {
27
+ return (
28
+ <Tooltip
29
+ key={data._id}
30
+ label={renderTooltip(data, relation)}
31
+ position="left"
32
+ withArrow
33
+ withinPortal
34
+ multiline
35
+ >
36
+ <Avatar className="entity-avatar" size="md" radius="xl">
37
+ <SourceIcon source={data} />
38
+ </Avatar>
39
+ </Tooltip>
40
+ );
41
+ };
42
+
43
+ export const SourceAvatarRow: React.FC<Props> = ({
44
+ data,
45
+ relation,
46
+ renderTooltip = defaultRenderSourceTooltip,
47
+ }) => {
48
+ return (
49
+ <Group wrap="nowrap" gap={0}>
50
+ <Tooltip
51
+ label={renderTooltip(data, relation)}
52
+ openDelay={500}
53
+ withArrow
54
+ multiline
55
+ >
56
+ <Text size="sm" fw={500} truncate="end">
57
+ {data.name || data.url}
58
+ </Text>
59
+ </Tooltip>
60
+ {data.url && (
61
+ <ActionIcon variant="subtle" size="sm">
62
+ <SourceIcon source={data} />
63
+ </ActionIcon>
64
+ )}
65
+ </Group>
66
+ );
67
+ };
@@ -0,0 +1,40 @@
1
+ import "@/avatars/layouts/EntityStyles.css";
2
+ import { Avatar, Tooltip } from "@mantine/core";
3
+ import type { Website, Relation } from "omni-osint-crud-client";
4
+ import { RelationTooltip } from "@/avatars/layouts/RelationTooltip";
5
+ import { WebsiteIcon } from "@/icons";
6
+ import { WebsiteCard } from "@/cards";
7
+
8
+ interface Props {
9
+ data: Website;
10
+ relation?: Relation;
11
+ renderTooltip?: (data: Website, relation?: Relation) => React.ReactNode;
12
+ }
13
+
14
+ const defaultRenderWebsiteTooltip = (data: Website, relation?: Relation) => {
15
+ return (
16
+ <RelationTooltip relation={relation}>
17
+ <WebsiteCard website={data} withBorder={false} background="transparent" />
18
+ </RelationTooltip>
19
+ );
20
+ };
21
+
22
+ export const WebsiteAvatar: React.FC<Props> = ({
23
+ data,
24
+ relation,
25
+ renderTooltip = defaultRenderWebsiteTooltip,
26
+ }) => {
27
+ return (
28
+ <Tooltip
29
+ key={data._id}
30
+ label={renderTooltip(data, relation)}
31
+ withArrow
32
+ withinPortal
33
+ multiline
34
+ >
35
+ <Avatar className="entity-avatar" size="md" radius="xl">
36
+ <WebsiteIcon website={data} />
37
+ </Avatar>
38
+ </Tooltip>
39
+ );
40
+ };
@@ -0,0 +1,12 @@
1
+ // Avatar Layouts
2
+ export { AvatarDropdown } from './layouts/AvatarDropdown';
3
+ export { AvatarRowList } from './layouts/AvatarRowList';
4
+ export { AvatarSpan } from './layouts/AvatarSpan';
5
+ export { RelationTooltip } from './layouts/RelationTooltip';
6
+ // Avatars
7
+ export { EmptyAvatar } from './EmptyAvatar';
8
+ export { EventAvatar } from './EventAvatar';
9
+ export { OrganizationAvatar } from './OrganizationAvatar';
10
+ export { PersonAvatar } from './PersonAvatar';
11
+ export { SourceAvatar } from './SourceAvatar';
12
+ export { WebsiteAvatar } from './WebsiteAvatar';