@thangph2146/nextjs-editor 1.0.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/cn.ts","../src/utils/logger.ts","../src/utils/index.ts","../src/constants/typography.ts","../src/constants/index.ts","../src/components/ui/button.tsx","../src/components/editor/editor-ui/image-sizing.ts","../src/components/editor/context/editor-container-context.tsx","../src/components/ui/typography.tsx","../src/components/editor/editor-ui/image-resizer.tsx","../src/components/ui/dialog.tsx","../src/components/editor/shared/can-use-dom.ts","../src/components/ui/input.tsx","../src/components/ui/label.tsx","../src/components/ui/tabs.tsx","../src/features/uploads/hooks/use-uploads-queries.ts","../src/components/ui/collapsible.tsx","../src/components/editor/plugins/images-plugin.tsx","../src/components/editor/context/priority-image-context.tsx","../src/components/editor/editor-ui/hooks/use-responsive-image-dimensions.ts","../src/components/editor/editor-ui/lazy-image.tsx","../src/components/editor/editor-ui/broken-image.tsx","../src/components/editor/editor-ui/image-placeholder.tsx","../src/components/editor/editor-ui/content-editable.tsx","../src/components/editor/editor-ui/caption-composer.tsx","../src/components/editor/editor-ui/hooks/use-image-caption-controls.ts","../src/components/editor/editor-ui/hooks/use-image-node-interactions.ts","../src/components/editor/editor-ui/image-component.tsx","../src/components/editor/nodes/image-node.tsx","../src/components/editor/utils/emoji-list.ts","../src/index.tsx","../src/components/editor/editor-x/editor.tsx","../src/components/editor/themes/editor-theme.ts","../src/components/ui/tooltip.tsx","../src/components/editor/editor-x/nodes.ts","../src/components/editor/nodes/autocomplete-node.tsx","../src/components/editor/plugins/autocomplete-plugin.tsx","../src/components/editor/utils/swipe.ts","../src/components/editor/nodes/embeds/tweet-node.tsx","../src/components/editor/nodes/embeds/youtube-node.tsx","../src/components/editor/nodes/emoji-node.tsx","../src/components/editor/nodes/keyword-node.tsx","../src/components/editor/nodes/layout-container-node.tsx","../src/components/editor/nodes/layout-item-node.tsx","../src/components/editor/nodes/list-with-color-node.tsx","../src/components/editor/nodes/mention-node.ts","../src/components/editor/editor-x/plugins.tsx","../src/components/editor/plugins/actions/actions-plugin.tsx","../src/components/editor/plugins/actions/clear-editor-plugin.tsx","../src/components/editor/plugins/actions/counter-character-plugin.tsx","../src/components/ui/separator.tsx","../src/components/ui/flex.tsx","../src/components/editor/plugins/actions/edit-mode-toggle-plugin.tsx","../src/components/editor/plugins/actions/import-export-plugin.tsx","../src/components/editor/plugins/actions/markdown-toggle-plugin.tsx","../src/components/editor/plugins/actions/share-content-plugin.tsx","../src/components/editor/utils/doc-serialization.ts","../src/components/editor/plugins/actions/speech-to-text-plugin.tsx","../src/components/editor/editor-hooks/use-report.ts","../src/components/editor/plugins/actions/tree-view-plugin.tsx","../src/components/ui/scroll-area.tsx","../src/components/editor/plugins/auto-link-plugin.tsx","../src/components/editor/plugins/code-action-menu-plugin.tsx","../src/components/editor/editor-hooks/use-debounce.ts","../src/components/editor/editor-ui/code-button.tsx","../src/components/editor/plugins/code-highlight-plugin.tsx","../src/components/editor/plugins/component-picker-menu-plugin.tsx","../src/components/editor/editor-hooks/use-modal.tsx","../src/components/ui/command.tsx","../src/components/editor/plugins/context-menu-plugin.tsx","../src/components/editor/plugins/layout-plugin.tsx","../src/components/ui/select.tsx","../src/components/editor/editor-ui/color-picker.tsx","../src/components/ui/popover.tsx","../src/components/editor/plugins/list-color-plugin.tsx","../src/components/editor/plugins/drag-drop-paste-plugin.tsx","../src/components/editor/plugins/draggable-block-plugin.tsx","../src/components/editor/plugins/embeds/auto-embed-plugin.tsx","../src/components/editor/plugins/embeds/twitter-plugin.tsx","../src/components/editor/plugins/embeds/youtube-plugin.tsx","../src/components/editor/plugins/emoji-picker-plugin.tsx","../src/components/editor/plugins/emojis-plugin.tsx","../src/components/editor/plugins/floating-link-editor-plugin.tsx","../src/components/editor/utils/get-selected-node.ts","../src/components/editor/utils/set-floating-elem-position-for-link-editor.ts","../src/components/editor/utils/url.ts","../src/components/editor/plugins/floating-text-format-plugin.tsx","../src/components/editor/utils/get-dom-range-rect.ts","../src/components/editor/utils/set-floating-elem-position.ts","../src/components/ui/toggle-group.tsx","../src/components/ui/toggle.tsx","../src/components/editor/plugins/keywords-plugin.tsx","../src/components/editor/plugins/link-plugin.tsx","../src/components/editor/plugins/list-max-indent-level-plugin.tsx","../src/components/editor/plugins/mentions-plugin.tsx","../src/components/editor/plugins/picker/alignment-picker-plugin.tsx","../src/components/editor/plugins/picker/component-picker-option.tsx","../src/components/editor/plugins/picker/bulleted-list-picker-plugin.tsx","../src/components/editor/plugins/picker/check-list-picker-plugin.tsx","../src/components/editor/plugins/picker/code-picker-plugin.tsx","../src/components/editor/plugins/picker/columns-layout-picker-plugin.tsx","../src/components/editor/plugins/picker/divider-picker-plugin.tsx","../src/components/editor/plugins/picker/embeds-picker-plugin.tsx","../src/components/editor/plugins/picker/heading-picker-plugin.tsx","../src/components/editor/plugins/picker/image-picker-plugin.tsx","../src/components/editor/plugins/picker/numbered-list-picker-plugin.tsx","../src/components/editor/plugins/picker/paragraph-picker-plugin.tsx","../src/components/editor/plugins/picker/quote-picker-plugin.tsx","../src/components/editor/plugins/picker/table-picker-plugin.tsx","../src/components/editor/plugins/table-plugin.tsx","../src/components/editor/plugins/tab-focus-plugin.tsx","../src/components/editor/plugins/table-column-resizer-plugin.tsx","../src/components/editor/plugins/toolbar/block-format-toolbar-plugin.tsx","../src/components/editor/context/toolbar-context.tsx","../src/components/editor/editor-hooks/use-update-toolbar.ts","../src/components/editor/plugins/toolbar/block-format/block-format-data.tsx","../src/components/editor/plugins/toolbar/block-format/format-bulleted-list.tsx","../src/components/editor/plugins/toolbar/block-format/format-check-list.tsx","../src/components/editor/plugins/toolbar/block-format/format-code-block.tsx","../src/components/editor/plugins/toolbar/block-format/format-heading.tsx","../src/components/editor/plugins/toolbar/block-format/format-numbered-list.tsx","../src/components/editor/plugins/toolbar/block-format/format-paragraph.tsx","../src/components/editor/plugins/toolbar/block-format/format-quote.tsx","../src/components/editor/plugins/toolbar/block-insert-plugin.tsx","../src/components/editor/plugins/toolbar/block-insert/insert-columns-layout.tsx","../src/components/editor/plugins/toolbar/block-insert/insert-embeds.tsx","../src/components/editor/plugins/toolbar/block-insert/insert-horizontal-rule.tsx","../src/components/editor/plugins/toolbar/block-insert/insert-image.tsx","../src/components/editor/plugins/toolbar/block-insert/insert-table.tsx","../src/components/editor/plugins/toolbar/clear-formatting-toolbar-plugin.tsx","../src/components/editor/plugins/toolbar/code-language-toolbar-plugin.tsx","../src/components/editor/plugins/toolbar/element-format-toolbar-plugin.tsx","../src/components/editor/plugins/toolbar/font-background-toolbar-plugin.tsx","../src/components/editor/plugins/toolbar/font-color-toolbar-plugin.tsx","../src/components/editor/plugins/toolbar/font-family-toolbar-plugin.tsx","../src/components/editor/plugins/toolbar/font-format-toolbar-plugin.tsx","../src/components/editor/plugins/toolbar/font-size-toolbar-plugin.tsx","../src/components/ui/button-group.tsx","../src/components/editor/plugins/toolbar/history-toolbar-plugin.tsx","../src/components/editor/plugins/toolbar/link-toolbar-plugin.tsx","../src/components/editor/plugins/toolbar/subsuper-toolbar-plugin.tsx","../src/components/editor/plugins/toolbar/toolbar-plugin.tsx","../src/hooks/shared/use-element-size.ts","../src/hooks/ui/use-header-height.ts","../src/components/editor/plugins/typing-pref-plugin.tsx","../src/components/editor/transformers/markdown-emoji-transformer.ts","../src/components/editor/transformers/markdown-hr-transformer.ts","../src/components/editor/transformers/markdown-image-transformer.ts","../src/components/editor/transformers/markdown-table-transformer.ts","../src/components/editor/transformers/markdown-tweet-transformer.ts"],"sourcesContent":["import { clsx, type ClassValue } from \"clsx\"\r\nimport { twMerge } from \"tailwind-merge\"\r\n\r\nexport const cn = (...inputs: ClassValue[]) => twMerge(clsx(inputs))\r\n","/**\r\n * Logger utility cho development\r\n * Hiển thị thời gian, vị trí file, và chi tiết log\r\n * Hoạt động được cả client-side và server-side\r\n */\r\n\r\ntype LogLevel = \"info\" | \"warn\" | \"error\" | \"debug\" | \"success\"\r\n\r\n// Kiểm tra môi trường (hoạt động cả client và server)\r\nconst isServer = typeof window === \"undefined\"\r\nconst isDevelopment = \r\n (isServer && process.env.NODE_ENV === \"development\") ||\r\n (!isServer && (process.env.NODE_ENV === \"development\" || window.location.hostname === \"localhost\"))\r\nconst LOG_ENABLED = isDevelopment || \r\n (isServer ? process.env.DEBUG === \"true\" : false) ||\r\n (!isServer ? (typeof window !== \"undefined\" && (window as { __DEBUG__?: boolean }).__DEBUG__ === true) : false)\r\n\r\n/**\r\n * Lấy vị trí file từ stack trace\r\n */\r\nconst getCallerInfo = (): string => {\r\n const stack = new Error().stack\r\n if (!stack) return \"unknown\"\r\n\r\n const lines = stack.split(\"\\n\")\r\n // Safely get process.cwd() only on server and not in edge runtime\r\n let projectPath = \"\"\r\n if (isServer) {\r\n try {\r\n if (typeof process !== \"undefined\" && typeof process.cwd === \"function\") {\r\n projectPath = process.cwd()\r\n }\r\n } catch {\r\n // Ignore errors in edge runtime\r\n }\r\n }\r\n\r\n // Tìm dòng đầu tiên không phải từ logger.ts hoặc node_modules\r\n for (let i = 0; i < lines.length; i++) {\r\n const line = lines[i]\r\n if (!line) continue\r\n\r\n // Bỏ qua các dòng từ logger.ts hoặc node_modules\r\n if (line.includes(\"logger.ts\") || line.includes(\"node_modules\")) {\r\n continue\r\n }\r\n\r\n // Extract file path và line number\r\n // Format: \" at functionName (file://path:line:column)\" hoặc \" at path:line:column\"\r\n const match = line.match(/\\((.+):(\\d+):(\\d+)\\)|at (.+):(\\d+):(\\d+)/)\r\n if (match) {\r\n const filePath = match[1] || match[4]\r\n const lineNum = match[2] || match[5]\r\n if (filePath && lineNum) {\r\n if (isServer && projectPath && filePath.includes(projectPath)) {\r\n // Server-side: Lấy đường dẫn tương đối từ project root\r\n const relativePath = filePath\r\n .replace(projectPath, \"\")\r\n .replace(/^[\\\\/]/, \"\")\r\n .replace(/\\\\/g, \"/\")\r\n return `${relativePath}:${lineNum}`\r\n } else if (!isServer) {\r\n // Client-side: Lấy tên file từ URL\r\n const urlMatch = filePath.match(/\\/?([^\\/]+\\.(ts|tsx|js|jsx)):(\\d+)/)\r\n if (urlMatch) {\r\n return `${urlMatch[1]}:${lineNum}`\r\n }\r\n // Fallback: lấy phần cuối của path\r\n const parts = filePath.split(\"/\")\r\n const filename = parts[parts.length - 1] || filePath\r\n return `${filename}:${lineNum}`\r\n }\r\n }\r\n }\r\n }\r\n\r\n return \"unknown\"\r\n}\r\n\r\n/**\r\n * Format timestamp\r\n */\r\nconst formatTimestamp = (): string => new Date().toISOString()\r\n\r\n/**\r\n * Format log message\r\n */\r\nconst formatLog = (\r\n level: LogLevel,\r\n message: string,\r\n data?: Record<string, unknown> | Error | unknown,\r\n): void => {\r\n const timestamp = formatTimestamp()\r\n const location = getCallerInfo()\r\n const levelEmoji = {\r\n info: \"🔵\",\r\n success: \"🟢\",\r\n warn: \"🟡\",\r\n error: \"🔴\",\r\n debug: \"🔷\",\r\n }[level]\r\n\r\n const prefix = `[${levelEmoji}] ${timestamp}`\r\n const locationStr = `[${location}]`\r\n\r\n // Format data\r\n let dataStr = \"\"\r\n if (data) {\r\n if (data instanceof Error) {\r\n dataStr = `\\nError: ${data.message}\\nStack: ${data.stack}`\r\n } else if (typeof data === \"object\") {\r\n try {\r\n dataStr = `\\nData: ${JSON.stringify(data, null, 2)}`\r\n } catch {\r\n dataStr = `\\nData: [Circular or Unserializable]`\r\n }\r\n } else {\r\n dataStr = `\\nValue: ${String(data)}`\r\n }\r\n }\r\n\r\n const output = `${prefix} ${locationStr} ${message}${dataStr}`\r\n\r\n switch (level) {\r\n case \"error\":\r\n console.error(output)\r\n break\r\n case \"warn\":\r\n console.warn(output)\r\n break\r\n case \"info\":\r\n case \"success\":\r\n console.log(output)\r\n break\r\n case \"debug\":\r\n console.debug(output)\r\n break\r\n }\r\n}\r\n\r\n/**\r\n * Public logger object\r\n */\r\nexport const logger = {\r\n info: (message: string, data?: unknown) => LOG_ENABLED && formatLog(\"info\", message, data),\r\n success: (message: string, data?: unknown) => LOG_ENABLED && formatLog(\"success\", message, data),\r\n warn: (message: string, data?: unknown) => LOG_ENABLED && formatLog(\"warn\", message, data),\r\n error: (message: string, data?: unknown) => LOG_ENABLED && formatLog(\"error\", message, data),\r\n debug: (message: string, data?: unknown) => LOG_ENABLED && formatLog(\"debug\", message, data),\r\n}\r\n","export { cn } from \"./cn\"\r\nexport { logger } from \"./logger\"\r\n","/**\r\n * Shared Typography Configuration\r\n * Đồng bộ text sizes và header styles cho toàn bộ hệ thống\r\n * \r\n * Typography Configuration Barrel Export\r\n * Export tất cả typography utilities từ một nơi\r\n */\r\n\r\n/**\r\n * Text Size Classes - Responsive typography scale\r\n */\r\nexport const textSizes = {\r\n xs: \"text-xs\",\r\n sm: \"text-sm\",\r\n base: \"text-base\",\r\n lg: \"text-lg\",\r\n xl: \"text-xl\",\r\n \"2xl\": \"text-2xl\",\r\n \"3xl\": \"text-3xl\",\r\n \"4xl\": \"text-4xl\",\r\n \"5xl\": \"text-5xl\",\r\n \"6xl\": \"text-6xl\",\r\n} as const\r\n\r\n/**\r\n * Responsive Text Size Classes\r\n * Mobile-first approach với breakpoints: sm, md, lg, xl\r\n */\r\nexport const responsiveTextSizes = {\r\n // Small text (body, captions)\r\n small: \"text-xs sm:text-xs md:text-sm\",\r\n // Medium text (body, descriptions)\r\n medium: \"text-xs sm:text-sm md:text-base\",\r\n // Large text (subheadings)\r\n large: \"text-sm sm:text-base md:text-lg\",\r\n // Extra large text (headings)\r\n xlarge: \"text-base sm:text-lg md:text-xl\",\r\n} as const\r\n\r\n/**\r\n * Heading Size Classes - Responsive heading scale\r\n */\r\nexport const headingSizes = {\r\n // H1 - Main page title\r\n h1: \"text-xl sm:text-2xl md:text-3xl lg:text-4xl\",\r\n // H2 - Section title\r\n h2: \"text-lg sm:text-xl md:text-2xl lg:text-3xl\",\r\n // H3 - Subsection title\r\n h3: \"text-base sm:text-lg md:text-xl lg:text-2xl\",\r\n // H4 - Card title, small section\r\n h4: \"text-sm sm:text-base md:text-lg lg:text-xl\",\r\n // H5 - Small heading\r\n h5: \"text-xs sm:text-sm md:text-base lg:text-lg\",\r\n // H6 - Smallest heading\r\n h6: \"text-xs sm:text-xs md:text-sm lg:text-base\",\r\n} as const\r\n\r\n/**\r\n * Font Weight Classes\r\n */\r\nexport const fontWeights = {\r\n normal: \"font-normal\",\r\n medium: \"font-medium\",\r\n semibold: \"font-semibold\",\r\n bold: \"font-bold\",\r\n} as const\r\n\r\n/**\r\n * Line Height Classes\r\n */\r\nexport const lineHeights = {\r\n tight: \"leading-tight\",\r\n normal: \"leading-normal\",\r\n relaxed: \"leading-relaxed\",\r\n loose: \"leading-loose\",\r\n} as const\r\n\r\n/**\r\n * Text Color Classes\r\n */\r\nexport const textColors = {\r\n foreground: \"text-foreground\",\r\n muted: \"text-muted-foreground\",\r\n primary: \"text-primary\",\r\n secondary: \"text-secondary\",\r\n accent: \"text-accent-foreground\",\r\n destructive: \"text-destructive\",\r\n} as const\r\n\r\n/**\r\n * Complete Typography Presets\r\n */\r\nexport const typography = {\r\n // Body text presets\r\n body: {\r\n small: `${responsiveTextSizes.small} ${fontWeights.normal} ${lineHeights.relaxed}`,\r\n medium: `${responsiveTextSizes.medium} ${fontWeights.normal} ${lineHeights.relaxed}`,\r\n large: `${responsiveTextSizes.large} ${fontWeights.normal} ${lineHeights.relaxed}`,\r\n muted: {\r\n small: `${responsiveTextSizes.small} ${fontWeights.normal} ${lineHeights.relaxed} ${textColors.muted}`,\r\n medium: `${responsiveTextSizes.medium} ${fontWeights.normal} ${lineHeights.relaxed} ${textColors.muted}`,\r\n large: `${responsiveTextSizes.large} ${fontWeights.normal} ${lineHeights.relaxed} ${textColors.muted}`,\r\n },\r\n },\r\n // Heading presets\r\n heading: {\r\n h1: `${headingSizes.h1} ${fontWeights.bold}`,\r\n h2: `${headingSizes.h2} ${fontWeights.bold}`,\r\n h3: `${headingSizes.h3} ${fontWeights.semibold}`,\r\n h4: `${headingSizes.h4} ${fontWeights.semibold}`,\r\n h5: `${headingSizes.h5} ${fontWeights.medium}`,\r\n h6: `${headingSizes.h6} ${fontWeights.medium}`,\r\n // Primary color headings\r\n primary: {\r\n h1: `${headingSizes.h1} ${fontWeights.bold} ${textColors.primary}`,\r\n h2: `${headingSizes.h2} ${fontWeights.bold} ${textColors.primary}`,\r\n h3: `${headingSizes.h3} ${fontWeights.semibold} ${textColors.primary}`,\r\n },\r\n },\r\n // Title presets (for cards, sections)\r\n title: {\r\n default: `${headingSizes.h4} ${fontWeights.bold}`,\r\n large: `${headingSizes.h3} ${fontWeights.bold}`,\r\n small: `${headingSizes.h5} ${fontWeights.semibold}`,\r\n },\r\n // Description presets\r\n description: {\r\n default: `${responsiveTextSizes.medium} ${fontWeights.normal} ${lineHeights.relaxed} ${textColors.muted}`,\r\n small: `${responsiveTextSizes.small} ${fontWeights.normal} ${lineHeights.relaxed} ${textColors.muted}`,\r\n large: `${responsiveTextSizes.large} ${fontWeights.normal} ${lineHeights.relaxed} ${textColors.muted}`,\r\n },\r\n} as const\r\n\r\n/**\r\n * Icon Size Classes\r\n * Đồng bộ kích thước icon cho toàn bộ hệ thống\r\n */\r\nexport const iconSizes = {\r\n // Extra small icons (3x3 = 12px) - Badges, inline indicators\r\n xs: \"h-3 w-3\",\r\n // Small icons (4x4 = 16px) - Navigation, menu items, form labels\r\n sm: \"h-4 w-4\",\r\n // Medium icons (5x5 = 20px) - Buttons, dropdowns, cards\r\n md: \"h-5 w-5\",\r\n // Large icons (6x6 = 24px) - Section headers, prominent buttons\r\n lg: \"h-6 w-6\",\r\n // Extra large icons (7x7 = 28px) - Large buttons, featured sections\r\n xl: \"h-7 w-7\",\r\n // 2XL icons (8x8 = 32px) - Avatars, large featured icons\r\n \"2xl\": \"h-8 w-8\",\r\n // 3XL icons (9x9 = 36px) - Extra large avatars\r\n \"3xl\": \"h-9 w-9\",\r\n // 4XL icons (10x10 = 40px) - Hero sections, large displays\r\n \"4xl\": \"h-10 w-10\",\r\n} as const\r\n\r\n/**\r\n * Responsive Icon Size Classes\r\n * Icon sizes responsive theo breakpoints\r\n */\r\nexport const responsiveIconSizes = {\r\n // Small responsive (4x4 mobile, 5x5 desktop)\r\n small: \"h-4 w-4 sm:h-5 sm:w-5\",\r\n // Medium responsive (5x5 mobile, 6x6 desktop)\r\n medium: \"h-5 w-5 sm:h-6 sm:w-6\",\r\n // Large responsive (6x6 mobile, 8x8 desktop)\r\n large: \"h-6 w-6 sm:h-8 sm:w-8\",\r\n} as const\r\n\r\n/**\r\n * Header Configuration\r\n * Styles cho các header components\r\n */\r\nexport const headerConfig = {\r\n // Main page header (H1)\r\n main: {\r\n className: `${headingSizes.h1} ${fontWeights.bold}`,\r\n },\r\n // Section header (H2)\r\n section: {\r\n className: `${headingSizes.h2} ${fontWeights.bold}`,\r\n },\r\n // Subsection header (H3)\r\n subsection: {\r\n className: `${headingSizes.h3} ${fontWeights.semibold}`,\r\n },\r\n // Card header (H4)\r\n card: {\r\n className: `${headingSizes.h4} ${fontWeights.semibold}`,\r\n },\r\n // Primary color headers\r\n primary: {\r\n main: {\r\n className: `${headingSizes.h1} ${fontWeights.bold} ${textColors.primary}`,\r\n },\r\n section: {\r\n className: `${headingSizes.h2} ${fontWeights.bold} ${textColors.primary}`,\r\n },\r\n subsection: {\r\n className: `${headingSizes.h3} ${fontWeights.semibold} ${textColors.primary}`,\r\n },\r\n },\r\n} as const\r\n","export * from \"./typography\"\r\n","import { Slot } from \"@radix-ui/react-slot\";\r\nimport { cva, type VariantProps } from \"class-variance-authority\";\r\nimport * as React from \"react\";\r\n\r\nimport { cn } from \"@/utils/index\";\r\nimport { iconSizes, responsiveTextSizes, fontWeights, lineHeights } from \"@/constants\";\r\n\r\nconst buttonBodySmall = `${responsiveTextSizes.small} ${fontWeights.normal} ${lineHeights.relaxed}`\r\n\r\nconst buttonVariants = cva(\r\n `inline-flex items-center justify-center whitespace-nowrap rounded-lg ${buttonBodySmall} font-medium transition-colors outline-offset-2 focus-visible:outline focus-visible:outline-2 focus-visible:outline-ring/70 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 cursor-pointer`,\r\n {\r\n variants: {\r\n variant: {\r\n default: \"bg-primary text-primary-foreground shadow-sm shadow-black/5 hover:bg-primary/90 cursor-pointer\",\r\n destructive:\r\n \"bg-destructive text-destructive-foreground shadow-sm shadow-black/5 hover:bg-destructive/90\",\r\n outline:\r\n \"border border-input bg-background shadow-sm shadow-black/5 hover:bg-accent hover:text-accent-foreground\",\r\n secondary:\r\n \"bg-secondary text-secondary-foreground shadow-sm shadow-black/5 hover:bg-secondary/80\",\r\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\r\n link: \"text-primary underline-offset-4 hover:underline\",\r\n },\r\n size: {\r\n default: \"h-9 min-h-[44px] px-4 py-2\", // 44px minimum for mobile touch targets\r\n sm: `h-8 min-h-[44px] rounded-lg px-3 ${buttonBodySmall}`, // Ensure mobile-friendly\r\n lg: \"h-10 min-h-[44px] rounded-lg px-8\",\r\n icon: `${iconSizes[\"3xl\"]}`, // 44x44px minimum for icon buttons\r\n \"icon-absolute\": \"absolute right-0 top-0 h-full px-3 py-2 hover:bg-transparent\",\r\n },\r\n fullWidth: {\r\n true: \"w-full\",\r\n false: \"\",\r\n },\r\n },\r\n defaultVariants: {\r\n variant: \"default\",\r\n size: \"default\",\r\n fullWidth: false,\r\n },\r\n },\r\n);\r\n\r\nexport interface ButtonProps\r\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\r\n VariantProps<typeof buttonVariants> {\r\n asChild?: boolean;\r\n}\r\n\r\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\r\n (\r\n { className, variant, size, fullWidth, asChild = false, type = \"button\", ...props },\r\n ref,\r\n ) => {\r\n const Comp = asChild ? Slot : \"button\";\r\n const componentProps = asChild ? props : { type, ...props };\r\n\r\n return (\r\n <Comp\r\n className={cn(buttonVariants({ variant, size, fullWidth, className }))}\r\n ref={ref}\r\n {...componentProps}\r\n />\r\n );\r\n },\r\n);\r\nButton.displayName = \"Button\";\r\n\r\nexport { Button, buttonVariants };\r\n\r\n","export const unlockImageBoundaries = (image: HTMLElement) => {\r\n // Không giới hạn kéo lớn/nhỏ: cho phép resize tự do\r\n image.style.setProperty(\"max-width\", \"none\", \"important\")\r\n image.style.setProperty(\"max-height\", \"none\", \"important\")\r\n}\r\n\r\nexport const getImageAspectRatio = (image: HTMLElement | null) => {\r\n if (!image) {\r\n return 1\r\n }\r\n // HTMLImageElement has naturalWidth and naturalHeight properties\r\n const imgElement = image as HTMLImageElement\r\n if (imgElement.naturalWidth > 0 && imgElement.naturalHeight > 0) {\r\n return imgElement.naturalWidth / imgElement.naturalHeight\r\n }\r\n const { width, height } = image.getBoundingClientRect()\r\n if (!height) {\r\n return 1\r\n }\r\n return width / height\r\n}\r\n\r\nexport const getInnerWidth = (element: HTMLElement) => {\r\n const rectWidth = element.getBoundingClientRect().width\r\n if (rectWidth <= 0) {\r\n return 0\r\n }\r\n if (typeof window === \"undefined\") {\r\n return rectWidth\r\n }\r\n const styles = window.getComputedStyle(element)\r\n const paddingLeft = Number.parseFloat(styles.paddingLeft || \"0\") || 0\r\n const paddingRight = Number.parseFloat(styles.paddingRight || \"0\") || 0\r\n return Math.max(rectWidth - (paddingLeft + paddingRight), 0)\r\n}\r\n\r\nexport const getNearestContentWidth = (image: HTMLElement) => {\r\n if (typeof window === \"undefined\") {\r\n return null\r\n }\r\n\r\n let current: HTMLElement | null = image.parentElement\r\n while (current) {\r\n const display = window.getComputedStyle(current).display\r\n const isInline =\r\n display === \"inline\" ||\r\n display === \"inline-block\" ||\r\n display === \"inline-flex\" ||\r\n display === \"contents\"\r\n\r\n if (!isInline) {\r\n const width = getInnerWidth(current)\r\n if (width > 0) {\r\n return width\r\n }\r\n }\r\n current = current.parentElement\r\n }\r\n\r\n return null\r\n}\r\n\r\nconst FIELD_CONTENT_SELECTOR = \"[data-slot='field-content']\"\r\n\r\nconst getFieldContentWidth = (element: HTMLElement | null) => {\r\n if (!element) {\r\n return null\r\n }\r\n const fieldContent = element.closest(FIELD_CONTENT_SELECTOR) as\r\n | HTMLElement\r\n | null\r\n if (fieldContent) {\r\n const width = getInnerWidth(fieldContent)\r\n if (width > 0) {\r\n return width\r\n }\r\n }\r\n return null\r\n}\r\n\r\nconst clampWidth = (value: number | null, hardLimit?: number) => {\r\n if (!value || value <= 0) {\r\n return null\r\n }\r\n if (hardLimit && hardLimit > 0) {\r\n return Math.min(value, hardLimit)\r\n }\r\n return value\r\n}\r\n\r\nexport const getContainerWidth = (\r\n element: HTMLElement,\r\n editorRoot: HTMLElement | null,\r\n hardLimit?: number\r\n) => {\r\n const fieldContentWidth = clampWidth(\r\n getFieldContentWidth(element),\r\n hardLimit\r\n )\r\n if (fieldContentWidth) {\r\n return fieldContentWidth\r\n }\r\n const contentWidth = clampWidth(getNearestContentWidth(element), hardLimit)\r\n if (contentWidth) {\r\n return contentWidth\r\n }\r\n\r\n if (editorRoot) {\r\n const rootWidth = clampWidth(getInnerWidth(editorRoot), hardLimit)\r\n if (rootWidth) {\r\n return rootWidth\r\n }\r\n }\r\n\r\n const elementWidth = clampWidth(\r\n element.getBoundingClientRect().width,\r\n hardLimit\r\n )\r\n return elementWidth ?? undefined\r\n}\r\n","\"use client\"\r\n\r\nimport { createContext, useContext, type ReactNode } from \"react\"\r\n\r\ntype EditorContainerContextValue = {\r\n maxWidth?: number\r\n}\r\n\r\nconst EditorContainerContext = createContext<EditorContainerContextValue | null>(\r\n null\r\n)\r\n\r\nexport function EditorContainerProvider({\r\n value,\r\n children,\r\n}: {\r\n value: EditorContainerContextValue\r\n children: ReactNode\r\n}) {\r\n return (\r\n <EditorContainerContext.Provider value={value}>\r\n {children}\r\n </EditorContainerContext.Provider>\r\n )\r\n}\r\n\r\nexport function useEditorContainer() {\r\n return useContext(EditorContainerContext)\r\n}\r\n","import * as React from \"react\"\r\nimport { cn } from \"@/utils\"\r\nimport { typography, iconSizes } from \"@/constants\"\r\n\r\n/**\r\n * Typography Components\r\n * Các component typography riêng biệt cho từng loại text\r\n * Tuân thủ pattern: không gắn className bên ngoài, chỉ sử dụng typography config\r\n */\r\n\r\nexport function TypographyH1({\r\n className,\r\n children,\r\n ...props\r\n}: React.HTMLAttributes<HTMLHeadingElement>) {\r\n return (\r\n <h1 className={cn(typography.heading.h1, className)} suppressHydrationWarning {...props}>\r\n {children}\r\n </h1>\r\n )\r\n}\r\n\r\nexport function TypographyH2({\r\n className,\r\n children,\r\n ...props\r\n}: React.HTMLAttributes<HTMLHeadingElement>) {\r\n return (\r\n <h2 className={cn(typography.heading.h2, className)} suppressHydrationWarning {...props}>\r\n {children}\r\n </h2>\r\n )\r\n}\r\n\r\nexport function TypographyH3({\r\n className,\r\n children,\r\n ...props\r\n}: React.HTMLAttributes<HTMLHeadingElement>) {\r\n return (\r\n <h3 className={cn(typography.heading.h3, className)} suppressHydrationWarning {...props}>\r\n {children}\r\n </h3>\r\n )\r\n}\r\n\r\nexport function TypographyH4({\r\n className,\r\n children,\r\n ...props\r\n}: React.HTMLAttributes<HTMLHeadingElement>) {\r\n return (\r\n <h4 className={cn(typography.heading.h4, className)} suppressHydrationWarning {...props}>\r\n {children}\r\n </h4>\r\n )\r\n}\r\n\r\nexport function TypographyH5({\r\n className,\r\n children,\r\n ...props\r\n}: React.HTMLAttributes<HTMLHeadingElement>) {\r\n return (\r\n <h5 className={cn(typography.heading.h5, className)} suppressHydrationWarning {...props}>\r\n {children}\r\n </h5>\r\n )\r\n}\r\n\r\nexport function TypographyH6({\r\n className,\r\n children,\r\n ...props\r\n}: React.HTMLAttributes<HTMLHeadingElement>) {\r\n return (\r\n <h6 className={cn(typography.heading.h6, className)} suppressHydrationWarning {...props}>\r\n {children}\r\n </h6>\r\n )\r\n}\r\n\r\nexport function TypographyP({\r\n className,\r\n children,\r\n ...props\r\n}: React.HTMLAttributes<HTMLParagraphElement>) {\r\n return (\r\n <p className={cn(typography.body.medium, className)} suppressHydrationWarning {...props}>\r\n {children}\r\n </p>\r\n )\r\n}\r\n\r\nexport function TypographyPSmall({\r\n className,\r\n children,\r\n ...props\r\n}: React.HTMLAttributes<HTMLParagraphElement>) {\r\n return (\r\n <p className={cn(typography.body.small, className)} suppressHydrationWarning {...props}>\r\n {children}\r\n </p>\r\n )\r\n}\r\n\r\nexport function TypographyPLarge({\r\n className,\r\n children,\r\n ...props\r\n}: React.HTMLAttributes<HTMLParagraphElement>) {\r\n return (\r\n <p className={cn(typography.body.large, className)} suppressHydrationWarning {...props}>\r\n {children}\r\n </p>\r\n )\r\n}\r\n\r\nexport function TypographyPMuted({\r\n className,\r\n children,\r\n ...props\r\n}: React.HTMLAttributes<HTMLParagraphElement>) {\r\n return (\r\n <p className={cn(typography.body.muted.medium, className)} suppressHydrationWarning {...props}>\r\n {children}\r\n </p>\r\n )\r\n}\r\n\r\nexport function TypographyPSmallMuted({\r\n className,\r\n children,\r\n ...props\r\n}: React.HTMLAttributes<HTMLParagraphElement>) {\r\n return (\r\n <p className={cn(typography.body.muted.small, className)} suppressHydrationWarning {...props}>\r\n {children}\r\n </p>\r\n )\r\n}\r\n\r\nexport function TypographyPLargeMuted({\r\n className,\r\n children,\r\n ...props\r\n}: React.HTMLAttributes<HTMLParagraphElement>) {\r\n return (\r\n <p className={cn(typography.body.muted.large, className)} suppressHydrationWarning {...props}>\r\n {children}\r\n </p>\r\n )\r\n}\r\n\r\nexport function TypographySpan({\r\n className,\r\n children,\r\n ...props\r\n}: React.HTMLAttributes<HTMLSpanElement>) {\r\n return (\r\n <span className={cn(typography.body.medium, className)} suppressHydrationWarning {...props}>\r\n {children}\r\n </span>\r\n )\r\n}\r\n\r\nexport function TypographySpanWhite({\r\n className,\r\n children,\r\n ...props\r\n}: React.HTMLAttributes<HTMLSpanElement>) {\r\n return (\r\n <span className={cn(typography.body.medium, \"text-white/80 hover:text-white transition-all duration-200\", className)} suppressHydrationWarning {...props}>\r\n {children}\r\n </span>\r\n )\r\n}\r\n\r\nexport function TypographySpanSmall({\r\n className,\r\n children,\r\n ...props\r\n}: React.HTMLAttributes<HTMLSpanElement>) {\r\n return (\r\n <span className={cn(typography.body.small, className)} suppressHydrationWarning {...props}>\r\n {children}\r\n </span>\r\n )\r\n}\r\n\r\nexport function TypographySpanLarge({\r\n className,\r\n children,\r\n ...props\r\n}: React.HTMLAttributes<HTMLSpanElement>) {\r\n return (\r\n <span className={cn(typography.body.large, className)} suppressHydrationWarning {...props}>\r\n {children}\r\n </span>\r\n )\r\n}\r\n\r\nexport function TypographySpanMuted({\r\n className,\r\n children,\r\n ...props\r\n}: React.HTMLAttributes<HTMLSpanElement>) {\r\n return (\r\n <span className={cn(typography.body.muted.medium, \"group-hover:text-primary-foreground transition-colors duration-200\", className)} suppressHydrationWarning {...props}>\r\n {children}\r\n </span>\r\n )\r\n}\r\n\r\nexport function TypographySpanSmallMuted({\r\n className,\r\n children,\r\n ...props\r\n}: React.HTMLAttributes<HTMLSpanElement>) {\r\n return (\r\n <span className={cn(typography.body.muted.small, className)} suppressHydrationWarning {...props}>\r\n {children}\r\n </span>\r\n )\r\n}\r\n\r\nexport function TypographySpanLargeMuted({\r\n className,\r\n children,\r\n ...props\r\n}: React.HTMLAttributes<HTMLSpanElement>) {\r\n return (\r\n <span className={cn(typography.body.muted.large, className)} suppressHydrationWarning {...props}>\r\n {children}\r\n </span>\r\n )\r\n}\r\n\r\nexport function TypographySpanDestructive({\r\n className,\r\n children,\r\n ...props\r\n}: React.HTMLAttributes<HTMLSpanElement>) {\r\n return (\r\n <span className={cn(typography.body.small, \"text-destructive\", className)} suppressHydrationWarning {...props}>\r\n {children}\r\n </span>\r\n )\r\n}\r\n\r\nexport function TypographyLink({\r\n className,\r\n children,\r\n ...props\r\n}: React.HTMLAttributes<HTMLAnchorElement>) {\r\n return (\r\n <a className={cn(\"underline-offset-2 hover:underline\", className)} suppressHydrationWarning {...props}>\r\n {children}\r\n </a>\r\n )\r\n}\r\n\r\nexport function TypographyTitle({\r\n className,\r\n children,\r\n ...props\r\n}: React.HTMLAttributes<HTMLDivElement>) {\r\n return (\r\n <div className={cn(typography.title.default, className)} suppressHydrationWarning {...props}>\r\n {children}\r\n </div>\r\n )\r\n}\r\n\r\nexport function TypographyTitleLarge({\r\n className,\r\n children,\r\n ...props\r\n}: React.HTMLAttributes<HTMLDivElement>) {\r\n return (\r\n <div className={cn(typography.title.large, className)} suppressHydrationWarning {...props}>\r\n {children}\r\n </div>\r\n )\r\n}\r\n\r\nexport function TypographyTitleSmall({\r\n className,\r\n children,\r\n ...props\r\n}: React.HTMLAttributes<HTMLDivElement>) {\r\n return (\r\n <div className={cn(typography.title.small, className)} suppressHydrationWarning {...props}>\r\n {children}\r\n </div>\r\n )\r\n}\r\n\r\nexport function TypographyDescription({\r\n className,\r\n children,\r\n ...props\r\n}: React.HTMLAttributes<HTMLDivElement>) {\r\n return (\r\n <div className={cn(typography.description.default, className)} suppressHydrationWarning {...props}>\r\n {children}\r\n </div>\r\n )\r\n}\r\n\r\nexport function TypographyDescriptionSmall({\r\n className,\r\n children,\r\n ...props\r\n}: React.HTMLAttributes<HTMLDivElement>) {\r\n return (\r\n <div className={cn(typography.description.small, className)} suppressHydrationWarning {...props}>\r\n {children}\r\n </div>\r\n )\r\n}\r\n\r\nexport function TypographyDescriptionLarge({\r\n className,\r\n children,\r\n ...props\r\n}: React.HTMLAttributes<HTMLDivElement>) {\r\n return (\r\n <div className={cn(typography.description.large, className)} suppressHydrationWarning {...props}>\r\n {children}\r\n </div>\r\n )\r\n}\r\n\r\n/**\r\n * Icon Size Helper Component\r\n * Clone element và merge className để đảm bảo icon sử dụng đúng size từ typography config\r\n */\r\nexport interface IconSizeProps {\r\n size?: keyof typeof iconSizes\r\n className?: string\r\n children?: React.ReactNode\r\n}\r\n\r\nexport function IconSize({ size = \"md\", className, children }: IconSizeProps) {\r\n // Clone element và merge className trực tiếp vào icon component\r\n if (React.isValidElement(children)) {\r\n return React.cloneElement(children as React.ReactElement<{ className?: string }>, {\r\n className: cn(iconSizes[size], className, (children as React.ReactElement<{ className?: string }>).props?.className),\r\n })\r\n }\r\n \r\n // Fallback: nếu không phải valid element, wrap trong span\r\n return (\r\n <span className={cn(iconSizes[size], className)} suppressHydrationWarning>\r\n {children}\r\n </span>\r\n )\r\n}\r\n\r\n\r\n","import * as React from \"react\"\r\nimport { JSX, useRef } from \"react\"\r\nimport { calculateZoomLevel } from \"@lexical/utils\"\r\nimport type { LexicalEditor } from \"lexical\"\r\nimport { ImagePlus, ImageMinus } from \"lucide-react\"\r\n\r\nimport { Button } from \"@/components/ui/button\"\r\nimport {\r\n getImageAspectRatio,\r\n unlockImageBoundaries,\r\n} from \"@/components/editor/editor-ui/image-sizing\"\r\nimport { useEditorContainer } from \"@/components/editor/context/editor-container-context\"\r\nimport { IconSize } from \"@/components/ui/typography\"\r\n\r\nfunction clamp(value: number, min: number, max: number) {\r\n // Nếu max là Infinity, chỉ giới hạn min\r\n if (max === Infinity) {\r\n return Math.max(value, min)\r\n }\r\n return Math.min(Math.max(value, min), max)\r\n}\r\n\r\nconst Direction = {\r\n east: 1 << 0,\r\n north: 1 << 3,\r\n south: 1 << 1,\r\n west: 1 << 2,\r\n}\r\n\r\nconst RESIZE_HANDLES = [\r\n {\r\n key: \"n\",\r\n direction: Direction.north,\r\n className:\r\n \"image-resizer image-resizer-n bg-primary absolute -top-2.5 left-1/2 h-2 w-2 -translate-x-1/2 cursor-ns-resize\",\r\n },\r\n {\r\n key: \"ne\",\r\n direction: Direction.north | Direction.east,\r\n className:\r\n \"image-resizer image-resizer-ne bg-primary absolute -top-2.5 -right-2.5 h-2 w-2 cursor-nesw-resize\",\r\n },\r\n {\r\n key: \"e\",\r\n direction: Direction.east,\r\n className:\r\n \"image-resizer image-resizer-e bg-primary absolute top-1/2 -right-2.5 h-2 w-2 -translate-y-1/2 cursor-ew-resize\",\r\n },\r\n {\r\n key: \"se\",\r\n direction: Direction.south | Direction.east,\r\n className:\r\n \"image-resizer image-resizer-se bg-primary absolute -right-2.5 -bottom-2.5 h-2 w-2 cursor-nwse-resize\",\r\n },\r\n {\r\n key: \"s\",\r\n direction: Direction.south,\r\n className:\r\n \"image-resizer image-resizer-s bg-primary absolute -bottom-2.5 left-1/2 h-2 w-2 -translate-x-1/2 cursor-ns-resize\",\r\n },\r\n {\r\n key: \"sw\",\r\n direction: Direction.south | Direction.west,\r\n className:\r\n \"image-resizer image-resizer-sw bg-primary absolute -bottom-2.5 -left-2.5 h-2 w-2 cursor-nesw-resize\",\r\n },\r\n {\r\n key: \"w\",\r\n direction: Direction.west,\r\n className:\r\n \"image-resizer image-resizer-w bg-primary absolute top-1/2 -left-2.5 h-2 w-2 -translate-y-1/2 cursor-ew-resize\",\r\n },\r\n {\r\n key: \"nw\",\r\n direction: Direction.north | Direction.west,\r\n className:\r\n \"image-resizer image-resizer-nw bg-primary absolute -top-2.5 -left-2.5 h-2 w-2 cursor-nwse-resize\",\r\n },\r\n] as const\r\n\r\nexport interface MediaResizerProps {\r\n editor: LexicalEditor\r\n buttonRef: { current: null | HTMLButtonElement }\r\n mediaRef: { current: null | HTMLElement }\r\n onResizeEnd: (width: \"inherit\" | number, height: \"inherit\" | number) => void\r\n onResizeStart: () => void\r\n showCaption?: boolean\r\n setShowCaption?: (show: boolean) => void\r\n captionsEnabled?: boolean\r\n onSetFullWidth?: () => void\r\n unlockBoundaries?: boolean\r\n onReplaceMedia?: () => void\r\n maxWidth?: number\r\n}\r\n\r\n/**\r\n * MediaResizer - Universal resizer for media elements (images, videos, etc.)\r\n * Supports both images with captions and videos without captions\r\n */\r\nexport function MediaResizer({\r\n onResizeStart,\r\n onResizeEnd,\r\n buttonRef,\r\n mediaRef,\r\n editor,\r\n showCaption = false,\r\n setShowCaption,\r\n captionsEnabled = false,\r\n onSetFullWidth: _onSetFullWidth,\r\n unlockBoundaries = true,\r\n onReplaceMedia,\r\n maxWidth,\r\n}: MediaResizerProps): JSX.Element {\r\n const controlWrapperRef = useRef<HTMLDivElement>(null)\r\n const userSelect = useRef({\r\n priority: \"\",\r\n value: \"default\",\r\n })\r\n const positioningRef = useRef<{\r\n currentHeight: \"inherit\" | number\r\n currentWidth: \"inherit\" | number\r\n direction: number\r\n isResizing: boolean\r\n ratio: number\r\n startHeight: number\r\n startWidth: number\r\n startX: number\r\n startY: number\r\n maxWidthLimit: number\r\n }>({\r\n currentHeight: 0,\r\n currentWidth: 0,\r\n direction: 0,\r\n isResizing: false,\r\n ratio: 0,\r\n startHeight: 0,\r\n startWidth: 0,\r\n startX: 0,\r\n startY: 0,\r\n maxWidthLimit: Infinity,\r\n })\r\n const editorRootElement = editor.getRootElement()\r\n const maxHeightContainer = Infinity\r\n const editorContainer = useEditorContainer()\r\n const _hardWidthLimit = maxWidth ?? editorContainer?.maxWidth\r\n\r\n const minWidth = 100\r\n const minHeight = 100\r\n\r\n React.useEffect(() => {\r\n if (!unlockBoundaries) {\r\n return\r\n }\r\n if (mediaRef.current) {\r\n unlockImageBoundaries(mediaRef.current)\r\n }\r\n }, [mediaRef, unlockBoundaries])\r\n\r\n const setStartCursor = (direction: number) => {\r\n const ew = direction === Direction.east || direction === Direction.west\r\n const ns = direction === Direction.north || direction === Direction.south\r\n const nwse =\r\n (direction & Direction.north && direction & Direction.west) ||\r\n (direction & Direction.south && direction & Direction.east)\r\n\r\n const cursorDir = ew ? \"ew\" : ns ? \"ns\" : nwse ? \"nwse\" : \"nesw\"\r\n\r\n if (editorRootElement !== null) {\r\n editorRootElement.style.setProperty(\r\n \"cursor\",\r\n `${cursorDir}-resize`,\r\n \"important\"\r\n )\r\n }\r\n if (document.body !== null) {\r\n document.body.style.setProperty(\r\n \"cursor\",\r\n `${cursorDir}-resize`,\r\n \"important\"\r\n )\r\n userSelect.current.value = document.body.style.getPropertyValue(\r\n \"-webkit-user-select\"\r\n )\r\n userSelect.current.priority = document.body.style.getPropertyPriority(\r\n \"-webkit-user-select\"\r\n )\r\n document.body.style.setProperty(\r\n \"-webkit-user-select\",\r\n `none`,\r\n \"important\"\r\n )\r\n }\r\n }\r\n\r\n const setEndCursor = () => {\r\n if (editorRootElement !== null) {\r\n editorRootElement.style.setProperty(\"cursor\", \"text\")\r\n }\r\n if (document.body !== null) {\r\n document.body.style.setProperty(\"cursor\", \"default\")\r\n document.body.style.setProperty(\r\n \"-webkit-user-select\",\r\n userSelect.current.value,\r\n userSelect.current.priority\r\n )\r\n }\r\n }\r\n\r\n const handlePointerDown = (\r\n event: React.PointerEvent<HTMLDivElement>,\r\n direction: number\r\n ) => {\r\n if (!editor.isEditable()) {\r\n return\r\n }\r\n\r\n const media = mediaRef.current\r\n const controlWrapper = controlWrapperRef.current\r\n\r\n if (media !== null && controlWrapper !== null) {\r\n event.preventDefault()\r\n if (unlockBoundaries) {\r\n unlockImageBoundaries(media)\r\n }\r\n const { width, height } = media.getBoundingClientRect()\r\n const zoom = calculateZoomLevel(media)\r\n const positioning = positioningRef.current\r\n positioning.startWidth = width\r\n positioning.startHeight = height\r\n positioning.ratio = getImageAspectRatio(media)\r\n positioning.currentWidth = width\r\n positioning.currentHeight = height\r\n positioning.startX = event.clientX / zoom\r\n positioning.startY = event.clientY / zoom\r\n positioning.isResizing = true\r\n positioning.direction = direction\r\n // Không giới hạn theo container — cho phép kéo lớn/nhỏ tự do\r\n positioning.maxWidthLimit = Infinity\r\n\r\n setStartCursor(direction)\r\n onResizeStart()\r\n\r\n controlWrapper.classList.add(\"touch-action-none\")\r\n media.style.height = `${height}px`\r\n media.style.width = `${width}px`\r\n\r\n document.addEventListener(\"pointermove\", handlePointerMove)\r\n document.addEventListener(\"pointerup\", handlePointerUp)\r\n }\r\n }\r\n const getEffectiveMaxWidth = () => {\r\n // Chỉ dùng maxWidthLimit (đã set Infinity) — không giới hạn theo container/context\r\n const maxFromPositioning =\r\n typeof positioningRef.current.maxWidthLimit === \"number\"\r\n ? positioningRef.current.maxWidthLimit\r\n : Infinity\r\n return maxFromPositioning\r\n }\r\n const handlePointerMove = (event: PointerEvent) => {\r\n const media = mediaRef.current\r\n const positioning = positioningRef.current\r\n\r\n const isHorizontal =\r\n positioning.direction & (Direction.east | Direction.west)\r\n const isVertical =\r\n positioning.direction & (Direction.south | Direction.north)\r\n\r\n if (media !== null && positioning.isResizing) {\r\n const zoom = calculateZoomLevel(media)\r\n // Corner cursor\r\n if (isHorizontal && isVertical) {\r\n let diff = Math.floor(positioning.startX - event.clientX / zoom)\r\n diff = positioning.direction & Direction.east ? -diff : diff\r\n\r\n const effectiveMaxWidth = getEffectiveMaxWidth()\r\n const width = clamp(\r\n positioning.startWidth + diff,\r\n minWidth,\r\n effectiveMaxWidth || Infinity\r\n )\r\n const widthReachedLimit =\r\n effectiveMaxWidth !== Infinity &&\r\n width >= effectiveMaxWidth &&\r\n diff > 0\r\n\r\n const height = width / positioning.ratio\r\n media.style.width = `${width}px`\r\n media.style.height = `${height}px`\r\n positioning.currentHeight = height\r\n positioning.currentWidth = width\r\n if (widthReachedLimit) {\r\n return\r\n }\r\n } else if (isVertical) {\r\n let diff = Math.floor(positioning.startY - event.clientY / zoom)\r\n diff = positioning.direction & Direction.south ? -diff : diff\r\n\r\n const height = clamp(\r\n positioning.startHeight + diff,\r\n minHeight,\r\n maxHeightContainer\r\n )\r\n\r\n // Calculate width based on aspect ratio to maintain proportions\r\n const width = height * positioning.ratio\r\n media.style.height = `${height}px`\r\n media.style.width = `${width}px`\r\n positioning.currentHeight = height\r\n positioning.currentWidth = width\r\n } else {\r\n let diff = Math.floor(positioning.startX - event.clientX / zoom)\r\n diff = positioning.direction & Direction.east ? -diff : diff\r\n\r\n const effectiveMaxWidth = getEffectiveMaxWidth()\r\n const width = clamp(\r\n positioning.startWidth + diff,\r\n minWidth,\r\n effectiveMaxWidth || Infinity\r\n )\r\n const widthReachedLimit =\r\n effectiveMaxWidth !== Infinity &&\r\n width >= effectiveMaxWidth &&\r\n diff > 0\r\n\r\n // Calculate height based on aspect ratio to maintain proportions\r\n const height = width / positioning.ratio\r\n media.style.width = `${width}px`\r\n media.style.height = `${height}px`\r\n positioning.currentWidth = width\r\n positioning.currentHeight = height\r\n if (widthReachedLimit) {\r\n return\r\n }\r\n }\r\n }\r\n }\r\n const handlePointerUp = () => {\r\n const media = mediaRef.current\r\n const positioning = positioningRef.current\r\n const controlWrapper = controlWrapperRef.current\r\n if (media !== null && controlWrapper !== null && positioning.isResizing) {\r\n const width = positioning.currentWidth\r\n const height = positioning.currentHeight\r\n positioning.startWidth = 0\r\n positioning.startHeight = 0\r\n positioning.ratio = 0\r\n positioning.startX = 0\r\n positioning.startY = 0\r\n positioning.currentWidth = 0\r\n positioning.currentHeight = 0\r\n positioning.isResizing = false\r\n\r\n controlWrapper.classList.remove(\"touch-action-none\")\r\n\r\n setEndCursor()\r\n onResizeEnd(width, height)\r\n\r\n document.removeEventListener(\"pointermove\", handlePointerMove)\r\n document.removeEventListener(\"pointerup\", handlePointerUp)\r\n }\r\n }\r\n\r\n return (\r\n <>\r\n <div ref={controlWrapperRef}>\r\n {RESIZE_HANDLES.map(({ key, direction, className }) => (\r\n <div\r\n key={key}\r\n className={className}\r\n onPointerDown={(event) => {\r\n handlePointerDown(event, direction)\r\n }}\r\n />\r\n ))}\r\n </div>\r\n <div className=\"mt-2 flex flex-wrap justify-center gap-2\">\r\n {onReplaceMedia && (\r\n <Button\r\n className=\"image-replace-button\"\r\n type=\"button\"\r\n variant=\"outline\"\r\n size=\"sm\"\r\n onClick={onReplaceMedia}\r\n >\r\n Change Image\r\n </Button>\r\n )}\r\n {setShowCaption && captionsEnabled && (\r\n <Button\r\n className=\"image-caption-button\"\r\n ref={buttonRef}\r\n type=\"button\"\r\n variant={\"outline\"}\r\n size=\"sm\"\r\n onClick={() => {\r\n setShowCaption(!showCaption)\r\n }}\r\n >\r\n {showCaption ? (\r\n <>\r\n <IconSize size=\"sm\" className=\"mr-1.5\">\r\n <ImageMinus />\r\n </IconSize>\r\n Remove Caption\r\n </>\r\n ) : (\r\n <>\r\n <IconSize size=\"sm\" className=\"mr-1.5\">\r\n <ImagePlus />\r\n </IconSize>\r\n Add Caption\r\n </>\r\n )}\r\n </Button>\r\n )}\r\n </div>\r\n </>\r\n )\r\n}\r\n\r\n// Backward compatibility: export as ImageResizer for existing code\r\nexport const ImageResizer = MediaResizer\r\n","\"use client\"\r\n\r\nimport * as React from \"react\"\r\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\"\r\nimport { XIcon } from \"lucide-react\"\r\n\r\nimport { cn } from \"@/utils\"\r\nimport { headingSizes, fontWeights, responsiveTextSizes, lineHeights } from \"@/constants\"\r\n\r\nconst dialogTitleDefault = `${headingSizes.h4} ${fontWeights.bold}`\r\nconst dialogBodySmall = `${responsiveTextSizes.small} ${fontWeights.normal} ${lineHeights.relaxed}`\r\n\r\nfunction Dialog({\r\n ...props\r\n}: React.ComponentProps<typeof DialogPrimitive.Root>) {\r\n return <DialogPrimitive.Root data-slot=\"dialog\" {...props} />\r\n}\r\n\r\nfunction DialogTrigger({\r\n ...props\r\n}: React.ComponentProps<typeof DialogPrimitive.Trigger>) {\r\n return <DialogPrimitive.Trigger data-slot=\"dialog-trigger\" {...props} />\r\n}\r\n\r\nfunction DialogPortal({\r\n ...props\r\n}: React.ComponentProps<typeof DialogPrimitive.Portal>) {\r\n return <DialogPrimitive.Portal data-slot=\"dialog-portal\" {...props} />\r\n}\r\n\r\nfunction DialogClose({\r\n ...props\r\n}: React.ComponentProps<typeof DialogPrimitive.Close>) {\r\n return <DialogPrimitive.Close data-slot=\"dialog-close\" {...props} />\r\n}\r\n\r\nfunction DialogOverlay({\r\n className,\r\n ...props\r\n}: React.ComponentProps<typeof DialogPrimitive.Overlay>) {\r\n return (\r\n <DialogPrimitive.Overlay\r\n data-slot=\"dialog-overlay\"\r\n className={cn(\r\n \"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-[1200] bg-black/60\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nconst defaultContentClass =\r\n \"bg-background data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 fixed top-[50%] left-[50%] z-[1200] grid w-full max-w-[calc(100vw-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200\"\r\n\r\nfunction DialogContent({\r\n className,\r\n children,\r\n showCloseButton = true,\r\n overlayClassName,\r\n size = \"default\",\r\n ...props\r\n}: React.ComponentProps<typeof DialogPrimitive.Content> & {\r\n showCloseButton?: boolean\r\n overlayClassName?: string\r\n /** \"full\" = không áp max-w mặc định (md:max-w-[32rem]), dùng khi truyền max-w qua className (vd. dialog xem ảnh) */\r\n size?: \"default\" | \"full\"\r\n}) {\r\n return (\r\n <DialogPortal data-slot=\"dialog-portal\">\r\n <DialogOverlay className={overlayClassName} />\r\n <DialogPrimitive.Content\r\n data-slot=\"dialog-content\"\r\n className={cn(\r\n defaultContentClass,\r\n size === \"default\" && \"md:max-w-[32rem]\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n {showCloseButton && (\r\n <DialogPrimitive.Close\r\n data-slot=\"dialog-close\"\r\n className={`ring-offset-background focus:ring-ring data-[state=open]:bg-accent data-[state=open]:text-muted-foreground absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none [&_svg]:pointer-events-none [&_svg]:shrink-0`}\r\n >\r\n <XIcon />\r\n <span className=\"sr-only\">Close</span>\r\n </DialogPrimitive.Close>\r\n )}\r\n </DialogPrimitive.Content>\r\n </DialogPortal>\r\n )\r\n}\r\n\r\nfunction DialogHeader({ className, ...props }: React.ComponentProps<\"div\">) {\r\n return (\r\n <div\r\n data-slot=\"dialog-header\"\r\n className={cn(\"flex flex-col gap-2 text-center sm:text-left\", className)}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nfunction DialogFooter({ className, ...props }: React.ComponentProps<\"div\">) {\r\n return (\r\n <div\r\n data-slot=\"dialog-footer\"\r\n className={cn(\r\n \"flex gap-2 sm:flex-row justify-end\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nfunction DialogTitle({\r\n className,\r\n ...props\r\n}: React.ComponentProps<typeof DialogPrimitive.Title>) {\r\n return (\r\n <DialogPrimitive.Title\r\n data-slot=\"dialog-title\"\r\n className={cn(`${dialogTitleDefault} leading-none`, className)}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nfunction DialogDescription({\r\n className,\r\n ...props\r\n}: React.ComponentProps<typeof DialogPrimitive.Description>) {\r\n return (\r\n <DialogPrimitive.Description\r\n data-slot=\"dialog-description\"\r\n className={cn(`text-muted-foreground ${dialogBodySmall}`, className)}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nexport {\r\n Dialog,\r\n DialogClose,\r\n DialogContent,\r\n DialogDescription,\r\n DialogFooter,\r\n DialogHeader,\r\n DialogOverlay,\r\n DialogPortal,\r\n DialogTitle,\r\n DialogTrigger,\r\n}\r\n\r\n","export const CAN_USE_DOM: boolean =\r\n typeof window !== \"undefined\" &&\r\n typeof window.document !== \"undefined\" &&\r\n typeof window.document.createElement !== \"undefined\"\r\n","import * as React from \"react\"\r\nimport { cva, type VariantProps } from \"class-variance-authority\"\r\n\r\nimport { cn } from \"@/utils\"\r\nimport { responsiveTextSizes, fontWeights, lineHeights } from \"@/constants\"\r\n\r\nconst inputBodyMedium = `${responsiveTextSizes.medium} ${fontWeights.normal} ${lineHeights.relaxed}`\r\nconst inputBodySmall = `${responsiveTextSizes.small} ${fontWeights.normal} ${lineHeights.relaxed}`\r\n\r\nconst inputVariants = cva(\r\n `file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 ${inputBodyMedium} shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:${inputBodySmall} file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 [&:read-only]:opacity-100 [&:read-only]:disabled:opacity-100 md:${inputBodySmall} focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive`,\r\n {\r\n variants: {\r\n paddingLeft: {\r\n none: \"\",\r\n \"9\": \"pl-9\",\r\n },\r\n paddingRight: {\r\n none: \"\",\r\n \"10\": \"pr-10\",\r\n },\r\n error: {\r\n true: \"border-destructive\",\r\n false: \"\",\r\n },\r\n },\r\n defaultVariants: {\r\n paddingLeft: \"none\",\r\n paddingRight: \"none\",\r\n error: false,\r\n },\r\n }\r\n)\r\n\r\nexport interface InputProps\r\n extends React.InputHTMLAttributes<HTMLInputElement>,\r\n VariantProps<typeof inputVariants> {}\r\n\r\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\r\n ({ className, type, paddingLeft, paddingRight, error, ...props }, ref) => {\r\n return (\r\n <input\r\n type={type}\r\n className={cn(inputVariants({ paddingLeft, paddingRight, error }), className)}\r\n ref={ref}\r\n {...props}\r\n />\r\n )\r\n }\r\n)\r\nInput.displayName = \"Input\"\r\n\r\nexport { Input }\r\n\r\n","\"use client\"\r\n\r\nimport * as React from \"react\"\r\nimport * as LabelPrimitive from \"@radix-ui/react-label\"\r\n\r\nimport { cn } from \"@/utils\"\r\nimport { responsiveTextSizes, fontWeights, lineHeights } from \"@/constants\"\r\n\r\nconst labelBodySmall = `${responsiveTextSizes.small} ${fontWeights.normal} ${lineHeights.relaxed}`\r\n\r\nfunction Label({\r\n className,\r\n ...props\r\n}: React.ComponentProps<typeof LabelPrimitive.Root>) {\r\n return (\r\n <LabelPrimitive.Root\r\n data-slot=\"label\"\r\n className={cn(\r\n `flex items-center gap-2 ${labelBodySmall} leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50`,\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nexport { Label }\r\n\r\n","\"use client\"\r\n\r\nimport * as React from \"react\"\r\nimport * as TabsPrimitive from \"@radix-ui/react-tabs\"\r\n\r\nimport { cn } from \"@/utils\"\r\n\r\nfunction Tabs({\r\n className,\r\n ...props\r\n}: React.ComponentProps<typeof TabsPrimitive.Root>) {\r\n return (\r\n <TabsPrimitive.Root\r\n data-slot=\"tabs\"\r\n className={cn(\"flex flex-col gap-2\", className)}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nfunction TabsList({\r\n className,\r\n ...props\r\n}: React.ComponentProps<typeof TabsPrimitive.List>) {\r\n return (\r\n <TabsPrimitive.List\r\n data-slot=\"tabs-list\"\r\n className={cn(\r\n \"bg-muted/80 dark:bg-muted/60 text-muted-foreground inline-flex h-11 w-fit items-center justify-center rounded-lg p-1 border border-border/50 shadow-sm backdrop-blur-sm\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nfunction TabsTrigger({\r\n className,\r\n ...props\r\n}: React.ComponentProps<typeof TabsPrimitive.Trigger>) {\r\n return (\r\n <TabsPrimitive.Trigger\r\n data-slot=\"tabs-trigger\"\r\n className={cn(\r\n `data-[state=active]:bg-background dark:data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:font-semibold focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:outline-ring dark:data-[state=active]:border-primary/30 dark:data-[state=active]:bg-primary/10 text-foreground/70 dark:text-muted-foreground inline-flex h-full flex-1 items-center justify-center gap-2 rounded-md border border-transparent px-4 py-2 font-medium whitespace-nowrap transition-all duration-200 focus-visible:ring-[3px] focus-visible:outline-1 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:shadow-md data-[state=active]:border-primary/20 hover:text-foreground hover:bg-background/50 [&_svg]:pointer-events-none [&_svg]:shrink-0 text-sm sm:text-base [&_svg:not([class*='size-'])]:w-4 [&_svg:not([class*='size-'])]:h-4 w-full`,\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nfunction TabsContent({\r\n className,\r\n ...props\r\n}: React.ComponentProps<typeof TabsPrimitive.Content>) {\r\n return (\r\n <TabsPrimitive.Content\r\n data-slot=\"tabs-content\"\r\n className={cn(\"flex-1 outline-none\", className)}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nexport { Tabs, TabsList, TabsTrigger, TabsContent }\r\n\r\n","/**\r\n * Stub uploads hooks for standalone nextjs-editor package.\r\n * Returns empty data so Insert Image dialog works (URL tab only).\r\n * In Next.js app you can replace this with real implementation via bundler alias or context.\r\n */\r\n\r\nimport type { FolderNode } from \"../types\"\r\n\r\nconst emptyFolderTree: FolderNode = {\r\n name: \"\",\r\n path: \"\",\r\n images: [],\r\n subfolders: [],\r\n}\r\n\r\nexport const useImagesList = (_page: number = 1, _limit: number = 50) => ({\r\n data: {\r\n success: true,\r\n data: {\r\n data: [] as { url: string; relativePath: string }[],\r\n folderTree: emptyFolderTree,\r\n pagination: { page: 1, limit: 50, total: 0, totalPages: 0 },\r\n },\r\n },\r\n isLoading: false,\r\n isError: false,\r\n})\r\n\r\nexport const useFoldersList = () => ({\r\n data: [] as { path: string; name: string }[],\r\n isLoading: false,\r\n isError: false,\r\n})\r\n\r\nexport const useCreateFolder = () => ({\r\n mutate: () => {},\r\n mutateAsync: async () => ({}),\r\n isPending: false,\r\n})\r\n\r\nexport const useDeleteFolder = () => ({\r\n mutate: () => {},\r\n mutateAsync: async () => {},\r\n isPending: false,\r\n})\r\n\r\nexport const useDeleteImage = () => ({\r\n mutate: () => {},\r\n mutateAsync: async () => {},\r\n isPending: false,\r\n})\r\n\r\nexport const useBulkDeleteImages = () => ({\r\n mutate: () => {},\r\n mutateAsync: async () => ({ successCount: 0, errorCount: 0 }),\r\n isPending: false,\r\n})\r\n","\"use client\"\r\n\r\nimport * as React from \"react\"\r\nimport * as CollapsiblePrimitive from \"@radix-ui/react-collapsible\"\r\nimport { cva, type VariantProps } from \"class-variance-authority\"\r\nimport { cn } from \"@/utils\"\r\n\r\nconst collapsibleVariants = cva(\"\", {\r\n variants: {\r\n fullWidth: {\r\n true: \"w-full\",\r\n false: \"\",\r\n },\r\n },\r\n defaultVariants: {\r\n fullWidth: false,\r\n },\r\n})\r\n\r\nexport interface CollapsibleProps\r\n extends React.ComponentProps<typeof CollapsiblePrimitive.Root>,\r\n VariantProps<typeof collapsibleVariants> {}\r\n\r\nfunction Collapsible({\r\n className,\r\n fullWidth,\r\n ...props\r\n}: CollapsibleProps) {\r\n return (\r\n <CollapsiblePrimitive.Root\r\n data-slot=\"collapsible\"\r\n className={cn(collapsibleVariants({ fullWidth }), className)}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nfunction CollapsibleTrigger({\r\n ...props\r\n}: React.ComponentProps<typeof CollapsiblePrimitive.CollapsibleTrigger>) {\r\n return (\r\n <CollapsiblePrimitive.CollapsibleTrigger\r\n data-slot=\"collapsible-trigger\"\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nfunction CollapsibleContent({\r\n className,\r\n ...props\r\n}: React.ComponentProps<typeof CollapsiblePrimitive.CollapsibleContent>) {\r\n return (\r\n <CollapsiblePrimitive.CollapsibleContent\r\n data-slot=\"collapsible-content\"\r\n className={cn(\r\n \"overflow-hidden data-[state=closed]:animate-[collapsible-up_0.2s_ease-out] data-[state=open]:animate-[collapsible-down_0.2s_ease-out]\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nexport { Collapsible, CollapsibleTrigger, CollapsibleContent }\r\n\r\n","\"use client\"\r\n\r\n/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\nimport { JSX, useEffect, useRef, useState } from \"react\"\r\nimport * as React from \"react\"\r\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\"\r\nimport { $wrapNodeInElement, mergeRegister } from \"@lexical/utils\"\r\nimport {\r\n $createParagraphNode,\r\n $createRangeSelection,\r\n $getSelection,\r\n $insertNodes,\r\n $isNodeSelection,\r\n $isRootOrShadowRoot,\r\n $setSelection,\r\n COMMAND_PRIORITY_EDITOR,\r\n COMMAND_PRIORITY_HIGH,\r\n COMMAND_PRIORITY_LOW,\r\n createCommand,\r\n DRAGOVER_COMMAND,\r\n DRAGSTART_COMMAND,\r\n DROP_COMMAND,\r\n LexicalCommand,\r\n LexicalEditor,\r\n} from \"lexical\"\r\n\r\nimport {\r\n $createImageNode,\r\n $isImageNode,\r\n ImageNode,\r\n ImagePayload,\r\n} from \"@/components/editor/nodes/image-node\"\r\nimport { CAN_USE_DOM } from \"@/components/editor/shared/can-use-dom\"\r\nimport { Button } from \"@/components/ui/button\"\r\nimport { DialogFooter } from \"@/components/ui/dialog\"\r\nimport { Input } from \"@/components/ui/input\"\r\nimport { Label } from \"@/components/ui/label\"\r\nimport {\r\n Tabs,\r\n TabsContent,\r\n TabsList,\r\n TabsTrigger,\r\n} from \"@/components/ui/tabs\"\r\nimport { useImagesList } from \"@/features/uploads/hooks/use-uploads-queries\"\r\nimport { Loader2, Folder, ChevronRight } from \"lucide-react\"\r\nimport Image from \"next/image\"\r\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from \"@/components/ui/collapsible\"\r\nimport { TypographyP, TypographySpanSmallMuted, IconSize } from \"@/components/ui/typography\"\r\nimport type { FolderNode } from \"@/features/uploads/types\"\r\n\r\nexport type InsertImagePayload = Readonly<ImagePayload>\r\n\r\nconst getDOMSelection = (targetWindow: Window | null): Selection | null =>\r\n CAN_USE_DOM ? (targetWindow || window).getSelection() : null\r\n\r\nexport const INSERT_IMAGE_COMMAND: LexicalCommand<InsertImagePayload> =\r\n createCommand(\"INSERT_IMAGE_COMMAND\")\r\n\r\nexport function InsertImageUriDialogBody({\r\n onClick,\r\n}: {\r\n onClick: (payload: InsertImagePayload) => void\r\n}) {\r\n const [src, setSrc] = useState(\"\")\r\n const [altText, setAltText] = useState(\"\")\r\n\r\n const isDisabled = src === \"\"\r\n\r\n return (\r\n <div className=\"grid gap-4 py-4\">\r\n <div className=\"grid gap-2\">\r\n <Label htmlFor=\"image-url\">Image URL</Label>\r\n <Input\r\n id=\"image-url\"\r\n placeholder=\"i.e. https://source.unsplash.com/random\"\r\n onChange={(e) => setSrc(e.target.value)}\r\n value={src}\r\n data-test-id=\"image-modal-url-input\"\r\n />\r\n </div>\r\n <div className=\"grid gap-2\">\r\n <Label htmlFor=\"alt-text\">Alt Text</Label>\r\n <Input\r\n id=\"alt-text\"\r\n placeholder=\"Random unsplash image\"\r\n onChange={(e) => setAltText(e.target.value)}\r\n value={altText}\r\n data-test-id=\"image-modal-alt-text-input\"\r\n />\r\n </div>\r\n <DialogFooter>\r\n <Button\r\n type=\"submit\"\r\n disabled={isDisabled}\r\n onClick={() => onClick({ altText, src })}\r\n data-test-id=\"image-modal-confirm-btn\"\r\n >\r\n Confirm\r\n </Button>\r\n </DialogFooter>\r\n </div>\r\n )\r\n}\r\n\r\nexport function InsertImageUploadedDialogBody({\r\n onClick,\r\n}: {\r\n onClick: (payload: InsertImagePayload) => void\r\n}) {\r\n const [src, setSrc] = useState(\"\")\r\n const [altText, setAltText] = useState(\"\")\r\n\r\n const isDisabled = src === \"\"\r\n\r\n const loadImage = (files: FileList | null) => {\r\n const reader = new FileReader()\r\n reader.onload = function () {\r\n if (typeof reader.result === \"string\") {\r\n setSrc(reader.result)\r\n }\r\n return \"\"\r\n }\r\n if (files !== null) {\r\n reader.readAsDataURL(files[0])\r\n }\r\n }\r\n\r\n return (\r\n <div className=\"grid gap-4 py-4\">\r\n <div className=\"grid gap-2\">\r\n <Label htmlFor=\"image-upload\">Image Upload</Label>\r\n <Input\r\n id=\"image-upload\"\r\n type=\"file\"\r\n onChange={(e) => loadImage(e.target.files)}\r\n accept=\"image/*\"\r\n data-test-id=\"image-modal-file-upload\"\r\n />\r\n </div>\r\n <div className=\"grid gap-2\">\r\n <Label htmlFor=\"alt-text\">Alt Text</Label>\r\n <Input\r\n id=\"alt-text\"\r\n placeholder=\"Descriptive alternative text\"\r\n onChange={(e) => setAltText(e.target.value)}\r\n value={altText}\r\n data-test-id=\"image-modal-alt-text-input\"\r\n />\r\n </div>\r\n <Button\r\n type=\"submit\"\r\n disabled={isDisabled}\r\n onClick={() => onClick({ altText, src })}\r\n data-test-id=\"image-modal-file-upload-btn\"\r\n >\r\n Confirm\r\n </Button>\r\n </div>\r\n )\r\n}\r\n\r\n// Component để hiển thị folder tree cho image picker\r\nfunction ImagePickerFolderTree({\r\n folder,\r\n level = 0,\r\n openFolders,\r\n setOpenFolders,\r\n selectedImage,\r\n onImageSelect,\r\n}: {\r\n folder: FolderNode\r\n level?: number\r\n openFolders: Set<string>\r\n setOpenFolders: React.Dispatch<React.SetStateAction<Set<string>>>\r\n selectedImage: string | null\r\n onImageSelect: (imageUrl: string, originalName: string) => void\r\n}) {\r\n const hasContent = folder.images.length > 0 || folder.subfolders.length > 0\r\n const isOpen = openFolders.has(folder.path)\r\n\r\n const handleOpenChange = React.useCallback(\r\n (open: boolean) => {\r\n if (open) {\r\n setOpenFolders((prev) => {\r\n const newSet = new Set(prev)\r\n newSet.add(folder.path)\r\n return newSet\r\n })\r\n } else {\r\n setOpenFolders((prev) => {\r\n const newSet = new Set(prev)\r\n newSet.delete(folder.path)\r\n return newSet\r\n })\r\n }\r\n },\r\n [folder.path, setOpenFolders]\r\n )\r\n\r\n if (!hasContent) return null\r\n\r\n return (\r\n <Collapsible key={folder.path} open={isOpen} onOpenChange={handleOpenChange} className=\"mb-2\">\r\n <CollapsibleTrigger className=\"flex items-center gap-2 w-full px-2 py-1.5 hover:bg-muted rounded-md transition-colors text-left\">\r\n <IconSize size=\"xs\" className={`transition-transform shrink-0 ${isOpen ? \"rotate-90\" : \"\"}`}>\r\n <ChevronRight />\r\n </IconSize>\r\n <IconSize size=\"xs\" className=\"text-muted-foreground shrink-0\">\r\n <Folder />\r\n </IconSize>\r\n <TypographyP className=\"truncate\">{folder.name}</TypographyP>\r\n <TypographySpanSmallMuted className=\"ml-auto shrink-0\">\r\n {`${folder.images.length} hình${folder.subfolders.length > 0 ? `, ${folder.subfolders.length} thư mục` : \"\"}`}\r\n </TypographySpanSmallMuted>\r\n </CollapsibleTrigger>\r\n <CollapsibleContent className=\"ml-4 mt-1\">\r\n {/* Render images in this folder */}\r\n {folder.images.length > 0 && (\r\n <div className=\"mb-3 grid grid-cols-4 gap-2\">\r\n {folder.images.map((image) => (\r\n <button\r\n key={image.fileName}\r\n type=\"button\"\r\n onClick={() => onImageSelect(image.url, image.originalName)}\r\n onDoubleClick={() => {\r\n // Double-click để insert ngay\r\n onImageSelect(image.url, image.originalName)\r\n // Trigger confirm sau một chút để state được update\r\n setTimeout(() => {\r\n const event = new Event(\"confirm-image-insert\", { bubbles: true })\r\n document.dispatchEvent(event)\r\n }, 100)\r\n }}\r\n className={`relative aspect-square rounded-md overflow-hidden border-2 transition-all cursor-pointer ${\r\n selectedImage === image.url\r\n ? \"border-primary ring-2 ring-primary ring-offset-1\"\r\n : \"border-border hover:border-primary/50\"\r\n }`}\r\n title={`${image.originalName} - Double-click để chèn ngay`}\r\n >\r\n <Image\r\n src={image.url}\r\n alt={image.originalName}\r\n title={image.originalName}\r\n fill\r\n className=\"object-cover article-image article-image-ux-impr article-image-new expandable\"\r\n sizes=\"(max-width: 768px) 25vw, 20vw\"\r\n unoptimized\r\n loading=\"eager\"\r\n />\r\n </button>\r\n ))}\r\n </div>\r\n )}\r\n {/* Render subfolders */}\r\n {folder.subfolders.map((subfolder) => (\r\n <ImagePickerFolderTree\r\n key={subfolder.path}\r\n folder={subfolder}\r\n level={level + 1}\r\n openFolders={openFolders}\r\n setOpenFolders={setOpenFolders}\r\n selectedImage={selectedImage}\r\n onImageSelect={onImageSelect}\r\n />\r\n ))}\r\n </CollapsibleContent>\r\n </Collapsible>\r\n )\r\n}\r\n\r\nexport function InsertImageUploadsDialogBody({\r\n onClick,\r\n}: {\r\n onClick: (payload: InsertImagePayload) => void\r\n}) {\r\n const [selectedImage, setSelectedImage] = useState<string | null>(null)\r\n const [altText, setAltText] = useState(\"\")\r\n const [openFolders, setOpenFolders] = useState<Set<string>>(new Set())\r\n const limit = 100 // Tăng limit để lấy nhiều hình ảnh hơn cho tree view\r\n\r\n const { data: imagesData, isLoading } = useImagesList(1, limit)\r\n const folderTree = imagesData?.data?.folderTree\r\n\r\n const isDisabled = !selectedImage\r\n\r\n const handleImageSelect = React.useCallback((imageUrl: string, originalName: string) => {\r\n setSelectedImage(imageUrl)\r\n setAltText((prev) => prev || originalName)\r\n }, [])\r\n\r\n const handleConfirm = React.useCallback(() => {\r\n if (selectedImage) {\r\n // Đảm bảo URL là absolute nếu là relative URL từ uploads\r\n let imageUrl = selectedImage\r\n if (imageUrl.startsWith(\"/api/uploads\")) {\r\n // Relative URL từ uploads - giữ nguyên vì nó sẽ hoạt động với same-origin\r\n imageUrl = selectedImage\r\n } else if (!imageUrl.startsWith(\"http://\") && !imageUrl.startsWith(\"https://\") && !imageUrl.startsWith(\"data:\")) {\r\n // Nếu không phải absolute URL và không phải data URL, thêm protocol\r\n imageUrl = `https://${imageUrl}`\r\n }\r\n \r\n onClick({ altText: altText || \"\", src: imageUrl })\r\n }\r\n }, [selectedImage, altText, onClick])\r\n\r\n // Listen for double-click confirm event\r\n React.useEffect(() => {\r\n const handleDoubleClickConfirm = () => {\r\n // Use a ref to get the latest selectedImage\r\n setTimeout(() => {\r\n handleConfirm()\r\n }, 50)\r\n }\r\n \r\n document.addEventListener(\"confirm-image-insert\", handleDoubleClickConfirm)\r\n return () => {\r\n document.removeEventListener(\"confirm-image-insert\", handleDoubleClickConfirm)\r\n }\r\n }, [handleConfirm])\r\n\r\n // Auto-expand root folders on mount\r\n React.useEffect(() => {\r\n if (folderTree && folderTree.subfolders.length > 0) {\r\n setOpenFolders(new Set(folderTree.subfolders.map((f) => f.path)))\r\n }\r\n }, [folderTree])\r\n\r\n return (\r\n <div className=\"grid gap-4 py-4\">\r\n <div className=\"grid gap-2\">\r\n <Label>Chọn hình ảnh từ thư viện</Label>\r\n {isLoading ? (\r\n <div className=\"flex items-center justify-center py-8\">\r\n <Loader2 className=\"h-6 w-6 animate-spin text-muted-foreground\" />\r\n </div>\r\n ) : !folderTree || (folderTree.subfolders.length === 0 && folderTree.images.length === 0) ? (\r\n <div className=\"text-center py-8\">\r\n <TypographySpanSmallMuted>Chưa có hình ảnh nào được upload</TypographySpanSmallMuted>\r\n </div>\r\n ) : (\r\n <div className=\"max-h-[350px] overflow-y-auto p-2 border rounded-md\">\r\n {/* Render root level images if any */}\r\n {folderTree.images.length > 0 && (\r\n <div className=\"mb-3\">\r\n <TypographySpanSmallMuted className=\"mb-2 px-1\">Root</TypographySpanSmallMuted>\r\n <div className=\"grid grid-cols-4 gap-2\">\r\n {folderTree.images.map((image) => (\r\n <button\r\n key={image.fileName}\r\n type=\"button\"\r\n onClick={() => handleImageSelect(image.url, image.originalName)}\r\n onDoubleClick={() => {\r\n handleImageSelect(image.url, image.originalName)\r\n setTimeout(() => {\r\n const event = new Event(\"confirm-image-insert\", { bubbles: true })\r\n document.dispatchEvent(event)\r\n }, 100)\r\n }}\r\n className={`relative aspect-square rounded-md overflow-hidden border-2 transition-all cursor-pointer ${\r\n selectedImage === image.url\r\n ? \"border-primary ring-2 ring-primary ring-offset-1\"\r\n : \"border-border hover:border-primary/50\"\r\n }`}\r\n title={`${image.originalName} - Double-click để chèn ngay`}\r\n >\r\n <Image\r\n src={image.url}\r\n alt={image.originalName}\r\n title={image.originalName}\r\n fill\r\n className=\"object-cover article-image article-image-ux-impr article-image-new expandable\"\r\n sizes=\"(max-width: 768px) 25vw, 20vw\"\r\n unoptimized\r\n loading=\"eager\"\r\n />\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n {/* Render folder tree */}\r\n {folderTree.subfolders.map((subfolder) => (\r\n <ImagePickerFolderTree\r\n key={subfolder.path}\r\n folder={subfolder}\r\n level={0}\r\n openFolders={openFolders}\r\n setOpenFolders={setOpenFolders}\r\n selectedImage={selectedImage}\r\n onImageSelect={handleImageSelect}\r\n />\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n {selectedImage && (\r\n <div className=\"grid gap-2\">\r\n <Label htmlFor=\"alt-text-uploads\">Alt Text</Label>\r\n <Input\r\n id=\"alt-text-uploads\"\r\n placeholder=\"Mô tả hình ảnh\"\r\n onChange={(e) => setAltText(e.target.value)}\r\n value={altText}\r\n data-test-id=\"image-modal-uploads-alt-text-input\"\r\n />\r\n </div>\r\n )}\r\n <DialogFooter>\r\n <Button\r\n type=\"submit\"\r\n disabled={isDisabled}\r\n onClick={handleConfirm}\r\n data-test-id=\"image-modal-uploads-confirm-btn\"\r\n >\r\n Chèn hình ảnh\r\n </Button>\r\n </DialogFooter>\r\n </div>\r\n )\r\n}\r\n\r\nexport function InsertImageDialog({\r\n activeEditor,\r\n onClose,\r\n onInsert,\r\n activeTab = \"uploads\",\r\n}: {\r\n activeEditor: LexicalEditor\r\n onClose: () => void\r\n onInsert?: (payload: InsertImagePayload, close: () => void) => void\r\n activeTab?: string\r\n}): JSX.Element {\r\n const hasModifier = useRef(false)\r\n\r\n useEffect(() => {\r\n hasModifier.current = false\r\n const handler = (e: KeyboardEvent) => {\r\n hasModifier.current = e.altKey\r\n }\r\n document.addEventListener(\"keydown\", handler)\r\n return () => {\r\n document.removeEventListener(\"keydown\", handler)\r\n }\r\n }, [activeEditor])\r\n\r\n const onClick = (payload: InsertImagePayload) => {\r\n if (onInsert) {\r\n onInsert(payload, onClose)\r\n return\r\n }\r\n activeEditor.dispatchCommand(INSERT_IMAGE_COMMAND, payload)\r\n onClose()\r\n }\r\n\r\n return (\r\n <Tabs defaultValue={activeTab}>\r\n <TabsList className=\"w-full\">\r\n <TabsTrigger value=\"uploads\" className=\"w-full\">\r\n Thư viện\r\n </TabsTrigger>\r\n <TabsTrigger value=\"url\" className=\"w-full\">\r\n URL\r\n </TabsTrigger>\r\n <TabsTrigger value=\"file\" className=\"w-full\">\r\n File\r\n </TabsTrigger>\r\n </TabsList>\r\n <TabsContent value=\"uploads\">\r\n <InsertImageUploadsDialogBody onClick={onClick} />\r\n </TabsContent>\r\n <TabsContent value=\"url\">\r\n <InsertImageUriDialogBody onClick={onClick} />\r\n </TabsContent>\r\n <TabsContent value=\"file\">\r\n <InsertImageUploadedDialogBody onClick={onClick} />\r\n </TabsContent>\r\n </Tabs>\r\n )\r\n}\r\n\r\nexport function ImagesPlugin({\r\n captionsEnabled,\r\n}: {\r\n captionsEnabled?: boolean\r\n}): JSX.Element | null {\r\n const [editor] = useLexicalComposerContext()\r\n\r\n useEffect(() => {\r\n if (!editor.hasNodes([ImageNode])) {\r\n throw new Error(\"ImagesPlugin: ImageNode not registered on editor\")\r\n }\r\n\r\n return mergeRegister(\r\n editor.registerCommand<InsertImagePayload>(\r\n INSERT_IMAGE_COMMAND,\r\n (payload) => {\r\n const imageNode = $createImageNode(payload)\r\n $insertNodes([imageNode])\r\n if ($isRootOrShadowRoot(imageNode.getParentOrThrow())) {\r\n $wrapNodeInElement(imageNode, $createParagraphNode).selectEnd()\r\n }\r\n\r\n return true\r\n },\r\n COMMAND_PRIORITY_EDITOR\r\n ),\r\n editor.registerCommand<DragEvent>(\r\n DRAGSTART_COMMAND,\r\n (event) => {\r\n return $onDragStart(event)\r\n },\r\n COMMAND_PRIORITY_HIGH\r\n ),\r\n editor.registerCommand<DragEvent>(\r\n DRAGOVER_COMMAND,\r\n (event) => {\r\n return $onDragover(event)\r\n },\r\n COMMAND_PRIORITY_LOW\r\n ),\r\n editor.registerCommand<DragEvent>(\r\n DROP_COMMAND,\r\n (event) => {\r\n return $onDrop(event, editor)\r\n },\r\n COMMAND_PRIORITY_HIGH\r\n )\r\n )\r\n }, [captionsEnabled, editor])\r\n\r\n return null\r\n}\r\n\r\nfunction $onDragStart(event: DragEvent): boolean {\r\n const node = $getImageNodeInSelection()\r\n if (!node) {\r\n return false\r\n }\r\n const dataTransfer = event.dataTransfer\r\n if (!dataTransfer) {\r\n return false\r\n }\r\n const TRANSPARENT_IMAGE =\r\n \"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\"\r\n const img = document.createElement(\"img\")\r\n img.src = TRANSPARENT_IMAGE\r\n dataTransfer.setData(\"text/plain\", \"_\")\r\n dataTransfer.setDragImage(img, 0, 0)\r\n dataTransfer.setData(\r\n \"application/x-lexical-drag\",\r\n JSON.stringify({\r\n data: {\r\n altText: node.__altText,\r\n caption: node.__caption,\r\n height: node.__height,\r\n key: node.getKey(),\r\n maxWidth: node.__maxWidth,\r\n showCaption: node.__showCaption,\r\n src: node.__src,\r\n width: node.__width,\r\n },\r\n type: \"image\",\r\n })\r\n )\r\n\r\n return true\r\n}\r\n\r\nfunction $onDragover(event: DragEvent): boolean {\r\n const node = $getImageNodeInSelection()\r\n if (!node) {\r\n return false\r\n }\r\n if (!canDropImage(event)) {\r\n event.preventDefault()\r\n }\r\n return true\r\n}\r\n\r\nfunction $onDrop(event: DragEvent, editor: LexicalEditor): boolean {\r\n const node = $getImageNodeInSelection()\r\n if (!node) {\r\n return false\r\n }\r\n const data = getDragImageData(event)\r\n if (!data) {\r\n return false\r\n }\r\n event.preventDefault()\r\n if (canDropImage(event)) {\r\n const range = getDragSelection(event)\r\n node.remove()\r\n const rangeSelection = $createRangeSelection()\r\n if (range !== null && range !== undefined) {\r\n rangeSelection.applyDOMRange(range)\r\n }\r\n $setSelection(rangeSelection)\r\n editor.dispatchCommand(INSERT_IMAGE_COMMAND, data)\r\n }\r\n return true\r\n}\r\n\r\nfunction $getImageNodeInSelection(): ImageNode | null {\r\n const selection = $getSelection()\r\n if (!$isNodeSelection(selection)) {\r\n return null\r\n }\r\n const nodes = selection.getNodes()\r\n const node = nodes[0]\r\n return $isImageNode(node) ? node : null\r\n}\r\n\r\nfunction getDragImageData(event: DragEvent): null | InsertImagePayload {\r\n const dragData = event.dataTransfer?.getData(\"application/x-lexical-drag\")\r\n if (!dragData) {\r\n return null\r\n }\r\n const { type, data } = JSON.parse(dragData)\r\n if (type !== \"image\") {\r\n return null\r\n }\r\n\r\n return data\r\n}\r\n\r\ndeclare global {\r\n interface DragEvent {\r\n rangeOffset?: number\r\n rangeParent?: Node\r\n }\r\n}\r\n\r\nfunction canDropImage(event: DragEvent): boolean {\r\n const target = event.target\r\n return !!(\r\n target &&\r\n target instanceof HTMLElement &&\r\n !target.closest(\"code, span.editor-image\") &&\r\n target.parentElement &&\r\n target.parentElement.closest(\"div.ContentEditable__root\")\r\n )\r\n}\r\n\r\nfunction getDragSelection(event: DragEvent): Range | null | undefined {\r\n let range\r\n const target = event.target as null | Element | Document\r\n const targetWindow =\r\n target == null\r\n ? null\r\n : target.nodeType === 9\r\n ? (target as Document).defaultView\r\n : (target as Element).ownerDocument.defaultView\r\n const domSelection = getDOMSelection(targetWindow)\r\n if (document.caretRangeFromPoint) {\r\n range = document.caretRangeFromPoint(event.clientX, event.clientY)\r\n } else if (event.rangeParent && domSelection !== null) {\r\n domSelection.collapse(event.rangeParent, event.rangeOffset || 0)\r\n range = domSelection.getRangeAt(0)\r\n } else {\r\n throw Error(`Cannot get the selection when dragging`)\r\n }\r\n\r\n return range\r\n}\r\n","\"use client\"\r\n\r\nimport { createContext, useContext } from \"react\"\r\n\r\nexport const PriorityImageContext = createContext<string | null>(null)\r\n\r\nexport const usePriorityImage = () => useContext(PriorityImageContext)\r\n","import { useState, useEffect } from \"react\"\r\nimport { LexicalEditor } from \"lexical\"\r\nimport { \r\n getContainerWidth, \r\n getImageAspectRatio \r\n} from \"../image-sizing\"\r\n\r\nexport type DimensionValue = \"inherit\" | number\r\n\r\nexport const imageCache = new Map<string, { width: number; height: number; ratio: number }>()\r\nexport const DEFAULT_ASPECT_RATIO = 16 / 9\r\nexport const DEFAULT_WIDTH = 800\r\nexport const DEFAULT_HEIGHT = Math.round(DEFAULT_WIDTH / DEFAULT_ASPECT_RATIO)\r\nexport const DEFAULT_DIMENSIONS = { width: DEFAULT_WIDTH, height: DEFAULT_HEIGHT, ratio: DEFAULT_ASPECT_RATIO }\r\n\r\ninterface UseResponsiveImageDimensionsProps {\r\n editor: LexicalEditor\r\n height: DimensionValue\r\n imageRef: { current: null | HTMLImageElement }\r\n width: DimensionValue\r\n isResizing: boolean\r\n fullWidth?: boolean\r\n maxWidthLimit?: number\r\n src: string\r\n}\r\n\r\n/**\r\n * Custom hook to handle responsive image dimensions.\r\n * Calculates width and height based on container width and image aspect ratio.\r\n */\r\nexport function useResponsiveImageDimensions({\r\n editor,\r\n height,\r\n imageRef,\r\n width,\r\n isResizing,\r\n fullWidth,\r\n maxWidthLimit,\r\n src,\r\n}: UseResponsiveImageDimensionsProps) {\r\n const [dimensions, setDimensions] = useState<{\r\n width: DimensionValue\r\n height: DimensionValue\r\n }>({\r\n width,\r\n height,\r\n })\r\n\r\n useEffect(() => {\r\n if (isResizing) {\r\n return\r\n }\r\n\r\n let cancelScheduledUpdate: null | (() => void) = null\r\n const cleanupTasks: Array<() => void> = []\r\n\r\n const scheduleDimensionsUpdate = (next: {\r\n width: DimensionValue\r\n height: DimensionValue\r\n }) => {\r\n if (cancelScheduledUpdate) {\r\n cancelScheduledUpdate()\r\n }\r\n\r\n const applyNext = () => {\r\n cancelScheduledUpdate = null\r\n setDimensions((prev) => {\r\n if (prev.width === next.width && prev.height === next.height) {\r\n return prev\r\n }\r\n return next\r\n })\r\n }\r\n\r\n if (\r\n typeof window !== \"undefined\" &&\r\n typeof window.requestAnimationFrame === \"function\"\r\n ) {\r\n const frameId = window.requestAnimationFrame(applyNext)\r\n cancelScheduledUpdate = () => window.cancelAnimationFrame(frameId)\r\n } else {\r\n const timeoutId = setTimeout(applyNext)\r\n cancelScheduledUpdate = () => clearTimeout(timeoutId)\r\n }\r\n }\r\n\r\n const editorRoot = editor.getRootElement()\r\n const image = imageRef.current\r\n\r\n if (!image) {\r\n scheduleDimensionsUpdate({ width, height })\r\n return () => {\r\n cancelScheduledUpdate?.()\r\n }\r\n }\r\n\r\n if (typeof width === \"number\" && typeof height === \"number\") {\r\n scheduleDimensionsUpdate({ width, height })\r\n return () => {\r\n cancelScheduledUpdate?.()\r\n }\r\n }\r\n\r\n const updateDimensions = () => {\r\n const containerWidth = getContainerWidth(\r\n image,\r\n editorRoot,\r\n maxWidthLimit\r\n )\r\n\r\n if (!containerWidth) {\r\n scheduleDimensionsUpdate({ width, height })\r\n return\r\n }\r\n\r\n const cached = imageCache.get(src)\r\n const baseWidth =\r\n typeof width === \"number\"\r\n ? width\r\n : image.naturalWidth || cached?.width || image.getBoundingClientRect().width || containerWidth\r\n\r\n let baseHeight: DimensionValue\r\n if (typeof height === \"number\") {\r\n baseHeight = height\r\n } else if (image.naturalHeight > 0) {\r\n baseHeight = image.naturalHeight\r\n } else if (cached?.height) {\r\n baseHeight = cached.height\r\n } else {\r\n const ratio = cached?.ratio || getImageAspectRatio(image) || DEFAULT_ASPECT_RATIO\r\n baseHeight = ratio > 0 ? Math.round(baseWidth / ratio) : \"inherit\"\r\n }\r\n\r\n let nextWidth: DimensionValue = baseWidth\r\n let nextHeight: DimensionValue = baseHeight\r\n\r\n if (fullWidth) {\r\n nextWidth = containerWidth\r\n if (typeof baseHeight === \"number\") {\r\n const ratio =\r\n typeof baseWidth === \"number\" && baseWidth > 0\r\n ? baseWidth / baseHeight\r\n : cached?.ratio || getImageAspectRatio(image) || DEFAULT_ASPECT_RATIO\r\n nextHeight = Math.max(Math.round(containerWidth / ratio), 1)\r\n } else if (baseHeight === \"inherit\") {\r\n const ratio = cached?.ratio || getImageAspectRatio(image) || DEFAULT_ASPECT_RATIO\r\n nextHeight = ratio > 0 ? Math.max(Math.round(containerWidth / ratio), 1) : baseHeight\r\n }\r\n } else if (\r\n width === \"inherit\" &&\r\n typeof baseWidth === \"number\" &&\r\n baseWidth > containerWidth\r\n ) {\r\n const scale = containerWidth / baseWidth\r\n nextWidth = containerWidth\r\n if (typeof baseHeight === \"number\") {\r\n nextHeight = Math.max(Math.round(baseHeight * scale), 1)\r\n } else if (baseHeight === \"inherit\") {\r\n const ratio = cached?.ratio || getImageAspectRatio(image) || DEFAULT_ASPECT_RATIO\r\n nextHeight =\r\n ratio > 0 ? Math.max(Math.round(containerWidth / ratio), 1) : baseHeight\r\n }\r\n }\r\n\r\n scheduleDimensionsUpdate({ width: nextWidth, height: nextHeight })\r\n }\r\n\r\n updateDimensions()\r\n\r\n if (typeof ResizeObserver !== \"undefined\") {\r\n const resizeObserver = new ResizeObserver(updateDimensions)\r\n if (editorRoot) {\r\n resizeObserver.observe(editorRoot)\r\n }\r\n if (image.parentElement) {\r\n resizeObserver.observe(image.parentElement)\r\n }\r\n cleanupTasks.push(() => {\r\n resizeObserver.disconnect()\r\n })\r\n } else if (typeof window !== \"undefined\") {\r\n window.addEventListener(\"resize\", updateDimensions)\r\n cleanupTasks.push(() => {\r\n window.removeEventListener(\"resize\", updateDimensions)\r\n })\r\n }\r\n\r\n return () => {\r\n cancelScheduledUpdate?.()\r\n cleanupTasks.forEach((task) => task())\r\n }\r\n }, [\r\n editor,\r\n height,\r\n imageRef,\r\n isResizing,\r\n width,\r\n fullWidth,\r\n maxWidthLimit,\r\n src,\r\n ])\r\n\r\n return dimensions\r\n}\r\n","import * as React from \"react\"\r\nimport { JSX, useState, useRef, useEffect } from \"react\"\r\nimport Image from \"next/image\"\r\nimport { cn } from \"@/utils\"\r\nimport { \r\n DimensionValue, \r\n imageCache, \r\n DEFAULT_WIDTH, \r\n DEFAULT_HEIGHT, \r\n DEFAULT_DIMENSIONS \r\n} from \"./hooks/use-responsive-image-dimensions\"\r\n\r\ninterface LazyImageProps {\r\n altText: string\r\n className: string | null\r\n height: DimensionValue\r\n imageRef: { current: null | HTMLImageElement }\r\n maxWidth: number\r\n src: string\r\n width: DimensionValue\r\n onError: () => void\r\n fetchPriority?: \"high\" | \"low\" | \"auto\"\r\n}\r\n\r\n/**\r\n * LazyImage - Handles image loading and rendering within the Lexical editor.\r\n * Includes dimensions caching to prevent layout shift.\r\n */\r\nexport function LazyImage({\r\n altText,\r\n className,\r\n imageRef,\r\n src,\r\n width,\r\n height,\r\n maxWidth: _maxWidth,\r\n onError,\r\n fetchPriority = \"auto\",\r\n}: LazyImageProps): JSX.Element {\r\n // Convert DimensionValue to number for width/height attributes\r\n const getNumericValue = (value: DimensionValue): number | undefined => {\r\n if (typeof value === \"number\") return value\r\n if (typeof value === \"string\") {\r\n if (value === \"inherit\") return undefined\r\n const num = parseInt((value as string).replace(\"px\", \"\"), 10)\r\n return isNaN(num) ? undefined : num\r\n }\r\n return undefined\r\n }\r\n \r\n const widthAttr = getNumericValue(width)\r\n const heightAttr = getNumericValue(height)\r\n \r\n const cachedDims = imageCache.get(src)\r\n const [actualDimensions, setActualDimensions] = useState<{ width?: number; height?: number; ratio?: number }>(\r\n cachedDims || DEFAULT_DIMENSIONS\r\n )\r\n \r\n const wrapperRef = useRef<HTMLDivElement>(null)\r\n \r\n useEffect(() => {\r\n if (wrapperRef.current) {\r\n const imgElement = wrapperRef.current.querySelector(\"img\") as HTMLImageElement | null\r\n if (imgElement) {\r\n imageRef.current = imgElement\r\n if ((width === \"inherit\" || height === \"inherit\") && imgElement.complete && imgElement.naturalWidth && imgElement.naturalHeight) {\r\n const ratio = imgElement.naturalWidth / imgElement.naturalHeight\r\n setActualDimensions({\r\n width: imgElement.naturalWidth,\r\n height: imgElement.naturalHeight,\r\n ratio,\r\n })\r\n imageCache.set(src, {\r\n width: imgElement.naturalWidth,\r\n height: imgElement.naturalHeight,\r\n ratio,\r\n })\r\n }\r\n }\r\n }\r\n }, [width, height, imageRef, src])\r\n \r\n const getSizes = (): string => {\r\n if (typeof widthAttr === \"number\" && widthAttr > 0) {\r\n if (widthAttr <= 640) return \"(max-width: 640px) 100vw, (max-width: 1024px) 50vw, 33vw\"\r\n return \"(max-width: 768px) 100vw, (max-width: 1200px) 80vw, 1200px\"\r\n }\r\n return \"(max-width: 768px) 100vw, (max-width: 1200px) 80vw, 1200px\"\r\n }\r\n\r\n const renderWidth = widthAttr || actualDimensions.width || DEFAULT_WIDTH\r\n const renderHeight = heightAttr || actualDimensions.height || DEFAULT_HEIGHT\r\n\r\n const hasExplicitDimensions =\r\n typeof widthAttr === \"number\" && typeof heightAttr === \"number\"\r\n\r\n /* Wrapper luôn width/max-width 100% để bị container giới hạn; ảnh bên trong tự thu nhỏ theo max-width: 100% */\r\n const wrapperStyle: React.CSSProperties = {\r\n display: \"inline-block\",\r\n width: \"100%\",\r\n maxWidth: \"100%\",\r\n }\r\n\r\n const imgStyle: React.CSSProperties =\r\n width === \"inherit\" && height === \"inherit\"\r\n ? { width: \"100%\", height: \"auto\", maxWidth: \"100%\", maxHeight: undefined }\r\n : {\r\n width: \"100%\",\r\n height: \"auto\",\r\n maxWidth: \"100%\",\r\n maxHeight: undefined,\r\n }\r\n\r\n return (\r\n <div\r\n ref={wrapperRef}\r\n style={wrapperStyle}\r\n className={hasExplicitDimensions ? \"editor-image__sized\" : undefined}\r\n >\r\n <Image\r\n className={cn(className, \"article-image article-image-ux-impr article-image-new expandable\")}\r\n src={src}\r\n alt={altText}\r\n title={altText}\r\n width={renderWidth}\r\n height={renderHeight}\r\n sizes={getSizes()}\r\n quality={75}\r\n unoptimized={true}\r\n style={imgStyle}\r\n onError={onError}\r\n draggable={false}\r\n priority={fetchPriority === \"high\"}\r\n loading=\"eager\"\r\n decoding=\"async\"\r\n onLoad={(e) => {\r\n const img = e.currentTarget\r\n if (img) {\r\n imageRef.current = img\r\n const ratio = img.naturalWidth / img.naturalHeight\r\n imageCache.set(src, {\r\n width: img.naturalWidth,\r\n height: img.naturalHeight,\r\n ratio,\r\n })\r\n if (width === \"inherit\" || height === \"inherit\") {\r\n setActualDimensions({\r\n width: img.naturalWidth,\r\n height: img.naturalHeight,\r\n })\r\n }\r\n }\r\n }}\r\n />\r\n </div>\r\n )\r\n}\r\n","import * as React from \"react\"\r\nimport { JSX } from \"react\"\r\nimport Image from \"next/image\"\r\n\r\n/**\r\n * BrokenImage - Fallback component for when an image fails to load.\r\n */\r\nexport function BrokenImage(): JSX.Element {\r\n const transparentPixel = \"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1' height='1'%3E%3C/svg%3E\"\r\n \r\n return (\r\n <div style={{ display: \"inline-block\", width: 200, height: 200 }}>\r\n <Image\r\n src={transparentPixel}\r\n alt=\"Broken image\"\r\n width={200}\r\n height={200}\r\n style={{\r\n opacity: 0.2,\r\n objectFit: \"contain\",\r\n }}\r\n draggable={false}\r\n unoptimized\r\n />\r\n </div>\r\n )\r\n}\r\n","import * as React from \"react\"\r\nimport { JSX } from \"react\"\r\nimport { DimensionValue } from \"./hooks/use-responsive-image-dimensions\"\r\n\r\ninterface ImagePlaceholderProps {\r\n width: DimensionValue\r\n height: DimensionValue\r\n}\r\n\r\n/**\r\n * ImagePlaceholder - Rendered while an image is loading or when dimensions are being calculated.\r\n */\r\nexport function ImagePlaceholder({\r\n width,\r\n height,\r\n}: ImagePlaceholderProps): JSX.Element {\r\n const MAX_CONTAINER_WIDTH = 800\r\n const MAX_CONTAINER_HEIGHT = 600\r\n \r\n const getNumeric = (val: DimensionValue, max: number) => {\r\n if (typeof val === \"number\") return val\r\n return max\r\n }\r\n\r\n const pWidth = getNumeric(width, MAX_CONTAINER_WIDTH)\r\n const pHeight = getNumeric(height, MAX_CONTAINER_HEIGHT)\r\n\r\n return (\r\n <div\r\n className=\"article-image-placeholder animate-pulse bg-muted flex items-center justify-center rounded-lg\"\r\n style={{\r\n width: width === \"inherit\" ? \"100%\" : pWidth,\r\n height: height === \"inherit\" ? \"auto\" : pHeight,\r\n aspectRatio: width === \"inherit\" || height === \"inherit\" ? \"16/9\" : undefined,\r\n maxWidth: \"100%\",\r\n }}\r\n >\r\n <div className=\"flex flex-col items-center gap-2 text-muted-foreground\">\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"40\"\r\n height=\"40\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" ry=\"2\" />\r\n <circle cx=\"9\" cy=\"9\" r=\"2\" />\r\n <path d=\"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21\" />\r\n </svg>\r\n </div>\r\n </div>\r\n )\r\n}\r\n","import { JSX } from \"react\"\r\nimport { ContentEditable as LexicalContentEditable } from \"@lexical/react/LexicalContentEditable\"\r\nimport { cn } from \"@/utils\"\r\n\r\ntype Props = {\r\n placeholder: string\r\n className?: string\r\n placeholderClassName?: string\r\n placeholderDefaults?: boolean // apply default positioning/padding for placeholder\r\n}\r\n\r\nexport function ContentEditable({\r\n placeholder,\r\n className,\r\n placeholderClassName,\r\n placeholderDefaults = true,\r\n}: Props): JSX.Element {\r\n return (\r\n <LexicalContentEditable\r\n className={cn(\"ContentEditable__root relative block min-h-72 px-8 py-4 focus:outline-none\", className)}\r\n aria-placeholder={placeholder}\r\n aria-label={placeholder || \"Editor nội dung\"}\r\n placeholder={\r\n <div\r\n className={cn(\r\n placeholderClassName,\r\n \"text-muted-foreground pointer-events-none select-none\",\r\n placeholderDefaults &&\r\n \"absolute top-0 left-0 overflow-hidden px-8 py-[18px] text-ellipsis\"\r\n )}\r\n >\r\n {placeholder}\r\n </div>\r\n }\r\n />\r\n )\r\n}\r\n","import * as React from \"react\"\r\nimport { LexicalEditor } from \"lexical\"\r\nimport { LexicalNestedComposer } from \"@lexical/react/LexicalNestedComposer\"\r\nimport { AutoFocusPlugin } from \"@lexical/react/LexicalAutoFocusPlugin\"\r\nimport { HistoryPlugin } from \"@lexical/react/LexicalHistoryPlugin\"\r\nimport { RichTextPlugin } from \"@lexical/react/LexicalRichTextPlugin\"\r\nimport { LexicalErrorBoundary } from \"@lexical/react/LexicalErrorBoundary\"\r\nimport { ContentEditable } from \"./content-editable\"\r\n\r\ninterface CaptionComposerProps {\r\n caption: LexicalEditor\r\n isEditable: boolean\r\n}\r\n\r\n/**\r\n * CaptionComposer - A nested editor for image captions.\r\n */\r\nexport function CaptionComposer({\r\n caption,\r\n isEditable,\r\n}: CaptionComposerProps) {\r\n return (\r\n <LexicalNestedComposer initialEditor={caption}>\r\n <AutoFocusPlugin />\r\n <HistoryPlugin />\r\n <RichTextPlugin\r\n contentEditable={\r\n <div className=\"relative\">\r\n <ContentEditable\r\n className={`ImageNode__contentEditable relative block min-h-5 w-full resize-none border-0 bg-transparent px-2.5 py-2 text-sm whitespace-pre-wrap outline-none word-break-break-word ${\r\n isEditable\r\n ? \"box-border cursor-text caret-primary user-select-text\"\r\n : \"cursor-default select-text\"\r\n }`}\r\n placeholder={isEditable ? \"Enter a caption...\" : \"\"}\r\n placeholderDefaults={false}\r\n placeholderClassName=\"ImageNode__placeholder absolute top-0 left-0 overflow-hidden px-2.5 py-2 text-ellipsis text-sm\"\r\n />\r\n </div>\r\n }\r\n ErrorBoundary={LexicalErrorBoundary}\r\n />\r\n </LexicalNestedComposer>\r\n )\r\n}\r\n","import { useState, useEffect, useRef, useCallback } from \"react\"\r\nimport { LexicalEditor, NodeKey, $getNodeByKey, $getRoot } from \"lexical\"\r\nimport { $isImageNode } from \"../../nodes/image-node\"\r\n\r\ninterface UseImageCaptionControlsProps {\r\n caption: LexicalEditor\r\n editor: LexicalEditor\r\n nodeKey: NodeKey\r\n showCaption: boolean\r\n}\r\n\r\ntype TimeoutHandle = ReturnType<typeof setTimeout>\r\n\r\n/**\r\n * Custom hook to handle image caption logic.\r\n * Manages caption visibility and content synchronization.\r\n */\r\nexport function useImageCaptionControls({\r\n caption,\r\n editor,\r\n nodeKey,\r\n showCaption,\r\n}: UseImageCaptionControlsProps) {\r\n const [hasCaptionContent, setHasCaptionContent] = useState(false)\r\n const [localShowCaption, setLocalShowCaption] = useState(showCaption)\r\n const isUpdatingCaptionRef = useRef(false)\r\n const lastShowCaptionRef = useRef(showCaption)\r\n\r\n useEffect(() => {\r\n let timeout: TimeoutHandle | null = null\r\n timeout = setTimeout(() => {\r\n if (!showCaption) {\r\n setHasCaptionContent(false)\r\n setLocalShowCaption(false)\r\n } else if (\r\n !isUpdatingCaptionRef.current &&\r\n lastShowCaptionRef.current !== showCaption\r\n ) {\r\n setLocalShowCaption(showCaption)\r\n lastShowCaptionRef.current = showCaption\r\n }\r\n isUpdatingCaptionRef.current = false\r\n }, 0)\r\n\r\n return () => {\r\n if (timeout) {\r\n clearTimeout(timeout)\r\n }\r\n }\r\n }, [showCaption])\r\n\r\n const setShowCaption = useCallback(\r\n (show: boolean) => {\r\n isUpdatingCaptionRef.current = true\r\n lastShowCaptionRef.current = show\r\n\r\n setLocalShowCaption(show)\r\n\r\n if (!show) {\r\n setHasCaptionContent(false)\r\n }\r\n\r\n editor.update(() => {\r\n const node = $getNodeByKey(nodeKey)\r\n if ($isImageNode(node)) {\r\n node.setShowCaption(show)\r\n\r\n if (!show) {\r\n caption.update(() => {\r\n const root = $getRoot()\r\n root.clear()\r\n })\r\n }\r\n }\r\n })\r\n },\r\n [caption, editor, nodeKey]\r\n )\r\n\r\n useEffect(() => {\r\n const computeHasContent = () => {\r\n const state = caption.getEditorState()\r\n const hasContent = state.read(() => {\r\n const root = $getRoot()\r\n const raw = root.getTextContent()\r\n const text = raw.replace(/[\\u200B\\u00A0\\s]+/g, \"\")\r\n return text.length > 0\r\n })\r\n setHasCaptionContent(showCaption && hasContent)\r\n }\r\n\r\n const timer = setTimeout(() => {\r\n computeHasContent()\r\n }, 0)\r\n\r\n const unregister = caption.registerUpdateListener(() => {\r\n computeHasContent()\r\n editor.update(() => {\r\n const node = $getNodeByKey(nodeKey)\r\n if ($isImageNode(node)) {\r\n node.setShowCaption(showCaption)\r\n }\r\n })\r\n })\r\n\r\n return () => {\r\n clearTimeout(timer)\r\n unregister()\r\n }\r\n }, [caption, editor, nodeKey, showCaption])\r\n\r\n return {\r\n hasCaptionContent,\r\n localShowCaption,\r\n setShowCaption,\r\n }\r\n}\r\n","import { useState, useEffect, useRef, useCallback } from \"react\"\r\nimport { \r\n LexicalEditor, \r\n NodeKey, \r\n BaseSelection, \r\n $getSelection, \r\n $isNodeSelection, \r\n $setSelection,\r\n SELECTION_CHANGE_COMMAND,\r\n CLICK_COMMAND,\r\n DRAGSTART_COMMAND,\r\n KEY_DELETE_COMMAND,\r\n KEY_BACKSPACE_COMMAND,\r\n KEY_ENTER_COMMAND,\r\n KEY_ESCAPE_COMMAND,\r\n COMMAND_PRIORITY_LOW,\r\n createCommand,\r\n LexicalCommand,\r\n $isRangeSelection\r\n} from \"lexical\"\r\nimport { useLexicalNodeSelection } from \"@lexical/react/useLexicalNodeSelection\"\r\nimport { mergeRegister } from \"@lexical/utils\"\r\nimport { $isImageNode } from \"../../nodes/image-node\"\r\n\r\nexport const RIGHT_CLICK_IMAGE_COMMAND: LexicalCommand<MouseEvent> = createCommand(\"RIGHT_CLICK_IMAGE_COMMAND\")\r\n\r\ninterface UseImageNodeInteractionsProps {\r\n buttonRef: React.MutableRefObject<HTMLButtonElement | null>\r\n caption: LexicalEditor\r\n editor: LexicalEditor\r\n imageRef: React.MutableRefObject<HTMLImageElement | null>\r\n isResizing: boolean\r\n nodeKey: NodeKey\r\n showCaption: boolean\r\n}\r\n\r\n/**\r\n * Custom hook to handle interactions with the image node.\r\n * Handles selection, deletion, keyboard navigation, and context menu.\r\n */\r\nexport function useImageNodeInteractions({\r\n buttonRef,\r\n caption,\r\n editor,\r\n imageRef,\r\n isResizing,\r\n nodeKey,\r\n showCaption,\r\n}: UseImageNodeInteractionsProps) {\r\n const [selection, setSelection] = useState<BaseSelection | null>(null)\r\n const [isSelected, setSelected, clearSelection] = useLexicalNodeSelection(nodeKey)\r\n const activeEditorRef = useRef<LexicalEditor | null>(null)\r\n\r\n const $onDelete = useCallback(\r\n (payload: KeyboardEvent) => {\r\n const deleteSelection = $getSelection()\r\n if (isSelected && $isNodeSelection(deleteSelection)) {\r\n const event: KeyboardEvent = payload\r\n event.preventDefault()\r\n editor.update(() => {\r\n deleteSelection.getNodes().forEach((node) => {\r\n if ($isImageNode(node)) {\r\n node.remove()\r\n }\r\n })\r\n })\r\n }\r\n return false\r\n },\r\n [editor, isSelected]\r\n )\r\n\r\n const $onEnter = useCallback(\r\n (event: KeyboardEvent) => {\r\n const latestSelection = $getSelection()\r\n const buttonElem = buttonRef.current\r\n if (\r\n isSelected &&\r\n $isNodeSelection(latestSelection) &&\r\n latestSelection.getNodes().length === 1\r\n ) {\r\n if (showCaption) {\r\n $setSelection(null)\r\n event.preventDefault()\r\n caption.focus()\r\n return true\r\n } else if (\r\n buttonElem !== null &&\r\n buttonElem !== document.activeElement\r\n ) {\r\n event.preventDefault()\r\n buttonElem.focus()\r\n return true\r\n }\r\n }\r\n return false\r\n },\r\n [buttonRef, caption, isSelected, showCaption]\r\n )\r\n\r\n const $onEscape = useCallback(\r\n (event: KeyboardEvent) => {\r\n if (\r\n activeEditorRef.current === caption ||\r\n buttonRef.current === event.target\r\n ) {\r\n $setSelection(null)\r\n editor.update(() => {\r\n setSelected(true)\r\n const parentRootElement = editor.getRootElement()\r\n if (parentRootElement !== null) {\r\n parentRootElement.focus()\r\n }\r\n })\r\n return true\r\n }\r\n return false\r\n },\r\n [buttonRef, caption, editor, setSelected]\r\n )\r\n\r\n const onClick = useCallback(\r\n (payload: MouseEvent) => {\r\n const event = payload\r\n\r\n if (isResizing) {\r\n return true\r\n }\r\n if (event.target === imageRef.current) {\r\n if (event.shiftKey) {\r\n setSelected(!isSelected)\r\n } else {\r\n clearSelection()\r\n setSelected(true)\r\n }\r\n return true\r\n }\r\n\r\n return false\r\n },\r\n [clearSelection, imageRef, isResizing, isSelected, setSelected]\r\n )\r\n\r\n const onRightClick = useCallback(\r\n (event: MouseEvent): void => {\r\n editor.getEditorState().read(() => {\r\n const latestSelection = $getSelection()\r\n const domElement = event.target as HTMLElement\r\n if (\r\n domElement.tagName === \"IMG\" &&\r\n $isRangeSelection(latestSelection) &&\r\n latestSelection.getNodes().length === 1\r\n ) {\r\n editor.dispatchCommand(\r\n RIGHT_CLICK_IMAGE_COMMAND,\r\n event as MouseEvent\r\n )\r\n }\r\n })\r\n },\r\n [editor]\r\n )\r\n\r\n useEffect(() => {\r\n let isMounted = true\r\n const rootElement = editor.getRootElement()\r\n const unregister = mergeRegister(\r\n editor.registerUpdateListener(({ editorState }) => {\r\n if (isMounted) {\r\n setSelection(editorState.read(() => $getSelection()))\r\n }\r\n }),\r\n editor.registerCommand(\r\n SELECTION_CHANGE_COMMAND,\r\n (_, activeEditor) => {\r\n activeEditorRef.current = activeEditor\r\n return false\r\n },\r\n COMMAND_PRIORITY_LOW\r\n ),\r\n editor.registerCommand<MouseEvent>(\r\n CLICK_COMMAND,\r\n onClick,\r\n COMMAND_PRIORITY_LOW\r\n ),\r\n editor.registerCommand<MouseEvent>(\r\n RIGHT_CLICK_IMAGE_COMMAND,\r\n onClick,\r\n COMMAND_PRIORITY_LOW\r\n ),\r\n editor.registerCommand(\r\n DRAGSTART_COMMAND,\r\n (event) => {\r\n if (event.target === imageRef.current) {\r\n event.preventDefault()\r\n return true\r\n }\r\n return false\r\n },\r\n COMMAND_PRIORITY_LOW\r\n ),\r\n editor.registerCommand(\r\n KEY_DELETE_COMMAND,\r\n $onDelete,\r\n COMMAND_PRIORITY_LOW\r\n ),\r\n editor.registerCommand(\r\n KEY_BACKSPACE_COMMAND,\r\n $onDelete,\r\n COMMAND_PRIORITY_LOW\r\n ),\r\n editor.registerCommand(KEY_ENTER_COMMAND, $onEnter, COMMAND_PRIORITY_LOW),\r\n editor.registerCommand(\r\n KEY_ESCAPE_COMMAND,\r\n $onEscape,\r\n COMMAND_PRIORITY_LOW\r\n )\r\n )\r\n\r\n rootElement?.addEventListener(\"contextmenu\", onRightClick)\r\n\r\n return () => {\r\n isMounted = false\r\n unregister()\r\n rootElement?.removeEventListener(\"contextmenu\", onRightClick)\r\n }\r\n }, [\r\n clearSelection,\r\n editor,\r\n imageRef,\r\n isResizing,\r\n isSelected,\r\n nodeKey,\r\n $onDelete,\r\n $onEnter,\r\n $onEscape,\r\n onClick,\r\n onRightClick,\r\n setSelected,\r\n ])\r\n\r\n return { isSelected, selection, setSelected, clearSelection }\r\n}\r\n","import * as React from \"react\"\r\nimport {\r\n JSX,\r\n Suspense,\r\n useCallback,\r\n useEffect,\r\n useRef,\r\n useState,\r\n} from \"react\"\r\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\"\r\nimport { useLexicalEditable } from \"@lexical/react/useLexicalEditable\"\r\nimport { $isNodeSelection, $getNodeByKey, NodeKey, LexicalEditor } from \"lexical\"\r\n\r\nimport { ImageResizer } from \"@/components/editor/editor-ui/image-resizer\"\r\nimport { $isImageNode } from \"@/components/editor/nodes/image-node\"\r\nimport { cn } from \"@/utils\"\r\nimport { useEditorContainer } from \"@/components/editor/context/editor-container-context\"\r\nimport {\r\n Dialog,\r\n DialogContent,\r\n DialogFooter,\r\n DialogHeader,\r\n DialogTitle,\r\n} from \"@/components/ui/dialog\"\r\nimport { Button } from \"@/components/ui/button\"\r\nimport { ExternalLink } from \"lucide-react\"\r\nimport {\r\n InsertImageDialog,\r\n InsertImagePayload,\r\n} from \"@/components/editor/plugins/images-plugin\"\r\nimport { usePriorityImage } from \"@/components/editor/context/priority-image-context\"\r\n\r\n// Sub-components\r\nimport { LazyImage } from \"./lazy-image\"\r\nimport { BrokenImage } from \"./broken-image\"\r\nimport { ImagePlaceholder } from \"./image-placeholder\"\r\nimport { CaptionComposer } from \"./caption-composer\"\r\n\r\n// Hooks\r\nimport { useResponsiveImageDimensions, DimensionValue } from \"./hooks/use-responsive-image-dimensions\"\r\nimport { useImageCaptionControls } from \"./hooks/use-image-caption-controls\"\r\nimport { useImageNodeInteractions } from \"./hooks/use-image-node-interactions\"\r\n\r\nconst RESIZE_HANDLE_HIDE_DELAY = 200\r\n\r\ninterface ImageComponentProps {\r\n altText: string\r\n caption: LexicalEditor\r\n captionsEnabled: boolean\r\n fullWidth: boolean\r\n height: DimensionValue\r\n maxWidth: number\r\n nodeKey: NodeKey\r\n resizable: boolean\r\n showCaption: boolean\r\n src: string\r\n width: DimensionValue\r\n}\r\n\r\n/**\r\n * ImageComponent - The main component for image nodes in the Lexical editor.\r\n * Orchestrates image rendering, resizing, captions, and interactions.\r\n */\r\nexport default function ImageComponent({\r\n altText,\r\n caption,\r\n captionsEnabled,\r\n fullWidth,\r\n height,\r\n maxWidth,\r\n nodeKey,\r\n resizable,\r\n showCaption,\r\n src,\r\n width,\r\n}: ImageComponentProps): JSX.Element {\r\n const imageRef = useRef<null | HTMLImageElement>(null)\r\n const buttonRef = useRef<HTMLButtonElement | null>(null)\r\n const [isResizing, setIsResizing] = useState<boolean>(false)\r\n const resizeTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null)\r\n const [editor] = useLexicalComposerContext()\r\n const [isLoadError, setIsLoadError] = useState<boolean>(false)\r\n const [isReplaceDialogOpen, setIsReplaceDialogOpen] = useState(false)\r\n const [isViewOriginalOpen, setIsViewOriginalOpen] = useState(false)\r\n const isEditable = useLexicalEditable()\r\n const editorContainer = useEditorContainer()\r\n \r\n const prioritySrc = usePriorityImage()\r\n const isPriority = src === prioritySrc\r\n \r\n // Custom hooks for logic separation\r\n const {\r\n hasCaptionContent,\r\n localShowCaption,\r\n setShowCaption,\r\n } = useImageCaptionControls({\r\n caption,\r\n editor,\r\n nodeKey,\r\n showCaption,\r\n })\r\n\r\n const responsiveDimensions = useResponsiveImageDimensions({\r\n editor,\r\n imageRef,\r\n width,\r\n height,\r\n isResizing,\r\n fullWidth,\r\n maxWidthLimit: editorContainer?.maxWidth,\r\n src,\r\n })\r\n\r\n const { isSelected, selection } = useImageNodeInteractions({\r\n buttonRef,\r\n caption,\r\n editor,\r\n imageRef,\r\n isResizing,\r\n nodeKey,\r\n showCaption,\r\n })\r\n\r\n useEffect(() => {\r\n if (!isEditable && isReplaceDialogOpen) {\r\n setTimeout(() => {\r\n setIsReplaceDialogOpen(false)\r\n }, 0)\r\n }\r\n }, [isEditable, isReplaceDialogOpen])\r\n\r\n useEffect(() => {\r\n return () => {\r\n if (resizeTimeoutRef.current) {\r\n clearTimeout(resizeTimeoutRef.current)\r\n }\r\n }\r\n }, [])\r\n\r\n const onResizeEnd = useCallback(\r\n (nextWidth: DimensionValue, nextHeight: DimensionValue) => {\r\n if (resizeTimeoutRef.current) {\r\n clearTimeout(resizeTimeoutRef.current)\r\n }\r\n resizeTimeoutRef.current = setTimeout(() => {\r\n setIsResizing(false)\r\n }, RESIZE_HANDLE_HIDE_DELAY)\r\n\r\n editor.update(() => {\r\n const node = $getNodeByKey(nodeKey)\r\n if ($isImageNode(node)) {\r\n node.setWidthAndHeight(nextWidth, nextHeight)\r\n }\r\n })\r\n },\r\n [editor, nodeKey]\r\n )\r\n\r\n const onResizeStart = useCallback(() => {\r\n setIsResizing(true)\r\n editor.update(() => {\r\n const node = $getNodeByKey(nodeKey)\r\n if ($isImageNode(node)) {\r\n node.setFullWidth(false)\r\n }\r\n })\r\n }, [editor, nodeKey])\r\n\r\n const handleReplaceImage = useCallback(\r\n (payload: InsertImagePayload) => {\r\n if (!payload?.src) {\r\n return\r\n }\r\n editor.update(() => {\r\n const node = $getNodeByKey(nodeKey)\r\n if ($isImageNode(node)) {\r\n node.setSrc(payload.src)\r\n if (payload.altText !== undefined) {\r\n node.setAltText(payload.altText)\r\n }\r\n node.setWidthAndHeight(\"inherit\", \"inherit\")\r\n }\r\n })\r\n },\r\n [editor, nodeKey]\r\n )\r\n\r\n const draggable = isSelected && $isNodeSelection(selection) && !isResizing\r\n const isFocused = (isSelected || isResizing) && isEditable\r\n const shouldRenderCaption =\r\n showCaption &&\r\n (isEditable\r\n ? localShowCaption && captionsEnabled\r\n : hasCaptionContent)\r\n\r\n const imageClassName = cn(\r\n \"article-image article-image-ux-impr article-image-new expandable cursor-default\",\r\n isFocused && \"focused ring-primary ring-2 ring-offset-2\",\r\n isFocused &&\r\n $isNodeSelection(selection) &&\r\n \"draggable cursor-grab active:cursor-grabbing\"\r\n )\r\n\r\n const captionWrapperClass = cn(\r\n \"image-caption-container mt-2 block min-w-[100px] overflow-hidden p-0\",\r\n isEditable ? \"border-1 rounded-md bg-white/90\" : \"border-0 bg-transparent\"\r\n )\r\n\r\n const handleViewOriginal = useCallback((e: React.MouseEvent) => {\r\n if (isEditable) return\r\n e.preventDefault()\r\n e.stopPropagation()\r\n setIsViewOriginalOpen(true)\r\n }, [isEditable])\r\n\r\n const imageWrapper = (\r\n <div draggable={draggable}>\r\n {isLoadError ? (\r\n <BrokenImage />\r\n ) : (\r\n <LazyImage\r\n className={imageClassName}\r\n src={src}\r\n altText={altText}\r\n imageRef={imageRef}\r\n width={responsiveDimensions.width}\r\n height={responsiveDimensions.height}\r\n maxWidth={maxWidth}\r\n onError={() => setIsLoadError(true)}\r\n fetchPriority={isPriority ? \"high\" : \"auto\"}\r\n />\r\n )}\r\n </div>\r\n )\r\n\r\n return (\r\n <Suspense\r\n fallback={\r\n <div draggable={draggable}>\r\n <ImagePlaceholder\r\n width={responsiveDimensions.width}\r\n height={responsiveDimensions.height}\r\n />\r\n </div>\r\n }\r\n >\r\n <>\r\n {!isEditable ? (\r\n <button\r\n type=\"button\"\r\n onClick={handleViewOriginal}\r\n className=\"cursor-pointer border-0 bg-transparent p-0 text-left outline-none [&>div]:outline-none\"\r\n aria-label=\"Xem hình gốc\"\r\n >\r\n {imageWrapper}\r\n </button>\r\n ) : (\r\n imageWrapper\r\n )}\r\n\r\n {shouldRenderCaption && (\r\n <div className={captionWrapperClass}>\r\n <CaptionComposer caption={caption} isEditable={isEditable} />\r\n </div>\r\n )}\r\n\r\n {resizable && isFocused && (\r\n <ImageResizer\r\n buttonRef={buttonRef}\r\n showCaption={showCaption}\r\n setShowCaption={setShowCaption}\r\n editor={editor}\r\n mediaRef={imageRef}\r\n maxWidth={maxWidth}\r\n onResizeStart={onResizeStart}\r\n onResizeEnd={onResizeEnd}\r\n captionsEnabled={captionsEnabled}\r\n onReplaceMedia={() => setIsReplaceDialogOpen(true)}\r\n />\r\n )}\r\n\r\n {isEditable && isReplaceDialogOpen && (\r\n <Dialog\r\n open={isReplaceDialogOpen}\r\n onOpenChange={setIsReplaceDialogOpen}\r\n >\r\n <DialogContent className=\"sm:max-w-[800px]\">\r\n <DialogHeader>\r\n <DialogTitle>Thay thế hình ảnh</DialogTitle>\r\n </DialogHeader>\r\n <InsertImageDialog\r\n activeEditor={editor}\r\n activeTab=\"url\"\r\n onClose={() => setIsReplaceDialogOpen(false)}\r\n onInsert={(payload) => {\r\n handleReplaceImage(payload)\r\n setIsReplaceDialogOpen(false)\r\n }}\r\n />\r\n </DialogContent>\r\n </Dialog>\r\n )}\r\n\r\n {!isEditable && (\r\n <Dialog open={isViewOriginalOpen} onOpenChange={setIsViewOriginalOpen}>\r\n <DialogContent\r\n size=\"full\"\r\n overlayClassName=\"bg-black/80\"\r\n className=\"max-w-[96vw] max-h-[96vh] w-[96vw] h-[96vh] overflow-hidden flex flex-col p-0 gap-0 rounded-xl border shadow-2xl\"\r\n aria-describedby=\"view-original-image-desc\"\r\n >\r\n <DialogHeader className=\"shrink-0 px-6 pt-5 pb-2 border-b bg-muted/30\">\r\n <DialogTitle className=\"text-base font-semibold\">\r\n Xem hình gốc\r\n </DialogTitle>\r\n </DialogHeader>\r\n <div\r\n id=\"view-original-image-desc\"\r\n className=\"flex-1 min-h-[70vh] overflow-auto flex items-center justify-center p-4 bg-black/20\"\r\n >\r\n {/* eslint-disable-next-line @next/next/no-img-element -- URL động (blob/API), hiển thị ảnh gốc */}\r\n <img\r\n src={src}\r\n alt={altText || \"Hình gốc\"}\r\n className=\"flex-1 min-w-0 min-h-0 w-full h-full max-w-full max-h-full object-contain rounded-lg\"\r\n />\r\n </div>\r\n <DialogFooter className=\"shrink-0 flex-row justify-center gap-2 px-6 py-4 border-t bg-muted/20 rounded-b-xl\">\r\n <Button\r\n variant=\"outline\"\r\n size=\"default\"\r\n asChild\r\n className=\"gap-2 text-base\"\r\n >\r\n <a\r\n href={src}\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n >\r\n <ExternalLink className=\"size-4 shrink-0\" aria-hidden />\r\n Mở ảnh gốc trong tab mới\r\n </a>\r\n </Button>\r\n </DialogFooter>\r\n </DialogContent>\r\n </Dialog>\r\n )}\r\n </>\r\n </Suspense>\r\n )\r\n}\r\n","import * as React from \"react\"\r\nimport { JSX, Suspense } from \"react\"\r\nimport type {\r\n DOMConversionMap,\r\n DOMConversionOutput,\r\n DOMExportOutput,\r\n EditorConfig,\r\n EditorState,\r\n LexicalEditor,\r\n LexicalNode,\r\n NodeKey,\r\n SerializedEditor,\r\n SerializedLexicalNode,\r\n Spread,\r\n} from \"lexical\"\r\nimport {\r\n $applyNodeReplacement,\r\n $getRoot,\r\n createEditor,\r\n DecoratorNode,\r\n ParagraphNode,\r\n RootNode,\r\n TextNode,\r\n} from \"lexical\"\r\n\r\nconst ImageComponent = React.lazy(() => import(\"../editor-ui/image-component\"))\r\n\r\nconst WHITESPACE_REGEX = /[\\u200B\\u00A0\\s]+/g\r\n\r\nexport interface ImagePayload {\r\n altText: string\r\n caption?: LexicalEditor\r\n height?: number\r\n key?: NodeKey\r\n maxWidth?: number\r\n showCaption?: boolean\r\n src: string\r\n width?: number\r\n captionsEnabled?: boolean\r\n fullWidth?: boolean\r\n}\r\n\r\nfunction editorStateHasContent(editorState: EditorState): boolean {\r\n return editorState.read(() => {\r\n const root = $getRoot()\r\n const text = root.getTextContent().replace(WHITESPACE_REGEX, \"\")\r\n return text.length > 0\r\n })\r\n}\r\n\r\nfunction captionHasContent(editor: LexicalEditor): boolean {\r\n return editorStateHasContent(editor.getEditorState())\r\n}\r\n\r\nfunction clearCaption(editor: LexicalEditor): void {\r\n editor.update(() => {\r\n const root = $getRoot()\r\n root.clear()\r\n })\r\n}\r\n\r\nfunction isGoogleDocCheckboxImg(img: HTMLImageElement): boolean {\r\n return (\r\n img.parentElement != null &&\r\n img.parentElement.tagName === \"LI\" &&\r\n img.previousSibling === null &&\r\n img.getAttribute(\"aria-roledescription\") === \"checkbox\"\r\n )\r\n}\r\n\r\nfunction $convertImageElement(domNode: Node): null | DOMConversionOutput {\r\n const img = domNode as HTMLImageElement\r\n if (img.src.startsWith(\"file:///\") || isGoogleDocCheckboxImg(img)) {\r\n return null\r\n }\r\n const { alt: altText, src, width, height } = img\r\n const node = $createImageNode({ altText, height, src, width })\r\n return { node }\r\n}\r\n\r\nexport type SerializedImageNode = Spread<\r\n {\r\n altText: string\r\n caption: SerializedEditor\r\n height?: number\r\n maxWidth: number\r\n showCaption: boolean\r\n src: string\r\n width?: number\r\n fullWidth?: boolean\r\n },\r\n SerializedLexicalNode\r\n>\r\n\r\nexport class ImageNode extends DecoratorNode<JSX.Element> {\r\n __src: string\r\n __altText: string\r\n __width: \"inherit\" | number\r\n __height: \"inherit\" | number\r\n __maxWidth: number\r\n __showCaption: boolean\r\n __caption: LexicalEditor\r\n // Captions cannot yet be used within editor cells\r\n __captionsEnabled: boolean\r\n __fullWidth: boolean\r\n\r\n static getType(): string {\r\n return \"image\"\r\n }\r\n\r\n static clone(node: ImageNode): ImageNode {\r\n return new ImageNode(\r\n node.__src,\r\n node.__altText,\r\n node.__maxWidth,\r\n node.__width,\r\n node.__height,\r\n node.__showCaption,\r\n node.__caption,\r\n node.__captionsEnabled,\r\n node.__fullWidth,\r\n node.__key\r\n )\r\n }\r\n\r\n static importJSON(serializedNode: SerializedImageNode): ImageNode {\r\n const { altText, height, width, maxWidth, caption, src, showCaption, fullWidth } =\r\n serializedNode\r\n\r\n const node = $createImageNode({\r\n altText,\r\n height,\r\n maxWidth,\r\n showCaption: showCaption === true,\r\n src,\r\n width,\r\n fullWidth,\r\n })\r\n\r\n if (showCaption === true && caption?.editorState) {\r\n const parsedState = node.__caption.parseEditorState(caption.editorState)\r\n\r\n if (editorStateHasContent(parsedState)) {\r\n node.__caption.setEditorState(parsedState)\r\n return node\r\n }\r\n }\r\n\r\n node.__showCaption = false\r\n clearCaption(node.__caption)\r\n return node\r\n }\r\n\r\n exportDOM(): DOMExportOutput {\r\n const element = document.createElement(\"img\")\r\n element.setAttribute(\"src\", this.__src)\r\n element.setAttribute(\"alt\", this.__altText)\r\n if (typeof this.__width === \"number\") {\r\n element.setAttribute(\"width\", this.__width.toString())\r\n }\r\n if (typeof this.__height === \"number\") {\r\n element.setAttribute(\"height\", this.__height.toString())\r\n }\r\n return { element }\r\n }\r\n\r\n static importDOM(): DOMConversionMap | null {\r\n return {\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n img: (node: Node) => ({\r\n conversion: $convertImageElement,\r\n priority: 0,\r\n }),\r\n }\r\n }\r\n\r\n constructor(\r\n src: string,\r\n altText: string,\r\n maxWidth: number,\r\n width?: \"inherit\" | number,\r\n height?: \"inherit\" | number,\r\n showCaption?: boolean,\r\n caption?: LexicalEditor,\r\n captionsEnabled?: boolean,\r\n fullWidth?: boolean,\r\n key?: NodeKey\r\n ) {\r\n super(key)\r\n this.__src = src\r\n this.__altText = altText\r\n this.__maxWidth = maxWidth\r\n this.__width = width || \"inherit\"\r\n this.__height = height || \"inherit\"\r\n this.__showCaption = showCaption || false\r\n this.__caption =\r\n caption ||\r\n createEditor({\r\n namespace: \"ImageCaption\",\r\n nodes: [RootNode, TextNode, ParagraphNode],\r\n })\r\n this.__captionsEnabled = captionsEnabled || captionsEnabled === undefined\r\n // Default image to full width if not specified for consistency with YouTube\r\n this.__fullWidth = fullWidth === undefined ? true : !!fullWidth\r\n }\r\n\r\n exportJSON(): SerializedImageNode {\r\n return {\r\n altText: this.getAltText(),\r\n caption: this.__caption.toJSON(),\r\n height: this.__height === \"inherit\" ? 0 : this.__height,\r\n maxWidth: this.__maxWidth,\r\n showCaption: this.__showCaption && captionHasContent(this.__caption),\r\n src: this.getSrc(),\r\n type: \"image\",\r\n version: 1,\r\n width: this.__width === \"inherit\" ? 0 : this.__width,\r\n fullWidth: this.__fullWidth || undefined,\r\n }\r\n }\r\n\r\n setWidthAndHeight(\r\n width: \"inherit\" | number,\r\n height: \"inherit\" | number\r\n ): void {\r\n const writable = this.getWritable()\r\n writable.__width = width\r\n writable.__height = height\r\n }\r\n\r\n setSrc(src: string): void {\r\n const writable = this.getWritable()\r\n writable.__src = src\r\n }\r\n\r\n setAltText(altText: string): void {\r\n const writable = this.getWritable()\r\n writable.__altText = altText\r\n }\r\n\r\n setShowCaption(showCaption: boolean): void {\r\n const writable = this.getWritable()\r\n writable.__showCaption = showCaption\r\n }\r\n\r\n setFullWidth(fullWidth: boolean): void {\r\n const writable = this.getWritable()\r\n writable.__fullWidth = fullWidth\r\n }\r\n\r\n // View\r\n\r\n createDOM(config: EditorConfig): HTMLElement {\r\n const span = document.createElement(\"span\")\r\n const theme = config.theme\r\n const className = theme.image\r\n if (className !== undefined) {\r\n span.className = className\r\n }\r\n return span\r\n }\r\n\r\n updateDOM(): false {\r\n return false\r\n }\r\n\r\n getSrc(): string {\r\n return this.__src\r\n }\r\n\r\n getAltText(): string {\r\n return this.__altText\r\n }\r\n\r\n decorate(): JSX.Element {\r\n return (\r\n <Suspense fallback={null}>\r\n <ImageComponent\r\n src={this.__src}\r\n altText={this.__altText}\r\n width={this.__width}\r\n height={this.__height}\r\n maxWidth={this.__maxWidth}\r\n nodeKey={this.getKey()}\r\n showCaption={this.__showCaption}\r\n caption={this.__caption}\r\n captionsEnabled={this.__captionsEnabled}\r\n fullWidth={this.__fullWidth}\r\n resizable={true}\r\n />\r\n </Suspense>\r\n )\r\n }\r\n}\r\n\r\nexport function $createImageNode({\r\n altText,\r\n height,\r\n maxWidth = 500,\r\n captionsEnabled,\r\n src,\r\n width,\r\n showCaption,\r\n caption,\r\n fullWidth,\r\n key,\r\n}: ImagePayload): ImageNode {\r\n return $applyNodeReplacement(\r\n new ImageNode(\r\n src,\r\n altText,\r\n maxWidth,\r\n width,\r\n height,\r\n showCaption,\r\n caption,\r\n captionsEnabled,\r\n fullWidth,\r\n key\r\n )\r\n )\r\n}\r\n\r\nexport function $isImageNode(\r\n node: LexicalNode | null | undefined\r\n): node is ImageNode {\r\n return node instanceof ImageNode\r\n}\r\n","const emojiList = [\r\n {\r\n description: \"grinning face\",\r\n emoji: \"😀\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"grinning\"],\r\n tags: [\"smile\", \"happy\"],\r\n unicode_version: \"6.1\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"😃\",\r\n description: \"grinning face with big eyes\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"smiley\"],\r\n tags: [\"happy\", \"joy\", \"haha\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"😄\",\r\n description: \"grinning face with smiling eyes\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"smile\"],\r\n tags: [\"happy\", \"joy\", \"laugh\", \"pleased\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"😁\",\r\n description: \"beaming face with smiling eyes\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"grin\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"😆\",\r\n description: \"grinning squinting face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"laughing\", \"satisfied\"],\r\n tags: [\"happy\", \"haha\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"😅\",\r\n description: \"grinning face with sweat\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"sweat_smile\"],\r\n tags: [\"hot\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🤣\",\r\n description: \"rolling on the floor laughing\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"rofl\"],\r\n tags: [\"lol\", \"laughing\"],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n },\r\n {\r\n emoji: \"😂\",\r\n description: \"face with tears of joy\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"joy\"],\r\n tags: [\"tears\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🙂\",\r\n description: \"slightly smiling face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"slightly_smiling_face\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🙃\",\r\n description: \"upside-down face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"upside_down_face\"],\r\n tags: [],\r\n unicode_version: \"8.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"😉\",\r\n description: \"winking face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"wink\"],\r\n tags: [\"flirt\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"😊\",\r\n description: \"smiling face with smiling eyes\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"blush\"],\r\n tags: [\"proud\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"😇\",\r\n description: \"smiling face with halo\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"innocent\"],\r\n tags: [\"angel\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🥰\",\r\n description: \"smiling face with hearts\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"smiling_face_with_three_hearts\"],\r\n tags: [\"love\"],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"😍\",\r\n description: \"smiling face with heart-eyes\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"heart_eyes\"],\r\n tags: [\"love\", \"crush\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🤩\",\r\n description: \"star-struck\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"star_struck\"],\r\n tags: [\"eyes\"],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"😘\",\r\n description: \"face blowing a kiss\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"kissing_heart\"],\r\n tags: [\"flirt\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"😗\",\r\n description: \"kissing face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"kissing\"],\r\n tags: [],\r\n unicode_version: \"6.1\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"☺️\",\r\n description: \"smiling face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"relaxed\"],\r\n tags: [\"blush\", \"pleased\"],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"😚\",\r\n description: \"kissing face with closed eyes\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"kissing_closed_eyes\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"😙\",\r\n description: \"kissing face with smiling eyes\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"kissing_smiling_eyes\"],\r\n tags: [],\r\n unicode_version: \"6.1\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🥲\",\r\n description: \"smiling face with tear\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"smiling_face_with_tear\"],\r\n tags: [],\r\n unicode_version: \"13.0\",\r\n ios_version: \"14.0\",\r\n },\r\n {\r\n emoji: \"😋\",\r\n description: \"face savoring food\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"yum\"],\r\n tags: [\"tongue\", \"lick\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"😛\",\r\n description: \"face with tongue\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"stuck_out_tongue\"],\r\n tags: [],\r\n unicode_version: \"6.1\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"😜\",\r\n description: \"winking face with tongue\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"stuck_out_tongue_winking_eye\"],\r\n tags: [\"prank\", \"silly\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🤪\",\r\n description: \"zany face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"zany_face\"],\r\n tags: [\"goofy\", \"wacky\"],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"😝\",\r\n description: \"squinting face with tongue\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"stuck_out_tongue_closed_eyes\"],\r\n tags: [\"prank\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🤑\",\r\n description: \"money-mouth face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"money_mouth_face\"],\r\n tags: [\"rich\"],\r\n unicode_version: \"8.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🤗\",\r\n description: \"hugging face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"hugs\"],\r\n tags: [],\r\n unicode_version: \"8.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🤭\",\r\n description: \"face with hand over mouth\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"hand_over_mouth\"],\r\n tags: [\"quiet\", \"whoops\"],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🤫\",\r\n description: \"shushing face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"shushing_face\"],\r\n tags: [\"silence\", \"quiet\"],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🤔\",\r\n description: \"thinking face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"thinking\"],\r\n tags: [],\r\n unicode_version: \"8.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🤐\",\r\n description: \"zipper-mouth face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"zipper_mouth_face\"],\r\n tags: [\"silence\", \"hush\"],\r\n unicode_version: \"8.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🤨\",\r\n description: \"face with raised eyebrow\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"raised_eyebrow\"],\r\n tags: [\"suspicious\"],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"😐\",\r\n description: \"neutral face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"neutral_face\"],\r\n tags: [\"meh\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"😑\",\r\n description: \"expressionless face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"expressionless\"],\r\n tags: [],\r\n unicode_version: \"6.1\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"😶\",\r\n description: \"face without mouth\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"no_mouth\"],\r\n tags: [\"mute\", \"silence\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"😶‍🌫️\",\r\n description: \"face in clouds\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"face_in_clouds\"],\r\n tags: [],\r\n unicode_version: \"13.1\",\r\n ios_version: \"14.0\",\r\n },\r\n {\r\n emoji: \"😏\",\r\n description: \"smirking face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"smirk\"],\r\n tags: [\"smug\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"😒\",\r\n description: \"unamused face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"unamused\"],\r\n tags: [\"meh\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🙄\",\r\n description: \"face with rolling eyes\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"roll_eyes\"],\r\n tags: [],\r\n unicode_version: \"8.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"😬\",\r\n description: \"grimacing face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"grimacing\"],\r\n tags: [],\r\n unicode_version: \"6.1\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"😮‍💨\",\r\n description: \"face exhaling\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"face_exhaling\"],\r\n tags: [],\r\n unicode_version: \"13.1\",\r\n ios_version: \"14.0\",\r\n },\r\n {\r\n emoji: \"🤥\",\r\n description: \"lying face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"lying_face\"],\r\n tags: [\"liar\"],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n },\r\n {\r\n emoji: \"😌\",\r\n description: \"relieved face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"relieved\"],\r\n tags: [\"whew\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"😔\",\r\n description: \"pensive face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"pensive\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"😪\",\r\n description: \"sleepy face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"sleepy\"],\r\n tags: [\"tired\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🤤\",\r\n description: \"drooling face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"drooling_face\"],\r\n tags: [],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n },\r\n {\r\n emoji: \"😴\",\r\n description: \"sleeping face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"sleeping\"],\r\n tags: [\"zzz\"],\r\n unicode_version: \"6.1\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"😷\",\r\n description: \"face with medical mask\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"mask\"],\r\n tags: [\"sick\", \"ill\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🤒\",\r\n description: \"face with thermometer\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"face_with_thermometer\"],\r\n tags: [\"sick\"],\r\n unicode_version: \"8.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🤕\",\r\n description: \"face with head-bandage\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"face_with_head_bandage\"],\r\n tags: [\"hurt\"],\r\n unicode_version: \"8.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🤢\",\r\n description: \"nauseated face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"nauseated_face\"],\r\n tags: [\"sick\", \"barf\", \"disgusted\"],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n },\r\n {\r\n emoji: \"🤮\",\r\n description: \"face vomiting\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"vomiting_face\"],\r\n tags: [\"barf\", \"sick\"],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🤧\",\r\n description: \"sneezing face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"sneezing_face\"],\r\n tags: [\"achoo\", \"sick\"],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n },\r\n {\r\n emoji: \"🥵\",\r\n description: \"hot face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"hot_face\"],\r\n tags: [\"heat\", \"sweating\"],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🥶\",\r\n description: \"cold face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"cold_face\"],\r\n tags: [\"freezing\", \"ice\"],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🥴\",\r\n description: \"woozy face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"woozy_face\"],\r\n tags: [\"groggy\"],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"😵\",\r\n description: \"knocked-out face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"dizzy_face\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"😵‍💫\",\r\n description: \"face with spiral eyes\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"face_with_spiral_eyes\"],\r\n tags: [],\r\n unicode_version: \"13.1\",\r\n ios_version: \"14.0\",\r\n },\r\n {\r\n emoji: \"🤯\",\r\n description: \"exploding head\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"exploding_head\"],\r\n tags: [\"mind\", \"blown\"],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🤠\",\r\n description: \"cowboy hat face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"cowboy_hat_face\"],\r\n tags: [],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n },\r\n {\r\n emoji: \"🥳\",\r\n description: \"partying face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"partying_face\"],\r\n tags: [\"celebration\", \"birthday\"],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🥸\",\r\n description: \"disguised face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"disguised_face\"],\r\n tags: [],\r\n unicode_version: \"13.0\",\r\n ios_version: \"14.0\",\r\n },\r\n {\r\n emoji: \"😎\",\r\n description: \"smiling face with sunglasses\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"sunglasses\"],\r\n tags: [\"cool\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🤓\",\r\n description: \"nerd face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"nerd_face\"],\r\n tags: [\"geek\", \"glasses\"],\r\n unicode_version: \"8.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🧐\",\r\n description: \"face with monocle\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"monocle_face\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"😕\",\r\n description: \"confused face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"confused\"],\r\n tags: [],\r\n unicode_version: \"6.1\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"😟\",\r\n description: \"worried face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"worried\"],\r\n tags: [\"nervous\"],\r\n unicode_version: \"6.1\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🙁\",\r\n description: \"slightly frowning face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"slightly_frowning_face\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"☹️\",\r\n description: \"frowning face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"frowning_face\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"😮\",\r\n description: \"face with open mouth\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"open_mouth\"],\r\n tags: [\"surprise\", \"impressed\", \"wow\"],\r\n unicode_version: \"6.1\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"😯\",\r\n description: \"hushed face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"hushed\"],\r\n tags: [\"silence\", \"speechless\"],\r\n unicode_version: \"6.1\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"😲\",\r\n description: \"astonished face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"astonished\"],\r\n tags: [\"amazed\", \"gasp\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"😳\",\r\n description: \"flushed face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"flushed\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🥺\",\r\n description: \"pleading face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"pleading_face\"],\r\n tags: [\"puppy\", \"eyes\"],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"😦\",\r\n description: \"frowning face with open mouth\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"frowning\"],\r\n tags: [],\r\n unicode_version: \"6.1\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"😧\",\r\n description: \"anguished face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"anguished\"],\r\n tags: [\"stunned\"],\r\n unicode_version: \"6.1\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"😨\",\r\n description: \"fearful face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"fearful\"],\r\n tags: [\"scared\", \"shocked\", \"oops\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"😰\",\r\n description: \"anxious face with sweat\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"cold_sweat\"],\r\n tags: [\"nervous\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"😥\",\r\n description: \"sad but relieved face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"disappointed_relieved\"],\r\n tags: [\"phew\", \"sweat\", \"nervous\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"😢\",\r\n description: \"crying face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"cry\"],\r\n tags: [\"sad\", \"tear\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"😭\",\r\n description: \"loudly crying face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"sob\"],\r\n tags: [\"sad\", \"cry\", \"bawling\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"😱\",\r\n description: \"face screaming in fear\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"scream\"],\r\n tags: [\"horror\", \"shocked\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"😖\",\r\n description: \"confounded face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"confounded\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"😣\",\r\n description: \"persevering face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"persevere\"],\r\n tags: [\"struggling\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"😞\",\r\n description: \"disappointed face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"disappointed\"],\r\n tags: [\"sad\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"😓\",\r\n description: \"downcast face with sweat\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"sweat\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"😩\",\r\n description: \"weary face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"weary\"],\r\n tags: [\"tired\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"😫\",\r\n description: \"tired face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"tired_face\"],\r\n tags: [\"upset\", \"whine\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🥱\",\r\n description: \"yawning face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"yawning_face\"],\r\n tags: [],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n },\r\n {\r\n emoji: \"😤\",\r\n description: \"face with steam from nose\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"triumph\"],\r\n tags: [\"smug\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"😡\",\r\n description: \"pouting face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"rage\", \"pout\"],\r\n tags: [\"angry\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"😠\",\r\n description: \"angry face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"angry\"],\r\n tags: [\"mad\", \"annoyed\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🤬\",\r\n description: \"face with symbols on mouth\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"cursing_face\"],\r\n tags: [\"foul\"],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"😈\",\r\n description: \"smiling face with horns\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"smiling_imp\"],\r\n tags: [\"devil\", \"evil\", \"horns\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"👿\",\r\n description: \"angry face with horns\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"imp\"],\r\n tags: [\"angry\", \"devil\", \"evil\", \"horns\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"💀\",\r\n description: \"skull\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"skull\"],\r\n tags: [\"dead\", \"danger\", \"poison\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"☠️\",\r\n description: \"skull and crossbones\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"skull_and_crossbones\"],\r\n tags: [\"danger\", \"pirate\"],\r\n unicode_version: \"\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"💩\",\r\n description: \"pile of poo\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"hankey\", \"poop\", \"shit\"],\r\n tags: [\"crap\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🤡\",\r\n description: \"clown face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"clown_face\"],\r\n tags: [],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n },\r\n {\r\n emoji: \"👹\",\r\n description: \"ogre\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"japanese_ogre\"],\r\n tags: [\"monster\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"👺\",\r\n description: \"goblin\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"japanese_goblin\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"👻\",\r\n description: \"ghost\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"ghost\"],\r\n tags: [\"halloween\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"👽\",\r\n description: \"alien\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"alien\"],\r\n tags: [\"ufo\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"👾\",\r\n description: \"alien monster\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"space_invader\"],\r\n tags: [\"game\", \"retro\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🤖\",\r\n description: \"robot\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"robot\"],\r\n tags: [],\r\n unicode_version: \"8.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"😺\",\r\n description: \"grinning cat\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"smiley_cat\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"😸\",\r\n description: \"grinning cat with smiling eyes\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"smile_cat\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"😹\",\r\n description: \"cat with tears of joy\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"joy_cat\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"😻\",\r\n description: \"smiling cat with heart-eyes\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"heart_eyes_cat\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"😼\",\r\n description: \"cat with wry smile\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"smirk_cat\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"😽\",\r\n description: \"kissing cat\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"kissing_cat\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🙀\",\r\n description: \"weary cat\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"scream_cat\"],\r\n tags: [\"horror\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"😿\",\r\n description: \"crying cat\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"crying_cat_face\"],\r\n tags: [\"sad\", \"tear\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"😾\",\r\n description: \"pouting cat\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"pouting_cat\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🙈\",\r\n description: \"see-no-evil monkey\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"see_no_evil\"],\r\n tags: [\"monkey\", \"blind\", \"ignore\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🙉\",\r\n description: \"hear-no-evil monkey\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"hear_no_evil\"],\r\n tags: [\"monkey\", \"deaf\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🙊\",\r\n description: \"speak-no-evil monkey\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"speak_no_evil\"],\r\n tags: [\"monkey\", \"mute\", \"hush\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"💋\",\r\n description: \"kiss mark\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"kiss\"],\r\n tags: [\"lipstick\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"💌\",\r\n description: \"love letter\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"love_letter\"],\r\n tags: [\"email\", \"envelope\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"💘\",\r\n description: \"heart with arrow\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"cupid\"],\r\n tags: [\"love\", \"heart\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"💝\",\r\n description: \"heart with ribbon\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"gift_heart\"],\r\n tags: [\"chocolates\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"💖\",\r\n description: \"sparkling heart\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"sparkling_heart\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"💗\",\r\n description: \"growing heart\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"heartpulse\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"💓\",\r\n description: \"beating heart\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"heartbeat\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"💞\",\r\n description: \"revolving hearts\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"revolving_hearts\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"💕\",\r\n description: \"two hearts\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"two_hearts\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"💟\",\r\n description: \"heart decoration\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"heart_decoration\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"❣️\",\r\n description: \"heart exclamation\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"heavy_heart_exclamation\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"💔\",\r\n description: \"broken heart\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"broken_heart\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"❤️‍🔥\",\r\n description: \"heart on fire\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"heart_on_fire\"],\r\n tags: [],\r\n unicode_version: \"13.1\",\r\n ios_version: \"14.0\",\r\n },\r\n {\r\n emoji: \"❤️‍🩹\",\r\n description: \"mending heart\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"mending_heart\"],\r\n tags: [],\r\n unicode_version: \"13.1\",\r\n ios_version: \"14.0\",\r\n },\r\n {\r\n emoji: \"❤️\",\r\n description: \"red heart\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"heart\"],\r\n tags: [\"love\"],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🧡\",\r\n description: \"orange heart\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"orange_heart\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"💛\",\r\n description: \"yellow heart\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"yellow_heart\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"💚\",\r\n description: \"green heart\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"green_heart\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"💙\",\r\n description: \"blue heart\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"blue_heart\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"💜\",\r\n description: \"purple heart\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"purple_heart\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🤎\",\r\n description: \"brown heart\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"brown_heart\"],\r\n tags: [],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n },\r\n {\r\n emoji: \"🖤\",\r\n description: \"black heart\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"black_heart\"],\r\n tags: [],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n },\r\n {\r\n emoji: \"🤍\",\r\n description: \"white heart\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"white_heart\"],\r\n tags: [],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n },\r\n {\r\n emoji: \"💯\",\r\n description: \"hundred points\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"100\"],\r\n tags: [\"score\", \"perfect\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"💢\",\r\n description: \"anger symbol\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"anger\"],\r\n tags: [\"angry\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"💥\",\r\n description: \"collision\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"boom\", \"collision\"],\r\n tags: [\"explode\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"💫\",\r\n description: \"dizzy\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"dizzy\"],\r\n tags: [\"star\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"💦\",\r\n description: \"sweat droplets\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"sweat_drops\"],\r\n tags: [\"water\", \"workout\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"💨\",\r\n description: \"dashing away\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"dash\"],\r\n tags: [\"wind\", \"blow\", \"fast\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🕳️\",\r\n description: \"hole\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"hole\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"💣\",\r\n description: \"bomb\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"bomb\"],\r\n tags: [\"boom\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"💬\",\r\n description: \"speech balloon\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"speech_balloon\"],\r\n tags: [\"comment\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"👁️‍🗨️\",\r\n description: \"eye in speech bubble\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"eye_speech_bubble\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🗨️\",\r\n description: \"left speech bubble\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"left_speech_bubble\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🗯️\",\r\n description: \"right anger bubble\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"right_anger_bubble\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"💭\",\r\n description: \"thought balloon\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"thought_balloon\"],\r\n tags: [\"thinking\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"💤\",\r\n description: \"zzz\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"zzz\"],\r\n tags: [\"sleeping\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"👋\",\r\n description: \"waving hand\",\r\n category: \"People & Body\",\r\n aliases: [\"wave\"],\r\n tags: [\"goodbye\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🤚\",\r\n description: \"raised back of hand\",\r\n category: \"People & Body\",\r\n aliases: [\"raised_back_of_hand\"],\r\n tags: [],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🖐️\",\r\n description: \"hand with fingers splayed\",\r\n category: \"People & Body\",\r\n aliases: [\"raised_hand_with_fingers_splayed\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"✋\",\r\n description: \"raised hand\",\r\n category: \"People & Body\",\r\n aliases: [\"hand\", \"raised_hand\"],\r\n tags: [\"highfive\", \"stop\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🖖\",\r\n description: \"vulcan salute\",\r\n category: \"People & Body\",\r\n aliases: [\"vulcan_salute\"],\r\n tags: [\"prosper\", \"spock\"],\r\n unicode_version: \"7.0\",\r\n ios_version: \"8.3\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👌\",\r\n description: \"OK hand\",\r\n category: \"People & Body\",\r\n aliases: [\"ok_hand\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🤌\",\r\n description: \"pinched fingers\",\r\n category: \"People & Body\",\r\n aliases: [\"pinched_fingers\"],\r\n tags: [],\r\n unicode_version: \"13.0\",\r\n ios_version: \"14.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🤏\",\r\n description: \"pinching hand\",\r\n category: \"People & Body\",\r\n aliases: [\"pinching_hand\"],\r\n tags: [],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"✌️\",\r\n description: \"victory hand\",\r\n category: \"People & Body\",\r\n aliases: [\"v\"],\r\n tags: [\"victory\", \"peace\"],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🤞\",\r\n description: \"crossed fingers\",\r\n category: \"People & Body\",\r\n aliases: [\"crossed_fingers\"],\r\n tags: [\"luck\", \"hopeful\"],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🤟\",\r\n description: \"love-you gesture\",\r\n category: \"People & Body\",\r\n aliases: [\"love_you_gesture\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🤘\",\r\n description: \"sign of the horns\",\r\n category: \"People & Body\",\r\n aliases: [\"metal\"],\r\n tags: [],\r\n unicode_version: \"8.0\",\r\n ios_version: \"9.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🤙\",\r\n description: \"call me hand\",\r\n category: \"People & Body\",\r\n aliases: [\"call_me_hand\"],\r\n tags: [],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👈\",\r\n description: \"backhand index pointing left\",\r\n category: \"People & Body\",\r\n aliases: [\"point_left\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👉\",\r\n description: \"backhand index pointing right\",\r\n category: \"People & Body\",\r\n aliases: [\"point_right\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👆\",\r\n description: \"backhand index pointing up\",\r\n category: \"People & Body\",\r\n aliases: [\"point_up_2\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🖕\",\r\n description: \"middle finger\",\r\n category: \"People & Body\",\r\n aliases: [\"middle_finger\", \"fu\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👇\",\r\n description: \"backhand index pointing down\",\r\n category: \"People & Body\",\r\n aliases: [\"point_down\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"☝️\",\r\n description: \"index pointing up\",\r\n category: \"People & Body\",\r\n aliases: [\"point_up\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👍\",\r\n description: \"thumbs up\",\r\n category: \"People & Body\",\r\n aliases: [\"+1\", \"thumbsup\"],\r\n tags: [\"approve\", \"ok\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👎\",\r\n description: \"thumbs down\",\r\n category: \"People & Body\",\r\n aliases: [\"-1\", \"thumbsdown\"],\r\n tags: [\"disapprove\", \"bury\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"✊\",\r\n description: \"raised fist\",\r\n category: \"People & Body\",\r\n aliases: [\"fist_raised\", \"fist\"],\r\n tags: [\"power\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👊\",\r\n description: \"oncoming fist\",\r\n category: \"People & Body\",\r\n aliases: [\"fist_oncoming\", \"facepunch\", \"punch\"],\r\n tags: [\"attack\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🤛\",\r\n description: \"left-facing fist\",\r\n category: \"People & Body\",\r\n aliases: [\"fist_left\"],\r\n tags: [],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🤜\",\r\n description: \"right-facing fist\",\r\n category: \"People & Body\",\r\n aliases: [\"fist_right\"],\r\n tags: [],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👏\",\r\n description: \"clapping hands\",\r\n category: \"People & Body\",\r\n aliases: [\"clap\"],\r\n tags: [\"praise\", \"applause\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🙌\",\r\n description: \"raising hands\",\r\n category: \"People & Body\",\r\n aliases: [\"raised_hands\"],\r\n tags: [\"hooray\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👐\",\r\n description: \"open hands\",\r\n category: \"People & Body\",\r\n aliases: [\"open_hands\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🤲\",\r\n description: \"palms up together\",\r\n category: \"People & Body\",\r\n aliases: [\"palms_up_together\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🤝\",\r\n description: \"handshake\",\r\n category: \"People & Body\",\r\n aliases: [\"handshake\"],\r\n tags: [\"deal\"],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n },\r\n {\r\n emoji: \"🙏\",\r\n description: \"folded hands\",\r\n category: \"People & Body\",\r\n aliases: [\"pray\"],\r\n tags: [\"please\", \"hope\", \"wish\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"✍️\",\r\n description: \"writing hand\",\r\n category: \"People & Body\",\r\n aliases: [\"writing_hand\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"9.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"💅\",\r\n description: \"nail polish\",\r\n category: \"People & Body\",\r\n aliases: [\"nail_care\"],\r\n tags: [\"beauty\", \"manicure\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🤳\",\r\n description: \"selfie\",\r\n category: \"People & Body\",\r\n aliases: [\"selfie\"],\r\n tags: [],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"💪\",\r\n description: \"flexed biceps\",\r\n category: \"People & Body\",\r\n aliases: [\"muscle\"],\r\n tags: [\"flex\", \"bicep\", \"strong\", \"workout\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🦾\",\r\n description: \"mechanical arm\",\r\n category: \"People & Body\",\r\n aliases: [\"mechanical_arm\"],\r\n tags: [],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n },\r\n {\r\n emoji: \"🦿\",\r\n description: \"mechanical leg\",\r\n category: \"People & Body\",\r\n aliases: [\"mechanical_leg\"],\r\n tags: [],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n },\r\n {\r\n emoji: \"🦵\",\r\n description: \"leg\",\r\n category: \"People & Body\",\r\n aliases: [\"leg\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🦶\",\r\n description: \"foot\",\r\n category: \"People & Body\",\r\n aliases: [\"foot\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👂\",\r\n description: \"ear\",\r\n category: \"People & Body\",\r\n aliases: [\"ear\"],\r\n tags: [\"hear\", \"sound\", \"listen\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🦻\",\r\n description: \"ear with hearing aid\",\r\n category: \"People & Body\",\r\n aliases: [\"ear_with_hearing_aid\"],\r\n tags: [],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👃\",\r\n description: \"nose\",\r\n category: \"People & Body\",\r\n aliases: [\"nose\"],\r\n tags: [\"smell\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🧠\",\r\n description: \"brain\",\r\n category: \"People & Body\",\r\n aliases: [\"brain\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🫀\",\r\n description: \"anatomical heart\",\r\n category: \"People & Body\",\r\n aliases: [\"anatomical_heart\"],\r\n tags: [],\r\n unicode_version: \"13.0\",\r\n ios_version: \"14.0\",\r\n },\r\n {\r\n emoji: \"🫁\",\r\n description: \"lungs\",\r\n category: \"People & Body\",\r\n aliases: [\"lungs\"],\r\n tags: [],\r\n unicode_version: \"13.0\",\r\n ios_version: \"14.0\",\r\n },\r\n {\r\n emoji: \"🦷\",\r\n description: \"tooth\",\r\n category: \"People & Body\",\r\n aliases: [\"tooth\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🦴\",\r\n description: \"bone\",\r\n category: \"People & Body\",\r\n aliases: [\"bone\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"👀\",\r\n description: \"eyes\",\r\n category: \"People & Body\",\r\n aliases: [\"eyes\"],\r\n tags: [\"look\", \"see\", \"watch\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"👁️\",\r\n description: \"eye\",\r\n category: \"People & Body\",\r\n aliases: [\"eye\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"👅\",\r\n description: \"tongue\",\r\n category: \"People & Body\",\r\n aliases: [\"tongue\"],\r\n tags: [\"taste\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"👄\",\r\n description: \"mouth\",\r\n category: \"People & Body\",\r\n aliases: [\"lips\"],\r\n tags: [\"kiss\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"👶\",\r\n description: \"baby\",\r\n category: \"People & Body\",\r\n aliases: [\"baby\"],\r\n tags: [\"child\", \"newborn\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🧒\",\r\n description: \"child\",\r\n category: \"People & Body\",\r\n aliases: [\"child\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👦\",\r\n description: \"boy\",\r\n category: \"People & Body\",\r\n aliases: [\"boy\"],\r\n tags: [\"child\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👧\",\r\n description: \"girl\",\r\n category: \"People & Body\",\r\n aliases: [\"girl\"],\r\n tags: [\"child\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🧑\",\r\n description: \"person\",\r\n category: \"People & Body\",\r\n aliases: [\"adult\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👱\",\r\n description: \"person: blond hair\",\r\n category: \"People & Body\",\r\n aliases: [\"blond_haired_person\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👨\",\r\n description: \"man\",\r\n category: \"People & Body\",\r\n aliases: [\"man\"],\r\n tags: [\"mustache\", \"father\", \"dad\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🧔\",\r\n description: \"person: beard\",\r\n category: \"People & Body\",\r\n aliases: [\"bearded_person\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🧔‍♂️\",\r\n description: \"man: beard\",\r\n category: \"People & Body\",\r\n aliases: [\"man_beard\"],\r\n tags: [],\r\n unicode_version: \"13.1\",\r\n ios_version: \"14.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🧔‍♀️\",\r\n description: \"woman: beard\",\r\n category: \"People & Body\",\r\n aliases: [\"woman_beard\"],\r\n tags: [],\r\n unicode_version: \"13.1\",\r\n ios_version: \"14.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👨‍🦰\",\r\n description: \"man: red hair\",\r\n category: \"People & Body\",\r\n aliases: [\"red_haired_man\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👨‍🦱\",\r\n description: \"man: curly hair\",\r\n category: \"People & Body\",\r\n aliases: [\"curly_haired_man\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👨‍🦳\",\r\n description: \"man: white hair\",\r\n category: \"People & Body\",\r\n aliases: [\"white_haired_man\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👨‍🦲\",\r\n description: \"man: bald\",\r\n category: \"People & Body\",\r\n aliases: [\"bald_man\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👩\",\r\n description: \"woman\",\r\n category: \"People & Body\",\r\n aliases: [\"woman\"],\r\n tags: [\"girls\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👩‍🦰\",\r\n description: \"woman: red hair\",\r\n category: \"People & Body\",\r\n aliases: [\"red_haired_woman\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🧑‍🦰\",\r\n description: \"person: red hair\",\r\n category: \"People & Body\",\r\n aliases: [\"person_red_hair\"],\r\n tags: [],\r\n unicode_version: \"12.1\",\r\n ios_version: \"13.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👩‍🦱\",\r\n description: \"woman: curly hair\",\r\n category: \"People & Body\",\r\n aliases: [\"curly_haired_woman\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🧑‍🦱\",\r\n description: \"person: curly hair\",\r\n category: \"People & Body\",\r\n aliases: [\"person_curly_hair\"],\r\n tags: [],\r\n unicode_version: \"12.1\",\r\n ios_version: \"13.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👩‍🦳\",\r\n description: \"woman: white hair\",\r\n category: \"People & Body\",\r\n aliases: [\"white_haired_woman\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🧑‍🦳\",\r\n description: \"person: white hair\",\r\n category: \"People & Body\",\r\n aliases: [\"person_white_hair\"],\r\n tags: [],\r\n unicode_version: \"12.1\",\r\n ios_version: \"13.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👩‍🦲\",\r\n description: \"woman: bald\",\r\n category: \"People & Body\",\r\n aliases: [\"bald_woman\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🧑‍🦲\",\r\n description: \"person: bald\",\r\n category: \"People & Body\",\r\n aliases: [\"person_bald\"],\r\n tags: [],\r\n unicode_version: \"12.1\",\r\n ios_version: \"13.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👱‍♀️\",\r\n description: \"woman: blond hair\",\r\n category: \"People & Body\",\r\n aliases: [\"blond_haired_woman\", \"blonde_woman\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"10.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👱‍♂️\",\r\n description: \"man: blond hair\",\r\n category: \"People & Body\",\r\n aliases: [\"blond_haired_man\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🧓\",\r\n description: \"older person\",\r\n category: \"People & Body\",\r\n aliases: [\"older_adult\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👴\",\r\n description: \"old man\",\r\n category: \"People & Body\",\r\n aliases: [\"older_man\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👵\",\r\n description: \"old woman\",\r\n category: \"People & Body\",\r\n aliases: [\"older_woman\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🙍\",\r\n description: \"person frowning\",\r\n category: \"People & Body\",\r\n aliases: [\"frowning_person\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🙍‍♂️\",\r\n description: \"man frowning\",\r\n category: \"People & Body\",\r\n aliases: [\"frowning_man\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"10.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🙍‍♀️\",\r\n description: \"woman frowning\",\r\n category: \"People & Body\",\r\n aliases: [\"frowning_woman\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🙎\",\r\n description: \"person pouting\",\r\n category: \"People & Body\",\r\n aliases: [\"pouting_face\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🙎‍♂️\",\r\n description: \"man pouting\",\r\n category: \"People & Body\",\r\n aliases: [\"pouting_man\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"10.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🙎‍♀️\",\r\n description: \"woman pouting\",\r\n category: \"People & Body\",\r\n aliases: [\"pouting_woman\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🙅\",\r\n description: \"person gesturing NO\",\r\n category: \"People & Body\",\r\n aliases: [\"no_good\"],\r\n tags: [\"stop\", \"halt\", \"denied\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🙅‍♂️\",\r\n description: \"man gesturing NO\",\r\n category: \"People & Body\",\r\n aliases: [\"no_good_man\", \"ng_man\"],\r\n tags: [\"stop\", \"halt\", \"denied\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"10.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🙅‍♀️\",\r\n description: \"woman gesturing NO\",\r\n category: \"People & Body\",\r\n aliases: [\"no_good_woman\", \"ng_woman\"],\r\n tags: [\"stop\", \"halt\", \"denied\"],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🙆\",\r\n description: \"person gesturing OK\",\r\n category: \"People & Body\",\r\n aliases: [\"ok_person\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🙆‍♂️\",\r\n description: \"man gesturing OK\",\r\n category: \"People & Body\",\r\n aliases: [\"ok_man\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"10.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🙆‍♀️\",\r\n description: \"woman gesturing OK\",\r\n category: \"People & Body\",\r\n aliases: [\"ok_woman\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"💁\",\r\n description: \"person tipping hand\",\r\n category: \"People & Body\",\r\n aliases: [\"tipping_hand_person\", \"information_desk_person\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"💁‍♂️\",\r\n description: \"man tipping hand\",\r\n category: \"People & Body\",\r\n aliases: [\"tipping_hand_man\", \"sassy_man\"],\r\n tags: [\"information\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"10.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"💁‍♀️\",\r\n description: \"woman tipping hand\",\r\n category: \"People & Body\",\r\n aliases: [\"tipping_hand_woman\", \"sassy_woman\"],\r\n tags: [\"information\"],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🙋\",\r\n description: \"person raising hand\",\r\n category: \"People & Body\",\r\n aliases: [\"raising_hand\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🙋‍♂️\",\r\n description: \"man raising hand\",\r\n category: \"People & Body\",\r\n aliases: [\"raising_hand_man\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"10.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🙋‍♀️\",\r\n description: \"woman raising hand\",\r\n category: \"People & Body\",\r\n aliases: [\"raising_hand_woman\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🧏\",\r\n description: \"deaf person\",\r\n category: \"People & Body\",\r\n aliases: [\"deaf_person\"],\r\n tags: [],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🧏‍♂️\",\r\n description: \"deaf man\",\r\n category: \"People & Body\",\r\n aliases: [\"deaf_man\"],\r\n tags: [],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🧏‍♀️\",\r\n description: \"deaf woman\",\r\n category: \"People & Body\",\r\n aliases: [\"deaf_woman\"],\r\n tags: [],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🙇\",\r\n description: \"person bowing\",\r\n category: \"People & Body\",\r\n aliases: [\"bow\"],\r\n tags: [\"respect\", \"thanks\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🙇‍♂️\",\r\n description: \"man bowing\",\r\n category: \"People & Body\",\r\n aliases: [\"bowing_man\"],\r\n tags: [\"respect\", \"thanks\"],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🙇‍♀️\",\r\n description: \"woman bowing\",\r\n category: \"People & Body\",\r\n aliases: [\"bowing_woman\"],\r\n tags: [\"respect\", \"thanks\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"10.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🤦\",\r\n description: \"person facepalming\",\r\n category: \"People & Body\",\r\n aliases: [\"facepalm\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🤦‍♂️\",\r\n description: \"man facepalming\",\r\n category: \"People & Body\",\r\n aliases: [\"man_facepalming\"],\r\n tags: [],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🤦‍♀️\",\r\n description: \"woman facepalming\",\r\n category: \"People & Body\",\r\n aliases: [\"woman_facepalming\"],\r\n tags: [],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🤷\",\r\n description: \"person shrugging\",\r\n category: \"People & Body\",\r\n aliases: [\"shrug\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🤷‍♂️\",\r\n description: \"man shrugging\",\r\n category: \"People & Body\",\r\n aliases: [\"man_shrugging\"],\r\n tags: [],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🤷‍♀️\",\r\n description: \"woman shrugging\",\r\n category: \"People & Body\",\r\n aliases: [\"woman_shrugging\"],\r\n tags: [],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🧑‍⚕️\",\r\n description: \"health worker\",\r\n category: \"People & Body\",\r\n aliases: [\"health_worker\"],\r\n tags: [],\r\n unicode_version: \"12.1\",\r\n ios_version: \"13.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👨‍⚕️\",\r\n description: \"man health worker\",\r\n category: \"People & Body\",\r\n aliases: [\"man_health_worker\"],\r\n tags: [\"doctor\", \"nurse\"],\r\n unicode_version: \"\",\r\n ios_version: \"10.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👩‍⚕️\",\r\n description: \"woman health worker\",\r\n category: \"People & Body\",\r\n aliases: [\"woman_health_worker\"],\r\n tags: [\"doctor\", \"nurse\"],\r\n unicode_version: \"\",\r\n ios_version: \"10.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🧑‍🎓\",\r\n description: \"student\",\r\n category: \"People & Body\",\r\n aliases: [\"student\"],\r\n tags: [],\r\n unicode_version: \"12.1\",\r\n ios_version: \"13.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👨‍🎓\",\r\n description: \"man student\",\r\n category: \"People & Body\",\r\n aliases: [\"man_student\"],\r\n tags: [\"graduation\"],\r\n unicode_version: \"\",\r\n ios_version: \"10.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👩‍🎓\",\r\n description: \"woman student\",\r\n category: \"People & Body\",\r\n aliases: [\"woman_student\"],\r\n tags: [\"graduation\"],\r\n unicode_version: \"\",\r\n ios_version: \"10.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🧑‍🏫\",\r\n description: \"teacher\",\r\n category: \"People & Body\",\r\n aliases: [\"teacher\"],\r\n tags: [],\r\n unicode_version: \"12.1\",\r\n ios_version: \"13.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👨‍🏫\",\r\n description: \"man teacher\",\r\n category: \"People & Body\",\r\n aliases: [\"man_teacher\"],\r\n tags: [\"school\", \"professor\"],\r\n unicode_version: \"\",\r\n ios_version: \"10.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👩‍🏫\",\r\n description: \"woman teacher\",\r\n category: \"People & Body\",\r\n aliases: [\"woman_teacher\"],\r\n tags: [\"school\", \"professor\"],\r\n unicode_version: \"\",\r\n ios_version: \"10.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🧑‍⚖️\",\r\n description: \"judge\",\r\n category: \"People & Body\",\r\n aliases: [\"judge\"],\r\n tags: [],\r\n unicode_version: \"12.1\",\r\n ios_version: \"13.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👨‍⚖️\",\r\n description: \"man judge\",\r\n category: \"People & Body\",\r\n aliases: [\"man_judge\"],\r\n tags: [\"justice\"],\r\n unicode_version: \"\",\r\n ios_version: \"10.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👩‍⚖️\",\r\n description: \"woman judge\",\r\n category: \"People & Body\",\r\n aliases: [\"woman_judge\"],\r\n tags: [\"justice\"],\r\n unicode_version: \"\",\r\n ios_version: \"10.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🧑‍🌾\",\r\n description: \"farmer\",\r\n category: \"People & Body\",\r\n aliases: [\"farmer\"],\r\n tags: [],\r\n unicode_version: \"12.1\",\r\n ios_version: \"13.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👨‍🌾\",\r\n description: \"man farmer\",\r\n category: \"People & Body\",\r\n aliases: [\"man_farmer\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"10.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👩‍🌾\",\r\n description: \"woman farmer\",\r\n category: \"People & Body\",\r\n aliases: [\"woman_farmer\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"10.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🧑‍🍳\",\r\n description: \"cook\",\r\n category: \"People & Body\",\r\n aliases: [\"cook\"],\r\n tags: [],\r\n unicode_version: \"12.1\",\r\n ios_version: \"13.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👨‍🍳\",\r\n description: \"man cook\",\r\n category: \"People & Body\",\r\n aliases: [\"man_cook\"],\r\n tags: [\"chef\"],\r\n unicode_version: \"\",\r\n ios_version: \"10.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👩‍🍳\",\r\n description: \"woman cook\",\r\n category: \"People & Body\",\r\n aliases: [\"woman_cook\"],\r\n tags: [\"chef\"],\r\n unicode_version: \"\",\r\n ios_version: \"10.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🧑‍🔧\",\r\n description: \"mechanic\",\r\n category: \"People & Body\",\r\n aliases: [\"mechanic\"],\r\n tags: [],\r\n unicode_version: \"12.1\",\r\n ios_version: \"13.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👨‍🔧\",\r\n description: \"man mechanic\",\r\n category: \"People & Body\",\r\n aliases: [\"man_mechanic\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"10.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👩‍🔧\",\r\n description: \"woman mechanic\",\r\n category: \"People & Body\",\r\n aliases: [\"woman_mechanic\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"10.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🧑‍🏭\",\r\n description: \"factory worker\",\r\n category: \"People & Body\",\r\n aliases: [\"factory_worker\"],\r\n tags: [],\r\n unicode_version: \"12.1\",\r\n ios_version: \"13.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👨‍🏭\",\r\n description: \"man factory worker\",\r\n category: \"People & Body\",\r\n aliases: [\"man_factory_worker\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"10.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👩‍🏭\",\r\n description: \"woman factory worker\",\r\n category: \"People & Body\",\r\n aliases: [\"woman_factory_worker\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"10.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🧑‍💼\",\r\n description: \"office worker\",\r\n category: \"People & Body\",\r\n aliases: [\"office_worker\"],\r\n tags: [],\r\n unicode_version: \"12.1\",\r\n ios_version: \"13.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👨‍💼\",\r\n description: \"man office worker\",\r\n category: \"People & Body\",\r\n aliases: [\"man_office_worker\"],\r\n tags: [\"business\"],\r\n unicode_version: \"\",\r\n ios_version: \"10.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👩‍💼\",\r\n description: \"woman office worker\",\r\n category: \"People & Body\",\r\n aliases: [\"woman_office_worker\"],\r\n tags: [\"business\"],\r\n unicode_version: \"\",\r\n ios_version: \"10.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🧑‍🔬\",\r\n description: \"scientist\",\r\n category: \"People & Body\",\r\n aliases: [\"scientist\"],\r\n tags: [],\r\n unicode_version: \"12.1\",\r\n ios_version: \"13.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👨‍🔬\",\r\n description: \"man scientist\",\r\n category: \"People & Body\",\r\n aliases: [\"man_scientist\"],\r\n tags: [\"research\"],\r\n unicode_version: \"\",\r\n ios_version: \"10.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👩‍🔬\",\r\n description: \"woman scientist\",\r\n category: \"People & Body\",\r\n aliases: [\"woman_scientist\"],\r\n tags: [\"research\"],\r\n unicode_version: \"\",\r\n ios_version: \"10.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🧑‍💻\",\r\n description: \"technologist\",\r\n category: \"People & Body\",\r\n aliases: [\"technologist\"],\r\n tags: [],\r\n unicode_version: \"12.1\",\r\n ios_version: \"13.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👨‍💻\",\r\n description: \"man technologist\",\r\n category: \"People & Body\",\r\n aliases: [\"man_technologist\"],\r\n tags: [\"coder\"],\r\n unicode_version: \"\",\r\n ios_version: \"10.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👩‍💻\",\r\n description: \"woman technologist\",\r\n category: \"People & Body\",\r\n aliases: [\"woman_technologist\"],\r\n tags: [\"coder\"],\r\n unicode_version: \"\",\r\n ios_version: \"10.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🧑‍🎤\",\r\n description: \"singer\",\r\n category: \"People & Body\",\r\n aliases: [\"singer\"],\r\n tags: [],\r\n unicode_version: \"12.1\",\r\n ios_version: \"13.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👨‍🎤\",\r\n description: \"man singer\",\r\n category: \"People & Body\",\r\n aliases: [\"man_singer\"],\r\n tags: [\"rockstar\"],\r\n unicode_version: \"\",\r\n ios_version: \"10.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👩‍🎤\",\r\n description: \"woman singer\",\r\n category: \"People & Body\",\r\n aliases: [\"woman_singer\"],\r\n tags: [\"rockstar\"],\r\n unicode_version: \"\",\r\n ios_version: \"10.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🧑‍🎨\",\r\n description: \"artist\",\r\n category: \"People & Body\",\r\n aliases: [\"artist\"],\r\n tags: [],\r\n unicode_version: \"12.1\",\r\n ios_version: \"13.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👨‍🎨\",\r\n description: \"man artist\",\r\n category: \"People & Body\",\r\n aliases: [\"man_artist\"],\r\n tags: [\"painter\"],\r\n unicode_version: \"\",\r\n ios_version: \"10.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👩‍🎨\",\r\n description: \"woman artist\",\r\n category: \"People & Body\",\r\n aliases: [\"woman_artist\"],\r\n tags: [\"painter\"],\r\n unicode_version: \"\",\r\n ios_version: \"10.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🧑‍✈️\",\r\n description: \"pilot\",\r\n category: \"People & Body\",\r\n aliases: [\"pilot\"],\r\n tags: [],\r\n unicode_version: \"12.1\",\r\n ios_version: \"13.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👨‍✈️\",\r\n description: \"man pilot\",\r\n category: \"People & Body\",\r\n aliases: [\"man_pilot\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"10.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👩‍✈️\",\r\n description: \"woman pilot\",\r\n category: \"People & Body\",\r\n aliases: [\"woman_pilot\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"10.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🧑‍🚀\",\r\n description: \"astronaut\",\r\n category: \"People & Body\",\r\n aliases: [\"astronaut\"],\r\n tags: [],\r\n unicode_version: \"12.1\",\r\n ios_version: \"13.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👨‍🚀\",\r\n description: \"man astronaut\",\r\n category: \"People & Body\",\r\n aliases: [\"man_astronaut\"],\r\n tags: [\"space\"],\r\n unicode_version: \"\",\r\n ios_version: \"10.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👩‍🚀\",\r\n description: \"woman astronaut\",\r\n category: \"People & Body\",\r\n aliases: [\"woman_astronaut\"],\r\n tags: [\"space\"],\r\n unicode_version: \"\",\r\n ios_version: \"10.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🧑‍🚒\",\r\n description: \"firefighter\",\r\n category: \"People & Body\",\r\n aliases: [\"firefighter\"],\r\n tags: [],\r\n unicode_version: \"12.1\",\r\n ios_version: \"13.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👨‍🚒\",\r\n description: \"man firefighter\",\r\n category: \"People & Body\",\r\n aliases: [\"man_firefighter\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"10.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👩‍🚒\",\r\n description: \"woman firefighter\",\r\n category: \"People & Body\",\r\n aliases: [\"woman_firefighter\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"10.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👮\",\r\n description: \"police officer\",\r\n category: \"People & Body\",\r\n aliases: [\"police_officer\", \"cop\"],\r\n tags: [\"law\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👮‍♂️\",\r\n description: \"man police officer\",\r\n category: \"People & Body\",\r\n aliases: [\"policeman\"],\r\n tags: [\"law\", \"cop\"],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👮‍♀️\",\r\n description: \"woman police officer\",\r\n category: \"People & Body\",\r\n aliases: [\"policewoman\"],\r\n tags: [\"law\", \"cop\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"10.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🕵️\",\r\n description: \"detective\",\r\n category: \"People & Body\",\r\n aliases: [\"detective\"],\r\n tags: [\"sleuth\"],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🕵️‍♂️\",\r\n description: \"man detective\",\r\n category: \"People & Body\",\r\n aliases: [\"male_detective\"],\r\n tags: [\"sleuth\"],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🕵️‍♀️\",\r\n description: \"woman detective\",\r\n category: \"People & Body\",\r\n aliases: [\"female_detective\"],\r\n tags: [\"sleuth\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"10.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"💂\",\r\n description: \"guard\",\r\n category: \"People & Body\",\r\n aliases: [\"guard\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"💂‍♂️\",\r\n description: \"man guard\",\r\n category: \"People & Body\",\r\n aliases: [\"guardsman\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"💂‍♀️\",\r\n description: \"woman guard\",\r\n category: \"People & Body\",\r\n aliases: [\"guardswoman\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"10.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🥷\",\r\n description: \"ninja\",\r\n category: \"People & Body\",\r\n aliases: [\"ninja\"],\r\n tags: [],\r\n unicode_version: \"13.0\",\r\n ios_version: \"14.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👷\",\r\n description: \"construction worker\",\r\n category: \"People & Body\",\r\n aliases: [\"construction_worker\"],\r\n tags: [\"helmet\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👷‍♂️\",\r\n description: \"man construction worker\",\r\n category: \"People & Body\",\r\n aliases: [\"construction_worker_man\"],\r\n tags: [\"helmet\"],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👷‍♀️\",\r\n description: \"woman construction worker\",\r\n category: \"People & Body\",\r\n aliases: [\"construction_worker_woman\"],\r\n tags: [\"helmet\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"10.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🤴\",\r\n description: \"prince\",\r\n category: \"People & Body\",\r\n aliases: [\"prince\"],\r\n tags: [\"crown\", \"royal\"],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👸\",\r\n description: \"princess\",\r\n category: \"People & Body\",\r\n aliases: [\"princess\"],\r\n tags: [\"crown\", \"royal\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👳\",\r\n description: \"person wearing turban\",\r\n category: \"People & Body\",\r\n aliases: [\"person_with_turban\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👳‍♂️\",\r\n description: \"man wearing turban\",\r\n category: \"People & Body\",\r\n aliases: [\"man_with_turban\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👳‍♀️\",\r\n description: \"woman wearing turban\",\r\n category: \"People & Body\",\r\n aliases: [\"woman_with_turban\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"10.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👲\",\r\n description: \"person with skullcap\",\r\n category: \"People & Body\",\r\n aliases: [\"man_with_gua_pi_mao\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🧕\",\r\n description: \"woman with headscarf\",\r\n category: \"People & Body\",\r\n aliases: [\"woman_with_headscarf\"],\r\n tags: [\"hijab\"],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🤵\",\r\n description: \"person in tuxedo\",\r\n category: \"People & Body\",\r\n aliases: [\"person_in_tuxedo\"],\r\n tags: [\"groom\", \"marriage\", \"wedding\"],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🤵‍♂️\",\r\n description: \"man in tuxedo\",\r\n category: \"People & Body\",\r\n aliases: [\"man_in_tuxedo\"],\r\n tags: [],\r\n unicode_version: \"13.0\",\r\n ios_version: \"14.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🤵‍♀️\",\r\n description: \"woman in tuxedo\",\r\n category: \"People & Body\",\r\n aliases: [\"woman_in_tuxedo\"],\r\n tags: [],\r\n unicode_version: \"13.0\",\r\n ios_version: \"14.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👰\",\r\n description: \"person with veil\",\r\n category: \"People & Body\",\r\n aliases: [\"person_with_veil\"],\r\n tags: [\"marriage\", \"wedding\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👰‍♂️\",\r\n description: \"man with veil\",\r\n category: \"People & Body\",\r\n aliases: [\"man_with_veil\"],\r\n tags: [],\r\n unicode_version: \"13.0\",\r\n ios_version: \"14.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👰‍♀️\",\r\n description: \"woman with veil\",\r\n category: \"People & Body\",\r\n aliases: [\"woman_with_veil\", \"bride_with_veil\"],\r\n tags: [],\r\n unicode_version: \"13.0\",\r\n ios_version: \"14.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🤰\",\r\n description: \"pregnant woman\",\r\n category: \"People & Body\",\r\n aliases: [\"pregnant_woman\"],\r\n tags: [],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🤱\",\r\n description: \"breast-feeding\",\r\n category: \"People & Body\",\r\n aliases: [\"breast_feeding\"],\r\n tags: [\"nursing\"],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👩‍🍼\",\r\n description: \"woman feeding baby\",\r\n category: \"People & Body\",\r\n aliases: [\"woman_feeding_baby\"],\r\n tags: [],\r\n unicode_version: \"13.0\",\r\n ios_version: \"14.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👨‍🍼\",\r\n description: \"man feeding baby\",\r\n category: \"People & Body\",\r\n aliases: [\"man_feeding_baby\"],\r\n tags: [],\r\n unicode_version: \"13.0\",\r\n ios_version: \"14.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🧑‍🍼\",\r\n description: \"person feeding baby\",\r\n category: \"People & Body\",\r\n aliases: [\"person_feeding_baby\"],\r\n tags: [],\r\n unicode_version: \"13.0\",\r\n ios_version: \"14.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👼\",\r\n description: \"baby angel\",\r\n category: \"People & Body\",\r\n aliases: [\"angel\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🎅\",\r\n description: \"Santa Claus\",\r\n category: \"People & Body\",\r\n aliases: [\"santa\"],\r\n tags: [\"christmas\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🤶\",\r\n description: \"Mrs. Claus\",\r\n category: \"People & Body\",\r\n aliases: [\"mrs_claus\"],\r\n tags: [\"santa\"],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🧑‍🎄\",\r\n description: \"mx claus\",\r\n category: \"People & Body\",\r\n aliases: [\"mx_claus\"],\r\n tags: [],\r\n unicode_version: \"13.0\",\r\n ios_version: \"14.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🦸\",\r\n description: \"superhero\",\r\n category: \"People & Body\",\r\n aliases: [\"superhero\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🦸‍♂️\",\r\n description: \"man superhero\",\r\n category: \"People & Body\",\r\n aliases: [\"superhero_man\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🦸‍♀️\",\r\n description: \"woman superhero\",\r\n category: \"People & Body\",\r\n aliases: [\"superhero_woman\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🦹\",\r\n description: \"supervillain\",\r\n category: \"People & Body\",\r\n aliases: [\"supervillain\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🦹‍♂️\",\r\n description: \"man supervillain\",\r\n category: \"People & Body\",\r\n aliases: [\"supervillain_man\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🦹‍♀️\",\r\n description: \"woman supervillain\",\r\n category: \"People & Body\",\r\n aliases: [\"supervillain_woman\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🧙\",\r\n description: \"mage\",\r\n category: \"People & Body\",\r\n aliases: [\"mage\"],\r\n tags: [\"wizard\"],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🧙‍♂️\",\r\n description: \"man mage\",\r\n category: \"People & Body\",\r\n aliases: [\"mage_man\"],\r\n tags: [\"wizard\"],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🧙‍♀️\",\r\n description: \"woman mage\",\r\n category: \"People & Body\",\r\n aliases: [\"mage_woman\"],\r\n tags: [\"wizard\"],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🧚\",\r\n description: \"fairy\",\r\n category: \"People & Body\",\r\n aliases: [\"fairy\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🧚‍♂️\",\r\n description: \"man fairy\",\r\n category: \"People & Body\",\r\n aliases: [\"fairy_man\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🧚‍♀️\",\r\n description: \"woman fairy\",\r\n category: \"People & Body\",\r\n aliases: [\"fairy_woman\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🧛\",\r\n description: \"vampire\",\r\n category: \"People & Body\",\r\n aliases: [\"vampire\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🧛‍♂️\",\r\n description: \"man vampire\",\r\n category: \"People & Body\",\r\n aliases: [\"vampire_man\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🧛‍♀️\",\r\n description: \"woman vampire\",\r\n category: \"People & Body\",\r\n aliases: [\"vampire_woman\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🧜\",\r\n description: \"merperson\",\r\n category: \"People & Body\",\r\n aliases: [\"merperson\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🧜‍♂️\",\r\n description: \"merman\",\r\n category: \"People & Body\",\r\n aliases: [\"merman\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🧜‍♀️\",\r\n description: \"mermaid\",\r\n category: \"People & Body\",\r\n aliases: [\"mermaid\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🧝\",\r\n description: \"elf\",\r\n category: \"People & Body\",\r\n aliases: [\"elf\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🧝‍♂️\",\r\n description: \"man elf\",\r\n category: \"People & Body\",\r\n aliases: [\"elf_man\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🧝‍♀️\",\r\n description: \"woman elf\",\r\n category: \"People & Body\",\r\n aliases: [\"elf_woman\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🧞\",\r\n description: \"genie\",\r\n category: \"People & Body\",\r\n aliases: [\"genie\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🧞‍♂️\",\r\n description: \"man genie\",\r\n category: \"People & Body\",\r\n aliases: [\"genie_man\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🧞‍♀️\",\r\n description: \"woman genie\",\r\n category: \"People & Body\",\r\n aliases: [\"genie_woman\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🧟\",\r\n description: \"zombie\",\r\n category: \"People & Body\",\r\n aliases: [\"zombie\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🧟‍♂️\",\r\n description: \"man zombie\",\r\n category: \"People & Body\",\r\n aliases: [\"zombie_man\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🧟‍♀️\",\r\n description: \"woman zombie\",\r\n category: \"People & Body\",\r\n aliases: [\"zombie_woman\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"💆\",\r\n description: \"person getting massage\",\r\n category: \"People & Body\",\r\n aliases: [\"massage\"],\r\n tags: [\"spa\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"💆‍♂️\",\r\n description: \"man getting massage\",\r\n category: \"People & Body\",\r\n aliases: [\"massage_man\"],\r\n tags: [\"spa\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"10.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"💆‍♀️\",\r\n description: \"woman getting massage\",\r\n category: \"People & Body\",\r\n aliases: [\"massage_woman\"],\r\n tags: [\"spa\"],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"💇\",\r\n description: \"person getting haircut\",\r\n category: \"People & Body\",\r\n aliases: [\"haircut\"],\r\n tags: [\"beauty\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"💇‍♂️\",\r\n description: \"man getting haircut\",\r\n category: \"People & Body\",\r\n aliases: [\"haircut_man\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"10.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"💇‍♀️\",\r\n description: \"woman getting haircut\",\r\n category: \"People & Body\",\r\n aliases: [\"haircut_woman\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🚶\",\r\n description: \"person walking\",\r\n category: \"People & Body\",\r\n aliases: [\"walking\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🚶‍♂️\",\r\n description: \"man walking\",\r\n category: \"People & Body\",\r\n aliases: [\"walking_man\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🚶‍♀️\",\r\n description: \"woman walking\",\r\n category: \"People & Body\",\r\n aliases: [\"walking_woman\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"10.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🧍\",\r\n description: \"person standing\",\r\n category: \"People & Body\",\r\n aliases: [\"standing_person\"],\r\n tags: [],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🧍‍♂️\",\r\n description: \"man standing\",\r\n category: \"People & Body\",\r\n aliases: [\"standing_man\"],\r\n tags: [],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🧍‍♀️\",\r\n description: \"woman standing\",\r\n category: \"People & Body\",\r\n aliases: [\"standing_woman\"],\r\n tags: [],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🧎\",\r\n description: \"person kneeling\",\r\n category: \"People & Body\",\r\n aliases: [\"kneeling_person\"],\r\n tags: [],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🧎‍♂️\",\r\n description: \"man kneeling\",\r\n category: \"People & Body\",\r\n aliases: [\"kneeling_man\"],\r\n tags: [],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🧎‍♀️\",\r\n description: \"woman kneeling\",\r\n category: \"People & Body\",\r\n aliases: [\"kneeling_woman\"],\r\n tags: [],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🧑‍🦯\",\r\n description: \"person with white cane\",\r\n category: \"People & Body\",\r\n aliases: [\"person_with_probing_cane\"],\r\n tags: [],\r\n unicode_version: \"12.1\",\r\n ios_version: \"13.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👨‍🦯\",\r\n description: \"man with white cane\",\r\n category: \"People & Body\",\r\n aliases: [\"man_with_probing_cane\"],\r\n tags: [],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👩‍🦯\",\r\n description: \"woman with white cane\",\r\n category: \"People & Body\",\r\n aliases: [\"woman_with_probing_cane\"],\r\n tags: [],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🧑‍🦼\",\r\n description: \"person in motorized wheelchair\",\r\n category: \"People & Body\",\r\n aliases: [\"person_in_motorized_wheelchair\"],\r\n tags: [],\r\n unicode_version: \"12.1\",\r\n ios_version: \"13.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👨‍🦼\",\r\n description: \"man in motorized wheelchair\",\r\n category: \"People & Body\",\r\n aliases: [\"man_in_motorized_wheelchair\"],\r\n tags: [],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👩‍🦼\",\r\n description: \"woman in motorized wheelchair\",\r\n category: \"People & Body\",\r\n aliases: [\"woman_in_motorized_wheelchair\"],\r\n tags: [],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🧑‍🦽\",\r\n description: \"person in manual wheelchair\",\r\n category: \"People & Body\",\r\n aliases: [\"person_in_manual_wheelchair\"],\r\n tags: [],\r\n unicode_version: \"12.1\",\r\n ios_version: \"13.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👨‍🦽\",\r\n description: \"man in manual wheelchair\",\r\n category: \"People & Body\",\r\n aliases: [\"man_in_manual_wheelchair\"],\r\n tags: [],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👩‍🦽\",\r\n description: \"woman in manual wheelchair\",\r\n category: \"People & Body\",\r\n aliases: [\"woman_in_manual_wheelchair\"],\r\n tags: [],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🏃\",\r\n description: \"person running\",\r\n category: \"People & Body\",\r\n aliases: [\"runner\", \"running\"],\r\n tags: [\"exercise\", \"workout\", \"marathon\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🏃‍♂️\",\r\n description: \"man running\",\r\n category: \"People & Body\",\r\n aliases: [\"running_man\"],\r\n tags: [\"exercise\", \"workout\", \"marathon\"],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🏃‍♀️\",\r\n description: \"woman running\",\r\n category: \"People & Body\",\r\n aliases: [\"running_woman\"],\r\n tags: [\"exercise\", \"workout\", \"marathon\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"10.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"💃\",\r\n description: \"woman dancing\",\r\n category: \"People & Body\",\r\n aliases: [\"woman_dancing\", \"dancer\"],\r\n tags: [\"dress\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🕺\",\r\n description: \"man dancing\",\r\n category: \"People & Body\",\r\n aliases: [\"man_dancing\"],\r\n tags: [\"dancer\"],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🕴️\",\r\n description: \"person in suit levitating\",\r\n category: \"People & Body\",\r\n aliases: [\"business_suit_levitating\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👯\",\r\n description: \"people with bunny ears\",\r\n category: \"People & Body\",\r\n aliases: [\"dancers\"],\r\n tags: [\"bunny\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"👯‍♂️\",\r\n description: \"men with bunny ears\",\r\n category: \"People & Body\",\r\n aliases: [\"dancing_men\"],\r\n tags: [\"bunny\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"10.0\",\r\n },\r\n {\r\n emoji: \"👯‍♀️\",\r\n description: \"women with bunny ears\",\r\n category: \"People & Body\",\r\n aliases: [\"dancing_women\"],\r\n tags: [\"bunny\"],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🧖\",\r\n description: \"person in steamy room\",\r\n category: \"People & Body\",\r\n aliases: [\"sauna_person\"],\r\n tags: [\"steamy\"],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🧖‍♂️\",\r\n description: \"man in steamy room\",\r\n category: \"People & Body\",\r\n aliases: [\"sauna_man\"],\r\n tags: [\"steamy\"],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🧖‍♀️\",\r\n description: \"woman in steamy room\",\r\n category: \"People & Body\",\r\n aliases: [\"sauna_woman\"],\r\n tags: [\"steamy\"],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🧗\",\r\n description: \"person climbing\",\r\n category: \"People & Body\",\r\n aliases: [\"climbing\"],\r\n tags: [\"bouldering\"],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🧗‍♂️\",\r\n description: \"man climbing\",\r\n category: \"People & Body\",\r\n aliases: [\"climbing_man\"],\r\n tags: [\"bouldering\"],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🧗‍♀️\",\r\n description: \"woman climbing\",\r\n category: \"People & Body\",\r\n aliases: [\"climbing_woman\"],\r\n tags: [\"bouldering\"],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🤺\",\r\n description: \"person fencing\",\r\n category: \"People & Body\",\r\n aliases: [\"person_fencing\"],\r\n tags: [],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n },\r\n {\r\n emoji: \"🏇\",\r\n description: \"horse racing\",\r\n category: \"People & Body\",\r\n aliases: [\"horse_racing\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"⛷️\",\r\n description: \"skier\",\r\n category: \"People & Body\",\r\n aliases: [\"skier\"],\r\n tags: [],\r\n unicode_version: \"5.2\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🏂\",\r\n description: \"snowboarder\",\r\n category: \"People & Body\",\r\n aliases: [\"snowboarder\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🏌️\",\r\n description: \"person golfing\",\r\n category: \"People & Body\",\r\n aliases: [\"golfing\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🏌️‍♂️\",\r\n description: \"man golfing\",\r\n category: \"People & Body\",\r\n aliases: [\"golfing_man\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🏌️‍♀️\",\r\n description: \"woman golfing\",\r\n category: \"People & Body\",\r\n aliases: [\"golfing_woman\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"10.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🏄\",\r\n description: \"person surfing\",\r\n category: \"People & Body\",\r\n aliases: [\"surfer\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🏄‍♂️\",\r\n description: \"man surfing\",\r\n category: \"People & Body\",\r\n aliases: [\"surfing_man\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🏄‍♀️\",\r\n description: \"woman surfing\",\r\n category: \"People & Body\",\r\n aliases: [\"surfing_woman\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"10.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🚣\",\r\n description: \"person rowing boat\",\r\n category: \"People & Body\",\r\n aliases: [\"rowboat\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🚣‍♂️\",\r\n description: \"man rowing boat\",\r\n category: \"People & Body\",\r\n aliases: [\"rowing_man\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🚣‍♀️\",\r\n description: \"woman rowing boat\",\r\n category: \"People & Body\",\r\n aliases: [\"rowing_woman\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"10.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🏊\",\r\n description: \"person swimming\",\r\n category: \"People & Body\",\r\n aliases: [\"swimmer\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🏊‍♂️\",\r\n description: \"man swimming\",\r\n category: \"People & Body\",\r\n aliases: [\"swimming_man\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🏊‍♀️\",\r\n description: \"woman swimming\",\r\n category: \"People & Body\",\r\n aliases: [\"swimming_woman\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"10.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"⛹️\",\r\n description: \"person bouncing ball\",\r\n category: \"People & Body\",\r\n aliases: [\"bouncing_ball_person\"],\r\n tags: [\"basketball\"],\r\n unicode_version: \"5.2\",\r\n ios_version: \"9.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"⛹️‍♂️\",\r\n description: \"man bouncing ball\",\r\n category: \"People & Body\",\r\n aliases: [\"bouncing_ball_man\", \"basketball_man\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"⛹️‍♀️\",\r\n description: \"woman bouncing ball\",\r\n category: \"People & Body\",\r\n aliases: [\"bouncing_ball_woman\", \"basketball_woman\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"10.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🏋️\",\r\n description: \"person lifting weights\",\r\n category: \"People & Body\",\r\n aliases: [\"weight_lifting\"],\r\n tags: [\"gym\", \"workout\"],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🏋️‍♂️\",\r\n description: \"man lifting weights\",\r\n category: \"People & Body\",\r\n aliases: [\"weight_lifting_man\"],\r\n tags: [\"gym\", \"workout\"],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🏋️‍♀️\",\r\n description: \"woman lifting weights\",\r\n category: \"People & Body\",\r\n aliases: [\"weight_lifting_woman\"],\r\n tags: [\"gym\", \"workout\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"10.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🚴\",\r\n description: \"person biking\",\r\n category: \"People & Body\",\r\n aliases: [\"bicyclist\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🚴‍♂️\",\r\n description: \"man biking\",\r\n category: \"People & Body\",\r\n aliases: [\"biking_man\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🚴‍♀️\",\r\n description: \"woman biking\",\r\n category: \"People & Body\",\r\n aliases: [\"biking_woman\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"10.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🚵\",\r\n description: \"person mountain biking\",\r\n category: \"People & Body\",\r\n aliases: [\"mountain_bicyclist\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🚵‍♂️\",\r\n description: \"man mountain biking\",\r\n category: \"People & Body\",\r\n aliases: [\"mountain_biking_man\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🚵‍♀️\",\r\n description: \"woman mountain biking\",\r\n category: \"People & Body\",\r\n aliases: [\"mountain_biking_woman\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"10.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🤸\",\r\n description: \"person cartwheeling\",\r\n category: \"People & Body\",\r\n aliases: [\"cartwheeling\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🤸‍♂️\",\r\n description: \"man cartwheeling\",\r\n category: \"People & Body\",\r\n aliases: [\"man_cartwheeling\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"10.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🤸‍♀️\",\r\n description: \"woman cartwheeling\",\r\n category: \"People & Body\",\r\n aliases: [\"woman_cartwheeling\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"10.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🤼\",\r\n description: \"people wrestling\",\r\n category: \"People & Body\",\r\n aliases: [\"wrestling\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🤼‍♂️\",\r\n description: \"men wrestling\",\r\n category: \"People & Body\",\r\n aliases: [\"men_wrestling\"],\r\n tags: [],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n },\r\n {\r\n emoji: \"🤼‍♀️\",\r\n description: \"women wrestling\",\r\n category: \"People & Body\",\r\n aliases: [\"women_wrestling\"],\r\n tags: [],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n },\r\n {\r\n emoji: \"🤽\",\r\n description: \"person playing water polo\",\r\n category: \"People & Body\",\r\n aliases: [\"water_polo\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🤽‍♂️\",\r\n description: \"man playing water polo\",\r\n category: \"People & Body\",\r\n aliases: [\"man_playing_water_polo\"],\r\n tags: [],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🤽‍♀️\",\r\n description: \"woman playing water polo\",\r\n category: \"People & Body\",\r\n aliases: [\"woman_playing_water_polo\"],\r\n tags: [],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🤾\",\r\n description: \"person playing handball\",\r\n category: \"People & Body\",\r\n aliases: [\"handball_person\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🤾‍♂️\",\r\n description: \"man playing handball\",\r\n category: \"People & Body\",\r\n aliases: [\"man_playing_handball\"],\r\n tags: [],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🤾‍♀️\",\r\n description: \"woman playing handball\",\r\n category: \"People & Body\",\r\n aliases: [\"woman_playing_handball\"],\r\n tags: [],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🤹\",\r\n description: \"person juggling\",\r\n category: \"People & Body\",\r\n aliases: [\"juggling_person\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🤹‍♂️\",\r\n description: \"man juggling\",\r\n category: \"People & Body\",\r\n aliases: [\"man_juggling\"],\r\n tags: [],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🤹‍♀️\",\r\n description: \"woman juggling\",\r\n category: \"People & Body\",\r\n aliases: [\"woman_juggling\"],\r\n tags: [],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🧘\",\r\n description: \"person in lotus position\",\r\n category: \"People & Body\",\r\n aliases: [\"lotus_position\"],\r\n tags: [\"meditation\"],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🧘‍♂️\",\r\n description: \"man in lotus position\",\r\n category: \"People & Body\",\r\n aliases: [\"lotus_position_man\"],\r\n tags: [\"meditation\"],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🧘‍♀️\",\r\n description: \"woman in lotus position\",\r\n category: \"People & Body\",\r\n aliases: [\"lotus_position_woman\"],\r\n tags: [\"meditation\"],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🛀\",\r\n description: \"person taking bath\",\r\n category: \"People & Body\",\r\n aliases: [\"bath\"],\r\n tags: [\"shower\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🛌\",\r\n description: \"person in bed\",\r\n category: \"People & Body\",\r\n aliases: [\"sleeping_bed\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"🧑‍🤝‍🧑\",\r\n description: \"people holding hands\",\r\n category: \"People & Body\",\r\n aliases: [\"people_holding_hands\"],\r\n tags: [\"couple\", \"date\"],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👭\",\r\n description: \"women holding hands\",\r\n category: \"People & Body\",\r\n aliases: [\"two_women_holding_hands\"],\r\n tags: [\"couple\", \"date\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👫\",\r\n description: \"woman and man holding hands\",\r\n category: \"People & Body\",\r\n aliases: [\"couple\"],\r\n tags: [\"date\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👬\",\r\n description: \"men holding hands\",\r\n category: \"People & Body\",\r\n aliases: [\"two_men_holding_hands\"],\r\n tags: [\"couple\", \"date\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"💏\",\r\n description: \"kiss\",\r\n category: \"People & Body\",\r\n aliases: [\"couplekiss\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👩‍❤️‍💋‍👨\",\r\n description: \"kiss: woman, man\",\r\n category: \"People & Body\",\r\n aliases: [\"couplekiss_man_woman\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👨‍❤️‍💋‍👨\",\r\n description: \"kiss: man, man\",\r\n category: \"People & Body\",\r\n aliases: [\"couplekiss_man_man\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👩‍❤️‍💋‍👩\",\r\n description: \"kiss: woman, woman\",\r\n category: \"People & Body\",\r\n aliases: [\"couplekiss_woman_woman\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"💑\",\r\n description: \"couple with heart\",\r\n category: \"People & Body\",\r\n aliases: [\"couple_with_heart\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👩‍❤️‍👨\",\r\n description: \"couple with heart: woman, man\",\r\n category: \"People & Body\",\r\n aliases: [\"couple_with_heart_woman_man\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👨‍❤️‍👨\",\r\n description: \"couple with heart: man, man\",\r\n category: \"People & Body\",\r\n aliases: [\"couple_with_heart_man_man\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👩‍❤️‍👩\",\r\n description: \"couple with heart: woman, woman\",\r\n category: \"People & Body\",\r\n aliases: [\"couple_with_heart_woman_woman\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n skin_tones: true,\r\n },\r\n {\r\n emoji: \"👪\",\r\n description: \"family\",\r\n category: \"People & Body\",\r\n aliases: [\"family\"],\r\n tags: [\"home\", \"parents\", \"child\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"👨‍👩‍👦\",\r\n description: \"family: man, woman, boy\",\r\n category: \"People & Body\",\r\n aliases: [\"family_man_woman_boy\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"👨‍👩‍👧\",\r\n description: \"family: man, woman, girl\",\r\n category: \"People & Body\",\r\n aliases: [\"family_man_woman_girl\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"👨‍👩‍👧‍👦\",\r\n description: \"family: man, woman, girl, boy\",\r\n category: \"People & Body\",\r\n aliases: [\"family_man_woman_girl_boy\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"👨‍👩‍👦‍👦\",\r\n description: \"family: man, woman, boy, boy\",\r\n category: \"People & Body\",\r\n aliases: [\"family_man_woman_boy_boy\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"👨‍👩‍👧‍👧\",\r\n description: \"family: man, woman, girl, girl\",\r\n category: \"People & Body\",\r\n aliases: [\"family_man_woman_girl_girl\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"👨‍👨‍👦\",\r\n description: \"family: man, man, boy\",\r\n category: \"People & Body\",\r\n aliases: [\"family_man_man_boy\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"👨‍👨‍👧\",\r\n description: \"family: man, man, girl\",\r\n category: \"People & Body\",\r\n aliases: [\"family_man_man_girl\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"👨‍👨‍👧‍👦\",\r\n description: \"family: man, man, girl, boy\",\r\n category: \"People & Body\",\r\n aliases: [\"family_man_man_girl_boy\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"👨‍👨‍👦‍👦\",\r\n description: \"family: man, man, boy, boy\",\r\n category: \"People & Body\",\r\n aliases: [\"family_man_man_boy_boy\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"👨‍👨‍👧‍👧\",\r\n description: \"family: man, man, girl, girl\",\r\n category: \"People & Body\",\r\n aliases: [\"family_man_man_girl_girl\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"👩‍👩‍👦\",\r\n description: \"family: woman, woman, boy\",\r\n category: \"People & Body\",\r\n aliases: [\"family_woman_woman_boy\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"👩‍👩‍👧\",\r\n description: \"family: woman, woman, girl\",\r\n category: \"People & Body\",\r\n aliases: [\"family_woman_woman_girl\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"👩‍👩‍👧‍👦\",\r\n description: \"family: woman, woman, girl, boy\",\r\n category: \"People & Body\",\r\n aliases: [\"family_woman_woman_girl_boy\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"👩‍👩‍👦‍👦\",\r\n description: \"family: woman, woman, boy, boy\",\r\n category: \"People & Body\",\r\n aliases: [\"family_woman_woman_boy_boy\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"👩‍👩‍👧‍👧\",\r\n description: \"family: woman, woman, girl, girl\",\r\n category: \"People & Body\",\r\n aliases: [\"family_woman_woman_girl_girl\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"👨‍👦\",\r\n description: \"family: man, boy\",\r\n category: \"People & Body\",\r\n aliases: [\"family_man_boy\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"10.0\",\r\n },\r\n {\r\n emoji: \"👨‍👦‍👦\",\r\n description: \"family: man, boy, boy\",\r\n category: \"People & Body\",\r\n aliases: [\"family_man_boy_boy\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"10.0\",\r\n },\r\n {\r\n emoji: \"👨‍👧\",\r\n description: \"family: man, girl\",\r\n category: \"People & Body\",\r\n aliases: [\"family_man_girl\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"10.0\",\r\n },\r\n {\r\n emoji: \"👨‍👧‍👦\",\r\n description: \"family: man, girl, boy\",\r\n category: \"People & Body\",\r\n aliases: [\"family_man_girl_boy\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"10.0\",\r\n },\r\n {\r\n emoji: \"👨‍👧‍👧\",\r\n description: \"family: man, girl, girl\",\r\n category: \"People & Body\",\r\n aliases: [\"family_man_girl_girl\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"10.0\",\r\n },\r\n {\r\n emoji: \"👩‍👦\",\r\n description: \"family: woman, boy\",\r\n category: \"People & Body\",\r\n aliases: [\"family_woman_boy\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"10.0\",\r\n },\r\n {\r\n emoji: \"👩‍👦‍👦\",\r\n description: \"family: woman, boy, boy\",\r\n category: \"People & Body\",\r\n aliases: [\"family_woman_boy_boy\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"10.0\",\r\n },\r\n {\r\n emoji: \"👩‍👧\",\r\n description: \"family: woman, girl\",\r\n category: \"People & Body\",\r\n aliases: [\"family_woman_girl\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"10.0\",\r\n },\r\n {\r\n emoji: \"👩‍👧‍👦\",\r\n description: \"family: woman, girl, boy\",\r\n category: \"People & Body\",\r\n aliases: [\"family_woman_girl_boy\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"10.0\",\r\n },\r\n {\r\n emoji: \"👩‍👧‍👧\",\r\n description: \"family: woman, girl, girl\",\r\n category: \"People & Body\",\r\n aliases: [\"family_woman_girl_girl\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"10.0\",\r\n },\r\n {\r\n emoji: \"🗣️\",\r\n description: \"speaking head\",\r\n category: \"People & Body\",\r\n aliases: [\"speaking_head\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"👤\",\r\n description: \"bust in silhouette\",\r\n category: \"People & Body\",\r\n aliases: [\"bust_in_silhouette\"],\r\n tags: [\"user\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"👥\",\r\n description: \"busts in silhouette\",\r\n category: \"People & Body\",\r\n aliases: [\"busts_in_silhouette\"],\r\n tags: [\"users\", \"group\", \"team\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🫂\",\r\n description: \"people hugging\",\r\n category: \"People & Body\",\r\n aliases: [\"people_hugging\"],\r\n tags: [],\r\n unicode_version: \"13.0\",\r\n ios_version: \"14.0\",\r\n },\r\n {\r\n emoji: \"👣\",\r\n description: \"footprints\",\r\n category: \"People & Body\",\r\n aliases: [\"footprints\"],\r\n tags: [\"feet\", \"tracks\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🐵\",\r\n description: \"monkey face\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"monkey_face\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🐒\",\r\n description: \"monkey\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"monkey\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🦍\",\r\n description: \"gorilla\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"gorilla\"],\r\n tags: [],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n },\r\n {\r\n emoji: \"🦧\",\r\n description: \"orangutan\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"orangutan\"],\r\n tags: [],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n },\r\n {\r\n emoji: \"🐶\",\r\n description: \"dog face\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"dog\"],\r\n tags: [\"pet\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🐕\",\r\n description: \"dog\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"dog2\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🦮\",\r\n description: \"guide dog\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"guide_dog\"],\r\n tags: [],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n },\r\n {\r\n emoji: \"🐕‍🦺\",\r\n description: \"service dog\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"service_dog\"],\r\n tags: [],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n },\r\n {\r\n emoji: \"🐩\",\r\n description: \"poodle\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"poodle\"],\r\n tags: [\"dog\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🐺\",\r\n description: \"wolf\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"wolf\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🦊\",\r\n description: \"fox\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"fox_face\"],\r\n tags: [],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n },\r\n {\r\n emoji: \"🦝\",\r\n description: \"raccoon\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"raccoon\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🐱\",\r\n description: \"cat face\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"cat\"],\r\n tags: [\"pet\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🐈\",\r\n description: \"cat\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"cat2\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🐈‍⬛\",\r\n description: \"black cat\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"black_cat\"],\r\n tags: [],\r\n unicode_version: \"13.0\",\r\n ios_version: \"14.0\",\r\n },\r\n {\r\n emoji: \"🦁\",\r\n description: \"lion\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"lion\"],\r\n tags: [],\r\n unicode_version: \"8.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🐯\",\r\n description: \"tiger face\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"tiger\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🐅\",\r\n description: \"tiger\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"tiger2\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🐆\",\r\n description: \"leopard\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"leopard\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🐴\",\r\n description: \"horse face\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"horse\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🐎\",\r\n description: \"horse\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"racehorse\"],\r\n tags: [\"speed\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🦄\",\r\n description: \"unicorn\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"unicorn\"],\r\n tags: [],\r\n unicode_version: \"8.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🦓\",\r\n description: \"zebra\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"zebra\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🦌\",\r\n description: \"deer\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"deer\"],\r\n tags: [],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n },\r\n {\r\n emoji: \"🦬\",\r\n description: \"bison\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"bison\"],\r\n tags: [],\r\n unicode_version: \"13.0\",\r\n ios_version: \"14.0\",\r\n },\r\n {\r\n emoji: \"🐮\",\r\n description: \"cow face\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"cow\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🐂\",\r\n description: \"ox\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"ox\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🐃\",\r\n description: \"water buffalo\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"water_buffalo\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🐄\",\r\n description: \"cow\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"cow2\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🐷\",\r\n description: \"pig face\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"pig\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🐖\",\r\n description: \"pig\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"pig2\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🐗\",\r\n description: \"boar\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"boar\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🐽\",\r\n description: \"pig nose\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"pig_nose\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🐏\",\r\n description: \"ram\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"ram\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🐑\",\r\n description: \"ewe\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"sheep\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🐐\",\r\n description: \"goat\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"goat\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🐪\",\r\n description: \"camel\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"dromedary_camel\"],\r\n tags: [\"desert\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🐫\",\r\n description: \"two-hump camel\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"camel\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🦙\",\r\n description: \"llama\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"llama\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🦒\",\r\n description: \"giraffe\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"giraffe\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🐘\",\r\n description: \"elephant\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"elephant\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🦣\",\r\n description: \"mammoth\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"mammoth\"],\r\n tags: [],\r\n unicode_version: \"13.0\",\r\n ios_version: \"14.0\",\r\n },\r\n {\r\n emoji: \"🦏\",\r\n description: \"rhinoceros\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"rhinoceros\"],\r\n tags: [],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n },\r\n {\r\n emoji: \"🦛\",\r\n description: \"hippopotamus\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"hippopotamus\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🐭\",\r\n description: \"mouse face\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"mouse\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🐁\",\r\n description: \"mouse\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"mouse2\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🐀\",\r\n description: \"rat\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"rat\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🐹\",\r\n description: \"hamster\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"hamster\"],\r\n tags: [\"pet\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🐰\",\r\n description: \"rabbit face\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"rabbit\"],\r\n tags: [\"bunny\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🐇\",\r\n description: \"rabbit\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"rabbit2\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🐿️\",\r\n description: \"chipmunk\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"chipmunk\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🦫\",\r\n description: \"beaver\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"beaver\"],\r\n tags: [],\r\n unicode_version: \"13.0\",\r\n ios_version: \"14.0\",\r\n },\r\n {\r\n emoji: \"🦔\",\r\n description: \"hedgehog\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"hedgehog\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🦇\",\r\n description: \"bat\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"bat\"],\r\n tags: [],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n },\r\n {\r\n emoji: \"🐻\",\r\n description: \"bear\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"bear\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🐻‍❄️\",\r\n description: \"polar bear\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"polar_bear\"],\r\n tags: [],\r\n unicode_version: \"13.0\",\r\n ios_version: \"14.0\",\r\n },\r\n {\r\n emoji: \"🐨\",\r\n description: \"koala\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"koala\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🐼\",\r\n description: \"panda\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"panda_face\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🦥\",\r\n description: \"sloth\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"sloth\"],\r\n tags: [],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n },\r\n {\r\n emoji: \"🦦\",\r\n description: \"otter\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"otter\"],\r\n tags: [],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n },\r\n {\r\n emoji: \"🦨\",\r\n description: \"skunk\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"skunk\"],\r\n tags: [],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n },\r\n {\r\n emoji: \"🦘\",\r\n description: \"kangaroo\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"kangaroo\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🦡\",\r\n description: \"badger\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"badger\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🐾\",\r\n description: \"paw prints\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"feet\", \"paw_prints\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🦃\",\r\n description: \"turkey\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"turkey\"],\r\n tags: [\"thanksgiving\"],\r\n unicode_version: \"8.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🐔\",\r\n description: \"chicken\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"chicken\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🐓\",\r\n description: \"rooster\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"rooster\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🐣\",\r\n description: \"hatching chick\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"hatching_chick\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🐤\",\r\n description: \"baby chick\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"baby_chick\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🐥\",\r\n description: \"front-facing baby chick\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"hatched_chick\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🐦\",\r\n description: \"bird\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"bird\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🐧\",\r\n description: \"penguin\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"penguin\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🕊️\",\r\n description: \"dove\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"dove\"],\r\n tags: [\"peace\"],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🦅\",\r\n description: \"eagle\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"eagle\"],\r\n tags: [],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n },\r\n {\r\n emoji: \"🦆\",\r\n description: \"duck\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"duck\"],\r\n tags: [],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n },\r\n {\r\n emoji: \"🦢\",\r\n description: \"swan\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"swan\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🦉\",\r\n description: \"owl\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"owl\"],\r\n tags: [],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n },\r\n {\r\n emoji: \"🦤\",\r\n description: \"dodo\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"dodo\"],\r\n tags: [],\r\n unicode_version: \"13.0\",\r\n ios_version: \"14.0\",\r\n },\r\n {\r\n emoji: \"🪶\",\r\n description: \"feather\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"feather\"],\r\n tags: [],\r\n unicode_version: \"13.0\",\r\n ios_version: \"14.0\",\r\n },\r\n {\r\n emoji: \"🦩\",\r\n description: \"flamingo\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"flamingo\"],\r\n tags: [],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n },\r\n {\r\n emoji: \"🦚\",\r\n description: \"peacock\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"peacock\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🦜\",\r\n description: \"parrot\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"parrot\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🐸\",\r\n description: \"frog\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"frog\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🐊\",\r\n description: \"crocodile\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"crocodile\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🐢\",\r\n description: \"turtle\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"turtle\"],\r\n tags: [\"slow\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🦎\",\r\n description: \"lizard\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"lizard\"],\r\n tags: [],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n },\r\n {\r\n emoji: \"🐍\",\r\n description: \"snake\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"snake\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🐲\",\r\n description: \"dragon face\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"dragon_face\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🐉\",\r\n description: \"dragon\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"dragon\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🦕\",\r\n description: \"sauropod\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"sauropod\"],\r\n tags: [\"dinosaur\"],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🦖\",\r\n description: \"T-Rex\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"t-rex\"],\r\n tags: [\"dinosaur\"],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🐳\",\r\n description: \"spouting whale\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"whale\"],\r\n tags: [\"sea\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🐋\",\r\n description: \"whale\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"whale2\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🐬\",\r\n description: \"dolphin\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"dolphin\", \"flipper\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🦭\",\r\n description: \"seal\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"seal\"],\r\n tags: [],\r\n unicode_version: \"13.0\",\r\n ios_version: \"14.0\",\r\n },\r\n {\r\n emoji: \"🐟\",\r\n description: \"fish\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"fish\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🐠\",\r\n description: \"tropical fish\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"tropical_fish\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🐡\",\r\n description: \"blowfish\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"blowfish\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🦈\",\r\n description: \"shark\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"shark\"],\r\n tags: [],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n },\r\n {\r\n emoji: \"🐙\",\r\n description: \"octopus\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"octopus\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🐚\",\r\n description: \"spiral shell\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"shell\"],\r\n tags: [\"sea\", \"beach\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🐌\",\r\n description: \"snail\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"snail\"],\r\n tags: [\"slow\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🦋\",\r\n description: \"butterfly\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"butterfly\"],\r\n tags: [],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n },\r\n {\r\n emoji: \"🐛\",\r\n description: \"bug\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"bug\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🐜\",\r\n description: \"ant\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"ant\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🐝\",\r\n description: \"honeybee\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"bee\", \"honeybee\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🪲\",\r\n description: \"beetle\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"beetle\"],\r\n tags: [],\r\n unicode_version: \"13.0\",\r\n ios_version: \"14.0\",\r\n },\r\n {\r\n emoji: \"🐞\",\r\n description: \"lady beetle\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"lady_beetle\"],\r\n tags: [\"bug\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🦗\",\r\n description: \"cricket\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"cricket\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🪳\",\r\n description: \"cockroach\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"cockroach\"],\r\n tags: [],\r\n unicode_version: \"13.0\",\r\n ios_version: \"14.0\",\r\n },\r\n {\r\n emoji: \"🕷️\",\r\n description: \"spider\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"spider\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🕸️\",\r\n description: \"spider web\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"spider_web\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🦂\",\r\n description: \"scorpion\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"scorpion\"],\r\n tags: [],\r\n unicode_version: \"8.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🦟\",\r\n description: \"mosquito\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"mosquito\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🪰\",\r\n description: \"fly\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"fly\"],\r\n tags: [],\r\n unicode_version: \"13.0\",\r\n ios_version: \"14.0\",\r\n },\r\n {\r\n emoji: \"🪱\",\r\n description: \"worm\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"worm\"],\r\n tags: [],\r\n unicode_version: \"13.0\",\r\n ios_version: \"14.0\",\r\n },\r\n {\r\n emoji: \"🦠\",\r\n description: \"microbe\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"microbe\"],\r\n tags: [\"germ\"],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"💐\",\r\n description: \"bouquet\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"bouquet\"],\r\n tags: [\"flowers\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🌸\",\r\n description: \"cherry blossom\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"cherry_blossom\"],\r\n tags: [\"flower\", \"spring\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"💮\",\r\n description: \"white flower\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"white_flower\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🏵️\",\r\n description: \"rosette\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"rosette\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🌹\",\r\n description: \"rose\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"rose\"],\r\n tags: [\"flower\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🥀\",\r\n description: \"wilted flower\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"wilted_flower\"],\r\n tags: [],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n },\r\n {\r\n emoji: \"🌺\",\r\n description: \"hibiscus\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"hibiscus\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🌻\",\r\n description: \"sunflower\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"sunflower\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🌼\",\r\n description: \"blossom\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"blossom\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🌷\",\r\n description: \"tulip\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"tulip\"],\r\n tags: [\"flower\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🌱\",\r\n description: \"seedling\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"seedling\"],\r\n tags: [\"plant\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🪴\",\r\n description: \"potted plant\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"potted_plant\"],\r\n tags: [],\r\n unicode_version: \"13.0\",\r\n ios_version: \"14.0\",\r\n },\r\n {\r\n emoji: \"🌲\",\r\n description: \"evergreen tree\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"evergreen_tree\"],\r\n tags: [\"wood\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🌳\",\r\n description: \"deciduous tree\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"deciduous_tree\"],\r\n tags: [\"wood\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🌴\",\r\n description: \"palm tree\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"palm_tree\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🌵\",\r\n description: \"cactus\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"cactus\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🌾\",\r\n description: \"sheaf of rice\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"ear_of_rice\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🌿\",\r\n description: \"herb\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"herb\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"☘️\",\r\n description: \"shamrock\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"shamrock\"],\r\n tags: [],\r\n unicode_version: \"4.1\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🍀\",\r\n description: \"four leaf clover\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"four_leaf_clover\"],\r\n tags: [\"luck\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🍁\",\r\n description: \"maple leaf\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"maple_leaf\"],\r\n tags: [\"canada\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🍂\",\r\n description: \"fallen leaf\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"fallen_leaf\"],\r\n tags: [\"autumn\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🍃\",\r\n description: \"leaf fluttering in wind\",\r\n category: \"Animals & Nature\",\r\n aliases: [\"leaves\"],\r\n tags: [\"leaf\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🍇\",\r\n description: \"grapes\",\r\n category: \"Food & Drink\",\r\n aliases: [\"grapes\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🍈\",\r\n description: \"melon\",\r\n category: \"Food & Drink\",\r\n aliases: [\"melon\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🍉\",\r\n description: \"watermelon\",\r\n category: \"Food & Drink\",\r\n aliases: [\"watermelon\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🍊\",\r\n description: \"tangerine\",\r\n category: \"Food & Drink\",\r\n aliases: [\"tangerine\", \"orange\", \"mandarin\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🍋\",\r\n description: \"lemon\",\r\n category: \"Food & Drink\",\r\n aliases: [\"lemon\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🍌\",\r\n description: \"banana\",\r\n category: \"Food & Drink\",\r\n aliases: [\"banana\"],\r\n tags: [\"fruit\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🍍\",\r\n description: \"pineapple\",\r\n category: \"Food & Drink\",\r\n aliases: [\"pineapple\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🥭\",\r\n description: \"mango\",\r\n category: \"Food & Drink\",\r\n aliases: [\"mango\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🍎\",\r\n description: \"red apple\",\r\n category: \"Food & Drink\",\r\n aliases: [\"apple\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🍏\",\r\n description: \"green apple\",\r\n category: \"Food & Drink\",\r\n aliases: [\"green_apple\"],\r\n tags: [\"fruit\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🍐\",\r\n description: \"pear\",\r\n category: \"Food & Drink\",\r\n aliases: [\"pear\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🍑\",\r\n description: \"peach\",\r\n category: \"Food & Drink\",\r\n aliases: [\"peach\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🍒\",\r\n description: \"cherries\",\r\n category: \"Food & Drink\",\r\n aliases: [\"cherries\"],\r\n tags: [\"fruit\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🍓\",\r\n description: \"strawberry\",\r\n category: \"Food & Drink\",\r\n aliases: [\"strawberry\"],\r\n tags: [\"fruit\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🫐\",\r\n description: \"blueberries\",\r\n category: \"Food & Drink\",\r\n aliases: [\"blueberries\"],\r\n tags: [],\r\n unicode_version: \"13.0\",\r\n ios_version: \"14.0\",\r\n },\r\n {\r\n emoji: \"🥝\",\r\n description: \"kiwi fruit\",\r\n category: \"Food & Drink\",\r\n aliases: [\"kiwi_fruit\"],\r\n tags: [],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n },\r\n {\r\n emoji: \"🍅\",\r\n description: \"tomato\",\r\n category: \"Food & Drink\",\r\n aliases: [\"tomato\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🫒\",\r\n description: \"olive\",\r\n category: \"Food & Drink\",\r\n aliases: [\"olive\"],\r\n tags: [],\r\n unicode_version: \"13.0\",\r\n ios_version: \"14.0\",\r\n },\r\n {\r\n emoji: \"🥥\",\r\n description: \"coconut\",\r\n category: \"Food & Drink\",\r\n aliases: [\"coconut\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🥑\",\r\n description: \"avocado\",\r\n category: \"Food & Drink\",\r\n aliases: [\"avocado\"],\r\n tags: [],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n },\r\n {\r\n emoji: \"🍆\",\r\n description: \"eggplant\",\r\n category: \"Food & Drink\",\r\n aliases: [\"eggplant\"],\r\n tags: [\"aubergine\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🥔\",\r\n description: \"potato\",\r\n category: \"Food & Drink\",\r\n aliases: [\"potato\"],\r\n tags: [],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n },\r\n {\r\n emoji: \"🥕\",\r\n description: \"carrot\",\r\n category: \"Food & Drink\",\r\n aliases: [\"carrot\"],\r\n tags: [],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n },\r\n {\r\n emoji: \"🌽\",\r\n description: \"ear of corn\",\r\n category: \"Food & Drink\",\r\n aliases: [\"corn\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🌶️\",\r\n description: \"hot pepper\",\r\n category: \"Food & Drink\",\r\n aliases: [\"hot_pepper\"],\r\n tags: [\"spicy\"],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🫑\",\r\n description: \"bell pepper\",\r\n category: \"Food & Drink\",\r\n aliases: [\"bell_pepper\"],\r\n tags: [],\r\n unicode_version: \"13.0\",\r\n ios_version: \"14.0\",\r\n },\r\n {\r\n emoji: \"🥒\",\r\n description: \"cucumber\",\r\n category: \"Food & Drink\",\r\n aliases: [\"cucumber\"],\r\n tags: [],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n },\r\n {\r\n emoji: \"🥬\",\r\n description: \"leafy green\",\r\n category: \"Food & Drink\",\r\n aliases: [\"leafy_green\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🥦\",\r\n description: \"broccoli\",\r\n category: \"Food & Drink\",\r\n aliases: [\"broccoli\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🧄\",\r\n description: \"garlic\",\r\n category: \"Food & Drink\",\r\n aliases: [\"garlic\"],\r\n tags: [],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n },\r\n {\r\n emoji: \"🧅\",\r\n description: \"onion\",\r\n category: \"Food & Drink\",\r\n aliases: [\"onion\"],\r\n tags: [],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n },\r\n {\r\n emoji: \"🍄\",\r\n description: \"mushroom\",\r\n category: \"Food & Drink\",\r\n aliases: [\"mushroom\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🥜\",\r\n description: \"peanuts\",\r\n category: \"Food & Drink\",\r\n aliases: [\"peanuts\"],\r\n tags: [],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n },\r\n {\r\n emoji: \"🌰\",\r\n description: \"chestnut\",\r\n category: \"Food & Drink\",\r\n aliases: [\"chestnut\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🍞\",\r\n description: \"bread\",\r\n category: \"Food & Drink\",\r\n aliases: [\"bread\"],\r\n tags: [\"toast\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🥐\",\r\n description: \"croissant\",\r\n category: \"Food & Drink\",\r\n aliases: [\"croissant\"],\r\n tags: [],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n },\r\n {\r\n emoji: \"🥖\",\r\n description: \"baguette bread\",\r\n category: \"Food & Drink\",\r\n aliases: [\"baguette_bread\"],\r\n tags: [],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n },\r\n {\r\n emoji: \"🫓\",\r\n description: \"flatbread\",\r\n category: \"Food & Drink\",\r\n aliases: [\"flatbread\"],\r\n tags: [],\r\n unicode_version: \"13.0\",\r\n ios_version: \"14.0\",\r\n },\r\n {\r\n emoji: \"🥨\",\r\n description: \"pretzel\",\r\n category: \"Food & Drink\",\r\n aliases: [\"pretzel\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🥯\",\r\n description: \"bagel\",\r\n category: \"Food & Drink\",\r\n aliases: [\"bagel\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🥞\",\r\n description: \"pancakes\",\r\n category: \"Food & Drink\",\r\n aliases: [\"pancakes\"],\r\n tags: [],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n },\r\n {\r\n emoji: \"🧇\",\r\n description: \"waffle\",\r\n category: \"Food & Drink\",\r\n aliases: [\"waffle\"],\r\n tags: [],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n },\r\n {\r\n emoji: \"🧀\",\r\n description: \"cheese wedge\",\r\n category: \"Food & Drink\",\r\n aliases: [\"cheese\"],\r\n tags: [],\r\n unicode_version: \"8.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🍖\",\r\n description: \"meat on bone\",\r\n category: \"Food & Drink\",\r\n aliases: [\"meat_on_bone\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🍗\",\r\n description: \"poultry leg\",\r\n category: \"Food & Drink\",\r\n aliases: [\"poultry_leg\"],\r\n tags: [\"meat\", \"chicken\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🥩\",\r\n description: \"cut of meat\",\r\n category: \"Food & Drink\",\r\n aliases: [\"cut_of_meat\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🥓\",\r\n description: \"bacon\",\r\n category: \"Food & Drink\",\r\n aliases: [\"bacon\"],\r\n tags: [],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n },\r\n {\r\n emoji: \"🍔\",\r\n description: \"hamburger\",\r\n category: \"Food & Drink\",\r\n aliases: [\"hamburger\"],\r\n tags: [\"burger\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🍟\",\r\n description: \"french fries\",\r\n category: \"Food & Drink\",\r\n aliases: [\"fries\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🍕\",\r\n description: \"pizza\",\r\n category: \"Food & Drink\",\r\n aliases: [\"pizza\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🌭\",\r\n description: \"hot dog\",\r\n category: \"Food & Drink\",\r\n aliases: [\"hotdog\"],\r\n tags: [],\r\n unicode_version: \"8.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🥪\",\r\n description: \"sandwich\",\r\n category: \"Food & Drink\",\r\n aliases: [\"sandwich\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🌮\",\r\n description: \"taco\",\r\n category: \"Food & Drink\",\r\n aliases: [\"taco\"],\r\n tags: [],\r\n unicode_version: \"8.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🌯\",\r\n description: \"burrito\",\r\n category: \"Food & Drink\",\r\n aliases: [\"burrito\"],\r\n tags: [],\r\n unicode_version: \"8.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🫔\",\r\n description: \"tamale\",\r\n category: \"Food & Drink\",\r\n aliases: [\"tamale\"],\r\n tags: [],\r\n unicode_version: \"13.0\",\r\n ios_version: \"14.0\",\r\n },\r\n {\r\n emoji: \"🥙\",\r\n description: \"stuffed flatbread\",\r\n category: \"Food & Drink\",\r\n aliases: [\"stuffed_flatbread\"],\r\n tags: [],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n },\r\n {\r\n emoji: \"🧆\",\r\n description: \"falafel\",\r\n category: \"Food & Drink\",\r\n aliases: [\"falafel\"],\r\n tags: [],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n },\r\n {\r\n emoji: \"🥚\",\r\n description: \"egg\",\r\n category: \"Food & Drink\",\r\n aliases: [\"egg\"],\r\n tags: [],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n },\r\n {\r\n emoji: \"🍳\",\r\n description: \"cooking\",\r\n category: \"Food & Drink\",\r\n aliases: [\"fried_egg\"],\r\n tags: [\"breakfast\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🥘\",\r\n description: \"shallow pan of food\",\r\n category: \"Food & Drink\",\r\n aliases: [\"shallow_pan_of_food\"],\r\n tags: [\"paella\", \"curry\"],\r\n unicode_version: \"\",\r\n ios_version: \"10.2\",\r\n },\r\n {\r\n emoji: \"🍲\",\r\n description: \"pot of food\",\r\n category: \"Food & Drink\",\r\n aliases: [\"stew\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🫕\",\r\n description: \"fondue\",\r\n category: \"Food & Drink\",\r\n aliases: [\"fondue\"],\r\n tags: [],\r\n unicode_version: \"13.0\",\r\n ios_version: \"14.0\",\r\n },\r\n {\r\n emoji: \"🥣\",\r\n description: \"bowl with spoon\",\r\n category: \"Food & Drink\",\r\n aliases: [\"bowl_with_spoon\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🥗\",\r\n description: \"green salad\",\r\n category: \"Food & Drink\",\r\n aliases: [\"green_salad\"],\r\n tags: [],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n },\r\n {\r\n emoji: \"🍿\",\r\n description: \"popcorn\",\r\n category: \"Food & Drink\",\r\n aliases: [\"popcorn\"],\r\n tags: [],\r\n unicode_version: \"8.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🧈\",\r\n description: \"butter\",\r\n category: \"Food & Drink\",\r\n aliases: [\"butter\"],\r\n tags: [],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n },\r\n {\r\n emoji: \"🧂\",\r\n description: \"salt\",\r\n category: \"Food & Drink\",\r\n aliases: [\"salt\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🥫\",\r\n description: \"canned food\",\r\n category: \"Food & Drink\",\r\n aliases: [\"canned_food\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🍱\",\r\n description: \"bento box\",\r\n category: \"Food & Drink\",\r\n aliases: [\"bento\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🍘\",\r\n description: \"rice cracker\",\r\n category: \"Food & Drink\",\r\n aliases: [\"rice_cracker\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🍙\",\r\n description: \"rice ball\",\r\n category: \"Food & Drink\",\r\n aliases: [\"rice_ball\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🍚\",\r\n description: \"cooked rice\",\r\n category: \"Food & Drink\",\r\n aliases: [\"rice\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🍛\",\r\n description: \"curry rice\",\r\n category: \"Food & Drink\",\r\n aliases: [\"curry\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🍜\",\r\n description: \"steaming bowl\",\r\n category: \"Food & Drink\",\r\n aliases: [\"ramen\"],\r\n tags: [\"noodle\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🍝\",\r\n description: \"spaghetti\",\r\n category: \"Food & Drink\",\r\n aliases: [\"spaghetti\"],\r\n tags: [\"pasta\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🍠\",\r\n description: \"roasted sweet potato\",\r\n category: \"Food & Drink\",\r\n aliases: [\"sweet_potato\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🍢\",\r\n description: \"oden\",\r\n category: \"Food & Drink\",\r\n aliases: [\"oden\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🍣\",\r\n description: \"sushi\",\r\n category: \"Food & Drink\",\r\n aliases: [\"sushi\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🍤\",\r\n description: \"fried shrimp\",\r\n category: \"Food & Drink\",\r\n aliases: [\"fried_shrimp\"],\r\n tags: [\"tempura\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🍥\",\r\n description: \"fish cake with swirl\",\r\n category: \"Food & Drink\",\r\n aliases: [\"fish_cake\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🥮\",\r\n description: \"moon cake\",\r\n category: \"Food & Drink\",\r\n aliases: [\"moon_cake\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🍡\",\r\n description: \"dango\",\r\n category: \"Food & Drink\",\r\n aliases: [\"dango\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🥟\",\r\n description: \"dumpling\",\r\n category: \"Food & Drink\",\r\n aliases: [\"dumpling\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🥠\",\r\n description: \"fortune cookie\",\r\n category: \"Food & Drink\",\r\n aliases: [\"fortune_cookie\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🥡\",\r\n description: \"takeout box\",\r\n category: \"Food & Drink\",\r\n aliases: [\"takeout_box\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🦀\",\r\n description: \"crab\",\r\n category: \"Food & Drink\",\r\n aliases: [\"crab\"],\r\n tags: [],\r\n unicode_version: \"8.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🦞\",\r\n description: \"lobster\",\r\n category: \"Food & Drink\",\r\n aliases: [\"lobster\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🦐\",\r\n description: \"shrimp\",\r\n category: \"Food & Drink\",\r\n aliases: [\"shrimp\"],\r\n tags: [],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n },\r\n {\r\n emoji: \"🦑\",\r\n description: \"squid\",\r\n category: \"Food & Drink\",\r\n aliases: [\"squid\"],\r\n tags: [],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n },\r\n {\r\n emoji: \"🦪\",\r\n description: \"oyster\",\r\n category: \"Food & Drink\",\r\n aliases: [\"oyster\"],\r\n tags: [],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n },\r\n {\r\n emoji: \"🍦\",\r\n description: \"soft ice cream\",\r\n category: \"Food & Drink\",\r\n aliases: [\"icecream\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🍧\",\r\n description: \"shaved ice\",\r\n category: \"Food & Drink\",\r\n aliases: [\"shaved_ice\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🍨\",\r\n description: \"ice cream\",\r\n category: \"Food & Drink\",\r\n aliases: [\"ice_cream\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🍩\",\r\n description: \"doughnut\",\r\n category: \"Food & Drink\",\r\n aliases: [\"doughnut\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🍪\",\r\n description: \"cookie\",\r\n category: \"Food & Drink\",\r\n aliases: [\"cookie\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🎂\",\r\n description: \"birthday cake\",\r\n category: \"Food & Drink\",\r\n aliases: [\"birthday\"],\r\n tags: [\"party\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🍰\",\r\n description: \"shortcake\",\r\n category: \"Food & Drink\",\r\n aliases: [\"cake\"],\r\n tags: [\"dessert\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🧁\",\r\n description: \"cupcake\",\r\n category: \"Food & Drink\",\r\n aliases: [\"cupcake\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🥧\",\r\n description: \"pie\",\r\n category: \"Food & Drink\",\r\n aliases: [\"pie\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🍫\",\r\n description: \"chocolate bar\",\r\n category: \"Food & Drink\",\r\n aliases: [\"chocolate_bar\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🍬\",\r\n description: \"candy\",\r\n category: \"Food & Drink\",\r\n aliases: [\"candy\"],\r\n tags: [\"sweet\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🍭\",\r\n description: \"lollipop\",\r\n category: \"Food & Drink\",\r\n aliases: [\"lollipop\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🍮\",\r\n description: \"custard\",\r\n category: \"Food & Drink\",\r\n aliases: [\"custard\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🍯\",\r\n description: \"honey pot\",\r\n category: \"Food & Drink\",\r\n aliases: [\"honey_pot\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🍼\",\r\n description: \"baby bottle\",\r\n category: \"Food & Drink\",\r\n aliases: [\"baby_bottle\"],\r\n tags: [\"milk\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🥛\",\r\n description: \"glass of milk\",\r\n category: \"Food & Drink\",\r\n aliases: [\"milk_glass\"],\r\n tags: [],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n },\r\n {\r\n emoji: \"☕\",\r\n description: \"hot beverage\",\r\n category: \"Food & Drink\",\r\n aliases: [\"coffee\"],\r\n tags: [\"cafe\", \"espresso\"],\r\n unicode_version: \"4.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🫖\",\r\n description: \"teapot\",\r\n category: \"Food & Drink\",\r\n aliases: [\"teapot\"],\r\n tags: [],\r\n unicode_version: \"13.0\",\r\n ios_version: \"14.0\",\r\n },\r\n {\r\n emoji: \"🍵\",\r\n description: \"teacup without handle\",\r\n category: \"Food & Drink\",\r\n aliases: [\"tea\"],\r\n tags: [\"green\", \"breakfast\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🍶\",\r\n description: \"sake\",\r\n category: \"Food & Drink\",\r\n aliases: [\"sake\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🍾\",\r\n description: \"bottle with popping cork\",\r\n category: \"Food & Drink\",\r\n aliases: [\"champagne\"],\r\n tags: [\"bottle\", \"bubbly\", \"celebration\"],\r\n unicode_version: \"8.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🍷\",\r\n description: \"wine glass\",\r\n category: \"Food & Drink\",\r\n aliases: [\"wine_glass\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🍸\",\r\n description: \"cocktail glass\",\r\n category: \"Food & Drink\",\r\n aliases: [\"cocktail\"],\r\n tags: [\"drink\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🍹\",\r\n description: \"tropical drink\",\r\n category: \"Food & Drink\",\r\n aliases: [\"tropical_drink\"],\r\n tags: [\"summer\", \"vacation\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🍺\",\r\n description: \"beer mug\",\r\n category: \"Food & Drink\",\r\n aliases: [\"beer\"],\r\n tags: [\"drink\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🍻\",\r\n description: \"clinking beer mugs\",\r\n category: \"Food & Drink\",\r\n aliases: [\"beers\"],\r\n tags: [\"drinks\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🥂\",\r\n description: \"clinking glasses\",\r\n category: \"Food & Drink\",\r\n aliases: [\"clinking_glasses\"],\r\n tags: [\"cheers\", \"toast\"],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n },\r\n {\r\n emoji: \"🥃\",\r\n description: \"tumbler glass\",\r\n category: \"Food & Drink\",\r\n aliases: [\"tumbler_glass\"],\r\n tags: [\"whisky\"],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n },\r\n {\r\n emoji: \"🥤\",\r\n description: \"cup with straw\",\r\n category: \"Food & Drink\",\r\n aliases: [\"cup_with_straw\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🧋\",\r\n description: \"bubble tea\",\r\n category: \"Food & Drink\",\r\n aliases: [\"bubble_tea\"],\r\n tags: [],\r\n unicode_version: \"13.0\",\r\n ios_version: \"14.0\",\r\n },\r\n {\r\n emoji: \"🧃\",\r\n description: \"beverage box\",\r\n category: \"Food & Drink\",\r\n aliases: [\"beverage_box\"],\r\n tags: [],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n },\r\n {\r\n emoji: \"🧉\",\r\n description: \"mate\",\r\n category: \"Food & Drink\",\r\n aliases: [\"mate\"],\r\n tags: [],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n },\r\n {\r\n emoji: \"🧊\",\r\n description: \"ice\",\r\n category: \"Food & Drink\",\r\n aliases: [\"ice_cube\"],\r\n tags: [],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n },\r\n {\r\n emoji: \"🥢\",\r\n description: \"chopsticks\",\r\n category: \"Food & Drink\",\r\n aliases: [\"chopsticks\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🍽️\",\r\n description: \"fork and knife with plate\",\r\n category: \"Food & Drink\",\r\n aliases: [\"plate_with_cutlery\"],\r\n tags: [\"dining\", \"dinner\"],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🍴\",\r\n description: \"fork and knife\",\r\n category: \"Food & Drink\",\r\n aliases: [\"fork_and_knife\"],\r\n tags: [\"cutlery\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🥄\",\r\n description: \"spoon\",\r\n category: \"Food & Drink\",\r\n aliases: [\"spoon\"],\r\n tags: [],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n },\r\n {\r\n emoji: \"🔪\",\r\n description: \"kitchen knife\",\r\n category: \"Food & Drink\",\r\n aliases: [\"hocho\", \"knife\"],\r\n tags: [\"cut\", \"chop\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🏺\",\r\n description: \"amphora\",\r\n category: \"Food & Drink\",\r\n aliases: [\"amphora\"],\r\n tags: [],\r\n unicode_version: \"8.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🌍\",\r\n description: \"globe showing Europe-Africa\",\r\n category: \"Travel & Places\",\r\n aliases: [\"earth_africa\"],\r\n tags: [\"globe\", \"world\", \"international\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🌎\",\r\n description: \"globe showing Americas\",\r\n category: \"Travel & Places\",\r\n aliases: [\"earth_americas\"],\r\n tags: [\"globe\", \"world\", \"international\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🌏\",\r\n description: \"globe showing Asia-Australia\",\r\n category: \"Travel & Places\",\r\n aliases: [\"earth_asia\"],\r\n tags: [\"globe\", \"world\", \"international\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🌐\",\r\n description: \"globe with meridians\",\r\n category: \"Travel & Places\",\r\n aliases: [\"globe_with_meridians\"],\r\n tags: [\"world\", \"global\", \"international\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🗺️\",\r\n description: \"world map\",\r\n category: \"Travel & Places\",\r\n aliases: [\"world_map\"],\r\n tags: [\"travel\"],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🗾\",\r\n description: \"map of Japan\",\r\n category: \"Travel & Places\",\r\n aliases: [\"japan\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🧭\",\r\n description: \"compass\",\r\n category: \"Travel & Places\",\r\n aliases: [\"compass\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🏔️\",\r\n description: \"snow-capped mountain\",\r\n category: \"Travel & Places\",\r\n aliases: [\"mountain_snow\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"⛰️\",\r\n description: \"mountain\",\r\n category: \"Travel & Places\",\r\n aliases: [\"mountain\"],\r\n tags: [],\r\n unicode_version: \"5.2\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🌋\",\r\n description: \"volcano\",\r\n category: \"Travel & Places\",\r\n aliases: [\"volcano\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🗻\",\r\n description: \"mount fuji\",\r\n category: \"Travel & Places\",\r\n aliases: [\"mount_fuji\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🏕️\",\r\n description: \"camping\",\r\n category: \"Travel & Places\",\r\n aliases: [\"camping\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🏖️\",\r\n description: \"beach with umbrella\",\r\n category: \"Travel & Places\",\r\n aliases: [\"beach_umbrella\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🏜️\",\r\n description: \"desert\",\r\n category: \"Travel & Places\",\r\n aliases: [\"desert\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🏝️\",\r\n description: \"desert island\",\r\n category: \"Travel & Places\",\r\n aliases: [\"desert_island\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🏞️\",\r\n description: \"national park\",\r\n category: \"Travel & Places\",\r\n aliases: [\"national_park\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🏟️\",\r\n description: \"stadium\",\r\n category: \"Travel & Places\",\r\n aliases: [\"stadium\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🏛️\",\r\n description: \"classical building\",\r\n category: \"Travel & Places\",\r\n aliases: [\"classical_building\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🏗️\",\r\n description: \"building construction\",\r\n category: \"Travel & Places\",\r\n aliases: [\"building_construction\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🧱\",\r\n description: \"brick\",\r\n category: \"Travel & Places\",\r\n aliases: [\"bricks\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🪨\",\r\n description: \"rock\",\r\n category: \"Travel & Places\",\r\n aliases: [\"rock\"],\r\n tags: [],\r\n unicode_version: \"13.0\",\r\n ios_version: \"14.0\",\r\n },\r\n {\r\n emoji: \"🪵\",\r\n description: \"wood\",\r\n category: \"Travel & Places\",\r\n aliases: [\"wood\"],\r\n tags: [],\r\n unicode_version: \"13.0\",\r\n ios_version: \"14.0\",\r\n },\r\n {\r\n emoji: \"🛖\",\r\n description: \"hut\",\r\n category: \"Travel & Places\",\r\n aliases: [\"hut\"],\r\n tags: [],\r\n unicode_version: \"13.0\",\r\n ios_version: \"14.0\",\r\n },\r\n {\r\n emoji: \"🏘️\",\r\n description: \"houses\",\r\n category: \"Travel & Places\",\r\n aliases: [\"houses\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🏚️\",\r\n description: \"derelict house\",\r\n category: \"Travel & Places\",\r\n aliases: [\"derelict_house\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🏠\",\r\n description: \"house\",\r\n category: \"Travel & Places\",\r\n aliases: [\"house\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🏡\",\r\n description: \"house with garden\",\r\n category: \"Travel & Places\",\r\n aliases: [\"house_with_garden\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🏢\",\r\n description: \"office building\",\r\n category: \"Travel & Places\",\r\n aliases: [\"office\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🏣\",\r\n description: \"Japanese post office\",\r\n category: \"Travel & Places\",\r\n aliases: [\"post_office\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🏤\",\r\n description: \"post office\",\r\n category: \"Travel & Places\",\r\n aliases: [\"european_post_office\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🏥\",\r\n description: \"hospital\",\r\n category: \"Travel & Places\",\r\n aliases: [\"hospital\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🏦\",\r\n description: \"bank\",\r\n category: \"Travel & Places\",\r\n aliases: [\"bank\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🏨\",\r\n description: \"hotel\",\r\n category: \"Travel & Places\",\r\n aliases: [\"hotel\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🏩\",\r\n description: \"love hotel\",\r\n category: \"Travel & Places\",\r\n aliases: [\"love_hotel\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🏪\",\r\n description: \"convenience store\",\r\n category: \"Travel & Places\",\r\n aliases: [\"convenience_store\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🏫\",\r\n description: \"school\",\r\n category: \"Travel & Places\",\r\n aliases: [\"school\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🏬\",\r\n description: \"department store\",\r\n category: \"Travel & Places\",\r\n aliases: [\"department_store\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🏭\",\r\n description: \"factory\",\r\n category: \"Travel & Places\",\r\n aliases: [\"factory\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🏯\",\r\n description: \"Japanese castle\",\r\n category: \"Travel & Places\",\r\n aliases: [\"japanese_castle\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🏰\",\r\n description: \"castle\",\r\n category: \"Travel & Places\",\r\n aliases: [\"european_castle\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"💒\",\r\n description: \"wedding\",\r\n category: \"Travel & Places\",\r\n aliases: [\"wedding\"],\r\n tags: [\"marriage\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🗼\",\r\n description: \"Tokyo tower\",\r\n category: \"Travel & Places\",\r\n aliases: [\"tokyo_tower\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🗽\",\r\n description: \"Statue of Liberty\",\r\n category: \"Travel & Places\",\r\n aliases: [\"statue_of_liberty\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"⛪\",\r\n description: \"church\",\r\n category: \"Travel & Places\",\r\n aliases: [\"church\"],\r\n tags: [],\r\n unicode_version: \"5.2\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🕌\",\r\n description: \"mosque\",\r\n category: \"Travel & Places\",\r\n aliases: [\"mosque\"],\r\n tags: [],\r\n unicode_version: \"8.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🛕\",\r\n description: \"hindu temple\",\r\n category: \"Travel & Places\",\r\n aliases: [\"hindu_temple\"],\r\n tags: [],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n },\r\n {\r\n emoji: \"🕍\",\r\n description: \"synagogue\",\r\n category: \"Travel & Places\",\r\n aliases: [\"synagogue\"],\r\n tags: [],\r\n unicode_version: \"8.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"⛩️\",\r\n description: \"shinto shrine\",\r\n category: \"Travel & Places\",\r\n aliases: [\"shinto_shrine\"],\r\n tags: [],\r\n unicode_version: \"5.2\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🕋\",\r\n description: \"kaaba\",\r\n category: \"Travel & Places\",\r\n aliases: [\"kaaba\"],\r\n tags: [],\r\n unicode_version: \"8.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"⛲\",\r\n description: \"fountain\",\r\n category: \"Travel & Places\",\r\n aliases: [\"fountain\"],\r\n tags: [],\r\n unicode_version: \"5.2\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"⛺\",\r\n description: \"tent\",\r\n category: \"Travel & Places\",\r\n aliases: [\"tent\"],\r\n tags: [\"camping\"],\r\n unicode_version: \"5.2\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🌁\",\r\n description: \"foggy\",\r\n category: \"Travel & Places\",\r\n aliases: [\"foggy\"],\r\n tags: [\"karl\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🌃\",\r\n description: \"night with stars\",\r\n category: \"Travel & Places\",\r\n aliases: [\"night_with_stars\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🏙️\",\r\n description: \"cityscape\",\r\n category: \"Travel & Places\",\r\n aliases: [\"cityscape\"],\r\n tags: [\"skyline\"],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🌄\",\r\n description: \"sunrise over mountains\",\r\n category: \"Travel & Places\",\r\n aliases: [\"sunrise_over_mountains\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🌅\",\r\n description: \"sunrise\",\r\n category: \"Travel & Places\",\r\n aliases: [\"sunrise\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🌆\",\r\n description: \"cityscape at dusk\",\r\n category: \"Travel & Places\",\r\n aliases: [\"city_sunset\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🌇\",\r\n description: \"sunset\",\r\n category: \"Travel & Places\",\r\n aliases: [\"city_sunrise\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🌉\",\r\n description: \"bridge at night\",\r\n category: \"Travel & Places\",\r\n aliases: [\"bridge_at_night\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"♨️\",\r\n description: \"hot springs\",\r\n category: \"Travel & Places\",\r\n aliases: [\"hotsprings\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🎠\",\r\n description: \"carousel horse\",\r\n category: \"Travel & Places\",\r\n aliases: [\"carousel_horse\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🎡\",\r\n description: \"ferris wheel\",\r\n category: \"Travel & Places\",\r\n aliases: [\"ferris_wheel\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🎢\",\r\n description: \"roller coaster\",\r\n category: \"Travel & Places\",\r\n aliases: [\"roller_coaster\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"💈\",\r\n description: \"barber pole\",\r\n category: \"Travel & Places\",\r\n aliases: [\"barber\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🎪\",\r\n description: \"circus tent\",\r\n category: \"Travel & Places\",\r\n aliases: [\"circus_tent\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🚂\",\r\n description: \"locomotive\",\r\n category: \"Travel & Places\",\r\n aliases: [\"steam_locomotive\"],\r\n tags: [\"train\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🚃\",\r\n description: \"railway car\",\r\n category: \"Travel & Places\",\r\n aliases: [\"railway_car\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🚄\",\r\n description: \"high-speed train\",\r\n category: \"Travel & Places\",\r\n aliases: [\"bullettrain_side\"],\r\n tags: [\"train\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🚅\",\r\n description: \"bullet train\",\r\n category: \"Travel & Places\",\r\n aliases: [\"bullettrain_front\"],\r\n tags: [\"train\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🚆\",\r\n description: \"train\",\r\n category: \"Travel & Places\",\r\n aliases: [\"train2\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🚇\",\r\n description: \"metro\",\r\n category: \"Travel & Places\",\r\n aliases: [\"metro\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🚈\",\r\n description: \"light rail\",\r\n category: \"Travel & Places\",\r\n aliases: [\"light_rail\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🚉\",\r\n description: \"station\",\r\n category: \"Travel & Places\",\r\n aliases: [\"station\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🚊\",\r\n description: \"tram\",\r\n category: \"Travel & Places\",\r\n aliases: [\"tram\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🚝\",\r\n description: \"monorail\",\r\n category: \"Travel & Places\",\r\n aliases: [\"monorail\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🚞\",\r\n description: \"mountain railway\",\r\n category: \"Travel & Places\",\r\n aliases: [\"mountain_railway\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🚋\",\r\n description: \"tram car\",\r\n category: \"Travel & Places\",\r\n aliases: [\"train\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🚌\",\r\n description: \"bus\",\r\n category: \"Travel & Places\",\r\n aliases: [\"bus\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🚍\",\r\n description: \"oncoming bus\",\r\n category: \"Travel & Places\",\r\n aliases: [\"oncoming_bus\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🚎\",\r\n description: \"trolleybus\",\r\n category: \"Travel & Places\",\r\n aliases: [\"trolleybus\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🚐\",\r\n description: \"minibus\",\r\n category: \"Travel & Places\",\r\n aliases: [\"minibus\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🚑\",\r\n description: \"ambulance\",\r\n category: \"Travel & Places\",\r\n aliases: [\"ambulance\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🚒\",\r\n description: \"fire engine\",\r\n category: \"Travel & Places\",\r\n aliases: [\"fire_engine\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🚓\",\r\n description: \"police car\",\r\n category: \"Travel & Places\",\r\n aliases: [\"police_car\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🚔\",\r\n description: \"oncoming police car\",\r\n category: \"Travel & Places\",\r\n aliases: [\"oncoming_police_car\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🚕\",\r\n description: \"taxi\",\r\n category: \"Travel & Places\",\r\n aliases: [\"taxi\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🚖\",\r\n description: \"oncoming taxi\",\r\n category: \"Travel & Places\",\r\n aliases: [\"oncoming_taxi\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🚗\",\r\n description: \"automobile\",\r\n category: \"Travel & Places\",\r\n aliases: [\"car\", \"red_car\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🚘\",\r\n description: \"oncoming automobile\",\r\n category: \"Travel & Places\",\r\n aliases: [\"oncoming_automobile\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🚙\",\r\n description: \"sport utility vehicle\",\r\n category: \"Travel & Places\",\r\n aliases: [\"blue_car\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🛻\",\r\n description: \"pickup truck\",\r\n category: \"Travel & Places\",\r\n aliases: [\"pickup_truck\"],\r\n tags: [],\r\n unicode_version: \"13.0\",\r\n ios_version: \"14.0\",\r\n },\r\n {\r\n emoji: \"🚚\",\r\n description: \"delivery truck\",\r\n category: \"Travel & Places\",\r\n aliases: [\"truck\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🚛\",\r\n description: \"articulated lorry\",\r\n category: \"Travel & Places\",\r\n aliases: [\"articulated_lorry\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🚜\",\r\n description: \"tractor\",\r\n category: \"Travel & Places\",\r\n aliases: [\"tractor\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🏎️\",\r\n description: \"racing car\",\r\n category: \"Travel & Places\",\r\n aliases: [\"racing_car\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🏍️\",\r\n description: \"motorcycle\",\r\n category: \"Travel & Places\",\r\n aliases: [\"motorcycle\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🛵\",\r\n description: \"motor scooter\",\r\n category: \"Travel & Places\",\r\n aliases: [\"motor_scooter\"],\r\n tags: [],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n },\r\n {\r\n emoji: \"🦽\",\r\n description: \"manual wheelchair\",\r\n category: \"Travel & Places\",\r\n aliases: [\"manual_wheelchair\"],\r\n tags: [],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n },\r\n {\r\n emoji: \"🦼\",\r\n description: \"motorized wheelchair\",\r\n category: \"Travel & Places\",\r\n aliases: [\"motorized_wheelchair\"],\r\n tags: [],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n },\r\n {\r\n emoji: \"🛺\",\r\n description: \"auto rickshaw\",\r\n category: \"Travel & Places\",\r\n aliases: [\"auto_rickshaw\"],\r\n tags: [],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n },\r\n {\r\n emoji: \"🚲\",\r\n description: \"bicycle\",\r\n category: \"Travel & Places\",\r\n aliases: [\"bike\"],\r\n tags: [\"bicycle\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🛴\",\r\n description: \"kick scooter\",\r\n category: \"Travel & Places\",\r\n aliases: [\"kick_scooter\"],\r\n tags: [],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n },\r\n {\r\n emoji: \"🛹\",\r\n description: \"skateboard\",\r\n category: \"Travel & Places\",\r\n aliases: [\"skateboard\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🛼\",\r\n description: \"roller skate\",\r\n category: \"Travel & Places\",\r\n aliases: [\"roller_skate\"],\r\n tags: [],\r\n unicode_version: \"13.0\",\r\n ios_version: \"14.0\",\r\n },\r\n {\r\n emoji: \"🚏\",\r\n description: \"bus stop\",\r\n category: \"Travel & Places\",\r\n aliases: [\"busstop\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🛣️\",\r\n description: \"motorway\",\r\n category: \"Travel & Places\",\r\n aliases: [\"motorway\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🛤️\",\r\n description: \"railway track\",\r\n category: \"Travel & Places\",\r\n aliases: [\"railway_track\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🛢️\",\r\n description: \"oil drum\",\r\n category: \"Travel & Places\",\r\n aliases: [\"oil_drum\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"⛽\",\r\n description: \"fuel pump\",\r\n category: \"Travel & Places\",\r\n aliases: [\"fuelpump\"],\r\n tags: [],\r\n unicode_version: \"5.2\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🚨\",\r\n description: \"police car light\",\r\n category: \"Travel & Places\",\r\n aliases: [\"rotating_light\"],\r\n tags: [\"911\", \"emergency\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🚥\",\r\n description: \"horizontal traffic light\",\r\n category: \"Travel & Places\",\r\n aliases: [\"traffic_light\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🚦\",\r\n description: \"vertical traffic light\",\r\n category: \"Travel & Places\",\r\n aliases: [\"vertical_traffic_light\"],\r\n tags: [\"semaphore\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🛑\",\r\n description: \"stop sign\",\r\n category: \"Travel & Places\",\r\n aliases: [\"stop_sign\"],\r\n tags: [],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n },\r\n {\r\n emoji: \"🚧\",\r\n description: \"construction\",\r\n category: \"Travel & Places\",\r\n aliases: [\"construction\"],\r\n tags: [\"wip\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"⚓\",\r\n description: \"anchor\",\r\n category: \"Travel & Places\",\r\n aliases: [\"anchor\"],\r\n tags: [\"ship\"],\r\n unicode_version: \"4.1\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"⛵\",\r\n description: \"sailboat\",\r\n category: \"Travel & Places\",\r\n aliases: [\"boat\", \"sailboat\"],\r\n tags: [],\r\n unicode_version: \"5.2\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🛶\",\r\n description: \"canoe\",\r\n category: \"Travel & Places\",\r\n aliases: [\"canoe\"],\r\n tags: [],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n },\r\n {\r\n emoji: \"🚤\",\r\n description: \"speedboat\",\r\n category: \"Travel & Places\",\r\n aliases: [\"speedboat\"],\r\n tags: [\"ship\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🛳️\",\r\n description: \"passenger ship\",\r\n category: \"Travel & Places\",\r\n aliases: [\"passenger_ship\"],\r\n tags: [\"cruise\"],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"⛴️\",\r\n description: \"ferry\",\r\n category: \"Travel & Places\",\r\n aliases: [\"ferry\"],\r\n tags: [],\r\n unicode_version: \"5.2\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🛥️\",\r\n description: \"motor boat\",\r\n category: \"Travel & Places\",\r\n aliases: [\"motor_boat\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🚢\",\r\n description: \"ship\",\r\n category: \"Travel & Places\",\r\n aliases: [\"ship\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"✈️\",\r\n description: \"airplane\",\r\n category: \"Travel & Places\",\r\n aliases: [\"airplane\"],\r\n tags: [\"flight\"],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🛩️\",\r\n description: \"small airplane\",\r\n category: \"Travel & Places\",\r\n aliases: [\"small_airplane\"],\r\n tags: [\"flight\"],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🛫\",\r\n description: \"airplane departure\",\r\n category: \"Travel & Places\",\r\n aliases: [\"flight_departure\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🛬\",\r\n description: \"airplane arrival\",\r\n category: \"Travel & Places\",\r\n aliases: [\"flight_arrival\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🪂\",\r\n description: \"parachute\",\r\n category: \"Travel & Places\",\r\n aliases: [\"parachute\"],\r\n tags: [],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n },\r\n {\r\n emoji: \"💺\",\r\n description: \"seat\",\r\n category: \"Travel & Places\",\r\n aliases: [\"seat\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🚁\",\r\n description: \"helicopter\",\r\n category: \"Travel & Places\",\r\n aliases: [\"helicopter\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🚟\",\r\n description: \"suspension railway\",\r\n category: \"Travel & Places\",\r\n aliases: [\"suspension_railway\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🚠\",\r\n description: \"mountain cableway\",\r\n category: \"Travel & Places\",\r\n aliases: [\"mountain_cableway\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🚡\",\r\n description: \"aerial tramway\",\r\n category: \"Travel & Places\",\r\n aliases: [\"aerial_tramway\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🛰️\",\r\n description: \"satellite\",\r\n category: \"Travel & Places\",\r\n aliases: [\"artificial_satellite\"],\r\n tags: [\"orbit\", \"space\"],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🚀\",\r\n description: \"rocket\",\r\n category: \"Travel & Places\",\r\n aliases: [\"rocket\"],\r\n tags: [\"ship\", \"launch\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🛸\",\r\n description: \"flying saucer\",\r\n category: \"Travel & Places\",\r\n aliases: [\"flying_saucer\"],\r\n tags: [\"ufo\"],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🛎️\",\r\n description: \"bellhop bell\",\r\n category: \"Travel & Places\",\r\n aliases: [\"bellhop_bell\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🧳\",\r\n description: \"luggage\",\r\n category: \"Travel & Places\",\r\n aliases: [\"luggage\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"⌛\",\r\n description: \"hourglass done\",\r\n category: \"Travel & Places\",\r\n aliases: [\"hourglass\"],\r\n tags: [\"time\"],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"⏳\",\r\n description: \"hourglass not done\",\r\n category: \"Travel & Places\",\r\n aliases: [\"hourglass_flowing_sand\"],\r\n tags: [\"time\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"⌚\",\r\n description: \"watch\",\r\n category: \"Travel & Places\",\r\n aliases: [\"watch\"],\r\n tags: [\"time\"],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"⏰\",\r\n description: \"alarm clock\",\r\n category: \"Travel & Places\",\r\n aliases: [\"alarm_clock\"],\r\n tags: [\"morning\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"⏱️\",\r\n description: \"stopwatch\",\r\n category: \"Travel & Places\",\r\n aliases: [\"stopwatch\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"⏲️\",\r\n description: \"timer clock\",\r\n category: \"Travel & Places\",\r\n aliases: [\"timer_clock\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🕰️\",\r\n description: \"mantelpiece clock\",\r\n category: \"Travel & Places\",\r\n aliases: [\"mantelpiece_clock\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🕛\",\r\n description: \"twelve o’clock\",\r\n category: \"Travel & Places\",\r\n aliases: [\"clock12\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🕧\",\r\n description: \"twelve-thirty\",\r\n category: \"Travel & Places\",\r\n aliases: [\"clock1230\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🕐\",\r\n description: \"one o’clock\",\r\n category: \"Travel & Places\",\r\n aliases: [\"clock1\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🕜\",\r\n description: \"one-thirty\",\r\n category: \"Travel & Places\",\r\n aliases: [\"clock130\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🕑\",\r\n description: \"two o’clock\",\r\n category: \"Travel & Places\",\r\n aliases: [\"clock2\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🕝\",\r\n description: \"two-thirty\",\r\n category: \"Travel & Places\",\r\n aliases: [\"clock230\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🕒\",\r\n description: \"three o’clock\",\r\n category: \"Travel & Places\",\r\n aliases: [\"clock3\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🕞\",\r\n description: \"three-thirty\",\r\n category: \"Travel & Places\",\r\n aliases: [\"clock330\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🕓\",\r\n description: \"four o’clock\",\r\n category: \"Travel & Places\",\r\n aliases: [\"clock4\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🕟\",\r\n description: \"four-thirty\",\r\n category: \"Travel & Places\",\r\n aliases: [\"clock430\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🕔\",\r\n description: \"five o’clock\",\r\n category: \"Travel & Places\",\r\n aliases: [\"clock5\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🕠\",\r\n description: \"five-thirty\",\r\n category: \"Travel & Places\",\r\n aliases: [\"clock530\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🕕\",\r\n description: \"six o’clock\",\r\n category: \"Travel & Places\",\r\n aliases: [\"clock6\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🕡\",\r\n description: \"six-thirty\",\r\n category: \"Travel & Places\",\r\n aliases: [\"clock630\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🕖\",\r\n description: \"seven o’clock\",\r\n category: \"Travel & Places\",\r\n aliases: [\"clock7\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🕢\",\r\n description: \"seven-thirty\",\r\n category: \"Travel & Places\",\r\n aliases: [\"clock730\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🕗\",\r\n description: \"eight o’clock\",\r\n category: \"Travel & Places\",\r\n aliases: [\"clock8\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🕣\",\r\n description: \"eight-thirty\",\r\n category: \"Travel & Places\",\r\n aliases: [\"clock830\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🕘\",\r\n description: \"nine o’clock\",\r\n category: \"Travel & Places\",\r\n aliases: [\"clock9\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🕤\",\r\n description: \"nine-thirty\",\r\n category: \"Travel & Places\",\r\n aliases: [\"clock930\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🕙\",\r\n description: \"ten o’clock\",\r\n category: \"Travel & Places\",\r\n aliases: [\"clock10\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🕥\",\r\n description: \"ten-thirty\",\r\n category: \"Travel & Places\",\r\n aliases: [\"clock1030\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🕚\",\r\n description: \"eleven o’clock\",\r\n category: \"Travel & Places\",\r\n aliases: [\"clock11\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🕦\",\r\n description: \"eleven-thirty\",\r\n category: \"Travel & Places\",\r\n aliases: [\"clock1130\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🌑\",\r\n description: \"new moon\",\r\n category: \"Travel & Places\",\r\n aliases: [\"new_moon\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🌒\",\r\n description: \"waxing crescent moon\",\r\n category: \"Travel & Places\",\r\n aliases: [\"waxing_crescent_moon\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🌓\",\r\n description: \"first quarter moon\",\r\n category: \"Travel & Places\",\r\n aliases: [\"first_quarter_moon\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🌔\",\r\n description: \"waxing gibbous moon\",\r\n category: \"Travel & Places\",\r\n aliases: [\"moon\", \"waxing_gibbous_moon\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🌕\",\r\n description: \"full moon\",\r\n category: \"Travel & Places\",\r\n aliases: [\"full_moon\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🌖\",\r\n description: \"waning gibbous moon\",\r\n category: \"Travel & Places\",\r\n aliases: [\"waning_gibbous_moon\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🌗\",\r\n description: \"last quarter moon\",\r\n category: \"Travel & Places\",\r\n aliases: [\"last_quarter_moon\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🌘\",\r\n description: \"waning crescent moon\",\r\n category: \"Travel & Places\",\r\n aliases: [\"waning_crescent_moon\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🌙\",\r\n description: \"crescent moon\",\r\n category: \"Travel & Places\",\r\n aliases: [\"crescent_moon\"],\r\n tags: [\"night\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🌚\",\r\n description: \"new moon face\",\r\n category: \"Travel & Places\",\r\n aliases: [\"new_moon_with_face\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🌛\",\r\n description: \"first quarter moon face\",\r\n category: \"Travel & Places\",\r\n aliases: [\"first_quarter_moon_with_face\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🌜\",\r\n description: \"last quarter moon face\",\r\n category: \"Travel & Places\",\r\n aliases: [\"last_quarter_moon_with_face\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🌡️\",\r\n description: \"thermometer\",\r\n category: \"Travel & Places\",\r\n aliases: [\"thermometer\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"☀️\",\r\n description: \"sun\",\r\n category: \"Travel & Places\",\r\n aliases: [\"sunny\"],\r\n tags: [\"weather\"],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🌝\",\r\n description: \"full moon face\",\r\n category: \"Travel & Places\",\r\n aliases: [\"full_moon_with_face\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🌞\",\r\n description: \"sun with face\",\r\n category: \"Travel & Places\",\r\n aliases: [\"sun_with_face\"],\r\n tags: [\"summer\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🪐\",\r\n description: \"ringed planet\",\r\n category: \"Travel & Places\",\r\n aliases: [\"ringed_planet\"],\r\n tags: [],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n },\r\n {\r\n emoji: \"⭐\",\r\n description: \"star\",\r\n category: \"Travel & Places\",\r\n aliases: [\"star\"],\r\n tags: [],\r\n unicode_version: \"5.1\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🌟\",\r\n description: \"glowing star\",\r\n category: \"Travel & Places\",\r\n aliases: [\"star2\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🌠\",\r\n description: \"shooting star\",\r\n category: \"Travel & Places\",\r\n aliases: [\"stars\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🌌\",\r\n description: \"milky way\",\r\n category: \"Travel & Places\",\r\n aliases: [\"milky_way\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"☁️\",\r\n description: \"cloud\",\r\n category: \"Travel & Places\",\r\n aliases: [\"cloud\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"⛅\",\r\n description: \"sun behind cloud\",\r\n category: \"Travel & Places\",\r\n aliases: [\"partly_sunny\"],\r\n tags: [\"weather\", \"cloud\"],\r\n unicode_version: \"5.2\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"⛈️\",\r\n description: \"cloud with lightning and rain\",\r\n category: \"Travel & Places\",\r\n aliases: [\"cloud_with_lightning_and_rain\"],\r\n tags: [],\r\n unicode_version: \"5.2\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🌤️\",\r\n description: \"sun behind small cloud\",\r\n category: \"Travel & Places\",\r\n aliases: [\"sun_behind_small_cloud\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🌥️\",\r\n description: \"sun behind large cloud\",\r\n category: \"Travel & Places\",\r\n aliases: [\"sun_behind_large_cloud\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🌦️\",\r\n description: \"sun behind rain cloud\",\r\n category: \"Travel & Places\",\r\n aliases: [\"sun_behind_rain_cloud\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🌧️\",\r\n description: \"cloud with rain\",\r\n category: \"Travel & Places\",\r\n aliases: [\"cloud_with_rain\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🌨️\",\r\n description: \"cloud with snow\",\r\n category: \"Travel & Places\",\r\n aliases: [\"cloud_with_snow\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🌩️\",\r\n description: \"cloud with lightning\",\r\n category: \"Travel & Places\",\r\n aliases: [\"cloud_with_lightning\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🌪️\",\r\n description: \"tornado\",\r\n category: \"Travel & Places\",\r\n aliases: [\"tornado\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🌫️\",\r\n description: \"fog\",\r\n category: \"Travel & Places\",\r\n aliases: [\"fog\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🌬️\",\r\n description: \"wind face\",\r\n category: \"Travel & Places\",\r\n aliases: [\"wind_face\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🌀\",\r\n description: \"cyclone\",\r\n category: \"Travel & Places\",\r\n aliases: [\"cyclone\"],\r\n tags: [\"swirl\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🌈\",\r\n description: \"rainbow\",\r\n category: \"Travel & Places\",\r\n aliases: [\"rainbow\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🌂\",\r\n description: \"closed umbrella\",\r\n category: \"Travel & Places\",\r\n aliases: [\"closed_umbrella\"],\r\n tags: [\"weather\", \"rain\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"☂️\",\r\n description: \"umbrella\",\r\n category: \"Travel & Places\",\r\n aliases: [\"open_umbrella\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"☔\",\r\n description: \"umbrella with rain drops\",\r\n category: \"Travel & Places\",\r\n aliases: [\"umbrella\"],\r\n tags: [\"rain\", \"weather\"],\r\n unicode_version: \"4.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"⛱️\",\r\n description: \"umbrella on ground\",\r\n category: \"Travel & Places\",\r\n aliases: [\"parasol_on_ground\"],\r\n tags: [\"beach_umbrella\"],\r\n unicode_version: \"5.2\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"⚡\",\r\n description: \"high voltage\",\r\n category: \"Travel & Places\",\r\n aliases: [\"zap\"],\r\n tags: [\"lightning\", \"thunder\"],\r\n unicode_version: \"4.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"❄️\",\r\n description: \"snowflake\",\r\n category: \"Travel & Places\",\r\n aliases: [\"snowflake\"],\r\n tags: [\"winter\", \"cold\", \"weather\"],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"☃️\",\r\n description: \"snowman\",\r\n category: \"Travel & Places\",\r\n aliases: [\"snowman_with_snow\"],\r\n tags: [\"winter\", \"christmas\"],\r\n unicode_version: \"\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"⛄\",\r\n description: \"snowman without snow\",\r\n category: \"Travel & Places\",\r\n aliases: [\"snowman\"],\r\n tags: [\"winter\"],\r\n unicode_version: \"5.2\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"☄️\",\r\n description: \"comet\",\r\n category: \"Travel & Places\",\r\n aliases: [\"comet\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🔥\",\r\n description: \"fire\",\r\n category: \"Travel & Places\",\r\n aliases: [\"fire\"],\r\n tags: [\"burn\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"💧\",\r\n description: \"droplet\",\r\n category: \"Travel & Places\",\r\n aliases: [\"droplet\"],\r\n tags: [\"water\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🌊\",\r\n description: \"water wave\",\r\n category: \"Travel & Places\",\r\n aliases: [\"ocean\"],\r\n tags: [\"sea\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🎃\",\r\n description: \"jack-o-lantern\",\r\n category: \"Activities\",\r\n aliases: [\"jack_o_lantern\"],\r\n tags: [\"halloween\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🎄\",\r\n description: \"Christmas tree\",\r\n category: \"Activities\",\r\n aliases: [\"christmas_tree\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🎆\",\r\n description: \"fireworks\",\r\n category: \"Activities\",\r\n aliases: [\"fireworks\"],\r\n tags: [\"festival\", \"celebration\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🎇\",\r\n description: \"sparkler\",\r\n category: \"Activities\",\r\n aliases: [\"sparkler\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🧨\",\r\n description: \"firecracker\",\r\n category: \"Activities\",\r\n aliases: [\"firecracker\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"✨\",\r\n description: \"sparkles\",\r\n category: \"Activities\",\r\n aliases: [\"sparkles\"],\r\n tags: [\"shiny\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🎈\",\r\n description: \"balloon\",\r\n category: \"Activities\",\r\n aliases: [\"balloon\"],\r\n tags: [\"party\", \"birthday\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🎉\",\r\n description: \"party popper\",\r\n category: \"Activities\",\r\n aliases: [\"tada\"],\r\n tags: [\"hooray\", \"party\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🎊\",\r\n description: \"confetti ball\",\r\n category: \"Activities\",\r\n aliases: [\"confetti_ball\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🎋\",\r\n description: \"tanabata tree\",\r\n category: \"Activities\",\r\n aliases: [\"tanabata_tree\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🎍\",\r\n description: \"pine decoration\",\r\n category: \"Activities\",\r\n aliases: [\"bamboo\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🎎\",\r\n description: \"Japanese dolls\",\r\n category: \"Activities\",\r\n aliases: [\"dolls\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🎏\",\r\n description: \"carp streamer\",\r\n category: \"Activities\",\r\n aliases: [\"flags\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🎐\",\r\n description: \"wind chime\",\r\n category: \"Activities\",\r\n aliases: [\"wind_chime\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🎑\",\r\n description: \"moon viewing ceremony\",\r\n category: \"Activities\",\r\n aliases: [\"rice_scene\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🧧\",\r\n description: \"red envelope\",\r\n category: \"Activities\",\r\n aliases: [\"red_envelope\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🎀\",\r\n description: \"ribbon\",\r\n category: \"Activities\",\r\n aliases: [\"ribbon\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🎁\",\r\n description: \"wrapped gift\",\r\n category: \"Activities\",\r\n aliases: [\"gift\"],\r\n tags: [\"present\", \"birthday\", \"christmas\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🎗️\",\r\n description: \"reminder ribbon\",\r\n category: \"Activities\",\r\n aliases: [\"reminder_ribbon\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🎟️\",\r\n description: \"admission tickets\",\r\n category: \"Activities\",\r\n aliases: [\"tickets\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🎫\",\r\n description: \"ticket\",\r\n category: \"Activities\",\r\n aliases: [\"ticket\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🎖️\",\r\n description: \"military medal\",\r\n category: \"Activities\",\r\n aliases: [\"medal_military\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🏆\",\r\n description: \"trophy\",\r\n category: \"Activities\",\r\n aliases: [\"trophy\"],\r\n tags: [\"award\", \"contest\", \"winner\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🏅\",\r\n description: \"sports medal\",\r\n category: \"Activities\",\r\n aliases: [\"medal_sports\"],\r\n tags: [\"gold\", \"winner\"],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🥇\",\r\n description: \"1st place medal\",\r\n category: \"Activities\",\r\n aliases: [\"1st_place_medal\"],\r\n tags: [\"gold\"],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n },\r\n {\r\n emoji: \"🥈\",\r\n description: \"2nd place medal\",\r\n category: \"Activities\",\r\n aliases: [\"2nd_place_medal\"],\r\n tags: [\"silver\"],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n },\r\n {\r\n emoji: \"🥉\",\r\n description: \"3rd place medal\",\r\n category: \"Activities\",\r\n aliases: [\"3rd_place_medal\"],\r\n tags: [\"bronze\"],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n },\r\n {\r\n emoji: \"⚽\",\r\n description: \"soccer ball\",\r\n category: \"Activities\",\r\n aliases: [\"soccer\"],\r\n tags: [\"sports\"],\r\n unicode_version: \"5.2\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"⚾\",\r\n description: \"baseball\",\r\n category: \"Activities\",\r\n aliases: [\"baseball\"],\r\n tags: [\"sports\"],\r\n unicode_version: \"5.2\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🥎\",\r\n description: \"softball\",\r\n category: \"Activities\",\r\n aliases: [\"softball\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🏀\",\r\n description: \"basketball\",\r\n category: \"Activities\",\r\n aliases: [\"basketball\"],\r\n tags: [\"sports\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🏐\",\r\n description: \"volleyball\",\r\n category: \"Activities\",\r\n aliases: [\"volleyball\"],\r\n tags: [],\r\n unicode_version: \"8.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🏈\",\r\n description: \"american football\",\r\n category: \"Activities\",\r\n aliases: [\"football\"],\r\n tags: [\"sports\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🏉\",\r\n description: \"rugby football\",\r\n category: \"Activities\",\r\n aliases: [\"rugby_football\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🎾\",\r\n description: \"tennis\",\r\n category: \"Activities\",\r\n aliases: [\"tennis\"],\r\n tags: [\"sports\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🥏\",\r\n description: \"flying disc\",\r\n category: \"Activities\",\r\n aliases: [\"flying_disc\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🎳\",\r\n description: \"bowling\",\r\n category: \"Activities\",\r\n aliases: [\"bowling\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🏏\",\r\n description: \"cricket game\",\r\n category: \"Activities\",\r\n aliases: [\"cricket_game\"],\r\n tags: [],\r\n unicode_version: \"8.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🏑\",\r\n description: \"field hockey\",\r\n category: \"Activities\",\r\n aliases: [\"field_hockey\"],\r\n tags: [],\r\n unicode_version: \"8.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🏒\",\r\n description: \"ice hockey\",\r\n category: \"Activities\",\r\n aliases: [\"ice_hockey\"],\r\n tags: [],\r\n unicode_version: \"8.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🥍\",\r\n description: \"lacrosse\",\r\n category: \"Activities\",\r\n aliases: [\"lacrosse\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🏓\",\r\n description: \"ping pong\",\r\n category: \"Activities\",\r\n aliases: [\"ping_pong\"],\r\n tags: [],\r\n unicode_version: \"8.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🏸\",\r\n description: \"badminton\",\r\n category: \"Activities\",\r\n aliases: [\"badminton\"],\r\n tags: [],\r\n unicode_version: \"8.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🥊\",\r\n description: \"boxing glove\",\r\n category: \"Activities\",\r\n aliases: [\"boxing_glove\"],\r\n tags: [],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n },\r\n {\r\n emoji: \"🥋\",\r\n description: \"martial arts uniform\",\r\n category: \"Activities\",\r\n aliases: [\"martial_arts_uniform\"],\r\n tags: [],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n },\r\n {\r\n emoji: \"🥅\",\r\n description: \"goal net\",\r\n category: \"Activities\",\r\n aliases: [\"goal_net\"],\r\n tags: [],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n },\r\n {\r\n emoji: \"⛳\",\r\n description: \"flag in hole\",\r\n category: \"Activities\",\r\n aliases: [\"golf\"],\r\n tags: [],\r\n unicode_version: \"5.2\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"⛸️\",\r\n description: \"ice skate\",\r\n category: \"Activities\",\r\n aliases: [\"ice_skate\"],\r\n tags: [\"skating\"],\r\n unicode_version: \"5.2\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🎣\",\r\n description: \"fishing pole\",\r\n category: \"Activities\",\r\n aliases: [\"fishing_pole_and_fish\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🤿\",\r\n description: \"diving mask\",\r\n category: \"Activities\",\r\n aliases: [\"diving_mask\"],\r\n tags: [],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n },\r\n {\r\n emoji: \"🎽\",\r\n description: \"running shirt\",\r\n category: \"Activities\",\r\n aliases: [\"running_shirt_with_sash\"],\r\n tags: [\"marathon\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🎿\",\r\n description: \"skis\",\r\n category: \"Activities\",\r\n aliases: [\"ski\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🛷\",\r\n description: \"sled\",\r\n category: \"Activities\",\r\n aliases: [\"sled\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🥌\",\r\n description: \"curling stone\",\r\n category: \"Activities\",\r\n aliases: [\"curling_stone\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🎯\",\r\n description: \"bullseye\",\r\n category: \"Activities\",\r\n aliases: [\"dart\"],\r\n tags: [\"target\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🪀\",\r\n description: \"yo-yo\",\r\n category: \"Activities\",\r\n aliases: [\"yo_yo\"],\r\n tags: [],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n },\r\n {\r\n emoji: \"🪁\",\r\n description: \"kite\",\r\n category: \"Activities\",\r\n aliases: [\"kite\"],\r\n tags: [],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n },\r\n {\r\n emoji: \"🎱\",\r\n description: \"pool 8 ball\",\r\n category: \"Activities\",\r\n aliases: [\"8ball\"],\r\n tags: [\"pool\", \"billiards\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🔮\",\r\n description: \"crystal ball\",\r\n category: \"Activities\",\r\n aliases: [\"crystal_ball\"],\r\n tags: [\"fortune\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🪄\",\r\n description: \"magic wand\",\r\n category: \"Activities\",\r\n aliases: [\"magic_wand\"],\r\n tags: [],\r\n unicode_version: \"13.0\",\r\n ios_version: \"14.0\",\r\n },\r\n {\r\n emoji: \"🧿\",\r\n description: \"nazar amulet\",\r\n category: \"Activities\",\r\n aliases: [\"nazar_amulet\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🎮\",\r\n description: \"video game\",\r\n category: \"Activities\",\r\n aliases: [\"video_game\"],\r\n tags: [\"play\", \"controller\", \"console\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🕹️\",\r\n description: \"joystick\",\r\n category: \"Activities\",\r\n aliases: [\"joystick\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🎰\",\r\n description: \"slot machine\",\r\n category: \"Activities\",\r\n aliases: [\"slot_machine\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🎲\",\r\n description: \"game die\",\r\n category: \"Activities\",\r\n aliases: [\"game_die\"],\r\n tags: [\"dice\", \"gambling\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🧩\",\r\n description: \"puzzle piece\",\r\n category: \"Activities\",\r\n aliases: [\"jigsaw\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🧸\",\r\n description: \"teddy bear\",\r\n category: \"Activities\",\r\n aliases: [\"teddy_bear\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🪅\",\r\n description: \"piñata\",\r\n category: \"Activities\",\r\n aliases: [\"pinata\"],\r\n tags: [],\r\n unicode_version: \"13.0\",\r\n ios_version: \"14.0\",\r\n },\r\n {\r\n emoji: \"🪆\",\r\n description: \"nesting dolls\",\r\n category: \"Activities\",\r\n aliases: [\"nesting_dolls\"],\r\n tags: [],\r\n unicode_version: \"13.0\",\r\n ios_version: \"14.0\",\r\n },\r\n {\r\n emoji: \"♠️\",\r\n description: \"spade suit\",\r\n category: \"Activities\",\r\n aliases: [\"spades\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"♥️\",\r\n description: \"heart suit\",\r\n category: \"Activities\",\r\n aliases: [\"hearts\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"♦️\",\r\n description: \"diamond suit\",\r\n category: \"Activities\",\r\n aliases: [\"diamonds\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"♣️\",\r\n description: \"club suit\",\r\n category: \"Activities\",\r\n aliases: [\"clubs\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"♟️\",\r\n description: \"chess pawn\",\r\n category: \"Activities\",\r\n aliases: [\"chess_pawn\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🃏\",\r\n description: \"joker\",\r\n category: \"Activities\",\r\n aliases: [\"black_joker\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🀄\",\r\n description: \"mahjong red dragon\",\r\n category: \"Activities\",\r\n aliases: [\"mahjong\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🎴\",\r\n description: \"flower playing cards\",\r\n category: \"Activities\",\r\n aliases: [\"flower_playing_cards\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🎭\",\r\n description: \"performing arts\",\r\n category: \"Activities\",\r\n aliases: [\"performing_arts\"],\r\n tags: [\"theater\", \"drama\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🖼️\",\r\n description: \"framed picture\",\r\n category: \"Activities\",\r\n aliases: [\"framed_picture\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🎨\",\r\n description: \"artist palette\",\r\n category: \"Activities\",\r\n aliases: [\"art\"],\r\n tags: [\"design\", \"paint\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🧵\",\r\n description: \"thread\",\r\n category: \"Activities\",\r\n aliases: [\"thread\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🪡\",\r\n description: \"sewing needle\",\r\n category: \"Activities\",\r\n aliases: [\"sewing_needle\"],\r\n tags: [],\r\n unicode_version: \"13.0\",\r\n ios_version: \"14.0\",\r\n },\r\n {\r\n emoji: \"🧶\",\r\n description: \"yarn\",\r\n category: \"Activities\",\r\n aliases: [\"yarn\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🪢\",\r\n description: \"knot\",\r\n category: \"Activities\",\r\n aliases: [\"knot\"],\r\n tags: [],\r\n unicode_version: \"13.0\",\r\n ios_version: \"14.0\",\r\n },\r\n {\r\n emoji: \"👓\",\r\n description: \"glasses\",\r\n category: \"Objects\",\r\n aliases: [\"eyeglasses\"],\r\n tags: [\"glasses\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🕶️\",\r\n description: \"sunglasses\",\r\n category: \"Objects\",\r\n aliases: [\"dark_sunglasses\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🥽\",\r\n description: \"goggles\",\r\n category: \"Objects\",\r\n aliases: [\"goggles\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🥼\",\r\n description: \"lab coat\",\r\n category: \"Objects\",\r\n aliases: [\"lab_coat\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🦺\",\r\n description: \"safety vest\",\r\n category: \"Objects\",\r\n aliases: [\"safety_vest\"],\r\n tags: [],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n },\r\n {\r\n emoji: \"👔\",\r\n description: \"necktie\",\r\n category: \"Objects\",\r\n aliases: [\"necktie\"],\r\n tags: [\"shirt\", \"formal\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"👕\",\r\n description: \"t-shirt\",\r\n category: \"Objects\",\r\n aliases: [\"shirt\", \"tshirt\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"👖\",\r\n description: \"jeans\",\r\n category: \"Objects\",\r\n aliases: [\"jeans\"],\r\n tags: [\"pants\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🧣\",\r\n description: \"scarf\",\r\n category: \"Objects\",\r\n aliases: [\"scarf\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🧤\",\r\n description: \"gloves\",\r\n category: \"Objects\",\r\n aliases: [\"gloves\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🧥\",\r\n description: \"coat\",\r\n category: \"Objects\",\r\n aliases: [\"coat\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🧦\",\r\n description: \"socks\",\r\n category: \"Objects\",\r\n aliases: [\"socks\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"👗\",\r\n description: \"dress\",\r\n category: \"Objects\",\r\n aliases: [\"dress\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"👘\",\r\n description: \"kimono\",\r\n category: \"Objects\",\r\n aliases: [\"kimono\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🥻\",\r\n description: \"sari\",\r\n category: \"Objects\",\r\n aliases: [\"sari\"],\r\n tags: [],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n },\r\n {\r\n emoji: \"🩱\",\r\n description: \"one-piece swimsuit\",\r\n category: \"Objects\",\r\n aliases: [\"one_piece_swimsuit\"],\r\n tags: [],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n },\r\n {\r\n emoji: \"🩲\",\r\n description: \"briefs\",\r\n category: \"Objects\",\r\n aliases: [\"swim_brief\"],\r\n tags: [],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n },\r\n {\r\n emoji: \"🩳\",\r\n description: \"shorts\",\r\n category: \"Objects\",\r\n aliases: [\"shorts\"],\r\n tags: [],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n },\r\n {\r\n emoji: \"👙\",\r\n description: \"bikini\",\r\n category: \"Objects\",\r\n aliases: [\"bikini\"],\r\n tags: [\"beach\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"👚\",\r\n description: \"woman’s clothes\",\r\n category: \"Objects\",\r\n aliases: [\"womans_clothes\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"👛\",\r\n description: \"purse\",\r\n category: \"Objects\",\r\n aliases: [\"purse\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"👜\",\r\n description: \"handbag\",\r\n category: \"Objects\",\r\n aliases: [\"handbag\"],\r\n tags: [\"bag\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"👝\",\r\n description: \"clutch bag\",\r\n category: \"Objects\",\r\n aliases: [\"pouch\"],\r\n tags: [\"bag\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🛍️\",\r\n description: \"shopping bags\",\r\n category: \"Objects\",\r\n aliases: [\"shopping\"],\r\n tags: [\"bags\"],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🎒\",\r\n description: \"backpack\",\r\n category: \"Objects\",\r\n aliases: [\"school_satchel\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🩴\",\r\n description: \"thong sandal\",\r\n category: \"Objects\",\r\n aliases: [\"thong_sandal\"],\r\n tags: [],\r\n unicode_version: \"13.0\",\r\n ios_version: \"14.0\",\r\n },\r\n {\r\n emoji: \"👞\",\r\n description: \"man’s shoe\",\r\n category: \"Objects\",\r\n aliases: [\"mans_shoe\", \"shoe\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"👟\",\r\n description: \"running shoe\",\r\n category: \"Objects\",\r\n aliases: [\"athletic_shoe\"],\r\n tags: [\"sneaker\", \"sport\", \"running\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🥾\",\r\n description: \"hiking boot\",\r\n category: \"Objects\",\r\n aliases: [\"hiking_boot\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🥿\",\r\n description: \"flat shoe\",\r\n category: \"Objects\",\r\n aliases: [\"flat_shoe\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"👠\",\r\n description: \"high-heeled shoe\",\r\n category: \"Objects\",\r\n aliases: [\"high_heel\"],\r\n tags: [\"shoe\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"👡\",\r\n description: \"woman’s sandal\",\r\n category: \"Objects\",\r\n aliases: [\"sandal\"],\r\n tags: [\"shoe\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🩰\",\r\n description: \"ballet shoes\",\r\n category: \"Objects\",\r\n aliases: [\"ballet_shoes\"],\r\n tags: [],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n },\r\n {\r\n emoji: \"👢\",\r\n description: \"woman’s boot\",\r\n category: \"Objects\",\r\n aliases: [\"boot\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"👑\",\r\n description: \"crown\",\r\n category: \"Objects\",\r\n aliases: [\"crown\"],\r\n tags: [\"king\", \"queen\", \"royal\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"👒\",\r\n description: \"woman’s hat\",\r\n category: \"Objects\",\r\n aliases: [\"womans_hat\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🎩\",\r\n description: \"top hat\",\r\n category: \"Objects\",\r\n aliases: [\"tophat\"],\r\n tags: [\"hat\", \"classy\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🎓\",\r\n description: \"graduation cap\",\r\n category: \"Objects\",\r\n aliases: [\"mortar_board\"],\r\n tags: [\"education\", \"college\", \"university\", \"graduation\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🧢\",\r\n description: \"billed cap\",\r\n category: \"Objects\",\r\n aliases: [\"billed_cap\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🪖\",\r\n description: \"military helmet\",\r\n category: \"Objects\",\r\n aliases: [\"military_helmet\"],\r\n tags: [],\r\n unicode_version: \"13.0\",\r\n ios_version: \"14.0\",\r\n },\r\n {\r\n emoji: \"⛑️\",\r\n description: \"rescue worker’s helmet\",\r\n category: \"Objects\",\r\n aliases: [\"rescue_worker_helmet\"],\r\n tags: [],\r\n unicode_version: \"5.2\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"📿\",\r\n description: \"prayer beads\",\r\n category: \"Objects\",\r\n aliases: [\"prayer_beads\"],\r\n tags: [],\r\n unicode_version: \"8.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"💄\",\r\n description: \"lipstick\",\r\n category: \"Objects\",\r\n aliases: [\"lipstick\"],\r\n tags: [\"makeup\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"💍\",\r\n description: \"ring\",\r\n category: \"Objects\",\r\n aliases: [\"ring\"],\r\n tags: [\"wedding\", \"marriage\", \"engaged\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"💎\",\r\n description: \"gem stone\",\r\n category: \"Objects\",\r\n aliases: [\"gem\"],\r\n tags: [\"diamond\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🔇\",\r\n description: \"muted speaker\",\r\n category: \"Objects\",\r\n aliases: [\"mute\"],\r\n tags: [\"sound\", \"volume\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🔈\",\r\n description: \"speaker low volume\",\r\n category: \"Objects\",\r\n aliases: [\"speaker\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🔉\",\r\n description: \"speaker medium volume\",\r\n category: \"Objects\",\r\n aliases: [\"sound\"],\r\n tags: [\"volume\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🔊\",\r\n description: \"speaker high volume\",\r\n category: \"Objects\",\r\n aliases: [\"loud_sound\"],\r\n tags: [\"volume\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"📢\",\r\n description: \"loudspeaker\",\r\n category: \"Objects\",\r\n aliases: [\"loudspeaker\"],\r\n tags: [\"announcement\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"📣\",\r\n description: \"megaphone\",\r\n category: \"Objects\",\r\n aliases: [\"mega\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"📯\",\r\n description: \"postal horn\",\r\n category: \"Objects\",\r\n aliases: [\"postal_horn\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🔔\",\r\n description: \"bell\",\r\n category: \"Objects\",\r\n aliases: [\"bell\"],\r\n tags: [\"sound\", \"notification\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🔕\",\r\n description: \"bell with slash\",\r\n category: \"Objects\",\r\n aliases: [\"no_bell\"],\r\n tags: [\"volume\", \"off\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🎼\",\r\n description: \"musical score\",\r\n category: \"Objects\",\r\n aliases: [\"musical_score\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🎵\",\r\n description: \"musical note\",\r\n category: \"Objects\",\r\n aliases: [\"musical_note\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🎶\",\r\n description: \"musical notes\",\r\n category: \"Objects\",\r\n aliases: [\"notes\"],\r\n tags: [\"music\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🎙️\",\r\n description: \"studio microphone\",\r\n category: \"Objects\",\r\n aliases: [\"studio_microphone\"],\r\n tags: [\"podcast\"],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🎚️\",\r\n description: \"level slider\",\r\n category: \"Objects\",\r\n aliases: [\"level_slider\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🎛️\",\r\n description: \"control knobs\",\r\n category: \"Objects\",\r\n aliases: [\"control_knobs\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🎤\",\r\n description: \"microphone\",\r\n category: \"Objects\",\r\n aliases: [\"microphone\"],\r\n tags: [\"sing\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🎧\",\r\n description: \"headphone\",\r\n category: \"Objects\",\r\n aliases: [\"headphones\"],\r\n tags: [\"music\", \"earphones\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"📻\",\r\n description: \"radio\",\r\n category: \"Objects\",\r\n aliases: [\"radio\"],\r\n tags: [\"podcast\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🎷\",\r\n description: \"saxophone\",\r\n category: \"Objects\",\r\n aliases: [\"saxophone\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🪗\",\r\n description: \"accordion\",\r\n category: \"Objects\",\r\n aliases: [\"accordion\"],\r\n tags: [],\r\n unicode_version: \"13.0\",\r\n ios_version: \"14.0\",\r\n },\r\n {\r\n emoji: \"🎸\",\r\n description: \"guitar\",\r\n category: \"Objects\",\r\n aliases: [\"guitar\"],\r\n tags: [\"rock\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🎹\",\r\n description: \"musical keyboard\",\r\n category: \"Objects\",\r\n aliases: [\"musical_keyboard\"],\r\n tags: [\"piano\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🎺\",\r\n description: \"trumpet\",\r\n category: \"Objects\",\r\n aliases: [\"trumpet\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🎻\",\r\n description: \"violin\",\r\n category: \"Objects\",\r\n aliases: [\"violin\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🪕\",\r\n description: \"banjo\",\r\n category: \"Objects\",\r\n aliases: [\"banjo\"],\r\n tags: [],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n },\r\n {\r\n emoji: \"🥁\",\r\n description: \"drum\",\r\n category: \"Objects\",\r\n aliases: [\"drum\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"10.2\",\r\n },\r\n {\r\n emoji: \"🪘\",\r\n description: \"long drum\",\r\n category: \"Objects\",\r\n aliases: [\"long_drum\"],\r\n tags: [],\r\n unicode_version: \"13.0\",\r\n ios_version: \"14.0\",\r\n },\r\n {\r\n emoji: \"📱\",\r\n description: \"mobile phone\",\r\n category: \"Objects\",\r\n aliases: [\"iphone\"],\r\n tags: [\"smartphone\", \"mobile\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"📲\",\r\n description: \"mobile phone with arrow\",\r\n category: \"Objects\",\r\n aliases: [\"calling\"],\r\n tags: [\"call\", \"incoming\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"☎️\",\r\n description: \"telephone\",\r\n category: \"Objects\",\r\n aliases: [\"phone\", \"telephone\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"📞\",\r\n description: \"telephone receiver\",\r\n category: \"Objects\",\r\n aliases: [\"telephone_receiver\"],\r\n tags: [\"phone\", \"call\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"📟\",\r\n description: \"pager\",\r\n category: \"Objects\",\r\n aliases: [\"pager\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"📠\",\r\n description: \"fax machine\",\r\n category: \"Objects\",\r\n aliases: [\"fax\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🔋\",\r\n description: \"battery\",\r\n category: \"Objects\",\r\n aliases: [\"battery\"],\r\n tags: [\"power\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🔌\",\r\n description: \"electric plug\",\r\n category: \"Objects\",\r\n aliases: [\"electric_plug\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"💻\",\r\n description: \"laptop\",\r\n category: \"Objects\",\r\n aliases: [\"computer\"],\r\n tags: [\"desktop\", \"screen\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🖥️\",\r\n description: \"desktop computer\",\r\n category: \"Objects\",\r\n aliases: [\"desktop_computer\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🖨️\",\r\n description: \"printer\",\r\n category: \"Objects\",\r\n aliases: [\"printer\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"⌨️\",\r\n description: \"keyboard\",\r\n category: \"Objects\",\r\n aliases: [\"keyboard\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🖱️\",\r\n description: \"computer mouse\",\r\n category: \"Objects\",\r\n aliases: [\"computer_mouse\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🖲️\",\r\n description: \"trackball\",\r\n category: \"Objects\",\r\n aliases: [\"trackball\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"💽\",\r\n description: \"computer disk\",\r\n category: \"Objects\",\r\n aliases: [\"minidisc\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"💾\",\r\n description: \"floppy disk\",\r\n category: \"Objects\",\r\n aliases: [\"floppy_disk\"],\r\n tags: [\"save\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"💿\",\r\n description: \"optical disk\",\r\n category: \"Objects\",\r\n aliases: [\"cd\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"📀\",\r\n description: \"dvd\",\r\n category: \"Objects\",\r\n aliases: [\"dvd\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🧮\",\r\n description: \"abacus\",\r\n category: \"Objects\",\r\n aliases: [\"abacus\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🎥\",\r\n description: \"movie camera\",\r\n category: \"Objects\",\r\n aliases: [\"movie_camera\"],\r\n tags: [\"film\", \"video\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🎞️\",\r\n description: \"film frames\",\r\n category: \"Objects\",\r\n aliases: [\"film_strip\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"📽️\",\r\n description: \"film projector\",\r\n category: \"Objects\",\r\n aliases: [\"film_projector\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🎬\",\r\n description: \"clapper board\",\r\n category: \"Objects\",\r\n aliases: [\"clapper\"],\r\n tags: [\"film\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"📺\",\r\n description: \"television\",\r\n category: \"Objects\",\r\n aliases: [\"tv\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"📷\",\r\n description: \"camera\",\r\n category: \"Objects\",\r\n aliases: [\"camera\"],\r\n tags: [\"photo\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"📸\",\r\n description: \"camera with flash\",\r\n category: \"Objects\",\r\n aliases: [\"camera_flash\"],\r\n tags: [\"photo\"],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"📹\",\r\n description: \"video camera\",\r\n category: \"Objects\",\r\n aliases: [\"video_camera\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"📼\",\r\n description: \"videocassette\",\r\n category: \"Objects\",\r\n aliases: [\"vhs\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🔍\",\r\n description: \"magnifying glass tilted left\",\r\n category: \"Objects\",\r\n aliases: [\"mag\"],\r\n tags: [\"search\", \"zoom\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🔎\",\r\n description: \"magnifying glass tilted right\",\r\n category: \"Objects\",\r\n aliases: [\"mag_right\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🕯️\",\r\n description: \"candle\",\r\n category: \"Objects\",\r\n aliases: [\"candle\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"💡\",\r\n description: \"light bulb\",\r\n category: \"Objects\",\r\n aliases: [\"bulb\"],\r\n tags: [\"idea\", \"light\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🔦\",\r\n description: \"flashlight\",\r\n category: \"Objects\",\r\n aliases: [\"flashlight\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🏮\",\r\n description: \"red paper lantern\",\r\n category: \"Objects\",\r\n aliases: [\"izakaya_lantern\", \"lantern\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🪔\",\r\n description: \"diya lamp\",\r\n category: \"Objects\",\r\n aliases: [\"diya_lamp\"],\r\n tags: [],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n },\r\n {\r\n emoji: \"📔\",\r\n description: \"notebook with decorative cover\",\r\n category: \"Objects\",\r\n aliases: [\"notebook_with_decorative_cover\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"📕\",\r\n description: \"closed book\",\r\n category: \"Objects\",\r\n aliases: [\"closed_book\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"📖\",\r\n description: \"open book\",\r\n category: \"Objects\",\r\n aliases: [\"book\", \"open_book\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"📗\",\r\n description: \"green book\",\r\n category: \"Objects\",\r\n aliases: [\"green_book\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"📘\",\r\n description: \"blue book\",\r\n category: \"Objects\",\r\n aliases: [\"blue_book\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"📙\",\r\n description: \"orange book\",\r\n category: \"Objects\",\r\n aliases: [\"orange_book\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"📚\",\r\n description: \"books\",\r\n category: \"Objects\",\r\n aliases: [\"books\"],\r\n tags: [\"library\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"📓\",\r\n description: \"notebook\",\r\n category: \"Objects\",\r\n aliases: [\"notebook\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"📒\",\r\n description: \"ledger\",\r\n category: \"Objects\",\r\n aliases: [\"ledger\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"📃\",\r\n description: \"page with curl\",\r\n category: \"Objects\",\r\n aliases: [\"page_with_curl\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"📜\",\r\n description: \"scroll\",\r\n category: \"Objects\",\r\n aliases: [\"scroll\"],\r\n tags: [\"document\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"📄\",\r\n description: \"page facing up\",\r\n category: \"Objects\",\r\n aliases: [\"page_facing_up\"],\r\n tags: [\"document\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"📰\",\r\n description: \"newspaper\",\r\n category: \"Objects\",\r\n aliases: [\"newspaper\"],\r\n tags: [\"press\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🗞️\",\r\n description: \"rolled-up newspaper\",\r\n category: \"Objects\",\r\n aliases: [\"newspaper_roll\"],\r\n tags: [\"press\"],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"📑\",\r\n description: \"bookmark tabs\",\r\n category: \"Objects\",\r\n aliases: [\"bookmark_tabs\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🔖\",\r\n description: \"bookmark\",\r\n category: \"Objects\",\r\n aliases: [\"bookmark\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🏷️\",\r\n description: \"label\",\r\n category: \"Objects\",\r\n aliases: [\"label\"],\r\n tags: [\"tag\"],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"💰\",\r\n description: \"money bag\",\r\n category: \"Objects\",\r\n aliases: [\"moneybag\"],\r\n tags: [\"dollar\", \"cream\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🪙\",\r\n description: \"coin\",\r\n category: \"Objects\",\r\n aliases: [\"coin\"],\r\n tags: [],\r\n unicode_version: \"13.0\",\r\n ios_version: \"14.0\",\r\n },\r\n {\r\n emoji: \"💴\",\r\n description: \"yen banknote\",\r\n category: \"Objects\",\r\n aliases: [\"yen\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"💵\",\r\n description: \"dollar banknote\",\r\n category: \"Objects\",\r\n aliases: [\"dollar\"],\r\n tags: [\"money\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"💶\",\r\n description: \"euro banknote\",\r\n category: \"Objects\",\r\n aliases: [\"euro\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"💷\",\r\n description: \"pound banknote\",\r\n category: \"Objects\",\r\n aliases: [\"pound\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"💸\",\r\n description: \"money with wings\",\r\n category: \"Objects\",\r\n aliases: [\"money_with_wings\"],\r\n tags: [\"dollar\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"💳\",\r\n description: \"credit card\",\r\n category: \"Objects\",\r\n aliases: [\"credit_card\"],\r\n tags: [\"subscription\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🧾\",\r\n description: \"receipt\",\r\n category: \"Objects\",\r\n aliases: [\"receipt\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"💹\",\r\n description: \"chart increasing with yen\",\r\n category: \"Objects\",\r\n aliases: [\"chart\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"✉️\",\r\n description: \"envelope\",\r\n category: \"Objects\",\r\n aliases: [\"envelope\"],\r\n tags: [\"letter\", \"email\"],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"📧\",\r\n description: \"e-mail\",\r\n category: \"Objects\",\r\n aliases: [\"email\", \"e-mail\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"📨\",\r\n description: \"incoming envelope\",\r\n category: \"Objects\",\r\n aliases: [\"incoming_envelope\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"📩\",\r\n description: \"envelope with arrow\",\r\n category: \"Objects\",\r\n aliases: [\"envelope_with_arrow\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"📤\",\r\n description: \"outbox tray\",\r\n category: \"Objects\",\r\n aliases: [\"outbox_tray\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"📥\",\r\n description: \"inbox tray\",\r\n category: \"Objects\",\r\n aliases: [\"inbox_tray\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"📦\",\r\n description: \"package\",\r\n category: \"Objects\",\r\n aliases: [\"package\"],\r\n tags: [\"shipping\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"📫\",\r\n description: \"closed mailbox with raised flag\",\r\n category: \"Objects\",\r\n aliases: [\"mailbox\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"📪\",\r\n description: \"closed mailbox with lowered flag\",\r\n category: \"Objects\",\r\n aliases: [\"mailbox_closed\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"📬\",\r\n description: \"open mailbox with raised flag\",\r\n category: \"Objects\",\r\n aliases: [\"mailbox_with_mail\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"📭\",\r\n description: \"open mailbox with lowered flag\",\r\n category: \"Objects\",\r\n aliases: [\"mailbox_with_no_mail\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"📮\",\r\n description: \"postbox\",\r\n category: \"Objects\",\r\n aliases: [\"postbox\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🗳️\",\r\n description: \"ballot box with ballot\",\r\n category: \"Objects\",\r\n aliases: [\"ballot_box\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"✏️\",\r\n description: \"pencil\",\r\n category: \"Objects\",\r\n aliases: [\"pencil2\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"✒️\",\r\n description: \"black nib\",\r\n category: \"Objects\",\r\n aliases: [\"black_nib\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🖋️\",\r\n description: \"fountain pen\",\r\n category: \"Objects\",\r\n aliases: [\"fountain_pen\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🖊️\",\r\n description: \"pen\",\r\n category: \"Objects\",\r\n aliases: [\"pen\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🖌️\",\r\n description: \"paintbrush\",\r\n category: \"Objects\",\r\n aliases: [\"paintbrush\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🖍️\",\r\n description: \"crayon\",\r\n category: \"Objects\",\r\n aliases: [\"crayon\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"📝\",\r\n description: \"memo\",\r\n category: \"Objects\",\r\n aliases: [\"memo\", \"pencil\"],\r\n tags: [\"document\", \"note\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"💼\",\r\n description: \"briefcase\",\r\n category: \"Objects\",\r\n aliases: [\"briefcase\"],\r\n tags: [\"business\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"📁\",\r\n description: \"file folder\",\r\n category: \"Objects\",\r\n aliases: [\"file_folder\"],\r\n tags: [\"directory\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"📂\",\r\n description: \"open file folder\",\r\n category: \"Objects\",\r\n aliases: [\"open_file_folder\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🗂️\",\r\n description: \"card index dividers\",\r\n category: \"Objects\",\r\n aliases: [\"card_index_dividers\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"📅\",\r\n description: \"calendar\",\r\n category: \"Objects\",\r\n aliases: [\"date\"],\r\n tags: [\"calendar\", \"schedule\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"📆\",\r\n description: \"tear-off calendar\",\r\n category: \"Objects\",\r\n aliases: [\"calendar\"],\r\n tags: [\"schedule\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🗒️\",\r\n description: \"spiral notepad\",\r\n category: \"Objects\",\r\n aliases: [\"spiral_notepad\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🗓️\",\r\n description: \"spiral calendar\",\r\n category: \"Objects\",\r\n aliases: [\"spiral_calendar\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"📇\",\r\n description: \"card index\",\r\n category: \"Objects\",\r\n aliases: [\"card_index\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"📈\",\r\n description: \"chart increasing\",\r\n category: \"Objects\",\r\n aliases: [\"chart_with_upwards_trend\"],\r\n tags: [\"graph\", \"metrics\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"📉\",\r\n description: \"chart decreasing\",\r\n category: \"Objects\",\r\n aliases: [\"chart_with_downwards_trend\"],\r\n tags: [\"graph\", \"metrics\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"📊\",\r\n description: \"bar chart\",\r\n category: \"Objects\",\r\n aliases: [\"bar_chart\"],\r\n tags: [\"stats\", \"metrics\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"📋\",\r\n description: \"clipboard\",\r\n category: \"Objects\",\r\n aliases: [\"clipboard\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"📌\",\r\n description: \"pushpin\",\r\n category: \"Objects\",\r\n aliases: [\"pushpin\"],\r\n tags: [\"location\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"📍\",\r\n description: \"round pushpin\",\r\n category: \"Objects\",\r\n aliases: [\"round_pushpin\"],\r\n tags: [\"location\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"📎\",\r\n description: \"paperclip\",\r\n category: \"Objects\",\r\n aliases: [\"paperclip\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🖇️\",\r\n description: \"linked paperclips\",\r\n category: \"Objects\",\r\n aliases: [\"paperclips\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"📏\",\r\n description: \"straight ruler\",\r\n category: \"Objects\",\r\n aliases: [\"straight_ruler\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"📐\",\r\n description: \"triangular ruler\",\r\n category: \"Objects\",\r\n aliases: [\"triangular_ruler\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"✂️\",\r\n description: \"scissors\",\r\n category: \"Objects\",\r\n aliases: [\"scissors\"],\r\n tags: [\"cut\"],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🗃️\",\r\n description: \"card file box\",\r\n category: \"Objects\",\r\n aliases: [\"card_file_box\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🗄️\",\r\n description: \"file cabinet\",\r\n category: \"Objects\",\r\n aliases: [\"file_cabinet\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🗑️\",\r\n description: \"wastebasket\",\r\n category: \"Objects\",\r\n aliases: [\"wastebasket\"],\r\n tags: [\"trash\"],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🔒\",\r\n description: \"locked\",\r\n category: \"Objects\",\r\n aliases: [\"lock\"],\r\n tags: [\"security\", \"private\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🔓\",\r\n description: \"unlocked\",\r\n category: \"Objects\",\r\n aliases: [\"unlock\"],\r\n tags: [\"security\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🔏\",\r\n description: \"locked with pen\",\r\n category: \"Objects\",\r\n aliases: [\"lock_with_ink_pen\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🔐\",\r\n description: \"locked with key\",\r\n category: \"Objects\",\r\n aliases: [\"closed_lock_with_key\"],\r\n tags: [\"security\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🔑\",\r\n description: \"key\",\r\n category: \"Objects\",\r\n aliases: [\"key\"],\r\n tags: [\"lock\", \"password\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🗝️\",\r\n description: \"old key\",\r\n category: \"Objects\",\r\n aliases: [\"old_key\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🔨\",\r\n description: \"hammer\",\r\n category: \"Objects\",\r\n aliases: [\"hammer\"],\r\n tags: [\"tool\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🪓\",\r\n description: \"axe\",\r\n category: \"Objects\",\r\n aliases: [\"axe\"],\r\n tags: [],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n },\r\n {\r\n emoji: \"⛏️\",\r\n description: \"pick\",\r\n category: \"Objects\",\r\n aliases: [\"pick\"],\r\n tags: [],\r\n unicode_version: \"5.2\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"⚒️\",\r\n description: \"hammer and pick\",\r\n category: \"Objects\",\r\n aliases: [\"hammer_and_pick\"],\r\n tags: [],\r\n unicode_version: \"4.1\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🛠️\",\r\n description: \"hammer and wrench\",\r\n category: \"Objects\",\r\n aliases: [\"hammer_and_wrench\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🗡️\",\r\n description: \"dagger\",\r\n category: \"Objects\",\r\n aliases: [\"dagger\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"⚔️\",\r\n description: \"crossed swords\",\r\n category: \"Objects\",\r\n aliases: [\"crossed_swords\"],\r\n tags: [],\r\n unicode_version: \"4.1\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🔫\",\r\n description: \"water pistol\",\r\n category: \"Objects\",\r\n aliases: [\"gun\"],\r\n tags: [\"shoot\", \"weapon\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🪃\",\r\n description: \"boomerang\",\r\n category: \"Objects\",\r\n aliases: [\"boomerang\"],\r\n tags: [],\r\n unicode_version: \"13.0\",\r\n ios_version: \"14.0\",\r\n },\r\n {\r\n emoji: \"🏹\",\r\n description: \"bow and arrow\",\r\n category: \"Objects\",\r\n aliases: [\"bow_and_arrow\"],\r\n tags: [\"archery\"],\r\n unicode_version: \"8.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🛡️\",\r\n description: \"shield\",\r\n category: \"Objects\",\r\n aliases: [\"shield\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🪚\",\r\n description: \"carpentry saw\",\r\n category: \"Objects\",\r\n aliases: [\"carpentry_saw\"],\r\n tags: [],\r\n unicode_version: \"13.0\",\r\n ios_version: \"14.0\",\r\n },\r\n {\r\n emoji: \"🔧\",\r\n description: \"wrench\",\r\n category: \"Objects\",\r\n aliases: [\"wrench\"],\r\n tags: [\"tool\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🪛\",\r\n description: \"screwdriver\",\r\n category: \"Objects\",\r\n aliases: [\"screwdriver\"],\r\n tags: [],\r\n unicode_version: \"13.0\",\r\n ios_version: \"14.0\",\r\n },\r\n {\r\n emoji: \"🔩\",\r\n description: \"nut and bolt\",\r\n category: \"Objects\",\r\n aliases: [\"nut_and_bolt\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"⚙️\",\r\n description: \"gear\",\r\n category: \"Objects\",\r\n aliases: [\"gear\"],\r\n tags: [],\r\n unicode_version: \"4.1\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🗜️\",\r\n description: \"clamp\",\r\n category: \"Objects\",\r\n aliases: [\"clamp\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"⚖️\",\r\n description: \"balance scale\",\r\n category: \"Objects\",\r\n aliases: [\"balance_scale\"],\r\n tags: [],\r\n unicode_version: \"4.1\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🦯\",\r\n description: \"white cane\",\r\n category: \"Objects\",\r\n aliases: [\"probing_cane\"],\r\n tags: [],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n },\r\n {\r\n emoji: \"🔗\",\r\n description: \"link\",\r\n category: \"Objects\",\r\n aliases: [\"link\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"⛓️\",\r\n description: \"chains\",\r\n category: \"Objects\",\r\n aliases: [\"chains\"],\r\n tags: [],\r\n unicode_version: \"5.2\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🪝\",\r\n description: \"hook\",\r\n category: \"Objects\",\r\n aliases: [\"hook\"],\r\n tags: [],\r\n unicode_version: \"13.0\",\r\n ios_version: \"14.0\",\r\n },\r\n {\r\n emoji: \"🧰\",\r\n description: \"toolbox\",\r\n category: \"Objects\",\r\n aliases: [\"toolbox\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🧲\",\r\n description: \"magnet\",\r\n category: \"Objects\",\r\n aliases: [\"magnet\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🪜\",\r\n description: \"ladder\",\r\n category: \"Objects\",\r\n aliases: [\"ladder\"],\r\n tags: [],\r\n unicode_version: \"13.0\",\r\n ios_version: \"14.0\",\r\n },\r\n {\r\n emoji: \"⚗️\",\r\n description: \"alembic\",\r\n category: \"Objects\",\r\n aliases: [\"alembic\"],\r\n tags: [],\r\n unicode_version: \"4.1\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🧪\",\r\n description: \"test tube\",\r\n category: \"Objects\",\r\n aliases: [\"test_tube\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🧫\",\r\n description: \"petri dish\",\r\n category: \"Objects\",\r\n aliases: [\"petri_dish\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🧬\",\r\n description: \"dna\",\r\n category: \"Objects\",\r\n aliases: [\"dna\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🔬\",\r\n description: \"microscope\",\r\n category: \"Objects\",\r\n aliases: [\"microscope\"],\r\n tags: [\"science\", \"laboratory\", \"investigate\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🔭\",\r\n description: \"telescope\",\r\n category: \"Objects\",\r\n aliases: [\"telescope\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"📡\",\r\n description: \"satellite antenna\",\r\n category: \"Objects\",\r\n aliases: [\"satellite\"],\r\n tags: [\"signal\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"💉\",\r\n description: \"syringe\",\r\n category: \"Objects\",\r\n aliases: [\"syringe\"],\r\n tags: [\"health\", \"hospital\", \"needle\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🩸\",\r\n description: \"drop of blood\",\r\n category: \"Objects\",\r\n aliases: [\"drop_of_blood\"],\r\n tags: [],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n },\r\n {\r\n emoji: \"💊\",\r\n description: \"pill\",\r\n category: \"Objects\",\r\n aliases: [\"pill\"],\r\n tags: [\"health\", \"medicine\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🩹\",\r\n description: \"adhesive bandage\",\r\n category: \"Objects\",\r\n aliases: [\"adhesive_bandage\"],\r\n tags: [],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n },\r\n {\r\n emoji: \"🩺\",\r\n description: \"stethoscope\",\r\n category: \"Objects\",\r\n aliases: [\"stethoscope\"],\r\n tags: [],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n },\r\n {\r\n emoji: \"🚪\",\r\n description: \"door\",\r\n category: \"Objects\",\r\n aliases: [\"door\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🛗\",\r\n description: \"elevator\",\r\n category: \"Objects\",\r\n aliases: [\"elevator\"],\r\n tags: [],\r\n unicode_version: \"13.0\",\r\n ios_version: \"14.0\",\r\n },\r\n {\r\n emoji: \"🪞\",\r\n description: \"mirror\",\r\n category: \"Objects\",\r\n aliases: [\"mirror\"],\r\n tags: [],\r\n unicode_version: \"13.0\",\r\n ios_version: \"14.0\",\r\n },\r\n {\r\n emoji: \"🪟\",\r\n description: \"window\",\r\n category: \"Objects\",\r\n aliases: [\"window\"],\r\n tags: [],\r\n unicode_version: \"13.0\",\r\n ios_version: \"14.0\",\r\n },\r\n {\r\n emoji: \"🛏️\",\r\n description: \"bed\",\r\n category: \"Objects\",\r\n aliases: [\"bed\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🛋️\",\r\n description: \"couch and lamp\",\r\n category: \"Objects\",\r\n aliases: [\"couch_and_lamp\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🪑\",\r\n description: \"chair\",\r\n category: \"Objects\",\r\n aliases: [\"chair\"],\r\n tags: [],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n },\r\n {\r\n emoji: \"🚽\",\r\n description: \"toilet\",\r\n category: \"Objects\",\r\n aliases: [\"toilet\"],\r\n tags: [\"wc\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🪠\",\r\n description: \"plunger\",\r\n category: \"Objects\",\r\n aliases: [\"plunger\"],\r\n tags: [],\r\n unicode_version: \"13.0\",\r\n ios_version: \"14.0\",\r\n },\r\n {\r\n emoji: \"🚿\",\r\n description: \"shower\",\r\n category: \"Objects\",\r\n aliases: [\"shower\"],\r\n tags: [\"bath\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🛁\",\r\n description: \"bathtub\",\r\n category: \"Objects\",\r\n aliases: [\"bathtub\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🪤\",\r\n description: \"mouse trap\",\r\n category: \"Objects\",\r\n aliases: [\"mouse_trap\"],\r\n tags: [],\r\n unicode_version: \"13.0\",\r\n ios_version: \"14.0\",\r\n },\r\n {\r\n emoji: \"🪒\",\r\n description: \"razor\",\r\n category: \"Objects\",\r\n aliases: [\"razor\"],\r\n tags: [],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n },\r\n {\r\n emoji: \"🧴\",\r\n description: \"lotion bottle\",\r\n category: \"Objects\",\r\n aliases: [\"lotion_bottle\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🧷\",\r\n description: \"safety pin\",\r\n category: \"Objects\",\r\n aliases: [\"safety_pin\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🧹\",\r\n description: \"broom\",\r\n category: \"Objects\",\r\n aliases: [\"broom\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🧺\",\r\n description: \"basket\",\r\n category: \"Objects\",\r\n aliases: [\"basket\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🧻\",\r\n description: \"roll of paper\",\r\n category: \"Objects\",\r\n aliases: [\"roll_of_paper\"],\r\n tags: [\"toilet\"],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🪣\",\r\n description: \"bucket\",\r\n category: \"Objects\",\r\n aliases: [\"bucket\"],\r\n tags: [],\r\n unicode_version: \"13.0\",\r\n ios_version: \"14.0\",\r\n },\r\n {\r\n emoji: \"🧼\",\r\n description: \"soap\",\r\n category: \"Objects\",\r\n aliases: [\"soap\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🪥\",\r\n description: \"toothbrush\",\r\n category: \"Objects\",\r\n aliases: [\"toothbrush\"],\r\n tags: [],\r\n unicode_version: \"13.0\",\r\n ios_version: \"14.0\",\r\n },\r\n {\r\n emoji: \"🧽\",\r\n description: \"sponge\",\r\n category: \"Objects\",\r\n aliases: [\"sponge\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🧯\",\r\n description: \"fire extinguisher\",\r\n category: \"Objects\",\r\n aliases: [\"fire_extinguisher\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🛒\",\r\n description: \"shopping cart\",\r\n category: \"Objects\",\r\n aliases: [\"shopping_cart\"],\r\n tags: [],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n },\r\n {\r\n emoji: \"🚬\",\r\n description: \"cigarette\",\r\n category: \"Objects\",\r\n aliases: [\"smoking\"],\r\n tags: [\"cigarette\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"⚰️\",\r\n description: \"coffin\",\r\n category: \"Objects\",\r\n aliases: [\"coffin\"],\r\n tags: [\"funeral\"],\r\n unicode_version: \"4.1\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🪦\",\r\n description: \"headstone\",\r\n category: \"Objects\",\r\n aliases: [\"headstone\"],\r\n tags: [],\r\n unicode_version: \"13.0\",\r\n ios_version: \"14.0\",\r\n },\r\n {\r\n emoji: \"⚱️\",\r\n description: \"funeral urn\",\r\n category: \"Objects\",\r\n aliases: [\"funeral_urn\"],\r\n tags: [],\r\n unicode_version: \"4.1\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🗿\",\r\n description: \"moai\",\r\n category: \"Objects\",\r\n aliases: [\"moyai\"],\r\n tags: [\"stone\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🪧\",\r\n description: \"placard\",\r\n category: \"Objects\",\r\n aliases: [\"placard\"],\r\n tags: [],\r\n unicode_version: \"13.0\",\r\n ios_version: \"14.0\",\r\n },\r\n {\r\n emoji: \"🏧\",\r\n description: \"ATM sign\",\r\n category: \"Symbols\",\r\n aliases: [\"atm\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🚮\",\r\n description: \"litter in bin sign\",\r\n category: \"Symbols\",\r\n aliases: [\"put_litter_in_its_place\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🚰\",\r\n description: \"potable water\",\r\n category: \"Symbols\",\r\n aliases: [\"potable_water\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"♿\",\r\n description: \"wheelchair symbol\",\r\n category: \"Symbols\",\r\n aliases: [\"wheelchair\"],\r\n tags: [\"accessibility\"],\r\n unicode_version: \"4.1\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🚹\",\r\n description: \"men’s room\",\r\n category: \"Symbols\",\r\n aliases: [\"mens\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🚺\",\r\n description: \"women’s room\",\r\n category: \"Symbols\",\r\n aliases: [\"womens\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🚻\",\r\n description: \"restroom\",\r\n category: \"Symbols\",\r\n aliases: [\"restroom\"],\r\n tags: [\"toilet\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🚼\",\r\n description: \"baby symbol\",\r\n category: \"Symbols\",\r\n aliases: [\"baby_symbol\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🚾\",\r\n description: \"water closet\",\r\n category: \"Symbols\",\r\n aliases: [\"wc\"],\r\n tags: [\"toilet\", \"restroom\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🛂\",\r\n description: \"passport control\",\r\n category: \"Symbols\",\r\n aliases: [\"passport_control\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🛃\",\r\n description: \"customs\",\r\n category: \"Symbols\",\r\n aliases: [\"customs\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🛄\",\r\n description: \"baggage claim\",\r\n category: \"Symbols\",\r\n aliases: [\"baggage_claim\"],\r\n tags: [\"airport\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🛅\",\r\n description: \"left luggage\",\r\n category: \"Symbols\",\r\n aliases: [\"left_luggage\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"⚠️\",\r\n description: \"warning\",\r\n category: \"Symbols\",\r\n aliases: [\"warning\"],\r\n tags: [\"wip\"],\r\n unicode_version: \"4.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🚸\",\r\n description: \"children crossing\",\r\n category: \"Symbols\",\r\n aliases: [\"children_crossing\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"⛔\",\r\n description: \"no entry\",\r\n category: \"Symbols\",\r\n aliases: [\"no_entry\"],\r\n tags: [\"limit\"],\r\n unicode_version: \"5.2\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🚫\",\r\n description: \"prohibited\",\r\n category: \"Symbols\",\r\n aliases: [\"no_entry_sign\"],\r\n tags: [\"block\", \"forbidden\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🚳\",\r\n description: \"no bicycles\",\r\n category: \"Symbols\",\r\n aliases: [\"no_bicycles\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🚭\",\r\n description: \"no smoking\",\r\n category: \"Symbols\",\r\n aliases: [\"no_smoking\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🚯\",\r\n description: \"no littering\",\r\n category: \"Symbols\",\r\n aliases: [\"do_not_litter\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🚱\",\r\n description: \"non-potable water\",\r\n category: \"Symbols\",\r\n aliases: [\"non-potable_water\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🚷\",\r\n description: \"no pedestrians\",\r\n category: \"Symbols\",\r\n aliases: [\"no_pedestrians\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"📵\",\r\n description: \"no mobile phones\",\r\n category: \"Symbols\",\r\n aliases: [\"no_mobile_phones\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🔞\",\r\n description: \"no one under eighteen\",\r\n category: \"Symbols\",\r\n aliases: [\"underage\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"☢️\",\r\n description: \"radioactive\",\r\n category: \"Symbols\",\r\n aliases: [\"radioactive\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"☣️\",\r\n description: \"biohazard\",\r\n category: \"Symbols\",\r\n aliases: [\"biohazard\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"⬆️\",\r\n description: \"up arrow\",\r\n category: \"Symbols\",\r\n aliases: [\"arrow_up\"],\r\n tags: [],\r\n unicode_version: \"4.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"↗️\",\r\n description: \"up-right arrow\",\r\n category: \"Symbols\",\r\n aliases: [\"arrow_upper_right\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"➡️\",\r\n description: \"right arrow\",\r\n category: \"Symbols\",\r\n aliases: [\"arrow_right\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"↘️\",\r\n description: \"down-right arrow\",\r\n category: \"Symbols\",\r\n aliases: [\"arrow_lower_right\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"⬇️\",\r\n description: \"down arrow\",\r\n category: \"Symbols\",\r\n aliases: [\"arrow_down\"],\r\n tags: [],\r\n unicode_version: \"4.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"↙️\",\r\n description: \"down-left arrow\",\r\n category: \"Symbols\",\r\n aliases: [\"arrow_lower_left\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"⬅️\",\r\n description: \"left arrow\",\r\n category: \"Symbols\",\r\n aliases: [\"arrow_left\"],\r\n tags: [],\r\n unicode_version: \"4.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"↖️\",\r\n description: \"up-left arrow\",\r\n category: \"Symbols\",\r\n aliases: [\"arrow_upper_left\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"↕️\",\r\n description: \"up-down arrow\",\r\n category: \"Symbols\",\r\n aliases: [\"arrow_up_down\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"↔️\",\r\n description: \"left-right arrow\",\r\n category: \"Symbols\",\r\n aliases: [\"left_right_arrow\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"↩️\",\r\n description: \"right arrow curving left\",\r\n category: \"Symbols\",\r\n aliases: [\"leftwards_arrow_with_hook\"],\r\n tags: [\"return\"],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"↪️\",\r\n description: \"left arrow curving right\",\r\n category: \"Symbols\",\r\n aliases: [\"arrow_right_hook\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"⤴️\",\r\n description: \"right arrow curving up\",\r\n category: \"Symbols\",\r\n aliases: [\"arrow_heading_up\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"⤵️\",\r\n description: \"right arrow curving down\",\r\n category: \"Symbols\",\r\n aliases: [\"arrow_heading_down\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🔃\",\r\n description: \"clockwise vertical arrows\",\r\n category: \"Symbols\",\r\n aliases: [\"arrows_clockwise\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🔄\",\r\n description: \"counterclockwise arrows button\",\r\n category: \"Symbols\",\r\n aliases: [\"arrows_counterclockwise\"],\r\n tags: [\"sync\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🔙\",\r\n description: \"BACK arrow\",\r\n category: \"Symbols\",\r\n aliases: [\"back\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🔚\",\r\n description: \"END arrow\",\r\n category: \"Symbols\",\r\n aliases: [\"end\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🔛\",\r\n description: \"ON! arrow\",\r\n category: \"Symbols\",\r\n aliases: [\"on\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🔜\",\r\n description: \"SOON arrow\",\r\n category: \"Symbols\",\r\n aliases: [\"soon\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🔝\",\r\n description: \"TOP arrow\",\r\n category: \"Symbols\",\r\n aliases: [\"top\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🛐\",\r\n description: \"place of worship\",\r\n category: \"Symbols\",\r\n aliases: [\"place_of_worship\"],\r\n tags: [],\r\n unicode_version: \"8.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"⚛️\",\r\n description: \"atom symbol\",\r\n category: \"Symbols\",\r\n aliases: [\"atom_symbol\"],\r\n tags: [],\r\n unicode_version: \"4.1\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🕉️\",\r\n description: \"om\",\r\n category: \"Symbols\",\r\n aliases: [\"om\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"✡️\",\r\n description: \"star of David\",\r\n category: \"Symbols\",\r\n aliases: [\"star_of_david\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"☸️\",\r\n description: \"wheel of dharma\",\r\n category: \"Symbols\",\r\n aliases: [\"wheel_of_dharma\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"☯️\",\r\n description: \"yin yang\",\r\n category: \"Symbols\",\r\n aliases: [\"yin_yang\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"✝️\",\r\n description: \"latin cross\",\r\n category: \"Symbols\",\r\n aliases: [\"latin_cross\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"☦️\",\r\n description: \"orthodox cross\",\r\n category: \"Symbols\",\r\n aliases: [\"orthodox_cross\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"☪️\",\r\n description: \"star and crescent\",\r\n category: \"Symbols\",\r\n aliases: [\"star_and_crescent\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"☮️\",\r\n description: \"peace symbol\",\r\n category: \"Symbols\",\r\n aliases: [\"peace_symbol\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🕎\",\r\n description: \"menorah\",\r\n category: \"Symbols\",\r\n aliases: [\"menorah\"],\r\n tags: [],\r\n unicode_version: \"8.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🔯\",\r\n description: \"dotted six-pointed star\",\r\n category: \"Symbols\",\r\n aliases: [\"six_pointed_star\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"♈\",\r\n description: \"Aries\",\r\n category: \"Symbols\",\r\n aliases: [\"aries\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"♉\",\r\n description: \"Taurus\",\r\n category: \"Symbols\",\r\n aliases: [\"taurus\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"♊\",\r\n description: \"Gemini\",\r\n category: \"Symbols\",\r\n aliases: [\"gemini\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"♋\",\r\n description: \"Cancer\",\r\n category: \"Symbols\",\r\n aliases: [\"cancer\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"♌\",\r\n description: \"Leo\",\r\n category: \"Symbols\",\r\n aliases: [\"leo\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"♍\",\r\n description: \"Virgo\",\r\n category: \"Symbols\",\r\n aliases: [\"virgo\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"♎\",\r\n description: \"Libra\",\r\n category: \"Symbols\",\r\n aliases: [\"libra\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"♏\",\r\n description: \"Scorpio\",\r\n category: \"Symbols\",\r\n aliases: [\"scorpius\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"♐\",\r\n description: \"Sagittarius\",\r\n category: \"Symbols\",\r\n aliases: [\"sagittarius\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"♑\",\r\n description: \"Capricorn\",\r\n category: \"Symbols\",\r\n aliases: [\"capricorn\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"♒\",\r\n description: \"Aquarius\",\r\n category: \"Symbols\",\r\n aliases: [\"aquarius\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"♓\",\r\n description: \"Pisces\",\r\n category: \"Symbols\",\r\n aliases: [\"pisces\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"⛎\",\r\n description: \"Ophiuchus\",\r\n category: \"Symbols\",\r\n aliases: [\"ophiuchus\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🔀\",\r\n description: \"shuffle tracks button\",\r\n category: \"Symbols\",\r\n aliases: [\"twisted_rightwards_arrows\"],\r\n tags: [\"shuffle\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🔁\",\r\n description: \"repeat button\",\r\n category: \"Symbols\",\r\n aliases: [\"repeat\"],\r\n tags: [\"loop\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🔂\",\r\n description: \"repeat single button\",\r\n category: \"Symbols\",\r\n aliases: [\"repeat_one\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"▶️\",\r\n description: \"play button\",\r\n category: \"Symbols\",\r\n aliases: [\"arrow_forward\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"⏩\",\r\n description: \"fast-forward button\",\r\n category: \"Symbols\",\r\n aliases: [\"fast_forward\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"⏭️\",\r\n description: \"next track button\",\r\n category: \"Symbols\",\r\n aliases: [\"next_track_button\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"⏯️\",\r\n description: \"play or pause button\",\r\n category: \"Symbols\",\r\n aliases: [\"play_or_pause_button\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"◀️\",\r\n description: \"reverse button\",\r\n category: \"Symbols\",\r\n aliases: [\"arrow_backward\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"⏪\",\r\n description: \"fast reverse button\",\r\n category: \"Symbols\",\r\n aliases: [\"rewind\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"⏮️\",\r\n description: \"last track button\",\r\n category: \"Symbols\",\r\n aliases: [\"previous_track_button\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🔼\",\r\n description: \"upwards button\",\r\n category: \"Symbols\",\r\n aliases: [\"arrow_up_small\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"⏫\",\r\n description: \"fast up button\",\r\n category: \"Symbols\",\r\n aliases: [\"arrow_double_up\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🔽\",\r\n description: \"downwards button\",\r\n category: \"Symbols\",\r\n aliases: [\"arrow_down_small\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"⏬\",\r\n description: \"fast down button\",\r\n category: \"Symbols\",\r\n aliases: [\"arrow_double_down\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"⏸️\",\r\n description: \"pause button\",\r\n category: \"Symbols\",\r\n aliases: [\"pause_button\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"⏹️\",\r\n description: \"stop button\",\r\n category: \"Symbols\",\r\n aliases: [\"stop_button\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"⏺️\",\r\n description: \"record button\",\r\n category: \"Symbols\",\r\n aliases: [\"record_button\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"⏏️\",\r\n description: \"eject button\",\r\n category: \"Symbols\",\r\n aliases: [\"eject_button\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🎦\",\r\n description: \"cinema\",\r\n category: \"Symbols\",\r\n aliases: [\"cinema\"],\r\n tags: [\"film\", \"movie\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🔅\",\r\n description: \"dim button\",\r\n category: \"Symbols\",\r\n aliases: [\"low_brightness\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🔆\",\r\n description: \"bright button\",\r\n category: \"Symbols\",\r\n aliases: [\"high_brightness\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"📶\",\r\n description: \"antenna bars\",\r\n category: \"Symbols\",\r\n aliases: [\"signal_strength\"],\r\n tags: [\"wifi\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"📳\",\r\n description: \"vibration mode\",\r\n category: \"Symbols\",\r\n aliases: [\"vibration_mode\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"📴\",\r\n description: \"mobile phone off\",\r\n category: \"Symbols\",\r\n aliases: [\"mobile_phone_off\"],\r\n tags: [\"mute\", \"off\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"♀️\",\r\n description: \"female sign\",\r\n category: \"Symbols\",\r\n aliases: [\"female_sign\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"♂️\",\r\n description: \"male sign\",\r\n category: \"Symbols\",\r\n aliases: [\"male_sign\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"⚧️\",\r\n description: \"transgender symbol\",\r\n category: \"Symbols\",\r\n aliases: [\"transgender_symbol\"],\r\n tags: [],\r\n unicode_version: \"13.0\",\r\n ios_version: \"14.0\",\r\n },\r\n {\r\n emoji: \"✖️\",\r\n description: \"multiply\",\r\n category: \"Symbols\",\r\n aliases: [\"heavy_multiplication_x\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"➕\",\r\n description: \"plus\",\r\n category: \"Symbols\",\r\n aliases: [\"heavy_plus_sign\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"➖\",\r\n description: \"minus\",\r\n category: \"Symbols\",\r\n aliases: [\"heavy_minus_sign\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"➗\",\r\n description: \"divide\",\r\n category: \"Symbols\",\r\n aliases: [\"heavy_division_sign\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"♾️\",\r\n description: \"infinity\",\r\n category: \"Symbols\",\r\n aliases: [\"infinity\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"‼️\",\r\n description: \"double exclamation mark\",\r\n category: \"Symbols\",\r\n aliases: [\"bangbang\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"⁉️\",\r\n description: \"exclamation question mark\",\r\n category: \"Symbols\",\r\n aliases: [\"interrobang\"],\r\n tags: [],\r\n unicode_version: \"3.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"❓\",\r\n description: \"red question mark\",\r\n category: \"Symbols\",\r\n aliases: [\"question\"],\r\n tags: [\"confused\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"❔\",\r\n description: \"white question mark\",\r\n category: \"Symbols\",\r\n aliases: [\"grey_question\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"❕\",\r\n description: \"white exclamation mark\",\r\n category: \"Symbols\",\r\n aliases: [\"grey_exclamation\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"❗\",\r\n description: \"red exclamation mark\",\r\n category: \"Symbols\",\r\n aliases: [\"exclamation\", \"heavy_exclamation_mark\"],\r\n tags: [\"bang\"],\r\n unicode_version: \"5.2\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"〰️\",\r\n description: \"wavy dash\",\r\n category: \"Symbols\",\r\n aliases: [\"wavy_dash\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"💱\",\r\n description: \"currency exchange\",\r\n category: \"Symbols\",\r\n aliases: [\"currency_exchange\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"💲\",\r\n description: \"heavy dollar sign\",\r\n category: \"Symbols\",\r\n aliases: [\"heavy_dollar_sign\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"⚕️\",\r\n description: \"medical symbol\",\r\n category: \"Symbols\",\r\n aliases: [\"medical_symbol\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"♻️\",\r\n description: \"recycling symbol\",\r\n category: \"Symbols\",\r\n aliases: [\"recycle\"],\r\n tags: [\"environment\", \"green\"],\r\n unicode_version: \"3.2\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"⚜️\",\r\n description: \"fleur-de-lis\",\r\n category: \"Symbols\",\r\n aliases: [\"fleur_de_lis\"],\r\n tags: [],\r\n unicode_version: \"4.1\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🔱\",\r\n description: \"trident emblem\",\r\n category: \"Symbols\",\r\n aliases: [\"trident\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"📛\",\r\n description: \"name badge\",\r\n category: \"Symbols\",\r\n aliases: [\"name_badge\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🔰\",\r\n description: \"Japanese symbol for beginner\",\r\n category: \"Symbols\",\r\n aliases: [\"beginner\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"⭕\",\r\n description: \"hollow red circle\",\r\n category: \"Symbols\",\r\n aliases: [\"o\"],\r\n tags: [],\r\n unicode_version: \"5.2\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"✅\",\r\n description: \"check mark button\",\r\n category: \"Symbols\",\r\n aliases: [\"white_check_mark\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"☑️\",\r\n description: \"check box with check\",\r\n category: \"Symbols\",\r\n aliases: [\"ballot_box_with_check\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"✔️\",\r\n description: \"check mark\",\r\n category: \"Symbols\",\r\n aliases: [\"heavy_check_mark\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"❌\",\r\n description: \"cross mark\",\r\n category: \"Symbols\",\r\n aliases: [\"x\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"❎\",\r\n description: \"cross mark button\",\r\n category: \"Symbols\",\r\n aliases: [\"negative_squared_cross_mark\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"➰\",\r\n description: \"curly loop\",\r\n category: \"Symbols\",\r\n aliases: [\"curly_loop\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"➿\",\r\n description: \"double curly loop\",\r\n category: \"Symbols\",\r\n aliases: [\"loop\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"〽️\",\r\n description: \"part alternation mark\",\r\n category: \"Symbols\",\r\n aliases: [\"part_alternation_mark\"],\r\n tags: [],\r\n unicode_version: \"3.2\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"✳️\",\r\n description: \"eight-spoked asterisk\",\r\n category: \"Symbols\",\r\n aliases: [\"eight_spoked_asterisk\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"✴️\",\r\n description: \"eight-pointed star\",\r\n category: \"Symbols\",\r\n aliases: [\"eight_pointed_black_star\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"❇️\",\r\n description: \"sparkle\",\r\n category: \"Symbols\",\r\n aliases: [\"sparkle\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"©️\",\r\n description: \"copyright\",\r\n category: \"Symbols\",\r\n aliases: [\"copyright\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"®️\",\r\n description: \"registered\",\r\n category: \"Symbols\",\r\n aliases: [\"registered\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"™️\",\r\n description: \"trade mark\",\r\n category: \"Symbols\",\r\n aliases: [\"tm\"],\r\n tags: [\"trademark\"],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"#️⃣\",\r\n description: \"keycap: #\",\r\n category: \"Symbols\",\r\n aliases: [\"hash\"],\r\n tags: [\"number\"],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"*️⃣\",\r\n description: \"keycap: *\",\r\n category: \"Symbols\",\r\n aliases: [\"asterisk\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"0️⃣\",\r\n description: \"keycap: 0\",\r\n category: \"Symbols\",\r\n aliases: [\"zero\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"1️⃣\",\r\n description: \"keycap: 1\",\r\n category: \"Symbols\",\r\n aliases: [\"one\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"2️⃣\",\r\n description: \"keycap: 2\",\r\n category: \"Symbols\",\r\n aliases: [\"two\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"3️⃣\",\r\n description: \"keycap: 3\",\r\n category: \"Symbols\",\r\n aliases: [\"three\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"4️⃣\",\r\n description: \"keycap: 4\",\r\n category: \"Symbols\",\r\n aliases: [\"four\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"5️⃣\",\r\n description: \"keycap: 5\",\r\n category: \"Symbols\",\r\n aliases: [\"five\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"6️⃣\",\r\n description: \"keycap: 6\",\r\n category: \"Symbols\",\r\n aliases: [\"six\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"7️⃣\",\r\n description: \"keycap: 7\",\r\n category: \"Symbols\",\r\n aliases: [\"seven\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"8️⃣\",\r\n description: \"keycap: 8\",\r\n category: \"Symbols\",\r\n aliases: [\"eight\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"9️⃣\",\r\n description: \"keycap: 9\",\r\n category: \"Symbols\",\r\n aliases: [\"nine\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🔟\",\r\n description: \"keycap: 10\",\r\n category: \"Symbols\",\r\n aliases: [\"keycap_ten\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🔠\",\r\n description: \"input latin uppercase\",\r\n category: \"Symbols\",\r\n aliases: [\"capital_abcd\"],\r\n tags: [\"letters\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🔡\",\r\n description: \"input latin lowercase\",\r\n category: \"Symbols\",\r\n aliases: [\"abcd\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🔢\",\r\n description: \"input numbers\",\r\n category: \"Symbols\",\r\n aliases: [\"1234\"],\r\n tags: [\"numbers\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🔣\",\r\n description: \"input symbols\",\r\n category: \"Symbols\",\r\n aliases: [\"symbols\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🔤\",\r\n description: \"input latin letters\",\r\n category: \"Symbols\",\r\n aliases: [\"abc\"],\r\n tags: [\"alphabet\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🅰️\",\r\n description: \"A button (blood type)\",\r\n category: \"Symbols\",\r\n aliases: [\"a\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🆎\",\r\n description: \"AB button (blood type)\",\r\n category: \"Symbols\",\r\n aliases: [\"ab\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🅱️\",\r\n description: \"B button (blood type)\",\r\n category: \"Symbols\",\r\n aliases: [\"b\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🆑\",\r\n description: \"CL button\",\r\n category: \"Symbols\",\r\n aliases: [\"cl\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🆒\",\r\n description: \"COOL button\",\r\n category: \"Symbols\",\r\n aliases: [\"cool\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🆓\",\r\n description: \"FREE button\",\r\n category: \"Symbols\",\r\n aliases: [\"free\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"ℹ️\",\r\n description: \"information\",\r\n category: \"Symbols\",\r\n aliases: [\"information_source\"],\r\n tags: [],\r\n unicode_version: \"3.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🆔\",\r\n description: \"ID button\",\r\n category: \"Symbols\",\r\n aliases: [\"id\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"Ⓜ️\",\r\n description: \"circled M\",\r\n category: \"Symbols\",\r\n aliases: [\"m\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🆕\",\r\n description: \"NEW button\",\r\n category: \"Symbols\",\r\n aliases: [\"new\"],\r\n tags: [\"fresh\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🆖\",\r\n description: \"NG button\",\r\n category: \"Symbols\",\r\n aliases: [\"ng\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🅾️\",\r\n description: \"O button (blood type)\",\r\n category: \"Symbols\",\r\n aliases: [\"o2\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🆗\",\r\n description: \"OK button\",\r\n category: \"Symbols\",\r\n aliases: [\"ok\"],\r\n tags: [\"yes\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🅿️\",\r\n description: \"P button\",\r\n category: \"Symbols\",\r\n aliases: [\"parking\"],\r\n tags: [],\r\n unicode_version: \"5.2\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🆘\",\r\n description: \"SOS button\",\r\n category: \"Symbols\",\r\n aliases: [\"sos\"],\r\n tags: [\"help\", \"emergency\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🆙\",\r\n description: \"UP! button\",\r\n category: \"Symbols\",\r\n aliases: [\"up\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🆚\",\r\n description: \"VS button\",\r\n category: \"Symbols\",\r\n aliases: [\"vs\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🈁\",\r\n description: \"Japanese “here” button\",\r\n category: \"Symbols\",\r\n aliases: [\"koko\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🈂️\",\r\n description: \"Japanese “service charge” button\",\r\n category: \"Symbols\",\r\n aliases: [\"sa\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🈷️\",\r\n description: \"Japanese “monthly amount” button\",\r\n category: \"Symbols\",\r\n aliases: [\"u6708\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🈶\",\r\n description: \"Japanese “not free of charge” button\",\r\n category: \"Symbols\",\r\n aliases: [\"u6709\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🈯\",\r\n description: \"Japanese “reserved” button\",\r\n category: \"Symbols\",\r\n aliases: [\"u6307\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🉐\",\r\n description: \"Japanese “bargain” button\",\r\n category: \"Symbols\",\r\n aliases: [\"ideograph_advantage\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🈹\",\r\n description: \"Japanese “discount” button\",\r\n category: \"Symbols\",\r\n aliases: [\"u5272\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🈚\",\r\n description: \"Japanese “free of charge” button\",\r\n category: \"Symbols\",\r\n aliases: [\"u7121\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🈲\",\r\n description: \"Japanese “prohibited” button\",\r\n category: \"Symbols\",\r\n aliases: [\"u7981\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🉑\",\r\n description: \"Japanese “acceptable” button\",\r\n category: \"Symbols\",\r\n aliases: [\"accept\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🈸\",\r\n description: \"Japanese “application” button\",\r\n category: \"Symbols\",\r\n aliases: [\"u7533\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🈴\",\r\n description: \"Japanese “passing grade” button\",\r\n category: \"Symbols\",\r\n aliases: [\"u5408\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🈳\",\r\n description: \"Japanese “vacancy” button\",\r\n category: \"Symbols\",\r\n aliases: [\"u7a7a\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"㊗️\",\r\n description: \"Japanese “congratulations” button\",\r\n category: \"Symbols\",\r\n aliases: [\"congratulations\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"㊙️\",\r\n description: \"Japanese “secret” button\",\r\n category: \"Symbols\",\r\n aliases: [\"secret\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🈺\",\r\n description: \"Japanese “open for business” button\",\r\n category: \"Symbols\",\r\n aliases: [\"u55b6\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🈵\",\r\n description: \"Japanese “no vacancy” button\",\r\n category: \"Symbols\",\r\n aliases: [\"u6e80\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🔴\",\r\n description: \"red circle\",\r\n category: \"Symbols\",\r\n aliases: [\"red_circle\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🟠\",\r\n description: \"orange circle\",\r\n category: \"Symbols\",\r\n aliases: [\"orange_circle\"],\r\n tags: [],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n },\r\n {\r\n emoji: \"🟡\",\r\n description: \"yellow circle\",\r\n category: \"Symbols\",\r\n aliases: [\"yellow_circle\"],\r\n tags: [],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n },\r\n {\r\n emoji: \"🟢\",\r\n description: \"green circle\",\r\n category: \"Symbols\",\r\n aliases: [\"green_circle\"],\r\n tags: [],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n },\r\n {\r\n emoji: \"🔵\",\r\n description: \"blue circle\",\r\n category: \"Symbols\",\r\n aliases: [\"large_blue_circle\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🟣\",\r\n description: \"purple circle\",\r\n category: \"Symbols\",\r\n aliases: [\"purple_circle\"],\r\n tags: [],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n },\r\n {\r\n emoji: \"🟤\",\r\n description: \"brown circle\",\r\n category: \"Symbols\",\r\n aliases: [\"brown_circle\"],\r\n tags: [],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n },\r\n {\r\n emoji: \"⚫\",\r\n description: \"black circle\",\r\n category: \"Symbols\",\r\n aliases: [\"black_circle\"],\r\n tags: [],\r\n unicode_version: \"4.1\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"⚪\",\r\n description: \"white circle\",\r\n category: \"Symbols\",\r\n aliases: [\"white_circle\"],\r\n tags: [],\r\n unicode_version: \"4.1\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🟥\",\r\n description: \"red square\",\r\n category: \"Symbols\",\r\n aliases: [\"red_square\"],\r\n tags: [],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n },\r\n {\r\n emoji: \"🟧\",\r\n description: \"orange square\",\r\n category: \"Symbols\",\r\n aliases: [\"orange_square\"],\r\n tags: [],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n },\r\n {\r\n emoji: \"🟨\",\r\n description: \"yellow square\",\r\n category: \"Symbols\",\r\n aliases: [\"yellow_square\"],\r\n tags: [],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n },\r\n {\r\n emoji: \"🟩\",\r\n description: \"green square\",\r\n category: \"Symbols\",\r\n aliases: [\"green_square\"],\r\n tags: [],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n },\r\n {\r\n emoji: \"🟦\",\r\n description: \"blue square\",\r\n category: \"Symbols\",\r\n aliases: [\"blue_square\"],\r\n tags: [],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n },\r\n {\r\n emoji: \"🟪\",\r\n description: \"purple square\",\r\n category: \"Symbols\",\r\n aliases: [\"purple_square\"],\r\n tags: [],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n },\r\n {\r\n emoji: \"🟫\",\r\n description: \"brown square\",\r\n category: \"Symbols\",\r\n aliases: [\"brown_square\"],\r\n tags: [],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n },\r\n {\r\n emoji: \"⬛\",\r\n description: \"black large square\",\r\n category: \"Symbols\",\r\n aliases: [\"black_large_square\"],\r\n tags: [],\r\n unicode_version: \"5.1\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"⬜\",\r\n description: \"white large square\",\r\n category: \"Symbols\",\r\n aliases: [\"white_large_square\"],\r\n tags: [],\r\n unicode_version: \"5.1\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"◼️\",\r\n description: \"black medium square\",\r\n category: \"Symbols\",\r\n aliases: [\"black_medium_square\"],\r\n tags: [],\r\n unicode_version: \"3.2\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"◻️\",\r\n description: \"white medium square\",\r\n category: \"Symbols\",\r\n aliases: [\"white_medium_square\"],\r\n tags: [],\r\n unicode_version: \"3.2\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"◾\",\r\n description: \"black medium-small square\",\r\n category: \"Symbols\",\r\n aliases: [\"black_medium_small_square\"],\r\n tags: [],\r\n unicode_version: \"3.2\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"◽\",\r\n description: \"white medium-small square\",\r\n category: \"Symbols\",\r\n aliases: [\"white_medium_small_square\"],\r\n tags: [],\r\n unicode_version: \"3.2\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"▪️\",\r\n description: \"black small square\",\r\n category: \"Symbols\",\r\n aliases: [\"black_small_square\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"▫️\",\r\n description: \"white small square\",\r\n category: \"Symbols\",\r\n aliases: [\"white_small_square\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🔶\",\r\n description: \"large orange diamond\",\r\n category: \"Symbols\",\r\n aliases: [\"large_orange_diamond\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🔷\",\r\n description: \"large blue diamond\",\r\n category: \"Symbols\",\r\n aliases: [\"large_blue_diamond\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🔸\",\r\n description: \"small orange diamond\",\r\n category: \"Symbols\",\r\n aliases: [\"small_orange_diamond\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🔹\",\r\n description: \"small blue diamond\",\r\n category: \"Symbols\",\r\n aliases: [\"small_blue_diamond\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🔺\",\r\n description: \"red triangle pointed up\",\r\n category: \"Symbols\",\r\n aliases: [\"small_red_triangle\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🔻\",\r\n description: \"red triangle pointed down\",\r\n category: \"Symbols\",\r\n aliases: [\"small_red_triangle_down\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"💠\",\r\n description: \"diamond with a dot\",\r\n category: \"Symbols\",\r\n aliases: [\"diamond_shape_with_a_dot_inside\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🔘\",\r\n description: \"radio button\",\r\n category: \"Symbols\",\r\n aliases: [\"radio_button\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🔳\",\r\n description: \"white square button\",\r\n category: \"Symbols\",\r\n aliases: [\"white_square_button\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🔲\",\r\n description: \"black square button\",\r\n category: \"Symbols\",\r\n aliases: [\"black_square_button\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🏁\",\r\n description: \"chequered flag\",\r\n category: \"Flags\",\r\n aliases: [\"checkered_flag\"],\r\n tags: [\"milestone\", \"finish\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🚩\",\r\n description: \"triangular flag\",\r\n category: \"Flags\",\r\n aliases: [\"triangular_flag_on_post\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🎌\",\r\n description: \"crossed flags\",\r\n category: \"Flags\",\r\n aliases: [\"crossed_flags\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🏴\",\r\n description: \"black flag\",\r\n category: \"Flags\",\r\n aliases: [\"black_flag\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🏳️\",\r\n description: \"white flag\",\r\n category: \"Flags\",\r\n aliases: [\"white_flag\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🏳️‍🌈\",\r\n description: \"rainbow flag\",\r\n category: \"Flags\",\r\n aliases: [\"rainbow_flag\"],\r\n tags: [\"pride\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"10.0\",\r\n },\r\n {\r\n emoji: \"🏳️‍⚧️\",\r\n description: \"transgender flag\",\r\n category: \"Flags\",\r\n aliases: [\"transgender_flag\"],\r\n tags: [],\r\n unicode_version: \"13.0\",\r\n ios_version: \"14.0\",\r\n },\r\n {\r\n emoji: \"🏴‍☠️\",\r\n description: \"pirate flag\",\r\n category: \"Flags\",\r\n aliases: [\"pirate_flag\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🇦🇨\",\r\n description: \"flag: Ascension Island\",\r\n category: \"Flags\",\r\n aliases: [\"ascension_island\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🇦🇩\",\r\n description: \"flag: Andorra\",\r\n category: \"Flags\",\r\n aliases: [\"andorra\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇦🇪\",\r\n description: \"flag: United Arab Emirates\",\r\n category: \"Flags\",\r\n aliases: [\"united_arab_emirates\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇦🇫\",\r\n description: \"flag: Afghanistan\",\r\n category: \"Flags\",\r\n aliases: [\"afghanistan\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇦🇬\",\r\n description: \"flag: Antigua & Barbuda\",\r\n category: \"Flags\",\r\n aliases: [\"antigua_barbuda\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇦🇮\",\r\n description: \"flag: Anguilla\",\r\n category: \"Flags\",\r\n aliases: [\"anguilla\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇦🇱\",\r\n description: \"flag: Albania\",\r\n category: \"Flags\",\r\n aliases: [\"albania\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇦🇲\",\r\n description: \"flag: Armenia\",\r\n category: \"Flags\",\r\n aliases: [\"armenia\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇦🇴\",\r\n description: \"flag: Angola\",\r\n category: \"Flags\",\r\n aliases: [\"angola\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇦🇶\",\r\n description: \"flag: Antarctica\",\r\n category: \"Flags\",\r\n aliases: [\"antarctica\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"9.0\",\r\n },\r\n {\r\n emoji: \"🇦🇷\",\r\n description: \"flag: Argentina\",\r\n category: \"Flags\",\r\n aliases: [\"argentina\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇦🇸\",\r\n description: \"flag: American Samoa\",\r\n category: \"Flags\",\r\n aliases: [\"american_samoa\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇦🇹\",\r\n description: \"flag: Austria\",\r\n category: \"Flags\",\r\n aliases: [\"austria\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇦🇺\",\r\n description: \"flag: Australia\",\r\n category: \"Flags\",\r\n aliases: [\"australia\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇦🇼\",\r\n description: \"flag: Aruba\",\r\n category: \"Flags\",\r\n aliases: [\"aruba\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇦🇽\",\r\n description: \"flag: Åland Islands\",\r\n category: \"Flags\",\r\n aliases: [\"aland_islands\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"9.0\",\r\n },\r\n {\r\n emoji: \"🇦🇿\",\r\n description: \"flag: Azerbaijan\",\r\n category: \"Flags\",\r\n aliases: [\"azerbaijan\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇧🇦\",\r\n description: \"flag: Bosnia & Herzegovina\",\r\n category: \"Flags\",\r\n aliases: [\"bosnia_herzegovina\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇧🇧\",\r\n description: \"flag: Barbados\",\r\n category: \"Flags\",\r\n aliases: [\"barbados\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇧🇩\",\r\n description: \"flag: Bangladesh\",\r\n category: \"Flags\",\r\n aliases: [\"bangladesh\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇧🇪\",\r\n description: \"flag: Belgium\",\r\n category: \"Flags\",\r\n aliases: [\"belgium\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇧🇫\",\r\n description: \"flag: Burkina Faso\",\r\n category: \"Flags\",\r\n aliases: [\"burkina_faso\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇧🇬\",\r\n description: \"flag: Bulgaria\",\r\n category: \"Flags\",\r\n aliases: [\"bulgaria\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇧🇭\",\r\n description: \"flag: Bahrain\",\r\n category: \"Flags\",\r\n aliases: [\"bahrain\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇧🇮\",\r\n description: \"flag: Burundi\",\r\n category: \"Flags\",\r\n aliases: [\"burundi\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇧🇯\",\r\n description: \"flag: Benin\",\r\n category: \"Flags\",\r\n aliases: [\"benin\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇧🇱\",\r\n description: \"flag: St. Barthélemy\",\r\n category: \"Flags\",\r\n aliases: [\"st_barthelemy\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"9.0\",\r\n },\r\n {\r\n emoji: \"🇧🇲\",\r\n description: \"flag: Bermuda\",\r\n category: \"Flags\",\r\n aliases: [\"bermuda\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇧🇳\",\r\n description: \"flag: Brunei\",\r\n category: \"Flags\",\r\n aliases: [\"brunei\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇧🇴\",\r\n description: \"flag: Bolivia\",\r\n category: \"Flags\",\r\n aliases: [\"bolivia\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇧🇶\",\r\n description: \"flag: Caribbean Netherlands\",\r\n category: \"Flags\",\r\n aliases: [\"caribbean_netherlands\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"9.0\",\r\n },\r\n {\r\n emoji: \"🇧🇷\",\r\n description: \"flag: Brazil\",\r\n category: \"Flags\",\r\n aliases: [\"brazil\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇧🇸\",\r\n description: \"flag: Bahamas\",\r\n category: \"Flags\",\r\n aliases: [\"bahamas\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇧🇹\",\r\n description: \"flag: Bhutan\",\r\n category: \"Flags\",\r\n aliases: [\"bhutan\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇧🇻\",\r\n description: \"flag: Bouvet Island\",\r\n category: \"Flags\",\r\n aliases: [\"bouvet_island\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🇧🇼\",\r\n description: \"flag: Botswana\",\r\n category: \"Flags\",\r\n aliases: [\"botswana\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇧🇾\",\r\n description: \"flag: Belarus\",\r\n category: \"Flags\",\r\n aliases: [\"belarus\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇧🇿\",\r\n description: \"flag: Belize\",\r\n category: \"Flags\",\r\n aliases: [\"belize\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇨🇦\",\r\n description: \"flag: Canada\",\r\n category: \"Flags\",\r\n aliases: [\"canada\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇨🇨\",\r\n description: \"flag: Cocos (Keeling) Islands\",\r\n category: \"Flags\",\r\n aliases: [\"cocos_islands\"],\r\n tags: [\"keeling\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"9.0\",\r\n },\r\n {\r\n emoji: \"🇨🇩\",\r\n description: \"flag: Congo - Kinshasa\",\r\n category: \"Flags\",\r\n aliases: [\"congo_kinshasa\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇨🇫\",\r\n description: \"flag: Central African Republic\",\r\n category: \"Flags\",\r\n aliases: [\"central_african_republic\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇨🇬\",\r\n description: \"flag: Congo - Brazzaville\",\r\n category: \"Flags\",\r\n aliases: [\"congo_brazzaville\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇨🇭\",\r\n description: \"flag: Switzerland\",\r\n category: \"Flags\",\r\n aliases: [\"switzerland\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇨🇮\",\r\n description: \"flag: Côte d’Ivoire\",\r\n category: \"Flags\",\r\n aliases: [\"cote_divoire\"],\r\n tags: [\"ivory\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇨🇰\",\r\n description: \"flag: Cook Islands\",\r\n category: \"Flags\",\r\n aliases: [\"cook_islands\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇨🇱\",\r\n description: \"flag: Chile\",\r\n category: \"Flags\",\r\n aliases: [\"chile\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇨🇲\",\r\n description: \"flag: Cameroon\",\r\n category: \"Flags\",\r\n aliases: [\"cameroon\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇨🇳\",\r\n description: \"flag: China\",\r\n category: \"Flags\",\r\n aliases: [\"cn\"],\r\n tags: [\"china\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🇨🇴\",\r\n description: \"flag: Colombia\",\r\n category: \"Flags\",\r\n aliases: [\"colombia\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇨🇵\",\r\n description: \"flag: Clipperton Island\",\r\n category: \"Flags\",\r\n aliases: [\"clipperton_island\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🇨🇷\",\r\n description: \"flag: Costa Rica\",\r\n category: \"Flags\",\r\n aliases: [\"costa_rica\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇨🇺\",\r\n description: \"flag: Cuba\",\r\n category: \"Flags\",\r\n aliases: [\"cuba\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇨🇻\",\r\n description: \"flag: Cape Verde\",\r\n category: \"Flags\",\r\n aliases: [\"cape_verde\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇨🇼\",\r\n description: \"flag: Curaçao\",\r\n category: \"Flags\",\r\n aliases: [\"curacao\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇨🇽\",\r\n description: \"flag: Christmas Island\",\r\n category: \"Flags\",\r\n aliases: [\"christmas_island\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"9.0\",\r\n },\r\n {\r\n emoji: \"🇨🇾\",\r\n description: \"flag: Cyprus\",\r\n category: \"Flags\",\r\n aliases: [\"cyprus\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇨🇿\",\r\n description: \"flag: Czechia\",\r\n category: \"Flags\",\r\n aliases: [\"czech_republic\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇩🇪\",\r\n description: \"flag: Germany\",\r\n category: \"Flags\",\r\n aliases: [\"de\"],\r\n tags: [\"flag\", \"germany\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🇩🇬\",\r\n description: \"flag: Diego Garcia\",\r\n category: \"Flags\",\r\n aliases: [\"diego_garcia\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🇩🇯\",\r\n description: \"flag: Djibouti\",\r\n category: \"Flags\",\r\n aliases: [\"djibouti\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇩🇰\",\r\n description: \"flag: Denmark\",\r\n category: \"Flags\",\r\n aliases: [\"denmark\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇩🇲\",\r\n description: \"flag: Dominica\",\r\n category: \"Flags\",\r\n aliases: [\"dominica\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇩🇴\",\r\n description: \"flag: Dominican Republic\",\r\n category: \"Flags\",\r\n aliases: [\"dominican_republic\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇩🇿\",\r\n description: \"flag: Algeria\",\r\n category: \"Flags\",\r\n aliases: [\"algeria\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇪🇦\",\r\n description: \"flag: Ceuta & Melilla\",\r\n category: \"Flags\",\r\n aliases: [\"ceuta_melilla\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🇪🇨\",\r\n description: \"flag: Ecuador\",\r\n category: \"Flags\",\r\n aliases: [\"ecuador\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇪🇪\",\r\n description: \"flag: Estonia\",\r\n category: \"Flags\",\r\n aliases: [\"estonia\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇪🇬\",\r\n description: \"flag: Egypt\",\r\n category: \"Flags\",\r\n aliases: [\"egypt\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇪🇭\",\r\n description: \"flag: Western Sahara\",\r\n category: \"Flags\",\r\n aliases: [\"western_sahara\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"9.0\",\r\n },\r\n {\r\n emoji: \"🇪🇷\",\r\n description: \"flag: Eritrea\",\r\n category: \"Flags\",\r\n aliases: [\"eritrea\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇪🇸\",\r\n description: \"flag: Spain\",\r\n category: \"Flags\",\r\n aliases: [\"es\"],\r\n tags: [\"spain\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🇪🇹\",\r\n description: \"flag: Ethiopia\",\r\n category: \"Flags\",\r\n aliases: [\"ethiopia\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇪🇺\",\r\n description: \"flag: European Union\",\r\n category: \"Flags\",\r\n aliases: [\"eu\", \"european_union\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"9.0\",\r\n },\r\n {\r\n emoji: \"🇫🇮\",\r\n description: \"flag: Finland\",\r\n category: \"Flags\",\r\n aliases: [\"finland\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇫🇯\",\r\n description: \"flag: Fiji\",\r\n category: \"Flags\",\r\n aliases: [\"fiji\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇫🇰\",\r\n description: \"flag: Falkland Islands\",\r\n category: \"Flags\",\r\n aliases: [\"falkland_islands\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"9.0\",\r\n },\r\n {\r\n emoji: \"🇫🇲\",\r\n description: \"flag: Micronesia\",\r\n category: \"Flags\",\r\n aliases: [\"micronesia\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"9.0\",\r\n },\r\n {\r\n emoji: \"🇫🇴\",\r\n description: \"flag: Faroe Islands\",\r\n category: \"Flags\",\r\n aliases: [\"faroe_islands\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇫🇷\",\r\n description: \"flag: France\",\r\n category: \"Flags\",\r\n aliases: [\"fr\"],\r\n tags: [\"france\", \"french\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🇬🇦\",\r\n description: \"flag: Gabon\",\r\n category: \"Flags\",\r\n aliases: [\"gabon\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇬🇧\",\r\n description: \"flag: United Kingdom\",\r\n category: \"Flags\",\r\n aliases: [\"gb\", \"uk\"],\r\n tags: [\"flag\", \"british\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🇬🇩\",\r\n description: \"flag: Grenada\",\r\n category: \"Flags\",\r\n aliases: [\"grenada\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇬🇪\",\r\n description: \"flag: Georgia\",\r\n category: \"Flags\",\r\n aliases: [\"georgia\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇬🇫\",\r\n description: \"flag: French Guiana\",\r\n category: \"Flags\",\r\n aliases: [\"french_guiana\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇬🇬\",\r\n description: \"flag: Guernsey\",\r\n category: \"Flags\",\r\n aliases: [\"guernsey\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"9.0\",\r\n },\r\n {\r\n emoji: \"🇬🇭\",\r\n description: \"flag: Ghana\",\r\n category: \"Flags\",\r\n aliases: [\"ghana\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇬🇮\",\r\n description: \"flag: Gibraltar\",\r\n category: \"Flags\",\r\n aliases: [\"gibraltar\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇬🇱\",\r\n description: \"flag: Greenland\",\r\n category: \"Flags\",\r\n aliases: [\"greenland\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"9.0\",\r\n },\r\n {\r\n emoji: \"🇬🇲\",\r\n description: \"flag: Gambia\",\r\n category: \"Flags\",\r\n aliases: [\"gambia\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇬🇳\",\r\n description: \"flag: Guinea\",\r\n category: \"Flags\",\r\n aliases: [\"guinea\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇬🇵\",\r\n description: \"flag: Guadeloupe\",\r\n category: \"Flags\",\r\n aliases: [\"guadeloupe\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"9.0\",\r\n },\r\n {\r\n emoji: \"🇬🇶\",\r\n description: \"flag: Equatorial Guinea\",\r\n category: \"Flags\",\r\n aliases: [\"equatorial_guinea\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇬🇷\",\r\n description: \"flag: Greece\",\r\n category: \"Flags\",\r\n aliases: [\"greece\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇬🇸\",\r\n description: \"flag: South Georgia & South Sandwich Islands\",\r\n category: \"Flags\",\r\n aliases: [\"south_georgia_south_sandwich_islands\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"9.0\",\r\n },\r\n {\r\n emoji: \"🇬🇹\",\r\n description: \"flag: Guatemala\",\r\n category: \"Flags\",\r\n aliases: [\"guatemala\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇬🇺\",\r\n description: \"flag: Guam\",\r\n category: \"Flags\",\r\n aliases: [\"guam\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇬🇼\",\r\n description: \"flag: Guinea-Bissau\",\r\n category: \"Flags\",\r\n aliases: [\"guinea_bissau\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇬🇾\",\r\n description: \"flag: Guyana\",\r\n category: \"Flags\",\r\n aliases: [\"guyana\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇭🇰\",\r\n description: \"flag: Hong Kong SAR China\",\r\n category: \"Flags\",\r\n aliases: [\"hong_kong\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇭🇲\",\r\n description: \"flag: Heard & McDonald Islands\",\r\n category: \"Flags\",\r\n aliases: [\"heard_mcdonald_islands\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🇭🇳\",\r\n description: \"flag: Honduras\",\r\n category: \"Flags\",\r\n aliases: [\"honduras\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇭🇷\",\r\n description: \"flag: Croatia\",\r\n category: \"Flags\",\r\n aliases: [\"croatia\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇭🇹\",\r\n description: \"flag: Haiti\",\r\n category: \"Flags\",\r\n aliases: [\"haiti\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇭🇺\",\r\n description: \"flag: Hungary\",\r\n category: \"Flags\",\r\n aliases: [\"hungary\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇮🇨\",\r\n description: \"flag: Canary Islands\",\r\n category: \"Flags\",\r\n aliases: [\"canary_islands\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"9.0\",\r\n },\r\n {\r\n emoji: \"🇮🇩\",\r\n description: \"flag: Indonesia\",\r\n category: \"Flags\",\r\n aliases: [\"indonesia\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇮🇪\",\r\n description: \"flag: Ireland\",\r\n category: \"Flags\",\r\n aliases: [\"ireland\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇮🇱\",\r\n description: \"flag: Israel\",\r\n category: \"Flags\",\r\n aliases: [\"israel\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇮🇲\",\r\n description: \"flag: Isle of Man\",\r\n category: \"Flags\",\r\n aliases: [\"isle_of_man\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"9.0\",\r\n },\r\n {\r\n emoji: \"🇮🇳\",\r\n description: \"flag: India\",\r\n category: \"Flags\",\r\n aliases: [\"india\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇮🇴\",\r\n description: \"flag: British Indian Ocean Territory\",\r\n category: \"Flags\",\r\n aliases: [\"british_indian_ocean_territory\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"9.0\",\r\n },\r\n {\r\n emoji: \"🇮🇶\",\r\n description: \"flag: Iraq\",\r\n category: \"Flags\",\r\n aliases: [\"iraq\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇮🇷\",\r\n description: \"flag: Iran\",\r\n category: \"Flags\",\r\n aliases: [\"iran\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇮🇸\",\r\n description: \"flag: Iceland\",\r\n category: \"Flags\",\r\n aliases: [\"iceland\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇮🇹\",\r\n description: \"flag: Italy\",\r\n category: \"Flags\",\r\n aliases: [\"it\"],\r\n tags: [\"italy\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🇯🇪\",\r\n description: \"flag: Jersey\",\r\n category: \"Flags\",\r\n aliases: [\"jersey\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"9.0\",\r\n },\r\n {\r\n emoji: \"🇯🇲\",\r\n description: \"flag: Jamaica\",\r\n category: \"Flags\",\r\n aliases: [\"jamaica\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇯🇴\",\r\n description: \"flag: Jordan\",\r\n category: \"Flags\",\r\n aliases: [\"jordan\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇯🇵\",\r\n description: \"flag: Japan\",\r\n category: \"Flags\",\r\n aliases: [\"jp\"],\r\n tags: [\"japan\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🇰🇪\",\r\n description: \"flag: Kenya\",\r\n category: \"Flags\",\r\n aliases: [\"kenya\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇰🇬\",\r\n description: \"flag: Kyrgyzstan\",\r\n category: \"Flags\",\r\n aliases: [\"kyrgyzstan\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇰🇭\",\r\n description: \"flag: Cambodia\",\r\n category: \"Flags\",\r\n aliases: [\"cambodia\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇰🇮\",\r\n description: \"flag: Kiribati\",\r\n category: \"Flags\",\r\n aliases: [\"kiribati\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇰🇲\",\r\n description: \"flag: Comoros\",\r\n category: \"Flags\",\r\n aliases: [\"comoros\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇰🇳\",\r\n description: \"flag: St. Kitts & Nevis\",\r\n category: \"Flags\",\r\n aliases: [\"st_kitts_nevis\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇰🇵\",\r\n description: \"flag: North Korea\",\r\n category: \"Flags\",\r\n aliases: [\"north_korea\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇰🇷\",\r\n description: \"flag: South Korea\",\r\n category: \"Flags\",\r\n aliases: [\"kr\"],\r\n tags: [\"korea\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🇰🇼\",\r\n description: \"flag: Kuwait\",\r\n category: \"Flags\",\r\n aliases: [\"kuwait\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇰🇾\",\r\n description: \"flag: Cayman Islands\",\r\n category: \"Flags\",\r\n aliases: [\"cayman_islands\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇰🇿\",\r\n description: \"flag: Kazakhstan\",\r\n category: \"Flags\",\r\n aliases: [\"kazakhstan\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇱🇦\",\r\n description: \"flag: Laos\",\r\n category: \"Flags\",\r\n aliases: [\"laos\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇱🇧\",\r\n description: \"flag: Lebanon\",\r\n category: \"Flags\",\r\n aliases: [\"lebanon\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇱🇨\",\r\n description: \"flag: St. Lucia\",\r\n category: \"Flags\",\r\n aliases: [\"st_lucia\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇱🇮\",\r\n description: \"flag: Liechtenstein\",\r\n category: \"Flags\",\r\n aliases: [\"liechtenstein\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇱🇰\",\r\n description: \"flag: Sri Lanka\",\r\n category: \"Flags\",\r\n aliases: [\"sri_lanka\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇱🇷\",\r\n description: \"flag: Liberia\",\r\n category: \"Flags\",\r\n aliases: [\"liberia\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇱🇸\",\r\n description: \"flag: Lesotho\",\r\n category: \"Flags\",\r\n aliases: [\"lesotho\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇱🇹\",\r\n description: \"flag: Lithuania\",\r\n category: \"Flags\",\r\n aliases: [\"lithuania\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇱🇺\",\r\n description: \"flag: Luxembourg\",\r\n category: \"Flags\",\r\n aliases: [\"luxembourg\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇱🇻\",\r\n description: \"flag: Latvia\",\r\n category: \"Flags\",\r\n aliases: [\"latvia\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇱🇾\",\r\n description: \"flag: Libya\",\r\n category: \"Flags\",\r\n aliases: [\"libya\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇲🇦\",\r\n description: \"flag: Morocco\",\r\n category: \"Flags\",\r\n aliases: [\"morocco\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇲🇨\",\r\n description: \"flag: Monaco\",\r\n category: \"Flags\",\r\n aliases: [\"monaco\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"9.0\",\r\n },\r\n {\r\n emoji: \"🇲🇩\",\r\n description: \"flag: Moldova\",\r\n category: \"Flags\",\r\n aliases: [\"moldova\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇲🇪\",\r\n description: \"flag: Montenegro\",\r\n category: \"Flags\",\r\n aliases: [\"montenegro\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇲🇫\",\r\n description: \"flag: St. Martin\",\r\n category: \"Flags\",\r\n aliases: [\"st_martin\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🇲🇬\",\r\n description: \"flag: Madagascar\",\r\n category: \"Flags\",\r\n aliases: [\"madagascar\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇲🇭\",\r\n description: \"flag: Marshall Islands\",\r\n category: \"Flags\",\r\n aliases: [\"marshall_islands\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"9.0\",\r\n },\r\n {\r\n emoji: \"🇲🇰\",\r\n description: \"flag: North Macedonia\",\r\n category: \"Flags\",\r\n aliases: [\"macedonia\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇲🇱\",\r\n description: \"flag: Mali\",\r\n category: \"Flags\",\r\n aliases: [\"mali\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇲🇲\",\r\n description: \"flag: Myanmar (Burma)\",\r\n category: \"Flags\",\r\n aliases: [\"myanmar\"],\r\n tags: [\"burma\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇲🇳\",\r\n description: \"flag: Mongolia\",\r\n category: \"Flags\",\r\n aliases: [\"mongolia\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇲🇴\",\r\n description: \"flag: Macao SAR China\",\r\n category: \"Flags\",\r\n aliases: [\"macau\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇲🇵\",\r\n description: \"flag: Northern Mariana Islands\",\r\n category: \"Flags\",\r\n aliases: [\"northern_mariana_islands\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇲🇶\",\r\n description: \"flag: Martinique\",\r\n category: \"Flags\",\r\n aliases: [\"martinique\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"9.0\",\r\n },\r\n {\r\n emoji: \"🇲🇷\",\r\n description: \"flag: Mauritania\",\r\n category: \"Flags\",\r\n aliases: [\"mauritania\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇲🇸\",\r\n description: \"flag: Montserrat\",\r\n category: \"Flags\",\r\n aliases: [\"montserrat\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇲🇹\",\r\n description: \"flag: Malta\",\r\n category: \"Flags\",\r\n aliases: [\"malta\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇲🇺\",\r\n description: \"flag: Mauritius\",\r\n category: \"Flags\",\r\n aliases: [\"mauritius\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"9.0\",\r\n },\r\n {\r\n emoji: \"🇲🇻\",\r\n description: \"flag: Maldives\",\r\n category: \"Flags\",\r\n aliases: [\"maldives\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇲🇼\",\r\n description: \"flag: Malawi\",\r\n category: \"Flags\",\r\n aliases: [\"malawi\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇲🇽\",\r\n description: \"flag: Mexico\",\r\n category: \"Flags\",\r\n aliases: [\"mexico\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇲🇾\",\r\n description: \"flag: Malaysia\",\r\n category: \"Flags\",\r\n aliases: [\"malaysia\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇲🇿\",\r\n description: \"flag: Mozambique\",\r\n category: \"Flags\",\r\n aliases: [\"mozambique\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇳🇦\",\r\n description: \"flag: Namibia\",\r\n category: \"Flags\",\r\n aliases: [\"namibia\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇳🇨\",\r\n description: \"flag: New Caledonia\",\r\n category: \"Flags\",\r\n aliases: [\"new_caledonia\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇳🇪\",\r\n description: \"flag: Niger\",\r\n category: \"Flags\",\r\n aliases: [\"niger\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇳🇫\",\r\n description: \"flag: Norfolk Island\",\r\n category: \"Flags\",\r\n aliases: [\"norfolk_island\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"9.0\",\r\n },\r\n {\r\n emoji: \"🇳🇬\",\r\n description: \"flag: Nigeria\",\r\n category: \"Flags\",\r\n aliases: [\"nigeria\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇳🇮\",\r\n description: \"flag: Nicaragua\",\r\n category: \"Flags\",\r\n aliases: [\"nicaragua\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇳🇱\",\r\n description: \"flag: Netherlands\",\r\n category: \"Flags\",\r\n aliases: [\"netherlands\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇳🇴\",\r\n description: \"flag: Norway\",\r\n category: \"Flags\",\r\n aliases: [\"norway\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇳🇵\",\r\n description: \"flag: Nepal\",\r\n category: \"Flags\",\r\n aliases: [\"nepal\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇳🇷\",\r\n description: \"flag: Nauru\",\r\n category: \"Flags\",\r\n aliases: [\"nauru\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"9.0\",\r\n },\r\n {\r\n emoji: \"🇳🇺\",\r\n description: \"flag: Niue\",\r\n category: \"Flags\",\r\n aliases: [\"niue\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇳🇿\",\r\n description: \"flag: New Zealand\",\r\n category: \"Flags\",\r\n aliases: [\"new_zealand\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇴🇲\",\r\n description: \"flag: Oman\",\r\n category: \"Flags\",\r\n aliases: [\"oman\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇵🇦\",\r\n description: \"flag: Panama\",\r\n category: \"Flags\",\r\n aliases: [\"panama\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇵🇪\",\r\n description: \"flag: Peru\",\r\n category: \"Flags\",\r\n aliases: [\"peru\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇵🇫\",\r\n description: \"flag: French Polynesia\",\r\n category: \"Flags\",\r\n aliases: [\"french_polynesia\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"9.0\",\r\n },\r\n {\r\n emoji: \"🇵🇬\",\r\n description: \"flag: Papua New Guinea\",\r\n category: \"Flags\",\r\n aliases: [\"papua_new_guinea\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇵🇭\",\r\n description: \"flag: Philippines\",\r\n category: \"Flags\",\r\n aliases: [\"philippines\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇵🇰\",\r\n description: \"flag: Pakistan\",\r\n category: \"Flags\",\r\n aliases: [\"pakistan\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇵🇱\",\r\n description: \"flag: Poland\",\r\n category: \"Flags\",\r\n aliases: [\"poland\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇵🇲\",\r\n description: \"flag: St. Pierre & Miquelon\",\r\n category: \"Flags\",\r\n aliases: [\"st_pierre_miquelon\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"9.0\",\r\n },\r\n {\r\n emoji: \"🇵🇳\",\r\n description: \"flag: Pitcairn Islands\",\r\n category: \"Flags\",\r\n aliases: [\"pitcairn_islands\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"9.0\",\r\n },\r\n {\r\n emoji: \"🇵🇷\",\r\n description: \"flag: Puerto Rico\",\r\n category: \"Flags\",\r\n aliases: [\"puerto_rico\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇵🇸\",\r\n description: \"flag: Palestinian Territories\",\r\n category: \"Flags\",\r\n aliases: [\"palestinian_territories\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇵🇹\",\r\n description: \"flag: Portugal\",\r\n category: \"Flags\",\r\n aliases: [\"portugal\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇵🇼\",\r\n description: \"flag: Palau\",\r\n category: \"Flags\",\r\n aliases: [\"palau\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇵🇾\",\r\n description: \"flag: Paraguay\",\r\n category: \"Flags\",\r\n aliases: [\"paraguay\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇶🇦\",\r\n description: \"flag: Qatar\",\r\n category: \"Flags\",\r\n aliases: [\"qatar\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇷🇪\",\r\n description: \"flag: Réunion\",\r\n category: \"Flags\",\r\n aliases: [\"reunion\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"9.0\",\r\n },\r\n {\r\n emoji: \"🇷🇴\",\r\n description: \"flag: Romania\",\r\n category: \"Flags\",\r\n aliases: [\"romania\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇷🇸\",\r\n description: \"flag: Serbia\",\r\n category: \"Flags\",\r\n aliases: [\"serbia\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇷🇺\",\r\n description: \"flag: Russia\",\r\n category: \"Flags\",\r\n aliases: [\"ru\"],\r\n tags: [\"russia\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🇷🇼\",\r\n description: \"flag: Rwanda\",\r\n category: \"Flags\",\r\n aliases: [\"rwanda\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇸🇦\",\r\n description: \"flag: Saudi Arabia\",\r\n category: \"Flags\",\r\n aliases: [\"saudi_arabia\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇸🇧\",\r\n description: \"flag: Solomon Islands\",\r\n category: \"Flags\",\r\n aliases: [\"solomon_islands\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇸🇨\",\r\n description: \"flag: Seychelles\",\r\n category: \"Flags\",\r\n aliases: [\"seychelles\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇸🇩\",\r\n description: \"flag: Sudan\",\r\n category: \"Flags\",\r\n aliases: [\"sudan\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇸🇪\",\r\n description: \"flag: Sweden\",\r\n category: \"Flags\",\r\n aliases: [\"sweden\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇸🇬\",\r\n description: \"flag: Singapore\",\r\n category: \"Flags\",\r\n aliases: [\"singapore\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇸🇭\",\r\n description: \"flag: St. Helena\",\r\n category: \"Flags\",\r\n aliases: [\"st_helena\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"9.0\",\r\n },\r\n {\r\n emoji: \"🇸🇮\",\r\n description: \"flag: Slovenia\",\r\n category: \"Flags\",\r\n aliases: [\"slovenia\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇸🇯\",\r\n description: \"flag: Svalbard & Jan Mayen\",\r\n category: \"Flags\",\r\n aliases: [\"svalbard_jan_mayen\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🇸🇰\",\r\n description: \"flag: Slovakia\",\r\n category: \"Flags\",\r\n aliases: [\"slovakia\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇸🇱\",\r\n description: \"flag: Sierra Leone\",\r\n category: \"Flags\",\r\n aliases: [\"sierra_leone\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇸🇲\",\r\n description: \"flag: San Marino\",\r\n category: \"Flags\",\r\n aliases: [\"san_marino\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇸🇳\",\r\n description: \"flag: Senegal\",\r\n category: \"Flags\",\r\n aliases: [\"senegal\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇸🇴\",\r\n description: \"flag: Somalia\",\r\n category: \"Flags\",\r\n aliases: [\"somalia\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇸🇷\",\r\n description: \"flag: Suriname\",\r\n category: \"Flags\",\r\n aliases: [\"suriname\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇸🇸\",\r\n description: \"flag: South Sudan\",\r\n category: \"Flags\",\r\n aliases: [\"south_sudan\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇸🇹\",\r\n description: \"flag: São Tomé & Príncipe\",\r\n category: \"Flags\",\r\n aliases: [\"sao_tome_principe\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇸🇻\",\r\n description: \"flag: El Salvador\",\r\n category: \"Flags\",\r\n aliases: [\"el_salvador\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇸🇽\",\r\n description: \"flag: Sint Maarten\",\r\n category: \"Flags\",\r\n aliases: [\"sint_maarten\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇸🇾\",\r\n description: \"flag: Syria\",\r\n category: \"Flags\",\r\n aliases: [\"syria\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇸🇿\",\r\n description: \"flag: Eswatini\",\r\n category: \"Flags\",\r\n aliases: [\"swaziland\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇹🇦\",\r\n description: \"flag: Tristan da Cunha\",\r\n category: \"Flags\",\r\n aliases: [\"tristan_da_cunha\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🇹🇨\",\r\n description: \"flag: Turks & Caicos Islands\",\r\n category: \"Flags\",\r\n aliases: [\"turks_caicos_islands\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇹🇩\",\r\n description: \"flag: Chad\",\r\n category: \"Flags\",\r\n aliases: [\"chad\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"9.0\",\r\n },\r\n {\r\n emoji: \"🇹🇫\",\r\n description: \"flag: French Southern Territories\",\r\n category: \"Flags\",\r\n aliases: [\"french_southern_territories\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇹🇬\",\r\n description: \"flag: Togo\",\r\n category: \"Flags\",\r\n aliases: [\"togo\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇹🇭\",\r\n description: \"flag: Thailand\",\r\n category: \"Flags\",\r\n aliases: [\"thailand\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇹🇯\",\r\n description: \"flag: Tajikistan\",\r\n category: \"Flags\",\r\n aliases: [\"tajikistan\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇹🇰\",\r\n description: \"flag: Tokelau\",\r\n category: \"Flags\",\r\n aliases: [\"tokelau\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"9.0\",\r\n },\r\n {\r\n emoji: \"🇹🇱\",\r\n description: \"flag: Timor-Leste\",\r\n category: \"Flags\",\r\n aliases: [\"timor_leste\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇹🇲\",\r\n description: \"flag: Turkmenistan\",\r\n category: \"Flags\",\r\n aliases: [\"turkmenistan\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇹🇳\",\r\n description: \"flag: Tunisia\",\r\n category: \"Flags\",\r\n aliases: [\"tunisia\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇹🇴\",\r\n description: \"flag: Tonga\",\r\n category: \"Flags\",\r\n aliases: [\"tonga\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇹🇷\",\r\n description: \"flag: Turkey\",\r\n category: \"Flags\",\r\n aliases: [\"tr\"],\r\n tags: [\"turkey\"],\r\n unicode_version: \"8.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"🇹🇹\",\r\n description: \"flag: Trinidad & Tobago\",\r\n category: \"Flags\",\r\n aliases: [\"trinidad_tobago\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇹🇻\",\r\n description: \"flag: Tuvalu\",\r\n category: \"Flags\",\r\n aliases: [\"tuvalu\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇹🇼\",\r\n description: \"flag: Taiwan\",\r\n category: \"Flags\",\r\n aliases: [\"taiwan\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"9.0\",\r\n },\r\n {\r\n emoji: \"🇹🇿\",\r\n description: \"flag: Tanzania\",\r\n category: \"Flags\",\r\n aliases: [\"tanzania\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇺🇦\",\r\n description: \"flag: Ukraine\",\r\n category: \"Flags\",\r\n aliases: [\"ukraine\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇺🇬\",\r\n description: \"flag: Uganda\",\r\n category: \"Flags\",\r\n aliases: [\"uganda\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇺🇲\",\r\n description: \"flag: U.S. Outlying Islands\",\r\n category: \"Flags\",\r\n aliases: [\"us_outlying_islands\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🇺🇳\",\r\n description: \"flag: United Nations\",\r\n category: \"Flags\",\r\n aliases: [\"united_nations\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🇺🇸\",\r\n description: \"flag: United States\",\r\n category: \"Flags\",\r\n aliases: [\"us\"],\r\n tags: [\"flag\", \"united\", \"america\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"🇺🇾\",\r\n description: \"flag: Uruguay\",\r\n category: \"Flags\",\r\n aliases: [\"uruguay\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇺🇿\",\r\n description: \"flag: Uzbekistan\",\r\n category: \"Flags\",\r\n aliases: [\"uzbekistan\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇻🇦\",\r\n description: \"flag: Vatican City\",\r\n category: \"Flags\",\r\n aliases: [\"vatican_city\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"9.0\",\r\n },\r\n {\r\n emoji: \"🇻🇨\",\r\n description: \"flag: St. Vincent & Grenadines\",\r\n category: \"Flags\",\r\n aliases: [\"st_vincent_grenadines\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇻🇪\",\r\n description: \"flag: Venezuela\",\r\n category: \"Flags\",\r\n aliases: [\"venezuela\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇻🇬\",\r\n description: \"flag: British Virgin Islands\",\r\n category: \"Flags\",\r\n aliases: [\"british_virgin_islands\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇻🇮\",\r\n description: \"flag: U.S. Virgin Islands\",\r\n category: \"Flags\",\r\n aliases: [\"us_virgin_islands\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇻🇳\",\r\n description: \"flag: Vietnam\",\r\n category: \"Flags\",\r\n aliases: [\"vietnam\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇻🇺\",\r\n description: \"flag: Vanuatu\",\r\n category: \"Flags\",\r\n aliases: [\"vanuatu\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇼🇫\",\r\n description: \"flag: Wallis & Futuna\",\r\n category: \"Flags\",\r\n aliases: [\"wallis_futuna\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"9.0\",\r\n },\r\n {\r\n emoji: \"🇼🇸\",\r\n description: \"flag: Samoa\",\r\n category: \"Flags\",\r\n aliases: [\"samoa\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇽🇰\",\r\n description: \"flag: Kosovo\",\r\n category: \"Flags\",\r\n aliases: [\"kosovo\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇾🇪\",\r\n description: \"flag: Yemen\",\r\n category: \"Flags\",\r\n aliases: [\"yemen\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇾🇹\",\r\n description: \"flag: Mayotte\",\r\n category: \"Flags\",\r\n aliases: [\"mayotte\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"9.0\",\r\n },\r\n {\r\n emoji: \"🇿🇦\",\r\n description: \"flag: South Africa\",\r\n category: \"Flags\",\r\n aliases: [\"south_africa\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇿🇲\",\r\n description: \"flag: Zambia\",\r\n category: \"Flags\",\r\n aliases: [\"zambia\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🇿🇼\",\r\n description: \"flag: Zimbabwe\",\r\n category: \"Flags\",\r\n aliases: [\"zimbabwe\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"8.3\",\r\n },\r\n {\r\n emoji: \"🏴󠁧󠁢󠁥󠁮󠁧󠁿\",\r\n description: \"flag: England\",\r\n category: \"Flags\",\r\n aliases: [\"england\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🏴󠁧󠁢󠁳󠁣󠁴󠁿\",\r\n description: \"flag: Scotland\",\r\n category: \"Flags\",\r\n aliases: [\"scotland\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"🏴󠁧󠁢󠁷󠁬󠁳󠁿\",\r\n description: \"flag: Wales\",\r\n category: \"Flags\",\r\n aliases: [\"wales\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n]\r\n\r\nexport default emojiList\r\n","\"use client\"\r\n\r\nexport { Editor } from \"@/components/editor/editor-x/editor\"\r\nexport type { SerializedEditorState } from \"lexical\"\r\nexport type { EditorState } from \"lexical\"\r\n\r\n// Re-export theme CSS path for consumers to import\r\n// Usage: import \"nextjs-editor/styles.css\"\r\nexport const editorThemePath = \"./editor-theme.css\"\r\n","\"use client\"\r\n\r\nimport {\r\n InitialConfigType,\r\n LexicalComposer,\r\n} from \"@lexical/react/LexicalComposer\"\r\nimport { OnChangePlugin } from \"@lexical/react/LexicalOnChangePlugin\"\r\nimport { EditorState, SerializedEditorState } from \"lexical\"\r\n\r\nimport { editorTheme } from \"@/components/editor/themes/editor-theme\"\r\nimport { TooltipProvider } from \"@/components/ui/tooltip\"\r\n\r\nimport { nodes } from \"./nodes\"\r\nimport { Plugins } from \"./plugins\"\r\nimport { cn, logger } from \"@/utils\"\r\nimport { useElementSize } from \"@/hooks\"\r\nimport { EditorContainerProvider } from \"@/components/editor/context/editor-container-context\"\r\n\r\nconst editorConfig: InitialConfigType = {\r\n namespace: \"Editor\",\r\n theme: editorTheme,\r\n nodes,\r\n onError: (error: Error) => {\r\n // Lexical Table plugin đôi khi ném lỗi khi editor unmount (rời trang) vì TableObserver\r\n // còn chạy sau khi DOM table đã bị xóa — bỏ qua để tránh log ồn.\r\n if (\r\n error?.message?.includes(\"TableObserver\") &&\r\n error?.message?.includes(\"Expected to find TableElement in DOM\")\r\n ) {\r\n return\r\n }\r\n logger.error(\"[Editor] Error:\", error)\r\n },\r\n}\r\n\r\nexport function Editor({\r\n editorState,\r\n editorSerializedState,\r\n onChange,\r\n onSerializedChange,\r\n readOnly = false,\r\n}: {\r\n editorState?: EditorState\r\n editorSerializedState?: SerializedEditorState\r\n onChange?: (editorState: EditorState) => void\r\n onSerializedChange?: (editorSerializedState: SerializedEditorState) => void\r\n readOnly?: boolean\r\n}) {\r\n const { ref: editorRef, width: editorWidth } =\r\n useElementSize<HTMLDivElement>()\r\n const editorMaxWidth = editorWidth || undefined\r\n\r\n return (\r\n <div\r\n ref={editorRef}\r\n className={cn(\r\n \"bg-background rounded-lg shadow w-full\",\r\n )}\r\n id=\"editor-x\"\r\n >\r\n <EditorContainerProvider value={{ maxWidth: editorMaxWidth }}>\r\n <LexicalComposer\r\n initialConfig={{\r\n ...editorConfig,\r\n editable: !readOnly,\r\n ...(editorState ? { editorState } : {}),\r\n ...(editorSerializedState\r\n ? { editorState: JSON.stringify(editorSerializedState) }\r\n : {}),\r\n }}\r\n >\r\n <TooltipProvider>\r\n <Plugins readOnly={readOnly} />\r\n\r\n {!readOnly && (\r\n <OnChangePlugin\r\n ignoreSelectionChange={true}\r\n onChange={(editorState) => {\r\n onChange?.(editorState)\r\n onSerializedChange?.(editorState.toJSON())\r\n }}\r\n />\r\n )}\r\n </TooltipProvider>\r\n </LexicalComposer>\r\n </EditorContainerProvider>\r\n </div>\r\n )\r\n}\r\n","import { EditorThemeClasses } from \"lexical\"\r\n\r\nimport \"./editor-theme.css\"\r\n\r\nexport const editorTheme: EditorThemeClasses = {\r\n ltr: \"text-left\",\r\n rtl: \"text-right\",\r\n heading: {\r\n h1: \"scroll-m-20 text-4xl font-extrabold tracking-tight lg:text-5xl\",\r\n h2: \"scroll-m-20 border-b pb-2 text-3xl font-semibold tracking-tight first:mt-0\",\r\n h3: \"scroll-m-20 text-2xl font-semibold tracking-tight\",\r\n h4: \"scroll-m-20 text-xl font-semibold tracking-tight\",\r\n h5: \"scroll-m-20 text-lg font-semibold tracking-tight\",\r\n h6: \"scroll-m-20 text-base font-semibold tracking-tight\",\r\n },\r\n paragraph: \"leading-7 [&:not(:first-child)]:mt-2\",\r\n quote: \"mt-6 border-l-2 pl-6 italic\",\r\n link: \"text-blue-600 hover:underline hover:cursor-pointer\",\r\n list: {\r\n checklist: \"relative\",\r\n listitem: \"mx-8\",\r\n listitemChecked:\r\n 'relative mx-2 px-6 list-none outline-none line-through before:content-[\"\"] before:w-4 before:h-4 before:top-0.5 before:left-0 before:cursor-pointer before:block before:bg-cover before:absolute before:border before:border-primary before:rounded before:bg-primary before:bg-no-repeat after:content-[\"\"] after:cursor-pointer after:border-white after:border-solid after:absolute after:block after:top-[6px] after:w-[3px] after:left-[7px] after:right-[7px] after:h-[6px] after:rotate-45 after:border-r-2 after:border-b-2 after:border-l-0 after:border-t-0',\r\n listitemUnchecked:\r\n 'relative mx-2 px-6 list-none outline-none before:content-[\"\"] before:w-4 before:h-4 before:top-0.5 before:left-0 before:cursor-pointer before:block before:bg-cover before:absolute before:border before:border-primary before:rounded',\r\n nested: {\r\n listitem: \"list-none before:hidden after:hidden\",\r\n },\r\n ol: \"m-0 p-0 list-decimal [&>li]:mt-2\",\r\n olDepth: [\r\n \"list-outside list-decimal\",\r\n \"list-outside list-[upper-roman]\",\r\n \"list-outside list-[lower-roman]\",\r\n \"list-outside list-[upper-alpha]\",\r\n \"list-outside list-[lower-alpha]\",\r\n ],\r\n ul: \"m-0 p-0 list-outside [&>li]:mt-2\",\r\n ulDepth: [\r\n \"list-outside list-disc\",\r\n \"list-outside list-disc\",\r\n \"list-outside list-disc\",\r\n \"list-outside list-disc\",\r\n \"list-outside list-disc\",\r\n ],\r\n },\r\n hashtag: \"text-blue-600 bg-blue-100 rounded-md px-1\",\r\n text: {\r\n bold: \"font-bold\",\r\n code: \"bg-gray-100 p-1 rounded-md\",\r\n italic: \"italic\",\r\n strikethrough: \"line-through\",\r\n subscript: \"sub\",\r\n superscript: \"sup\",\r\n underline: \"underline\",\r\n underlineStrikethrough: \"underline line-through\",\r\n },\r\n image: \"relative inline-block user-select-none cursor-default editor-image\",\r\n inlineImage:\r\n \"relative inline-block user-select-none cursor-default inline-editor-image\",\r\n keyword: \"text-purple-900 font-bold\",\r\n code: \"EditorTheme__code\",\r\n codeHighlight: {\r\n atrule: \"EditorTheme__tokenAttr\",\r\n attr: \"EditorTheme__tokenAttr\",\r\n boolean: \"EditorTheme__tokenProperty\",\r\n builtin: \"EditorTheme__tokenSelector\",\r\n cdata: \"EditorTheme__tokenComment\",\r\n char: \"EditorTheme__tokenSelector\",\r\n class: \"EditorTheme__tokenFunction\",\r\n \"class-name\": \"EditorTheme__tokenFunction\",\r\n comment: \"EditorTheme__tokenComment\",\r\n constant: \"EditorTheme__tokenProperty\",\r\n deleted: \"EditorTheme__tokenProperty\",\r\n doctype: \"EditorTheme__tokenComment\",\r\n entity: \"EditorTheme__tokenOperator\",\r\n function: \"EditorTheme__tokenFunction\",\r\n important: \"EditorTheme__tokenVariable\",\r\n inserted: \"EditorTheme__tokenSelector\",\r\n keyword: \"EditorTheme__tokenAttr\",\r\n namespace: \"EditorTheme__tokenVariable\",\r\n number: \"EditorTheme__tokenProperty\",\r\n operator: \"EditorTheme__tokenOperator\",\r\n prolog: \"EditorTheme__tokenComment\",\r\n property: \"EditorTheme__tokenProperty\",\r\n punctuation: \"EditorTheme__tokenPunctuation\",\r\n regex: \"EditorTheme__tokenVariable\",\r\n selector: \"EditorTheme__tokenSelector\",\r\n string: \"EditorTheme__tokenSelector\",\r\n symbol: \"EditorTheme__tokenProperty\",\r\n tag: \"EditorTheme__tokenProperty\",\r\n url: \"EditorTheme__tokenOperator\",\r\n variable: \"EditorTheme__tokenVariable\",\r\n },\r\n characterLimit: \"bg-destructive/50\",\r\n table: \"EditorTheme__table overflow-x-auto border-collapse\",\r\n tableCell:\r\n \"EditorTheme__tableCell relative border px-4 py-2 text-left align-top [&[align=center]]:text-center [&[align=right]]:text-right\",\r\n tableCellActionButton:\r\n \"EditorTheme__tableCellActionButton bg-background block border-0 rounded-2xl w-5 h-5 text-foreground cursor-pointer\",\r\n tableCellActionButtonContainer:\r\n \"EditorTheme__tableCellActionButtonContainer block right-1 top-1.5 absolute z-10 w-5 h-5\",\r\n tableCellEditing: \"EditorTheme__tableCellEditing rounded-sm shadow-sm\",\r\n tableCellHeader:\r\n \"EditorTheme__tableCellHeader bg-muted border px-4 py-2 text-left align-top font-bold [&[align=center]]:text-center [&[align=right]]:text-right\",\r\n tableCellPrimarySelected:\r\n \"EditorTheme__tableCellPrimarySelected border border-primary border-solid block h-[calc(100%-2px)] w-[calc(100%-2px)] absolute -left-[1px] -top-[1px] z-10 \",\r\n tableCellResizer:\r\n \"EditorTheme__tableCellResizer absolute -right-1 h-full w-2 cursor-ew-resize z-10 top-0\",\r\n tableCellSelected: \"EditorTheme__tableCellSelected bg-muted\",\r\n tableCellSortedIndicator:\r\n \"EditorTheme__tableCellSortedIndicator block opacity-50 bsolute bottom-0 left-0 w-full h-1 bg-muted\",\r\n tableResizeRuler:\r\n \"EditorTheme__tableCellResizeRuler block absolute w-[1px] h-full bg-primary top-0\",\r\n tableRowStriping:\r\n \"EditorTheme__tableRowStriping m-0 border-t p-0 even:bg-muted\",\r\n tableSelected: \"EditorTheme__tableSelected ring-2 ring-primary ring-offset-2\",\r\n tableSelection: \"EditorTheme__tableSelection bg-transparent\",\r\n layoutItem: \"border border-dashed\",\r\n layoutContainer: \"grid gap-2.5 my-2.5 mx-0\",\r\n autocomplete: \"text-muted-foreground\",\r\n blockCursor: \"\",\r\n embedBlock: {\r\n base: \"user-select-none\",\r\n focus: \"ring-2 ring-primary ring-offset-2\",\r\n },\r\n hr: 'p-0.5 border-none my-1 mx-0 cursor-pointer after:content-[\"\"] after:block after:h-0.5 after:bg-muted selected:ring-2 selected:ring-primary selected:ring-offset-2 selected:user-select-none',\r\n indent: \"[--lexical-indent-base-value:40px]\",\r\n mark: \"\",\r\n markOverlap: \"\",\r\n}\r\n","\"use client\"\r\n\r\nimport * as React from \"react\"\r\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\"\r\n\r\nimport { cn } from \"@/utils\"\r\nimport { responsiveTextSizes, fontWeights, lineHeights, iconSizes } from \"@/constants\"\r\n\r\nconst tooltipBodySmall = `${responsiveTextSizes.small} ${fontWeights.normal} ${lineHeights.relaxed}`\r\nconst tooltipIconSize = iconSizes.xs\r\n\r\nfunction TooltipProvider({\r\n delayDuration = 0,\r\n ...props\r\n}: React.ComponentProps<typeof TooltipPrimitive.Provider>) {\r\n return (\r\n <TooltipPrimitive.Provider\r\n data-slot=\"tooltip-provider\"\r\n delayDuration={delayDuration}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nfunction Tooltip({\r\n ...props\r\n}: React.ComponentProps<typeof TooltipPrimitive.Root>) {\r\n return (\r\n <TooltipProvider>\r\n <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />\r\n </TooltipProvider>\r\n )\r\n}\r\n\r\nfunction TooltipTrigger({\r\n ...props\r\n}: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {\r\n return <TooltipPrimitive.Trigger data-slot=\"tooltip-trigger\" {...props} />\r\n}\r\n\r\nfunction TooltipContent({\r\n className,\r\n sideOffset = 0,\r\n children,\r\n ...props\r\n}: React.ComponentProps<typeof TooltipPrimitive.Content>) {\r\n return (\r\n <TooltipPrimitive.Portal>\r\n <TooltipPrimitive.Content\r\n data-slot=\"tooltip-content\"\r\n sideOffset={sideOffset}\r\n className={cn(\r\n `bg-foreground text-background animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-200 w-fit origin-(--radix-tooltip-content-transform-origin) rounded-md px-3 py-1.5 ${tooltipBodySmall} text-balance`,\r\n className\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n <TooltipPrimitive.Arrow className={`bg-foreground fill-foreground z-200 ${tooltipIconSize} translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px]`} />\r\n </TooltipPrimitive.Content>\r\n </TooltipPrimitive.Portal>\r\n )\r\n}\r\n\r\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }\r\n\r\n","import { CodeHighlightNode, CodeNode } from \"@lexical/code\"\r\nimport { HashtagNode } from \"@lexical/hashtag\"\r\nimport { AutoLinkNode, LinkNode } from \"@lexical/link\"\r\nimport { ListItemNode, ListNode, type ListType } from \"@lexical/list\"\r\nimport { OverflowNode } from \"@lexical/overflow\"\r\nimport { HorizontalRuleNode } from \"@lexical/react/LexicalHorizontalRuleNode\"\r\nimport { HeadingNode, QuoteNode } from \"@lexical/rich-text\"\r\nimport { TableCellNode, TableNode, TableRowNode } from \"@lexical/table\"\r\nimport {\r\n Klass,\r\n LexicalEditor,\r\n LexicalNode,\r\n LexicalNodeReplacement,\r\n ParagraphNode,\r\n TextNode,\r\n} from \"lexical\"\r\n\r\nimport { AutocompleteNode } from \"@/components/editor/nodes/autocomplete-node\"\r\nimport { TweetNode } from \"@/components/editor/nodes/embeds/tweet-node\"\r\nimport { YouTubeNode } from \"@/components/editor/nodes/embeds/youtube-node\"\r\nimport { EmojiNode } from \"@/components/editor/nodes/emoji-node\"\r\nimport { ImageNode } from \"@/components/editor/nodes/image-node\"\r\nimport { KeywordNode } from \"@/components/editor/nodes/keyword-node\"\r\nimport { LayoutContainerNode } from \"@/components/editor/nodes/layout-container-node\"\r\nimport { LayoutItemNode } from \"@/components/editor/nodes/layout-item-node\"\r\nimport { ListWithColorNode } from \"@/components/editor/nodes/list-with-color-node\"\r\nimport { MentionNode } from \"@/components/editor/nodes/mention-node\"\r\n\r\n/** Tạo ListWithColorNode dùng đúng class đã đăng ký trong editor (tránh type mismatch khi bundle trùng). */\r\nexport function createListWithColorNodeFromRegistry(\r\n editor: LexicalEditor,\r\n listType: ListType,\r\n start: number\r\n): InstanceType<typeof ListWithColorNode> {\r\n const config = (editor as unknown as { _config?: { nodes?: Array<Klass<LexicalNode>> } })\r\n ._config\r\n const Klass = config?.nodes?.find(\r\n (K) =>\r\n typeof (K as { getType?: () => string }).getType === \"function\" &&\r\n (K as { getType: () => string }).getType() === \"listwithcolor\"\r\n ) as typeof ListWithColorNode | undefined\r\n if (Klass) return new Klass(listType, start) as InstanceType<typeof ListWithColorNode>\r\n return new ListWithColorNode(listType, start)\r\n}\r\n\r\nexport const nodes: ReadonlyArray<Klass<LexicalNode> | LexicalNodeReplacement> =\r\n [\r\n HeadingNode,\r\n ParagraphNode,\r\n TextNode,\r\n QuoteNode,\r\n ListWithColorNode,\r\n ListNode,\r\n ListItemNode,\r\n LinkNode,\r\n OverflowNode,\r\n HashtagNode,\r\n TableNode,\r\n TableCellNode,\r\n TableRowNode,\r\n CodeNode,\r\n CodeHighlightNode,\r\n HorizontalRuleNode,\r\n MentionNode,\r\n ImageNode,\r\n EmojiNode,\r\n KeywordNode,\r\n LayoutContainerNode,\r\n LayoutItemNode,\r\n AutoLinkNode,\r\n TweetNode,\r\n YouTubeNode,\r\n AutocompleteNode,\r\n ]\r\n","import type {\r\n DOMExportOutput,\r\n EditorConfig,\r\n LexicalEditor,\r\n NodeKey,\r\n SerializedTextNode,\r\n Spread,\r\n} from \"lexical\"\r\nimport { TextNode } from \"lexical\"\r\n\r\nimport { uuid as UUID } from \"@/components/editor/plugins/autocomplete-plugin\"\r\n\r\nexport type SerializedAutocompleteNode = Spread<\r\n {\r\n uuid: string\r\n },\r\n SerializedTextNode\r\n>\r\n\r\nexport class AutocompleteNode extends TextNode {\r\n /**\r\n * A unique uuid is generated for each session and assigned to the instance.\r\n * This helps to:\r\n * - Ensures max one Autocomplete node per session.\r\n * - Ensure that when collaboration is enabled, this node is not shown in\r\n * other sessions.\r\n * See https://github.com/facebook/lexical/blob/main/packages/lexical-playground/src/plugins/AutocompletePlugin/index.tsx\r\n */\r\n __uuid: string\r\n\r\n static clone(node: AutocompleteNode): AutocompleteNode {\r\n return new AutocompleteNode(node.__text, node.__uuid, node.__key)\r\n }\r\n\r\n static getType(): \"autocomplete\" {\r\n return \"autocomplete\"\r\n }\r\n\r\n static importDOM() {\r\n // Never import from DOM\r\n return null\r\n }\r\n\r\n static importJSON(\r\n serializedNode: SerializedAutocompleteNode\r\n ): AutocompleteNode {\r\n return $createAutocompleteNode(\r\n serializedNode.text,\r\n serializedNode.uuid\r\n ).updateFromJSON(serializedNode)\r\n }\r\n\r\n exportJSON(): SerializedAutocompleteNode {\r\n return {\r\n ...super.exportJSON(),\r\n uuid: this.__uuid,\r\n }\r\n }\r\n\r\n constructor(text: string, uuid: string, key?: NodeKey) {\r\n super(text, key)\r\n this.__uuid = uuid\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n updateDOM(prevNode: this, dom: HTMLElement, config: EditorConfig): boolean {\r\n return false\r\n }\r\n\r\n exportDOM(_editor: LexicalEditor): DOMExportOutput {\r\n return { element: null }\r\n }\r\n\r\n excludeFromCopy() {\r\n return true\r\n }\r\n\r\n createDOM(config: EditorConfig): HTMLElement {\r\n const dom = super.createDOM(config)\r\n dom.classList.add(config.theme.autocomplete)\r\n if (this.__uuid !== UUID) {\r\n dom.style.display = \"none\"\r\n }\r\n return dom\r\n }\r\n}\r\n\r\nexport function $createAutocompleteNode(\r\n text: string,\r\n uuid: string\r\n): AutocompleteNode {\r\n return new AutocompleteNode(text, uuid).setMode(\"token\")\r\n}\r\n","\"use client\"\r\n\r\n/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\nimport type { JSX } from \"react\"\r\nimport { useCallback, useEffect } from \"react\"\r\nimport { logger } from \"@/utils\"\r\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\"\r\nimport {\r\n $getSelectionStyleValueForProperty,\r\n $isAtNodeEnd,\r\n} from \"@lexical/selection\"\r\nimport { mergeRegister } from \"@lexical/utils\"\r\nimport type { BaseSelection, NodeKey, TextNode } from \"lexical\"\r\nimport {\r\n $addUpdateTag,\r\n $createTextNode,\r\n $getNodeByKey,\r\n $getSelection,\r\n $isRangeSelection,\r\n $isTextNode,\r\n $setSelection,\r\n COMMAND_PRIORITY_LOW,\r\n HISTORY_MERGE_TAG,\r\n KEY_ARROW_RIGHT_COMMAND,\r\n KEY_TAB_COMMAND,\r\n} from \"lexical\"\r\n\r\nimport {\r\n $createAutocompleteNode,\r\n AutocompleteNode,\r\n} from \"@/components/editor/nodes/autocomplete-node\"\r\nimport { addSwipeRightListener } from \"@/components/editor/utils/swipe\"\r\n\r\nconst HISTORY_MERGE = { tag: HISTORY_MERGE_TAG }\r\n\r\ndeclare global {\r\n interface Navigator {\r\n userAgentData?: {\r\n mobile: boolean\r\n }\r\n }\r\n}\r\n\r\ntype SearchPromise = {\r\n dismiss: () => void\r\n promise: Promise<null | string>\r\n}\r\n\r\nexport const uuid = Math.random()\r\n .toString(36)\r\n .replace(/[^a-z]+/g, \"\")\r\n .substring(0, 5)\r\n\r\n// TODO lookup should be custom\r\nfunction $search(selection: null | BaseSelection): [boolean, string] {\r\n if (!$isRangeSelection(selection) || !selection.isCollapsed()) {\r\n return [false, \"\"]\r\n }\r\n const node = selection.getNodes()[0]\r\n const anchor = selection.anchor\r\n // Check siblings?\r\n if (!$isTextNode(node) || !node.isSimpleText() || !$isAtNodeEnd(anchor)) {\r\n return [false, \"\"]\r\n }\r\n const word = []\r\n const text = node.getTextContent()\r\n let i = node.getTextContentSize()\r\n let c\r\n while (i-- && i >= 0 && (c = text[i]) !== \" \") {\r\n word.push(c)\r\n }\r\n if (word.length === 0) {\r\n return [false, \"\"]\r\n }\r\n return [true, word.reverse().join(\"\")]\r\n}\r\n\r\n// TODO query should be custom\r\nfunction useQuery(): (searchText: string) => SearchPromise {\r\n return useCallback((searchText: string) => {\r\n const server = new AutocompleteServer()\r\n const response = server.query(searchText)\r\n return response\r\n }, [])\r\n}\r\n\r\nfunction formatSuggestionText(suggestion: string): string {\r\n const userAgentData = window.navigator.userAgentData\r\n const isMobile =\r\n userAgentData !== undefined\r\n ? userAgentData.mobile\r\n : window.innerWidth <= 800 && window.innerHeight <= 600\r\n\r\n return `${suggestion} ${isMobile ? \"(SWIPE \\u2B95)\" : \"(TAB)\"}`\r\n}\r\n\r\nexport function AutocompletePlugin(): JSX.Element | null {\r\n const [editor] = useLexicalComposerContext()\r\n const query = useQuery()\r\n\r\n useEffect(() => {\r\n let autocompleteNodeKey: null | NodeKey = null\r\n let lastMatch: null | string = null\r\n let lastSuggestion: null | string = null\r\n let searchPromise: null | SearchPromise = null\r\n let prevNodeFormat: number = 0\r\n function $clearSuggestion() {\r\n const autocompleteNode =\r\n autocompleteNodeKey !== null ? $getNodeByKey(autocompleteNodeKey) : null\r\n if (autocompleteNode !== null && autocompleteNode.isAttached()) {\r\n autocompleteNode.remove()\r\n autocompleteNodeKey = null\r\n }\r\n if (searchPromise !== null) {\r\n searchPromise.dismiss()\r\n searchPromise = null\r\n }\r\n lastMatch = null\r\n lastSuggestion = null\r\n prevNodeFormat = 0\r\n }\r\n function updateAsyncSuggestion(\r\n refSearchPromise: SearchPromise,\r\n newSuggestion: null | string\r\n ) {\r\n if (searchPromise !== refSearchPromise || newSuggestion === null) {\r\n // Outdated or no suggestion\r\n return\r\n }\r\n editor.update(() => {\r\n const selection = $getSelection()\r\n const [hasMatch, match] = $search(selection)\r\n if (!hasMatch || match !== lastMatch || !$isRangeSelection(selection)) {\r\n // Outdated\r\n return\r\n }\r\n const fontSize = $getSelectionStyleValueForProperty(\r\n selection,\r\n \"font-size\",\r\n \"16px\"\r\n )\r\n\r\n const selectionCopy = selection.clone()\r\n const prevNode = selection.getNodes()[0] as TextNode\r\n prevNodeFormat = prevNode.getFormat()\r\n const node = $createAutocompleteNode(\r\n formatSuggestionText(newSuggestion),\r\n uuid\r\n )\r\n .setFormat(prevNodeFormat)\r\n .setStyle(`font-size: ${fontSize}`)\r\n autocompleteNodeKey = node.getKey()\r\n selection.insertNodes([node])\r\n $setSelection(selectionCopy)\r\n lastSuggestion = newSuggestion\r\n }, HISTORY_MERGE)\r\n }\r\n\r\n function $handleAutocompleteNodeTransform(node: AutocompleteNode) {\r\n const key = node.getKey()\r\n if (node.__uuid === uuid && key !== autocompleteNodeKey) {\r\n // Max one Autocomplete node per session\r\n $clearSuggestion()\r\n }\r\n }\r\n function handleUpdate() {\r\n editor.update(() => {\r\n const selection = $getSelection()\r\n const [hasMatch, match] = $search(selection)\r\n if (!hasMatch) {\r\n $clearSuggestion()\r\n return\r\n }\r\n if (match === lastMatch) {\r\n return\r\n }\r\n $clearSuggestion()\r\n searchPromise = query(match)\r\n searchPromise.promise\r\n .then((newSuggestion) => {\r\n if (searchPromise !== null) {\r\n updateAsyncSuggestion(searchPromise, newSuggestion)\r\n }\r\n })\r\n .catch((e) => {\r\n if (e !== \"Dismissed\") {\r\n logger.error(\"[AutocompletePlugin] Error:\", e)\r\n }\r\n })\r\n lastMatch = match\r\n }, HISTORY_MERGE)\r\n }\r\n function $handleAutocompleteIntent(): boolean {\r\n if (lastSuggestion === null || autocompleteNodeKey === null) {\r\n return false\r\n }\r\n const autocompleteNode = $getNodeByKey(autocompleteNodeKey)\r\n if (autocompleteNode === null) {\r\n return false\r\n }\r\n\r\n const selection = $getSelection()\r\n if (!$isRangeSelection(selection)) {\r\n // Outdated\r\n return false\r\n }\r\n const fontSize = $getSelectionStyleValueForProperty(\r\n selection,\r\n \"font-size\",\r\n \"16px\"\r\n )\r\n\r\n const textNode = $createTextNode(lastSuggestion)\r\n .setFormat(prevNodeFormat)\r\n .setStyle(`font-size: ${fontSize}`)\r\n autocompleteNode.replace(textNode)\r\n textNode.selectNext()\r\n $clearSuggestion()\r\n return true\r\n }\r\n function $handleKeypressCommand(e: Event) {\r\n if ($handleAutocompleteIntent()) {\r\n e.preventDefault()\r\n return true\r\n }\r\n return false\r\n }\r\n function handleSwipeRight(_force: number, e: TouchEvent) {\r\n editor.update(() => {\r\n if ($handleAutocompleteIntent()) {\r\n e.preventDefault()\r\n } else {\r\n $addUpdateTag(HISTORY_MERGE.tag)\r\n }\r\n })\r\n }\r\n function unmountSuggestion() {\r\n editor.update(() => {\r\n $clearSuggestion()\r\n }, HISTORY_MERGE)\r\n }\r\n\r\n const rootElem = editor.getRootElement()\r\n\r\n return mergeRegister(\r\n editor.registerNodeTransform(\r\n AutocompleteNode,\r\n $handleAutocompleteNodeTransform\r\n ),\r\n editor.registerUpdateListener(handleUpdate),\r\n editor.registerCommand(\r\n KEY_TAB_COMMAND,\r\n $handleKeypressCommand,\r\n COMMAND_PRIORITY_LOW\r\n ),\r\n editor.registerCommand(\r\n KEY_ARROW_RIGHT_COMMAND,\r\n $handleKeypressCommand,\r\n COMMAND_PRIORITY_LOW\r\n ),\r\n ...(rootElem !== null\r\n ? [addSwipeRightListener(rootElem, handleSwipeRight)]\r\n : []),\r\n unmountSuggestion\r\n )\r\n }, [editor, query])\r\n\r\n return null\r\n}\r\n\r\n/*\r\n * Simulate an asynchronous autocomplete server (typical in more common use cases like GMail where\r\n * the data is not static).\r\n */\r\nclass AutocompleteServer {\r\n DATABASE = DICTIONARY\r\n LATENCY = 200\r\n\r\n query = (searchText: string): SearchPromise => {\r\n let isDismissed = false\r\n\r\n const dismiss = () => {\r\n isDismissed = true\r\n }\r\n const promise: Promise<null | string> = new Promise((resolve, reject) => {\r\n setTimeout(() => {\r\n if (isDismissed) {\r\n // TODO cache result\r\n return reject(\"Dismissed\")\r\n }\r\n const searchTextLength = searchText.length\r\n if (searchText === \"\" || searchTextLength < 4) {\r\n return resolve(null)\r\n }\r\n const char0 = searchText.charCodeAt(0)\r\n const isCapitalized = char0 >= 65 && char0 <= 90\r\n const caseInsensitiveSearchText = isCapitalized\r\n ? String.fromCharCode(char0 + 32) + searchText.substring(1)\r\n : searchText\r\n const match = this.DATABASE.find(\r\n (dictionaryWord) =>\r\n dictionaryWord.startsWith(caseInsensitiveSearchText) ?? null\r\n )\r\n if (match === undefined) {\r\n return resolve(null)\r\n }\r\n const matchCapitalized = isCapitalized\r\n ? String.fromCharCode(match.charCodeAt(0) - 32) + match.substring(1)\r\n : match\r\n const autocompleteChunk = matchCapitalized.substring(searchTextLength)\r\n if (autocompleteChunk === \"\") {\r\n return resolve(null)\r\n }\r\n return resolve(autocompleteChunk)\r\n }, this.LATENCY)\r\n })\r\n\r\n return {\r\n dismiss,\r\n promise,\r\n }\r\n }\r\n}\r\n\r\n// https://raw.githubusercontent.com/first20hours/google-10000-english/master/google-10000-english-usa-no-swears-long.txt\r\nconst DICTIONARY = [\r\n \"information\",\r\n \"available\",\r\n \"copyright\",\r\n \"university\",\r\n \"management\",\r\n \"international\",\r\n \"development\",\r\n \"education\",\r\n \"community\",\r\n \"technology\",\r\n \"following\",\r\n \"resources\",\r\n \"including\",\r\n \"directory\",\r\n \"government\",\r\n \"department\",\r\n \"description\",\r\n \"insurance\",\r\n \"different\",\r\n \"categories\",\r\n \"conditions\",\r\n \"accessories\",\r\n \"september\",\r\n \"questions\",\r\n \"application\",\r\n \"financial\",\r\n \"equipment\",\r\n \"performance\",\r\n \"experience\",\r\n \"important\",\r\n \"activities\",\r\n \"additional\",\r\n \"something\",\r\n \"professional\",\r\n \"committee\",\r\n \"washington\",\r\n \"california\",\r\n \"reference\",\r\n \"companies\",\r\n \"computers\",\r\n \"president\",\r\n \"australia\",\r\n \"discussion\",\r\n \"entertainment\",\r\n \"agreement\",\r\n \"marketing\",\r\n \"association\",\r\n \"collection\",\r\n \"solutions\",\r\n \"electronics\",\r\n \"technical\",\r\n \"microsoft\",\r\n \"conference\",\r\n \"environment\",\r\n \"statement\",\r\n \"downloads\",\r\n \"applications\",\r\n \"requirements\",\r\n \"individual\",\r\n \"subscribe\",\r\n \"everything\",\r\n \"production\",\r\n \"commercial\",\r\n \"advertising\",\r\n \"treatment\",\r\n \"newsletter\",\r\n \"knowledge\",\r\n \"currently\",\r\n \"construction\",\r\n \"registered\",\r\n \"protection\",\r\n \"engineering\",\r\n \"published\",\r\n \"corporate\",\r\n \"customers\",\r\n \"materials\",\r\n \"countries\",\r\n \"standards\",\r\n \"political\",\r\n \"advertise\",\r\n \"environmental\",\r\n \"availability\",\r\n \"employment\",\r\n \"commission\",\r\n \"administration\",\r\n \"institute\",\r\n \"sponsored\",\r\n \"electronic\",\r\n \"condition\",\r\n \"effective\",\r\n \"organization\",\r\n \"selection\",\r\n \"corporation\",\r\n \"executive\",\r\n \"necessary\",\r\n \"according\",\r\n \"particular\",\r\n \"facilities\",\r\n \"opportunities\",\r\n \"appropriate\",\r\n \"statistics\",\r\n \"investment\",\r\n \"christmas\",\r\n \"registration\",\r\n \"furniture\",\r\n \"wednesday\",\r\n \"structure\",\r\n \"distribution\",\r\n \"industrial\",\r\n \"potential\",\r\n \"responsible\",\r\n \"communications\",\r\n \"associated\",\r\n \"foundation\",\r\n \"documents\",\r\n \"communication\",\r\n \"independent\",\r\n \"operating\",\r\n \"developed\",\r\n \"telephone\",\r\n \"population\",\r\n \"navigation\",\r\n \"operations\",\r\n \"therefore\",\r\n \"christian\",\r\n \"understand\",\r\n \"publications\",\r\n \"worldwide\",\r\n \"connection\",\r\n \"publisher\",\r\n \"introduction\",\r\n \"properties\",\r\n \"accommodation\",\r\n \"excellent\",\r\n \"opportunity\",\r\n \"assessment\",\r\n \"especially\",\r\n \"interface\",\r\n \"operation\",\r\n \"restaurants\",\r\n \"beautiful\",\r\n \"locations\",\r\n \"significant\",\r\n \"technologies\",\r\n \"manufacturer\",\r\n \"providing\",\r\n \"authority\",\r\n \"considered\",\r\n \"programme\",\r\n \"enterprise\",\r\n \"educational\",\r\n \"employees\",\r\n \"alternative\",\r\n \"processing\",\r\n \"responsibility\",\r\n \"resolution\",\r\n \"publication\",\r\n \"relations\",\r\n \"photography\",\r\n \"components\",\r\n \"assistance\",\r\n \"completed\",\r\n \"organizations\",\r\n \"otherwise\",\r\n \"transportation\",\r\n \"disclaimer\",\r\n \"membership\",\r\n \"recommended\",\r\n \"background\",\r\n \"character\",\r\n \"maintenance\",\r\n \"functions\",\r\n \"trademarks\",\r\n \"phentermine\",\r\n \"submitted\",\r\n \"television\",\r\n \"interested\",\r\n \"throughout\",\r\n \"established\",\r\n \"programming\",\r\n \"regarding\",\r\n \"instructions\",\r\n \"increased\",\r\n \"understanding\",\r\n \"beginning\",\r\n \"associates\",\r\n \"instruments\",\r\n \"businesses\",\r\n \"specified\",\r\n \"restaurant\",\r\n \"procedures\",\r\n \"relationship\",\r\n \"traditional\",\r\n \"sometimes\",\r\n \"themselves\",\r\n \"transport\",\r\n \"interesting\",\r\n \"evaluation\",\r\n \"implementation\",\r\n \"galleries\",\r\n \"references\",\r\n \"presented\",\r\n \"literature\",\r\n \"respective\",\r\n \"definition\",\r\n \"secretary\",\r\n \"networking\",\r\n \"australian\",\r\n \"magazines\",\r\n \"francisco\",\r\n \"individuals\",\r\n \"guidelines\",\r\n \"installation\",\r\n \"described\",\r\n \"attention\",\r\n \"difference\",\r\n \"regulations\",\r\n \"certificate\",\r\n \"directions\",\r\n \"documentation\",\r\n \"automotive\",\r\n \"successful\",\r\n \"communities\",\r\n \"situation\",\r\n \"publishing\",\r\n \"emergency\",\r\n \"developing\",\r\n \"determine\",\r\n \"temperature\",\r\n \"announcements\",\r\n \"historical\",\r\n \"ringtones\",\r\n \"difficult\",\r\n \"scientific\",\r\n \"satellite\",\r\n \"particularly\",\r\n \"functional\",\r\n \"monitoring\",\r\n \"architecture\",\r\n \"recommend\",\r\n \"dictionary\",\r\n \"accounting\",\r\n \"manufacturing\",\r\n \"professor\",\r\n \"generally\",\r\n \"continued\",\r\n \"techniques\",\r\n \"permission\",\r\n \"generation\",\r\n \"component\",\r\n \"guarantee\",\r\n \"processes\",\r\n \"interests\",\r\n \"paperback\",\r\n \"classifieds\",\r\n \"supported\",\r\n \"competition\",\r\n \"providers\",\r\n \"characters\",\r\n \"thousands\",\r\n \"apartments\",\r\n \"generated\",\r\n \"administrative\",\r\n \"practices\",\r\n \"reporting\",\r\n \"essential\",\r\n \"affiliate\",\r\n \"immediately\",\r\n \"designated\",\r\n \"integrated\",\r\n \"configuration\",\r\n \"comprehensive\",\r\n \"universal\",\r\n \"presentation\",\r\n \"languages\",\r\n \"compliance\",\r\n \"improvement\",\r\n \"pennsylvania\",\r\n \"challenge\",\r\n \"acceptance\",\r\n \"strategies\",\r\n \"affiliates\",\r\n \"multimedia\",\r\n \"certified\",\r\n \"computing\",\r\n \"interactive\",\r\n \"procedure\",\r\n \"leadership\",\r\n \"religious\",\r\n \"breakfast\",\r\n \"developer\",\r\n \"approximately\",\r\n \"recommendations\",\r\n \"comparison\",\r\n \"automatically\",\r\n \"minnesota\",\r\n \"adventure\",\r\n \"institutions\",\r\n \"assistant\",\r\n \"advertisement\",\r\n \"headlines\",\r\n \"yesterday\",\r\n \"determined\",\r\n \"wholesale\",\r\n \"extension\",\r\n \"statements\",\r\n \"completely\",\r\n \"electrical\",\r\n \"applicable\",\r\n \"manufacturers\",\r\n \"classical\",\r\n \"dedicated\",\r\n \"direction\",\r\n \"basketball\",\r\n \"wisconsin\",\r\n \"personnel\",\r\n \"identified\",\r\n \"professionals\",\r\n \"advantage\",\r\n \"newsletters\",\r\n \"estimated\",\r\n \"anonymous\",\r\n \"miscellaneous\",\r\n \"integration\",\r\n \"interview\",\r\n \"framework\",\r\n \"installed\",\r\n \"massachusetts\",\r\n \"associate\",\r\n \"frequently\",\r\n \"discussions\",\r\n \"laboratory\",\r\n \"destination\",\r\n \"intelligence\",\r\n \"specifications\",\r\n \"tripadvisor\",\r\n \"residential\",\r\n \"decisions\",\r\n \"industries\",\r\n \"partnership\",\r\n \"editorial\",\r\n \"expression\",\r\n \"provisions\",\r\n \"principles\",\r\n \"suggestions\",\r\n \"replacement\",\r\n \"strategic\",\r\n \"economics\",\r\n \"compatible\",\r\n \"apartment\",\r\n \"netherlands\",\r\n \"consulting\",\r\n \"recreation\",\r\n \"participants\",\r\n \"favorites\",\r\n \"translation\",\r\n \"estimates\",\r\n \"protected\",\r\n \"philadelphia\",\r\n \"officials\",\r\n \"contained\",\r\n \"legislation\",\r\n \"parameters\",\r\n \"relationships\",\r\n \"tennessee\",\r\n \"representative\",\r\n \"frequency\",\r\n \"introduced\",\r\n \"departments\",\r\n \"residents\",\r\n \"displayed\",\r\n \"performed\",\r\n \"administrator\",\r\n \"addresses\",\r\n \"permanent\",\r\n \"agriculture\",\r\n \"constitutes\",\r\n \"portfolio\",\r\n \"practical\",\r\n \"delivered\",\r\n \"collectibles\",\r\n \"infrastructure\",\r\n \"exclusive\",\r\n \"originally\",\r\n \"utilities\",\r\n \"philosophy\",\r\n \"regulation\",\r\n \"reduction\",\r\n \"nutrition\",\r\n \"recording\",\r\n \"secondary\",\r\n \"wonderful\",\r\n \"announced\",\r\n \"prevention\",\r\n \"mentioned\",\r\n \"automatic\",\r\n \"healthcare\",\r\n \"maintained\",\r\n \"increasing\",\r\n \"connected\",\r\n \"directors\",\r\n \"participation\",\r\n \"containing\",\r\n \"combination\",\r\n \"amendment\",\r\n \"guaranteed\",\r\n \"libraries\",\r\n \"distributed\",\r\n \"singapore\",\r\n \"enterprises\",\r\n \"convention\",\r\n \"principal\",\r\n \"certification\",\r\n \"previously\",\r\n \"buildings\",\r\n \"household\",\r\n \"batteries\",\r\n \"positions\",\r\n \"subscription\",\r\n \"contemporary\",\r\n \"panasonic\",\r\n \"permalink\",\r\n \"signature\",\r\n \"provision\",\r\n \"certainly\",\r\n \"newspaper\",\r\n \"liability\",\r\n \"trademark\",\r\n \"trackback\",\r\n \"americans\",\r\n \"promotion\",\r\n \"conversion\",\r\n \"reasonable\",\r\n \"broadband\",\r\n \"influence\",\r\n \"importance\",\r\n \"webmaster\",\r\n \"prescription\",\r\n \"specifically\",\r\n \"represent\",\r\n \"conservation\",\r\n \"louisiana\",\r\n \"javascript\",\r\n \"marketplace\",\r\n \"evolution\",\r\n \"certificates\",\r\n \"objectives\",\r\n \"suggested\",\r\n \"concerned\",\r\n \"structures\",\r\n \"encyclopedia\",\r\n \"continuing\",\r\n \"interracial\",\r\n \"competitive\",\r\n \"suppliers\",\r\n \"preparation\",\r\n \"receiving\",\r\n \"accordance\",\r\n \"discussed\",\r\n \"elizabeth\",\r\n \"reservations\",\r\n \"playstation\",\r\n \"instruction\",\r\n \"annotation\",\r\n \"differences\",\r\n \"establish\",\r\n \"expressed\",\r\n \"paragraph\",\r\n \"mathematics\",\r\n \"compensation\",\r\n \"conducted\",\r\n \"percentage\",\r\n \"mississippi\",\r\n \"requested\",\r\n \"connecticut\",\r\n \"personals\",\r\n \"immediate\",\r\n \"agricultural\",\r\n \"supporting\",\r\n \"collections\",\r\n \"participate\",\r\n \"specialist\",\r\n \"experienced\",\r\n \"investigation\",\r\n \"institution\",\r\n \"searching\",\r\n \"proceedings\",\r\n \"transmission\",\r\n \"characteristics\",\r\n \"experiences\",\r\n \"extremely\",\r\n \"verzeichnis\",\r\n \"contracts\",\r\n \"concerning\",\r\n \"developers\",\r\n \"equivalent\",\r\n \"chemistry\",\r\n \"neighborhood\",\r\n \"variables\",\r\n \"continues\",\r\n \"curriculum\",\r\n \"psychology\",\r\n \"responses\",\r\n \"circumstances\",\r\n \"identification\",\r\n \"appliances\",\r\n \"elementary\",\r\n \"unlimited\",\r\n \"printable\",\r\n \"enforcement\",\r\n \"hardcover\",\r\n \"celebrity\",\r\n \"chocolate\",\r\n \"hampshire\",\r\n \"bluetooth\",\r\n \"controlled\",\r\n \"requirement\",\r\n \"authorities\",\r\n \"representatives\",\r\n \"pregnancy\",\r\n \"biography\",\r\n \"attractions\",\r\n \"transactions\",\r\n \"authorized\",\r\n \"retirement\",\r\n \"financing\",\r\n \"efficiency\",\r\n \"efficient\",\r\n \"commitment\",\r\n \"specialty\",\r\n \"interviews\",\r\n \"qualified\",\r\n \"discovery\",\r\n \"classified\",\r\n \"confidence\",\r\n \"lifestyle\",\r\n \"consistent\",\r\n \"clearance\",\r\n \"connections\",\r\n \"inventory\",\r\n \"converter\",\r\n \"organisation\",\r\n \"objective\",\r\n \"indicated\",\r\n \"securities\",\r\n \"volunteer\",\r\n \"democratic\",\r\n \"switzerland\",\r\n \"parameter\",\r\n \"processor\",\r\n \"dimensions\",\r\n \"contribute\",\r\n \"challenges\",\r\n \"recognition\",\r\n \"submission\",\r\n \"encourage\",\r\n \"regulatory\",\r\n \"inspection\",\r\n \"consumers\",\r\n \"territory\",\r\n \"transaction\",\r\n \"manchester\",\r\n \"contributions\",\r\n \"continuous\",\r\n \"resulting\",\r\n \"cambridge\",\r\n \"initiative\",\r\n \"execution\",\r\n \"disability\",\r\n \"increases\",\r\n \"contractor\",\r\n \"examination\",\r\n \"indicates\",\r\n \"committed\",\r\n \"extensive\",\r\n \"affordable\",\r\n \"candidate\",\r\n \"databases\",\r\n \"outstanding\",\r\n \"perspective\",\r\n \"messenger\",\r\n \"tournament\",\r\n \"consideration\",\r\n \"discounts\",\r\n \"catalogue\",\r\n \"publishers\",\r\n \"caribbean\",\r\n \"reservation\",\r\n \"remaining\",\r\n \"depending\",\r\n \"expansion\",\r\n \"purchased\",\r\n \"performing\",\r\n \"collected\",\r\n \"absolutely\",\r\n \"featuring\",\r\n \"implement\",\r\n \"scheduled\",\r\n \"calculator\",\r\n \"significantly\",\r\n \"temporary\",\r\n \"sufficient\",\r\n \"awareness\",\r\n \"vancouver\",\r\n \"contribution\",\r\n \"measurement\",\r\n \"constitution\",\r\n \"packaging\",\r\n \"consultation\",\r\n \"northwest\",\r\n \"classroom\",\r\n \"democracy\",\r\n \"wallpaper\",\r\n \"merchandise\",\r\n \"resistance\",\r\n \"baltimore\",\r\n \"candidates\",\r\n \"charlotte\",\r\n \"biological\",\r\n \"transition\",\r\n \"preferences\",\r\n \"instrument\",\r\n \"classification\",\r\n \"physician\",\r\n \"hollywood\",\r\n \"wikipedia\",\r\n \"spiritual\",\r\n \"photographs\",\r\n \"relatively\",\r\n \"satisfaction\",\r\n \"represents\",\r\n \"pittsburgh\",\r\n \"preferred\",\r\n \"intellectual\",\r\n \"comfortable\",\r\n \"interaction\",\r\n \"listening\",\r\n \"effectively\",\r\n \"experimental\",\r\n \"revolution\",\r\n \"consolidation\",\r\n \"landscape\",\r\n \"dependent\",\r\n \"mechanical\",\r\n \"consultants\",\r\n \"applicant\",\r\n \"cooperation\",\r\n \"acquisition\",\r\n \"implemented\",\r\n \"directories\",\r\n \"recognized\",\r\n \"notification\",\r\n \"licensing\",\r\n \"textbooks\",\r\n \"diversity\",\r\n \"cleveland\",\r\n \"investments\",\r\n \"accessibility\",\r\n \"sensitive\",\r\n \"templates\",\r\n \"completion\",\r\n \"universities\",\r\n \"technique\",\r\n \"contractors\",\r\n \"subscriptions\",\r\n \"calculate\",\r\n \"alexander\",\r\n \"broadcast\",\r\n \"converted\",\r\n \"anniversary\",\r\n \"improvements\",\r\n \"specification\",\r\n \"accessible\",\r\n \"accessory\",\r\n \"typically\",\r\n \"representation\",\r\n \"arrangements\",\r\n \"conferences\",\r\n \"uniprotkb\",\r\n \"consumption\",\r\n \"birmingham\",\r\n \"afternoon\",\r\n \"consultant\",\r\n \"controller\",\r\n \"ownership\",\r\n \"committees\",\r\n \"legislative\",\r\n \"researchers\",\r\n \"unsubscribe\",\r\n \"molecular\",\r\n \"residence\",\r\n \"attorneys\",\r\n \"operators\",\r\n \"sustainable\",\r\n \"philippines\",\r\n \"statistical\",\r\n \"innovation\",\r\n \"employers\",\r\n \"definitions\",\r\n \"elections\",\r\n \"stainless\",\r\n \"newspapers\",\r\n \"hospitals\",\r\n \"exception\",\r\n \"successfully\",\r\n \"indonesia\",\r\n \"primarily\",\r\n \"capabilities\",\r\n \"recommendation\",\r\n \"recruitment\",\r\n \"organized\",\r\n \"improving\",\r\n \"expensive\",\r\n \"organisations\",\r\n \"explained\",\r\n \"programmes\",\r\n \"expertise\",\r\n \"mechanism\",\r\n \"jewellery\",\r\n \"eventually\",\r\n \"agreements\",\r\n \"considering\",\r\n \"innovative\",\r\n \"conclusion\",\r\n \"disorders\",\r\n \"collaboration\",\r\n \"detection\",\r\n \"formation\",\r\n \"engineers\",\r\n \"proposals\",\r\n \"moderator\",\r\n \"tutorials\",\r\n \"settlement\",\r\n \"collectables\",\r\n \"fantastic\",\r\n \"governments\",\r\n \"purchasing\",\r\n \"appointed\",\r\n \"operational\",\r\n \"corresponding\",\r\n \"descriptions\",\r\n \"determination\",\r\n \"animation\",\r\n \"productions\",\r\n \"telecommunications\",\r\n \"instructor\",\r\n \"approaches\",\r\n \"highlights\",\r\n \"designers\",\r\n \"melbourne\",\r\n \"scientists\",\r\n \"blackjack\",\r\n \"argentina\",\r\n \"possibility\",\r\n \"commissioner\",\r\n \"dangerous\",\r\n \"reliability\",\r\n \"unfortunately\",\r\n \"respectively\",\r\n \"volunteers\",\r\n \"attachment\",\r\n \"appointment\",\r\n \"workshops\",\r\n \"hurricane\",\r\n \"represented\",\r\n \"mortgages\",\r\n \"responsibilities\",\r\n \"carefully\",\r\n \"productivity\",\r\n \"investors\",\r\n \"underground\",\r\n \"diagnosis\",\r\n \"principle\",\r\n \"vacations\",\r\n \"calculated\",\r\n \"appearance\",\r\n \"incorporated\",\r\n \"notebooks\",\r\n \"algorithm\",\r\n \"valentine\",\r\n \"involving\",\r\n \"investing\",\r\n \"christopher\",\r\n \"admission\",\r\n \"terrorism\",\r\n \"parliament\",\r\n \"situations\",\r\n \"allocated\",\r\n \"corrections\",\r\n \"structural\",\r\n \"municipal\",\r\n \"describes\",\r\n \"disabilities\",\r\n \"substance\",\r\n \"prohibited\",\r\n \"addressed\",\r\n \"simulation\",\r\n \"initiatives\",\r\n \"concentration\",\r\n \"interpretation\",\r\n \"bankruptcy\",\r\n \"optimization\",\r\n \"substances\",\r\n \"discovered\",\r\n \"restrictions\",\r\n \"participating\",\r\n \"exhibition\",\r\n \"composition\",\r\n \"nationwide\",\r\n \"definitely\",\r\n \"existence\",\r\n \"commentary\",\r\n \"limousines\",\r\n \"developments\",\r\n \"immigration\",\r\n \"destinations\",\r\n \"necessarily\",\r\n \"attribute\",\r\n \"apparently\",\r\n \"surrounding\",\r\n \"mountains\",\r\n \"popularity\",\r\n \"postposted\",\r\n \"coordinator\",\r\n \"obviously\",\r\n \"fundamental\",\r\n \"substantial\",\r\n \"progressive\",\r\n \"championship\",\r\n \"sacramento\",\r\n \"impossible\",\r\n \"depression\",\r\n \"testimonials\",\r\n \"memorabilia\",\r\n \"cartridge\",\r\n \"explanation\",\r\n \"cincinnati\",\r\n \"subsection\",\r\n \"electricity\",\r\n \"permitted\",\r\n \"workplace\",\r\n \"confirmed\",\r\n \"wallpapers\",\r\n \"infection\",\r\n \"eligibility\",\r\n \"involvement\",\r\n \"placement\",\r\n \"observations\",\r\n \"vbulletin\",\r\n \"subsequent\",\r\n \"motorcycle\",\r\n \"disclosure\",\r\n \"establishment\",\r\n \"presentations\",\r\n \"undergraduate\",\r\n \"occupation\",\r\n \"donations\",\r\n \"associations\",\r\n \"citysearch\",\r\n \"radiation\",\r\n \"seriously\",\r\n \"elsewhere\",\r\n \"pollution\",\r\n \"conservative\",\r\n \"guestbook\",\r\n \"effectiveness\",\r\n \"demonstrate\",\r\n \"atmosphere\",\r\n \"experiment\",\r\n \"purchases\",\r\n \"federation\",\r\n \"assignment\",\r\n \"chemicals\",\r\n \"everybody\",\r\n \"nashville\",\r\n \"counseling\",\r\n \"acceptable\",\r\n \"satisfied\",\r\n \"measurements\",\r\n \"milwaukee\",\r\n \"medication\",\r\n \"warehouse\",\r\n \"shareware\",\r\n \"violation\",\r\n \"configure\",\r\n \"stability\",\r\n \"southwest\",\r\n \"institutional\",\r\n \"expectations\",\r\n \"independence\",\r\n \"metabolism\",\r\n \"personally\",\r\n \"excellence\",\r\n \"somewhere\",\r\n \"attributes\",\r\n \"recognize\",\r\n \"screening\",\r\n \"thumbnail\",\r\n \"forgotten\",\r\n \"intelligent\",\r\n \"edinburgh\",\r\n \"obligation\",\r\n \"regardless\",\r\n \"restricted\",\r\n \"republican\",\r\n \"merchants\",\r\n \"attendance\",\r\n \"arguments\",\r\n \"amsterdam\",\r\n \"adventures\",\r\n \"announcement\",\r\n \"appreciate\",\r\n \"regularly\",\r\n \"mechanisms\",\r\n \"customize\",\r\n \"tradition\",\r\n \"indicators\",\r\n \"emissions\",\r\n \"physicians\",\r\n \"complaint\",\r\n \"experiments\",\r\n \"afghanistan\",\r\n \"scholarship\",\r\n \"governance\",\r\n \"supplements\",\r\n \"camcorder\",\r\n \"implementing\",\r\n \"ourselves\",\r\n \"conversation\",\r\n \"capability\",\r\n \"producing\",\r\n \"precision\",\r\n \"contributed\",\r\n \"reproduction\",\r\n \"ingredients\",\r\n \"franchise\",\r\n \"complaints\",\r\n \"promotions\",\r\n \"rehabilitation\",\r\n \"maintaining\",\r\n \"environments\",\r\n \"reception\",\r\n \"correctly\",\r\n \"consequences\",\r\n \"geography\",\r\n \"appearing\",\r\n \"integrity\",\r\n \"discrimination\",\r\n \"processed\",\r\n \"implications\",\r\n \"functionality\",\r\n \"intermediate\",\r\n \"emotional\",\r\n \"platforms\",\r\n \"overnight\",\r\n \"geographic\",\r\n \"preliminary\",\r\n \"districts\",\r\n \"introduce\",\r\n \"promotional\",\r\n \"chevrolet\",\r\n \"specialists\",\r\n \"generator\",\r\n \"suspension\",\r\n \"correction\",\r\n \"authentication\",\r\n \"communicate\",\r\n \"supplement\",\r\n \"showtimes\",\r\n \"promoting\",\r\n \"machinery\",\r\n \"bandwidth\",\r\n \"probability\",\r\n \"dimension\",\r\n \"schedules\",\r\n \"admissions\",\r\n \"quarterly\",\r\n \"illustrated\",\r\n \"continental\",\r\n \"alternate\",\r\n \"achievement\",\r\n \"limitations\",\r\n \"automated\",\r\n \"passenger\",\r\n \"convenient\",\r\n \"orientation\",\r\n \"childhood\",\r\n \"flexibility\",\r\n \"jurisdiction\",\r\n \"displaying\",\r\n \"encouraged\",\r\n \"cartridges\",\r\n \"declaration\",\r\n \"automation\",\r\n \"advantages\",\r\n \"preparing\",\r\n \"recipient\",\r\n \"extensions\",\r\n \"athletics\",\r\n \"southeast\",\r\n \"alternatives\",\r\n \"determining\",\r\n \"personalized\",\r\n \"conditioning\",\r\n \"partnerships\",\r\n \"destruction\",\r\n \"increasingly\",\r\n \"migration\",\r\n \"basically\",\r\n \"conventional\",\r\n \"applicants\",\r\n \"occupational\",\r\n \"adjustment\",\r\n \"treatments\",\r\n \"camcorders\",\r\n \"difficulty\",\r\n \"collective\",\r\n \"coalition\",\r\n \"enrollment\",\r\n \"producers\",\r\n \"collector\",\r\n \"interfaces\",\r\n \"advertisers\",\r\n \"representing\",\r\n \"observation\",\r\n \"restoration\",\r\n \"convenience\",\r\n \"returning\",\r\n \"opposition\",\r\n \"container\",\r\n \"defendant\",\r\n \"confirmation\",\r\n \"supervisor\",\r\n \"peripherals\",\r\n \"bestsellers\",\r\n \"departure\",\r\n \"minneapolis\",\r\n \"interactions\",\r\n \"intervention\",\r\n \"attraction\",\r\n \"modification\",\r\n \"customized\",\r\n \"understood\",\r\n \"assurance\",\r\n \"happening\",\r\n \"amendments\",\r\n \"metropolitan\",\r\n \"compilation\",\r\n \"verification\",\r\n \"attractive\",\r\n \"recordings\",\r\n \"jefferson\",\r\n \"gardening\",\r\n \"obligations\",\r\n \"orchestra\",\r\n \"polyphonic\",\r\n \"outsourcing\",\r\n \"adjustable\",\r\n \"allocation\",\r\n \"discipline\",\r\n \"demonstrated\",\r\n \"identifying\",\r\n \"alphabetical\",\r\n \"dispatched\",\r\n \"installing\",\r\n \"voluntary\",\r\n \"photographer\",\r\n \"messaging\",\r\n \"constructed\",\r\n \"additions\",\r\n \"requiring\",\r\n \"engagement\",\r\n \"refinance\",\r\n \"calendars\",\r\n \"arrangement\",\r\n \"conclusions\",\r\n \"bibliography\",\r\n \"compatibility\",\r\n \"furthermore\",\r\n \"cooperative\",\r\n \"measuring\",\r\n \"jacksonville\",\r\n \"headquarters\",\r\n \"transfers\",\r\n \"transformation\",\r\n \"attachments\",\r\n \"administrators\",\r\n \"personality\",\r\n \"facilitate\",\r\n \"subscriber\",\r\n \"priorities\",\r\n \"bookstore\",\r\n \"parenting\",\r\n \"incredible\",\r\n \"commonwealth\",\r\n \"pharmaceutical\",\r\n \"manhattan\",\r\n \"workforce\",\r\n \"organizational\",\r\n \"portuguese\",\r\n \"everywhere\",\r\n \"discharge\",\r\n \"halloween\",\r\n \"hazardous\",\r\n \"methodology\",\r\n \"housewares\",\r\n \"reputation\",\r\n \"resistant\",\r\n \"democrats\",\r\n \"recycling\",\r\n \"qualifications\",\r\n \"slideshow\",\r\n \"variation\",\r\n \"transferred\",\r\n \"photograph\",\r\n \"distributor\",\r\n \"underlying\",\r\n \"wrestling\",\r\n \"photoshop\",\r\n \"gathering\",\r\n \"projection\",\r\n \"mathematical\",\r\n \"specialized\",\r\n \"diagnostic\",\r\n \"indianapolis\",\r\n \"corporations\",\r\n \"criticism\",\r\n \"automobile\",\r\n \"confidential\",\r\n \"statutory\",\r\n \"accommodations\",\r\n \"northeast\",\r\n \"downloaded\",\r\n \"paintings\",\r\n \"injection\",\r\n \"yorkshire\",\r\n \"populations\",\r\n \"protective\",\r\n \"initially\",\r\n \"indicator\",\r\n \"eliminate\",\r\n \"sunglasses\",\r\n \"preference\",\r\n \"threshold\",\r\n \"venezuela\",\r\n \"exploration\",\r\n \"sequences\",\r\n \"astronomy\",\r\n \"translate\",\r\n \"announces\",\r\n \"compression\",\r\n \"establishing\",\r\n \"constitutional\",\r\n \"perfectly\",\r\n \"instantly\",\r\n \"litigation\",\r\n \"submissions\",\r\n \"broadcasting\",\r\n \"horizontal\",\r\n \"terrorist\",\r\n \"informational\",\r\n \"ecommerce\",\r\n \"suffering\",\r\n \"prospective\",\r\n \"ultimately\",\r\n \"artificial\",\r\n \"spectacular\",\r\n \"coordination\",\r\n \"connector\",\r\n \"affiliated\",\r\n \"activation\",\r\n \"naturally\",\r\n \"subscribers\",\r\n \"mitsubishi\",\r\n \"underwear\",\r\n \"potentially\",\r\n \"constraints\",\r\n \"inclusive\",\r\n \"dimensional\",\r\n \"considerable\",\r\n \"selecting\",\r\n \"processors\",\r\n \"pantyhose\",\r\n \"difficulties\",\r\n \"complexity\",\r\n \"constantly\",\r\n \"barcelona\",\r\n \"presidential\",\r\n \"documentary\",\r\n \"territories\",\r\n \"palestinian\",\r\n \"legislature\",\r\n \"hospitality\",\r\n \"procurement\",\r\n \"theoretical\",\r\n \"exercises\",\r\n \"surveillance\",\r\n \"protocols\",\r\n \"highlight\",\r\n \"substitute\",\r\n \"inclusion\",\r\n \"hopefully\",\r\n \"brilliant\",\r\n \"evaluated\",\r\n \"assignments\",\r\n \"termination\",\r\n \"households\",\r\n \"authentic\",\r\n \"montgomery\",\r\n \"architectural\",\r\n \"louisville\",\r\n \"macintosh\",\r\n \"movements\",\r\n \"amenities\",\r\n \"virtually\",\r\n \"authorization\",\r\n \"projector\",\r\n \"comparative\",\r\n \"psychological\",\r\n \"surprised\",\r\n \"genealogy\",\r\n \"expenditure\",\r\n \"liverpool\",\r\n \"connectivity\",\r\n \"algorithms\",\r\n \"similarly\",\r\n \"collaborative\",\r\n \"excluding\",\r\n \"commander\",\r\n \"suggestion\",\r\n \"spotlight\",\r\n \"investigate\",\r\n \"connecting\",\r\n \"logistics\",\r\n \"proportion\",\r\n \"significance\",\r\n \"symposium\",\r\n \"essentials\",\r\n \"protecting\",\r\n \"transmitted\",\r\n \"screenshots\",\r\n \"intensive\",\r\n \"switching\",\r\n \"correspondence\",\r\n \"supervision\",\r\n \"expenditures\",\r\n \"separation\",\r\n \"testimony\",\r\n \"celebrities\",\r\n \"mandatory\",\r\n \"boundaries\",\r\n \"syndication\",\r\n \"celebration\",\r\n \"filtering\",\r\n \"luxembourg\",\r\n \"offensive\",\r\n \"deployment\",\r\n \"colleagues\",\r\n \"separated\",\r\n \"directive\",\r\n \"governing\",\r\n \"retailers\",\r\n \"occasionally\",\r\n \"attending\",\r\n \"recruiting\",\r\n \"instructional\",\r\n \"traveling\",\r\n \"permissions\",\r\n \"biotechnology\",\r\n \"prescribed\",\r\n \"catherine\",\r\n \"reproduced\",\r\n \"calculation\",\r\n \"consolidated\",\r\n \"occasions\",\r\n \"equations\",\r\n \"exceptional\",\r\n \"respondents\",\r\n \"considerations\",\r\n \"queensland\",\r\n \"musicians\",\r\n \"composite\",\r\n \"unavailable\",\r\n \"essentially\",\r\n \"designing\",\r\n \"assessments\",\r\n \"brunswick\",\r\n \"sensitivity\",\r\n \"preservation\",\r\n \"streaming\",\r\n \"intensity\",\r\n \"technological\",\r\n \"syndicate\",\r\n \"antivirus\",\r\n \"addressing\",\r\n \"discounted\",\r\n \"bangladesh\",\r\n \"constitute\",\r\n \"concluded\",\r\n \"desperate\",\r\n \"demonstration\",\r\n \"governmental\",\r\n \"manufactured\",\r\n \"graduation\",\r\n \"variations\",\r\n \"addiction\",\r\n \"springfield\",\r\n \"synthesis\",\r\n \"undefined\",\r\n \"unemployment\",\r\n \"enhancement\",\r\n \"newcastle\",\r\n \"performances\",\r\n \"societies\",\r\n \"brazilian\",\r\n \"identical\",\r\n \"petroleum\",\r\n \"norwegian\",\r\n \"retention\",\r\n \"exchanges\",\r\n \"soundtrack\",\r\n \"wondering\",\r\n \"profession\",\r\n \"separately\",\r\n \"physiology\",\r\n \"collecting\",\r\n \"participant\",\r\n \"scholarships\",\r\n \"recreational\",\r\n \"dominican\",\r\n \"friendship\",\r\n \"expanding\",\r\n \"provincial\",\r\n \"investigations\",\r\n \"medications\",\r\n \"rochester\",\r\n \"advertiser\",\r\n \"encryption\",\r\n \"downloadable\",\r\n \"sophisticated\",\r\n \"possession\",\r\n \"laboratories\",\r\n \"vegetables\",\r\n \"thumbnails\",\r\n \"stockings\",\r\n \"respondent\",\r\n \"destroyed\",\r\n \"manufacture\",\r\n \"wordpress\",\r\n \"vulnerability\",\r\n \"accountability\",\r\n \"celebrate\",\r\n \"accredited\",\r\n \"appliance\",\r\n \"compressed\",\r\n \"scheduling\",\r\n \"perspectives\",\r\n \"mortality\",\r\n \"christians\",\r\n \"therapeutic\",\r\n \"impressive\",\r\n \"accordingly\",\r\n \"architect\",\r\n \"challenging\",\r\n \"microwave\",\r\n \"accidents\",\r\n \"relocation\",\r\n \"contributors\",\r\n \"violations\",\r\n \"temperatures\",\r\n \"competitions\",\r\n \"discretion\",\r\n \"cosmetics\",\r\n \"repository\",\r\n \"concentrations\",\r\n \"christianity\",\r\n \"negotiations\",\r\n \"realistic\",\r\n \"generating\",\r\n \"christina\",\r\n \"congressional\",\r\n \"photographic\",\r\n \"modifications\",\r\n \"millennium\",\r\n \"achieving\",\r\n \"fisheries\",\r\n \"exceptions\",\r\n \"reactions\",\r\n \"macromedia\",\r\n \"companion\",\r\n \"divisions\",\r\n \"additionally\",\r\n \"fellowship\",\r\n \"victorian\",\r\n \"copyrights\",\r\n \"lithuania\",\r\n \"mastercard\",\r\n \"chronicles\",\r\n \"obtaining\",\r\n \"distribute\",\r\n \"decorative\",\r\n \"enlargement\",\r\n \"campaigns\",\r\n \"conjunction\",\r\n \"instances\",\r\n \"indigenous\",\r\n \"validation\",\r\n \"corruption\",\r\n \"incentives\",\r\n \"cholesterol\",\r\n \"differential\",\r\n \"scientist\",\r\n \"starsmerchant\",\r\n \"arthritis\",\r\n \"nevertheless\",\r\n \"practitioners\",\r\n \"transcript\",\r\n \"inflation\",\r\n \"compounds\",\r\n \"contracting\",\r\n \"structured\",\r\n \"reasonably\",\r\n \"graduates\",\r\n \"recommends\",\r\n \"controlling\",\r\n \"distributors\",\r\n \"arlington\",\r\n \"particles\",\r\n \"extraordinary\",\r\n \"indicating\",\r\n \"coordinate\",\r\n \"exclusively\",\r\n \"limitation\",\r\n \"widescreen\",\r\n \"illustration\",\r\n \"construct\",\r\n \"inquiries\",\r\n \"inspiration\",\r\n \"affecting\",\r\n \"downloading\",\r\n \"aggregate\",\r\n \"forecasts\",\r\n \"complicated\",\r\n \"shopzilla\",\r\n \"decorating\",\r\n \"expressions\",\r\n \"shakespeare\",\r\n \"connectors\",\r\n \"conflicts\",\r\n \"travelers\",\r\n \"offerings\",\r\n \"incorrect\",\r\n \"furnishings\",\r\n \"guatemala\",\r\n \"perception\",\r\n \"renaissance\",\r\n \"pathology\",\r\n \"ordinance\",\r\n \"photographers\",\r\n \"infections\",\r\n \"configured\",\r\n \"festivals\",\r\n \"possibilities\",\r\n \"contributing\",\r\n \"analytical\",\r\n \"circulation\",\r\n \"assumption\",\r\n \"jerusalem\",\r\n \"transexuales\",\r\n \"invention\",\r\n \"technician\",\r\n \"executives\",\r\n \"enquiries\",\r\n \"cognitive\",\r\n \"exploring\",\r\n \"registrar\",\r\n \"supporters\",\r\n \"withdrawal\",\r\n \"predicted\",\r\n \"saskatchewan\",\r\n \"cancellation\",\r\n \"ministers\",\r\n \"veterinary\",\r\n \"prostores\",\r\n \"relevance\",\r\n \"incentive\",\r\n \"butterfly\",\r\n \"mechanics\",\r\n \"numerical\",\r\n \"reflection\",\r\n \"accompanied\",\r\n \"invitation\",\r\n \"princeton\",\r\n \"spirituality\",\r\n \"meanwhile\",\r\n \"proprietary\",\r\n \"childrens\",\r\n \"thumbzilla\",\r\n \"porcelain\",\r\n \"pichunter\",\r\n \"translated\",\r\n \"columnists\",\r\n \"consensus\",\r\n \"delivering\",\r\n \"journalism\",\r\n \"intention\",\r\n \"undertaken\",\r\n \"statewide\",\r\n \"semiconductor\",\r\n \"illustrations\",\r\n \"happiness\",\r\n \"substantially\",\r\n \"identifier\",\r\n \"calculations\",\r\n \"conducting\",\r\n \"accomplished\",\r\n \"calculators\",\r\n \"impression\",\r\n \"correlation\",\r\n \"fragrance\",\r\n \"neighbors\",\r\n \"transparent\",\r\n \"charleston\",\r\n \"champions\",\r\n \"selections\",\r\n \"projectors\",\r\n \"inappropriate\",\r\n \"comparing\",\r\n \"vocational\",\r\n \"pharmacies\",\r\n \"introducing\",\r\n \"appreciated\",\r\n \"albuquerque\",\r\n \"distinguished\",\r\n \"projected\",\r\n \"assumptions\",\r\n \"shareholders\",\r\n \"developmental\",\r\n \"regulated\",\r\n \"anticipated\",\r\n \"completing\",\r\n \"comparable\",\r\n \"confusion\",\r\n \"copyrighted\",\r\n \"warranties\",\r\n \"documented\",\r\n \"paperbacks\",\r\n \"keyboards\",\r\n \"vulnerable\",\r\n \"reflected\",\r\n \"respiratory\",\r\n \"notifications\",\r\n \"transexual\",\r\n \"mainstream\",\r\n \"evaluating\",\r\n \"subcommittee\",\r\n \"maternity\",\r\n \"journalists\",\r\n \"foundations\",\r\n \"volleyball\",\r\n \"liabilities\",\r\n \"decreased\",\r\n \"tolerance\",\r\n \"creativity\",\r\n \"describing\",\r\n \"lightning\",\r\n \"quotations\",\r\n \"inspector\",\r\n \"bookmarks\",\r\n \"behavioral\",\r\n \"riverside\",\r\n \"bathrooms\",\r\n \"abilities\",\r\n \"initiated\",\r\n \"nonprofit\",\r\n \"lancaster\",\r\n \"suspended\",\r\n \"containers\",\r\n \"attitudes\",\r\n \"simultaneously\",\r\n \"integrate\",\r\n \"sociology\",\r\n \"screenshot\",\r\n \"exhibitions\",\r\n \"confident\",\r\n \"retrieved\",\r\n \"officially\",\r\n \"consortium\",\r\n \"recipients\",\r\n \"delicious\",\r\n \"traditions\",\r\n \"periodically\",\r\n \"hungarian\",\r\n \"referring\",\r\n \"transform\",\r\n \"educators\",\r\n \"vegetable\",\r\n \"humanities\",\r\n \"independently\",\r\n \"alignment\",\r\n \"henderson\",\r\n \"britannica\",\r\n \"competitors\",\r\n \"visibility\",\r\n \"consciousness\",\r\n \"encounter\",\r\n \"resolutions\",\r\n \"accessing\",\r\n \"attempted\",\r\n \"witnesses\",\r\n \"administered\",\r\n \"strengthen\",\r\n \"frederick\",\r\n \"aggressive\",\r\n \"advertisements\",\r\n \"sublimedirectory\",\r\n \"disturbed\",\r\n \"determines\",\r\n \"sculpture\",\r\n \"motivation\",\r\n \"pharmacology\",\r\n \"passengers\",\r\n \"quantities\",\r\n \"petersburg\",\r\n \"consistently\",\r\n \"powerpoint\",\r\n \"obituaries\",\r\n \"punishment\",\r\n \"appreciation\",\r\n \"subsequently\",\r\n \"providence\",\r\n \"restriction\",\r\n \"incorporate\",\r\n \"backgrounds\",\r\n \"treasurer\",\r\n \"lightweight\",\r\n \"transcription\",\r\n \"complications\",\r\n \"scripting\",\r\n \"remembered\",\r\n \"synthetic\",\r\n \"testament\",\r\n \"specifics\",\r\n \"partially\",\r\n \"wilderness\",\r\n \"generations\",\r\n \"tournaments\",\r\n \"sponsorship\",\r\n \"headphones\",\r\n \"proceeding\",\r\n \"volkswagen\",\r\n \"uncertainty\",\r\n \"breakdown\",\r\n \"reconstruction\",\r\n \"subsidiary\",\r\n \"strengths\",\r\n \"encouraging\",\r\n \"furnished\",\r\n \"terrorists\",\r\n \"comparisons\",\r\n \"beneficial\",\r\n \"distributions\",\r\n \"viewpicture\",\r\n \"threatened\",\r\n \"republicans\",\r\n \"discusses\",\r\n \"responded\",\r\n \"abstracts\",\r\n \"prediction\",\r\n \"pharmaceuticals\",\r\n \"thesaurus\",\r\n \"individually\",\r\n \"battlefield\",\r\n \"literally\",\r\n \"ecological\",\r\n \"appraisal\",\r\n \"consisting\",\r\n \"submitting\",\r\n \"citations\",\r\n \"geographical\",\r\n \"mozambique\",\r\n \"disclaimers\",\r\n \"championships\",\r\n \"sheffield\",\r\n \"finishing\",\r\n \"wellington\",\r\n \"prospects\",\r\n \"bulgarian\",\r\n \"aboriginal\",\r\n \"remarkable\",\r\n \"preventing\",\r\n \"productive\",\r\n \"boulevard\",\r\n \"compliant\",\r\n \"penalties\",\r\n \"imagination\",\r\n \"refurbished\",\r\n \"activated\",\r\n \"conferencing\",\r\n \"armstrong\",\r\n \"politicians\",\r\n \"trackbacks\",\r\n \"accommodate\",\r\n \"christine\",\r\n \"accepting\",\r\n \"precipitation\",\r\n \"isolation\",\r\n \"sustained\",\r\n \"approximate\",\r\n \"programmer\",\r\n \"greetings\",\r\n \"inherited\",\r\n \"incomplete\",\r\n \"chronicle\",\r\n \"legitimate\",\r\n \"biographies\",\r\n \"investigator\",\r\n \"plaintiff\",\r\n \"prisoners\",\r\n \"mediterranean\",\r\n \"nightlife\",\r\n \"architects\",\r\n \"entrepreneur\",\r\n \"freelance\",\r\n \"excessive\",\r\n \"screensaver\",\r\n \"valuation\",\r\n \"unexpected\",\r\n \"cigarette\",\r\n \"characteristic\",\r\n \"metallica\",\r\n \"consequently\",\r\n \"appointments\",\r\n \"narrative\",\r\n \"academics\",\r\n \"quantitative\",\r\n \"screensavers\",\r\n \"subdivision\",\r\n \"distinction\",\r\n \"livestock\",\r\n \"exemption\",\r\n \"sustainability\",\r\n \"formatting\",\r\n \"nutritional\",\r\n \"nicaragua\",\r\n \"affiliation\",\r\n \"relatives\",\r\n \"satisfactory\",\r\n \"revolutionary\",\r\n \"bracelets\",\r\n \"telephony\",\r\n \"breathing\",\r\n \"thickness\",\r\n \"adjustments\",\r\n \"graphical\",\r\n \"discussing\",\r\n \"aerospace\",\r\n \"meaningful\",\r\n \"maintains\",\r\n \"shortcuts\",\r\n \"voyeurweb\",\r\n \"extending\",\r\n \"specifies\",\r\n \"accreditation\",\r\n \"blackberry\",\r\n \"meditation\",\r\n \"microphone\",\r\n \"macedonia\",\r\n \"combining\",\r\n \"instrumental\",\r\n \"organizing\",\r\n \"moderators\",\r\n \"kazakhstan\",\r\n \"standings\",\r\n \"partition\",\r\n \"invisible\",\r\n \"translations\",\r\n \"commodity\",\r\n \"kilometers\",\r\n \"thanksgiving\",\r\n \"guarantees\",\r\n \"indication\",\r\n \"congratulations\",\r\n \"cigarettes\",\r\n \"controllers\",\r\n \"consultancy\",\r\n \"conventions\",\r\n \"coordinates\",\r\n \"responding\",\r\n \"physically\",\r\n \"stakeholders\",\r\n \"hydrocodone\",\r\n \"consecutive\",\r\n \"attempting\",\r\n \"representations\",\r\n \"competing\",\r\n \"peninsula\",\r\n \"accurately\",\r\n \"considers\",\r\n \"ministries\",\r\n \"vacancies\",\r\n \"parliamentary\",\r\n \"acknowledge\",\r\n \"thoroughly\",\r\n \"nottingham\",\r\n \"identifies\",\r\n \"questionnaire\",\r\n \"qualification\",\r\n \"modelling\",\r\n \"miniature\",\r\n \"interstate\",\r\n \"consequence\",\r\n \"systematic\",\r\n \"perceived\",\r\n \"madagascar\",\r\n \"presenting\",\r\n \"troubleshooting\",\r\n \"uzbekistan\",\r\n \"centuries\",\r\n \"magnitude\",\r\n \"richardson\",\r\n \"fragrances\",\r\n \"vocabulary\",\r\n \"earthquake\",\r\n \"fundraising\",\r\n \"geological\",\r\n \"assessing\",\r\n \"introduces\",\r\n \"webmasters\",\r\n \"computational\",\r\n \"acdbentity\",\r\n \"participated\",\r\n \"handhelds\",\r\n \"answering\",\r\n \"impressed\",\r\n \"conspiracy\",\r\n \"organizer\",\r\n \"combinations\",\r\n \"preceding\",\r\n \"cumulative\",\r\n \"amplifier\",\r\n \"arbitrary\",\r\n \"prominent\",\r\n \"lexington\",\r\n \"contacted\",\r\n \"recorders\",\r\n \"occasional\",\r\n \"innovations\",\r\n \"postcards\",\r\n \"reviewing\",\r\n \"explicitly\",\r\n \"transsexual\",\r\n \"citizenship\",\r\n \"informative\",\r\n \"girlfriend\",\r\n \"bloomberg\",\r\n \"hierarchy\",\r\n \"influenced\",\r\n \"abandoned\",\r\n \"complement\",\r\n \"mauritius\",\r\n \"checklist\",\r\n \"requesting\",\r\n \"lauderdale\",\r\n \"scenarios\",\r\n \"extraction\",\r\n \"elevation\",\r\n \"utilization\",\r\n \"beverages\",\r\n \"calibration\",\r\n \"efficiently\",\r\n \"entertaining\",\r\n \"prerequisite\",\r\n \"hypothesis\",\r\n \"medicines\",\r\n \"regression\",\r\n \"enhancements\",\r\n \"renewable\",\r\n \"intersection\",\r\n \"passwords\",\r\n \"consistency\",\r\n \"collectors\",\r\n \"azerbaijan\",\r\n \"astrology\",\r\n \"occurring\",\r\n \"supplemental\",\r\n \"travelling\",\r\n \"induction\",\r\n \"precisely\",\r\n \"spreading\",\r\n \"provinces\",\r\n \"widespread\",\r\n \"incidence\",\r\n \"incidents\",\r\n \"enhancing\",\r\n \"interference\",\r\n \"palestine\",\r\n \"listprice\",\r\n \"atmospheric\",\r\n \"knowledgestorm\",\r\n \"referenced\",\r\n \"publicity\",\r\n \"proposition\",\r\n \"allowance\",\r\n \"designation\",\r\n \"duplicate\",\r\n \"criterion\",\r\n \"civilization\",\r\n \"vietnamese\",\r\n \"tremendous\",\r\n \"corrected\",\r\n \"encountered\",\r\n \"internationally\",\r\n \"surrounded\",\r\n \"creatures\",\r\n \"commented\",\r\n \"accomplish\",\r\n \"vegetarian\",\r\n \"newfoundland\",\r\n \"investigated\",\r\n \"ambassador\",\r\n \"stephanie\",\r\n \"contacting\",\r\n \"vegetation\",\r\n \"findarticles\",\r\n \"specially\",\r\n \"infectious\",\r\n \"continuity\",\r\n \"phenomenon\",\r\n \"conscious\",\r\n \"referrals\",\r\n \"differently\",\r\n \"integrating\",\r\n \"revisions\",\r\n \"reasoning\",\r\n \"charitable\",\r\n \"annotated\",\r\n \"convinced\",\r\n \"burlington\",\r\n \"replacing\",\r\n \"researcher\",\r\n \"watershed\",\r\n \"occupations\",\r\n \"acknowledged\",\r\n \"equilibrium\",\r\n \"characterized\",\r\n \"privilege\",\r\n \"qualifying\",\r\n \"estimation\",\r\n \"pediatric\",\r\n \"techrepublic\",\r\n \"institutes\",\r\n \"brochures\",\r\n \"traveller\",\r\n \"appropriations\",\r\n \"suspected\",\r\n \"benchmark\",\r\n \"beginners\",\r\n \"instructors\",\r\n \"highlighted\",\r\n \"stationery\",\r\n \"unauthorized\",\r\n \"competent\",\r\n \"contributor\",\r\n \"demonstrates\",\r\n \"gradually\",\r\n \"desirable\",\r\n \"journalist\",\r\n \"afterwards\",\r\n \"religions\",\r\n \"explosion\",\r\n \"signatures\",\r\n \"disciplines\",\r\n \"daughters\",\r\n \"conversations\",\r\n \"simplified\",\r\n \"motherboard\",\r\n \"bibliographic\",\r\n \"champagne\",\r\n \"deviation\",\r\n \"superintendent\",\r\n \"housewives\",\r\n \"influences\",\r\n \"inspections\",\r\n \"irrigation\",\r\n \"hydraulic\",\r\n \"robertson\",\r\n \"penetration\",\r\n \"conviction\",\r\n \"omissions\",\r\n \"retrieval\",\r\n \"qualities\",\r\n \"prototype\",\r\n \"importantly\",\r\n \"apparatus\",\r\n \"explaining\",\r\n \"nomination\",\r\n \"empirical\",\r\n \"dependence\",\r\n \"sexuality\",\r\n \"polyester\",\r\n \"commitments\",\r\n \"suggesting\",\r\n \"remainder\",\r\n \"privileges\",\r\n \"televisions\",\r\n \"specializing\",\r\n \"commodities\",\r\n \"motorcycles\",\r\n \"concentrate\",\r\n \"reproductive\",\r\n \"molecules\",\r\n \"refrigerator\",\r\n \"intervals\",\r\n \"sentences\",\r\n \"exclusion\",\r\n \"workstation\",\r\n \"holocaust\",\r\n \"receivers\",\r\n \"disposition\",\r\n \"navigator\",\r\n \"investigators\",\r\n \"marijuana\",\r\n \"cathedral\",\r\n \"fairfield\",\r\n \"fascinating\",\r\n \"landscapes\",\r\n \"lafayette\",\r\n \"computation\",\r\n \"cardiovascular\",\r\n \"salvation\",\r\n \"predictions\",\r\n \"accompanying\",\r\n \"selective\",\r\n \"arbitration\",\r\n \"configuring\",\r\n \"editorials\",\r\n \"sacrifice\",\r\n \"removable\",\r\n \"convergence\",\r\n \"gibraltar\",\r\n \"anthropology\",\r\n \"malpractice\",\r\n \"reporters\",\r\n \"necessity\",\r\n \"rendering\",\r\n \"hepatitis\",\r\n \"nationally\",\r\n \"waterproof\",\r\n \"specialties\",\r\n \"humanitarian\",\r\n \"invitations\",\r\n \"functioning\",\r\n \"economies\",\r\n \"alexandria\",\r\n \"bacterial\",\r\n \"undertake\",\r\n \"continuously\",\r\n \"achievements\",\r\n \"convertible\",\r\n \"secretariat\",\r\n \"paragraphs\",\r\n \"adolescent\",\r\n \"nominations\",\r\n \"cancelled\",\r\n \"introductory\",\r\n \"reservoir\",\r\n \"occurrence\",\r\n \"worcester\",\r\n \"demographic\",\r\n \"disciplinary\",\r\n \"respected\",\r\n \"portraits\",\r\n \"interpreted\",\r\n \"evaluations\",\r\n \"elimination\",\r\n \"hypothetical\",\r\n \"immigrants\",\r\n \"complimentary\",\r\n \"helicopter\",\r\n \"performer\",\r\n \"commissions\",\r\n \"powerseller\",\r\n \"graduated\",\r\n \"surprising\",\r\n \"unnecessary\",\r\n \"dramatically\",\r\n \"yugoslavia\",\r\n \"characterization\",\r\n \"likelihood\",\r\n \"fundamentals\",\r\n \"contamination\",\r\n \"endangered\",\r\n \"compromise\",\r\n \"expiration\",\r\n \"namespace\",\r\n \"peripheral\",\r\n \"negotiation\",\r\n \"opponents\",\r\n \"nominated\",\r\n \"confidentiality\",\r\n \"electoral\",\r\n \"changelog\",\r\n \"alternatively\",\r\n \"greensboro\",\r\n \"controversial\",\r\n \"recovered\",\r\n \"upgrading\",\r\n \"frontpage\",\r\n \"demanding\",\r\n \"defensive\",\r\n \"forbidden\",\r\n \"programmers\",\r\n \"monitored\",\r\n \"installations\",\r\n \"deutschland\",\r\n \"practitioner\",\r\n \"motivated\",\r\n \"smithsonian\",\r\n \"examining\",\r\n \"revelation\",\r\n \"delegation\",\r\n \"dictionaries\",\r\n \"greenhouse\",\r\n \"transparency\",\r\n \"currencies\",\r\n \"survivors\",\r\n \"positioning\",\r\n \"descending\",\r\n \"temporarily\",\r\n \"frequencies\",\r\n \"reflections\",\r\n \"municipality\",\r\n \"detective\",\r\n \"experiencing\",\r\n \"fireplace\",\r\n \"endorsement\",\r\n \"psychiatry\",\r\n \"persistent\",\r\n \"summaries\",\r\n \"looksmart\",\r\n \"magnificent\",\r\n \"colleague\",\r\n \"adaptation\",\r\n \"paintball\",\r\n \"enclosure\",\r\n \"supervisors\",\r\n \"westminster\",\r\n \"distances\",\r\n \"absorption\",\r\n \"treasures\",\r\n \"transcripts\",\r\n \"disappointed\",\r\n \"continually\",\r\n \"communist\",\r\n \"collectible\",\r\n \"entrepreneurs\",\r\n \"creations\",\r\n \"acquisitions\",\r\n \"biodiversity\",\r\n \"excitement\",\r\n \"presently\",\r\n \"mysterious\",\r\n \"librarian\",\r\n \"subsidiaries\",\r\n \"stockholm\",\r\n \"indonesian\",\r\n \"therapist\",\r\n \"promising\",\r\n \"relaxation\",\r\n \"thereafter\",\r\n \"commissioners\",\r\n \"forwarding\",\r\n \"nightmare\",\r\n \"reductions\",\r\n \"southampton\",\r\n \"organisms\",\r\n \"telescope\",\r\n \"portsmouth\",\r\n \"advancement\",\r\n \"harassment\",\r\n \"generators\",\r\n \"generates\",\r\n \"replication\",\r\n \"inexpensive\",\r\n \"receptors\",\r\n \"interventions\",\r\n \"huntington\",\r\n \"internship\",\r\n \"aluminium\",\r\n \"snowboard\",\r\n \"beastality\",\r\n \"evanescence\",\r\n \"coordinated\",\r\n \"shipments\",\r\n \"antarctica\",\r\n \"chancellor\",\r\n \"controversy\",\r\n \"legendary\",\r\n \"beautifully\",\r\n \"antibodies\",\r\n \"examinations\",\r\n \"immunology\",\r\n \"departmental\",\r\n \"terminology\",\r\n \"gentleman\",\r\n \"reproduce\",\r\n \"convicted\",\r\n \"roommates\",\r\n \"threatening\",\r\n \"spokesman\",\r\n \"activists\",\r\n \"frankfurt\",\r\n \"encourages\",\r\n \"assembled\",\r\n \"restructuring\",\r\n \"terminals\",\r\n \"simulations\",\r\n \"sufficiently\",\r\n \"conditional\",\r\n \"crossword\",\r\n \"conceptual\",\r\n \"liechtenstein\",\r\n \"translator\",\r\n \"automobiles\",\r\n \"continent\",\r\n \"longitude\",\r\n \"challenged\",\r\n \"telecharger\",\r\n \"insertion\",\r\n \"instrumentation\",\r\n \"constraint\",\r\n \"groundwater\",\r\n \"strengthening\",\r\n \"insulation\",\r\n \"infringement\",\r\n \"subjective\",\r\n \"swaziland\",\r\n \"varieties\",\r\n \"mediawiki\",\r\n \"configurations\",\r\n]\r\n","type Force = [number, number]\r\ntype Listener = (force: Force, e: TouchEvent) => void\r\ntype ElementValues = {\r\n start: null | Force\r\n listeners: Set<Listener>\r\n handleTouchstart: (e: TouchEvent) => void\r\n handleTouchend: (e: TouchEvent) => void\r\n}\r\n\r\nconst elements = new WeakMap<HTMLElement, ElementValues>()\r\n\r\nfunction readTouch(e: TouchEvent): [number, number] | null {\r\n const touch = e.changedTouches[0]\r\n if (touch === undefined) {\r\n return null\r\n }\r\n return [touch.clientX, touch.clientY]\r\n}\r\n\r\nfunction addListener(element: HTMLElement, cb: Listener): () => void {\r\n let elementValues = elements.get(element)\r\n if (elementValues === undefined) {\r\n const listeners = new Set<Listener>()\r\n const handleTouchstart = (e: TouchEvent) => {\r\n if (elementValues !== undefined) {\r\n elementValues.start = readTouch(e)\r\n }\r\n }\r\n const handleTouchend = (e: TouchEvent) => {\r\n if (elementValues === undefined) {\r\n return\r\n }\r\n const start = elementValues.start\r\n if (start === null) {\r\n return\r\n }\r\n const end = readTouch(e)\r\n for (const listener of Array.from(listeners)) {\r\n if (end !== null) {\r\n listener([end[0] - start[0], end[1] - start[1]], e)\r\n }\r\n }\r\n }\r\n element.addEventListener(\"touchstart\", handleTouchstart, { passive: true })\r\n element.addEventListener(\"touchend\", handleTouchend, { passive: true })\r\n\r\n elementValues = {\r\n handleTouchend,\r\n handleTouchstart,\r\n listeners,\r\n start: null,\r\n }\r\n elements.set(element, elementValues)\r\n }\r\n elementValues.listeners.add(cb)\r\n return () => deleteListener(element, cb)\r\n}\r\n\r\nfunction deleteListener(element: HTMLElement, cb: Listener): void {\r\n const elementValues = elements.get(element)\r\n if (elementValues === undefined) {\r\n return\r\n }\r\n const listeners = elementValues.listeners\r\n listeners.delete(cb)\r\n if (listeners.size === 0) {\r\n elements.delete(element)\r\n element.removeEventListener(\"touchstart\", elementValues.handleTouchstart)\r\n element.removeEventListener(\"touchend\", elementValues.handleTouchend)\r\n }\r\n}\r\n\r\nexport function addSwipeLeftListener(\r\n element: HTMLElement,\r\n cb: (_force: number, e: TouchEvent) => void\r\n) {\r\n return addListener(element, (force, e) => {\r\n const [x, y] = force\r\n if (x < 0 && -x > Math.abs(y)) {\r\n cb(x, e)\r\n }\r\n })\r\n}\r\n\r\nexport function addSwipeRightListener(\r\n element: HTMLElement,\r\n cb: (_force: number, e: TouchEvent) => void\r\n) {\r\n return addListener(element, (force, e) => {\r\n const [x, y] = force\r\n if (x > 0 && x > Math.abs(y)) {\r\n cb(x, e)\r\n }\r\n })\r\n}\r\n\r\nexport function addSwipeUpListener(\r\n element: HTMLElement,\r\n cb: (_force: number, e: TouchEvent) => void\r\n) {\r\n return addListener(element, (force, e) => {\r\n const [x, y] = force\r\n if (y < 0 && -y > Math.abs(x)) {\r\n cb(x, e)\r\n }\r\n })\r\n}\r\n\r\nexport function addSwipeDownListener(\r\n element: HTMLElement,\r\n cb: (_force: number, e: TouchEvent) => void\r\n) {\r\n return addListener(element, (force, e) => {\r\n const [x, y] = force\r\n if (y > 0 && y > Math.abs(x)) {\r\n cb(x, e)\r\n }\r\n })\r\n}\r\n","import * as React from \"react\"\r\nimport { JSX, useCallback, useEffect, useRef, useState } from \"react\"\r\nimport { BlockWithAlignableContents } from \"@lexical/react/LexicalBlockWithAlignableContents\"\r\nimport {\r\n DecoratorBlockNode,\r\n SerializedDecoratorBlockNode,\r\n} from \"@lexical/react/LexicalDecoratorBlockNode\"\r\nimport type {\r\n DOMConversionMap,\r\n DOMConversionOutput,\r\n DOMExportOutput,\r\n EditorConfig,\r\n ElementFormatType,\r\n LexicalEditor,\r\n LexicalNode,\r\n NodeKey,\r\n Spread,\r\n} from \"lexical\"\r\n\r\nconst WIDGET_SCRIPT_URL = \"https://platform.twitter.com/widgets.js\"\r\n\r\ntype TweetComponentProps = Readonly<{\r\n className: Readonly<{\r\n base: string\r\n focus: string\r\n }>\r\n format: ElementFormatType | null\r\n loadingComponent?: JSX.Element | string\r\n nodeKey: NodeKey\r\n onError?: (error: string) => void\r\n onLoad?: () => void\r\n tweetID: string\r\n}>\r\n\r\nfunction $convertTweetElement(\r\n domNode: HTMLDivElement\r\n): DOMConversionOutput | null {\r\n const id = domNode.getAttribute(\"data-lexical-tweet-id\")\r\n if (id) {\r\n const node = $createTweetNode(id)\r\n return { node }\r\n }\r\n return null\r\n}\r\n\r\nlet isTwitterScriptLoading = true\r\n\r\nfunction TweetComponent({\r\n className,\r\n format,\r\n loadingComponent,\r\n nodeKey,\r\n onError,\r\n onLoad,\r\n tweetID,\r\n}: TweetComponentProps) {\r\n const containerRef = useRef<HTMLDivElement | null>(null)\r\n\r\n const previousTweetIDRef = useRef<string>(\"\")\r\n const [isTweetLoading, setIsTweetLoading] = useState(false)\r\n\r\n const createTweet = useCallback(async () => {\r\n try {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n await (window as any).twttr.widgets.createTweet(tweetID, containerRef.current)\r\n\r\n setIsTweetLoading(false)\r\n isTwitterScriptLoading = false\r\n\r\n if (onLoad) {\r\n onLoad()\r\n }\r\n } catch (error) {\r\n if (onError) {\r\n onError(String(error))\r\n }\r\n }\r\n }, [onError, onLoad, tweetID])\r\n\r\n useEffect(() => {\r\n if (tweetID !== previousTweetIDRef.current) {\r\n // Use setTimeout to avoid calling setState synchronously within effect\r\n setTimeout(() => {\r\n setIsTweetLoading(true)\r\n }, 0)\r\n\r\n if (isTwitterScriptLoading) {\r\n const script = document.createElement(\"script\")\r\n script.src = WIDGET_SCRIPT_URL\r\n script.async = true\r\n document.body?.appendChild(script)\r\n script.onload = createTweet\r\n if (onError) {\r\n script.onerror = onError as OnErrorEventHandler\r\n }\r\n } else {\r\n // Use setTimeout to avoid calling setState synchronously within effect\r\n setTimeout(() => {\r\n createTweet()\r\n }, 0)\r\n }\r\n\r\n if (previousTweetIDRef) {\r\n previousTweetIDRef.current = tweetID\r\n }\r\n }\r\n }, [createTweet, onError, tweetID])\r\n\r\n return (\r\n <BlockWithAlignableContents\r\n className={className}\r\n format={format}\r\n nodeKey={nodeKey}\r\n >\r\n {isTweetLoading ? loadingComponent : null}\r\n <div\r\n style={{ display: \"block\", width: \"100%\", maxWidth: \"550px\" }}\r\n ref={containerRef}\r\n />\r\n </BlockWithAlignableContents>\r\n )\r\n}\r\n\r\nexport type SerializedTweetNode = Spread<\r\n {\r\n id: string\r\n },\r\n SerializedDecoratorBlockNode\r\n>\r\n\r\nexport class TweetNode extends DecoratorBlockNode {\r\n __id: string\r\n\r\n static getType(): string {\r\n return \"tweet\"\r\n }\r\n\r\n static clone(node: TweetNode): TweetNode {\r\n return new TweetNode(node.__id, node.__format, node.__key)\r\n }\r\n\r\n static importJSON(serializedNode: SerializedTweetNode): TweetNode {\r\n const node = $createTweetNode(serializedNode.id)\r\n node.setFormat(serializedNode.format)\r\n return node\r\n }\r\n\r\n exportJSON(): SerializedTweetNode {\r\n return {\r\n ...super.exportJSON(),\r\n id: this.getId(),\r\n type: \"tweet\",\r\n version: 1,\r\n }\r\n }\r\n\r\n static importDOM(): DOMConversionMap<HTMLDivElement> | null {\r\n return {\r\n div: (domNode: HTMLDivElement) => {\r\n if (!domNode.hasAttribute(\"data-lexical-tweet-id\")) {\r\n return null\r\n }\r\n return {\r\n conversion: $convertTweetElement,\r\n priority: 2,\r\n }\r\n },\r\n }\r\n }\r\n\r\n exportDOM(): DOMExportOutput {\r\n const element = document.createElement(\"div\")\r\n element.setAttribute(\"data-lexical-tweet-id\", this.__id)\r\n const text = document.createTextNode(this.getTextContent())\r\n element.append(text)\r\n return { element }\r\n }\r\n\r\n constructor(id: string, format?: ElementFormatType, key?: NodeKey) {\r\n super(format, key)\r\n this.__id = id\r\n }\r\n\r\n getId(): string {\r\n return this.__id\r\n }\r\n\r\n getTextContent(\r\n _includeInert?: boolean | undefined,\r\n _includeDirectionless?: false | undefined\r\n ): string {\r\n return `https://x.com/i/web/status/${this.__id}`\r\n }\r\n\r\n decorate(editor: LexicalEditor, config: EditorConfig): JSX.Element {\r\n const embedBlockTheme = config.theme.embedBlock || {}\r\n const className = {\r\n base: embedBlockTheme.base || \"\",\r\n focus: embedBlockTheme.focus || \"\",\r\n }\r\n return (\r\n <TweetComponent\r\n className={className}\r\n format={this.__format}\r\n loadingComponent=\"Loading...\"\r\n nodeKey={this.getKey()}\r\n tweetID={this.__id}\r\n />\r\n )\r\n }\r\n}\r\n\r\nexport function $createTweetNode(tweetID: string): TweetNode {\r\n return new TweetNode(tweetID)\r\n}\r\n\r\nexport function $isTweetNode(\r\n node: TweetNode | LexicalNode | null | undefined\r\n): node is TweetNode {\r\n return node instanceof TweetNode\r\n}\r\n","import * as React from \"react\"\r\nimport { JSX } from \"react\"\r\nimport { BlockWithAlignableContents } from \"@lexical/react/LexicalBlockWithAlignableContents\"\r\nimport { useLexicalEditable } from \"@lexical/react/useLexicalEditable\"\r\nimport { useLexicalNodeSelection } from \"@lexical/react/useLexicalNodeSelection\"\r\nimport { mergeRegister } from \"@lexical/utils\"\r\nimport { ImageResizer } from \"@/components/editor/editor-ui/image-resizer\"\r\nimport { getContainerWidth } from \"@/components/editor/editor-ui/image-sizing\"\r\nimport { useEditorContainer } from \"@/components/editor/context/editor-container-context\"\r\nimport { cn } from \"@/utils\"\r\nimport {\r\n DecoratorBlockNode,\r\n SerializedDecoratorBlockNode,\r\n} from \"@lexical/react/LexicalDecoratorBlockNode\"\r\nimport type {\r\n DOMConversionMap,\r\n DOMConversionOutput,\r\n DOMExportOutput,\r\n EditorConfig,\r\n ElementFormatType,\r\n LexicalEditor,\r\n LexicalNode,\r\n NodeKey,\r\n Spread,\r\n} from \"lexical\"\r\nimport { $getNodeByKey, CLICK_COMMAND, COMMAND_PRIORITY_LOW } from \"lexical\"\r\n\r\ntype YouTubeComponentProps = Readonly<{\r\n className: Readonly<{\r\n base: string\r\n focus: string\r\n }>\r\n format: ElementFormatType | null\r\n nodeKey: NodeKey\r\n videoID: string\r\n width: \"inherit\" | number\r\n height: \"inherit\" | number\r\n maxWidth: number\r\n fullWidth: boolean\r\n editor: LexicalEditor\r\n}>\r\n\r\nfunction YouTubeComponent({\r\n className,\r\n format,\r\n nodeKey,\r\n videoID,\r\n width,\r\n height,\r\n maxWidth,\r\n fullWidth,\r\n editor,\r\n}: YouTubeComponentProps) {\r\n const isEditable = useLexicalEditable()\r\n const [isSelected, setSelected, clearSelection] =\r\n useLexicalNodeSelection(nodeKey)\r\n const [isResizing, setIsResizing] = React.useState(false)\r\n const wrapperRef = React.useRef<HTMLDivElement | null>(null)\r\n const [wrapperElement, setWrapperElement] =\r\n React.useState<HTMLDivElement | null>(null)\r\n const buttonRef = React.useRef<HTMLButtonElement | null>(null)\r\n const [containerWidth, setContainerWidth] = React.useState<number>(maxWidth)\r\n const editorContainer = useEditorContainer()\r\n const editorHardWidthLimit = editorContainer?.maxWidth\r\n const updateNode = React.useCallback(\r\n (updater: (node: YouTubeNode) => void) => {\r\n editor.update(() => {\r\n const node = $getNodeByKey(nodeKey)\r\n if (node instanceof YouTubeNode) {\r\n updater(node)\r\n }\r\n })\r\n },\r\n [editor, nodeKey]\r\n )\r\n // YouTube videos have 16:9 aspect ratio (width:height)\r\n const aspectRatio = 16 / 9\r\n const clampToContainer = React.useCallback(\r\n (value: number) => {\r\n const limit =\r\n typeof editorHardWidthLimit === \"number\" && editorHardWidthLimit > 0\r\n ? editorHardWidthLimit\r\n : containerWidth || value\r\n return Math.min(value, limit)\r\n },\r\n [containerWidth, editorHardWidthLimit]\r\n )\r\n React.useEffect(() => {\r\n if (!wrapperElement) {\r\n return\r\n }\r\n const editorRoot = editor.getRootElement()\r\n const parentElement = wrapperElement.parentElement\r\n const fieldContentElement = wrapperElement.closest(\r\n \"[data-slot='field-content']\"\r\n ) as HTMLElement | null\r\n const getMeasurementTarget = () => parentElement ?? wrapperElement\r\n const updateAvailableWidth = () => {\r\n const measurementTarget = getMeasurementTarget()\r\n const widthValue =\r\n getContainerWidth(\r\n measurementTarget,\r\n editorRoot,\r\n editorHardWidthLimit\r\n ) || maxWidth\r\n if (widthValue > 0) {\r\n setContainerWidth((prev) => (prev === widthValue ? prev : widthValue))\r\n }\r\n }\r\n updateAvailableWidth()\r\n const hasResizeObserver =\r\n typeof window !== \"undefined\" && typeof ResizeObserver !== \"undefined\"\r\n let observer: ResizeObserver | null = null\r\n if (hasResizeObserver) {\r\n observer = new ResizeObserver(updateAvailableWidth)\r\n const elementsToObserve = new Set<HTMLElement>()\r\n elementsToObserve.add(wrapperElement)\r\n if (parentElement && parentElement !== wrapperElement) {\r\n elementsToObserve.add(parentElement)\r\n }\r\n if (fieldContentElement) {\r\n elementsToObserve.add(fieldContentElement)\r\n }\r\n if (\r\n editorRoot &&\r\n editorRoot instanceof HTMLElement &&\r\n editorRoot !== parentElement &&\r\n editorRoot !== wrapperElement\r\n ) {\r\n elementsToObserve.add(editorRoot)\r\n }\r\n elementsToObserve.forEach((element) => observer?.observe(element))\r\n return () => observer?.disconnect()\r\n }\r\n if (typeof window !== \"undefined\") {\r\n window.addEventListener(\"resize\", updateAvailableWidth)\r\n return () => window.removeEventListener(\"resize\", updateAvailableWidth)\r\n }\r\n }, [editor, editorHardWidthLimit, maxWidth, wrapperElement])\r\n React.useEffect(() => {\r\n if (!containerWidth) {\r\n return\r\n }\r\n if (\r\n editorHardWidthLimit &&\r\n containerWidth > editorHardWidthLimit\r\n ) {\r\n setContainerWidth(editorHardWidthLimit)\r\n return\r\n }\r\n updateNode((node) => {\r\n if (node.getMaxWidth() !== containerWidth) {\r\n node.setMaxWidth(containerWidth)\r\n }\r\n })\r\n }, [containerWidth, editorHardWidthLimit, updateNode])\r\n const availableWidth = Math.min(\r\n containerWidth || maxWidth,\r\n editorHardWidthLimit || containerWidth || maxWidth\r\n )\r\n const targetWidth =\r\n typeof width === \"number\" ? width : availableWidth\r\n const boundedWidth =\r\n typeof targetWidth === \"number\"\r\n ? Math.min(targetWidth, availableWidth)\r\n : availableWidth\r\n const renderedWidth = fullWidth ? availableWidth : boundedWidth\r\n const safeRenderedWidth = editorHardWidthLimit\r\n ? Math.min(renderedWidth, editorHardWidthLimit)\r\n : renderedWidth\r\n // CSS aspect-ratio expects width/height, not height/width\r\n const cssAspectRatio =\r\n typeof width === \"number\" && typeof height === \"number\" && height > 0\r\n ? width / height\r\n : aspectRatio\r\n const isFocused = (isSelected || isResizing) && isEditable\r\n const disablePlaybackInteractions = isEditable\r\n const iframeWidth = safeRenderedWidth\r\n const iframeHeight = Math.round(iframeWidth / aspectRatio)\r\n const handleWrapperRef = React.useCallback((node: HTMLDivElement | null) => {\r\n wrapperRef.current = node\r\n setWrapperElement(node)\r\n }, [])\r\n React.useEffect(() => {\r\n if (!isEditable) {\r\n return\r\n }\r\n return mergeRegister(\r\n editor.registerCommand<MouseEvent>(\r\n CLICK_COMMAND,\r\n (event) => {\r\n const wrapper = wrapperRef.current\r\n if (!wrapper || !(event.target instanceof Node)) {\r\n return false\r\n }\r\n if (!wrapper.contains(event.target)) {\r\n return false\r\n }\r\n if (isResizing) {\r\n return true\r\n }\r\n if (event.shiftKey) {\r\n setSelected(!isSelected)\r\n } else {\r\n clearSelection()\r\n setSelected(true)\r\n }\r\n event.preventDefault()\r\n return true\r\n },\r\n COMMAND_PRIORITY_LOW\r\n )\r\n )\r\n }, [clearSelection, editor, isEditable, isResizing, isSelected, setSelected])\r\n React.useEffect(() => {\r\n if (\r\n !containerWidth ||\r\n typeof width !== \"number\" ||\r\n fullWidth ||\r\n width <= containerWidth\r\n ) {\r\n return\r\n }\r\n updateNode((node) => {\r\n const nextWidth = clampToContainer(width)\r\n const nextHeight = Math.round(nextWidth / aspectRatio)\r\n node.setWidthAndHeight(nextWidth, nextHeight)\r\n })\r\n }, [\r\n aspectRatio,\r\n clampToContainer,\r\n containerWidth,\r\n editorHardWidthLimit,\r\n fullWidth,\r\n updateNode,\r\n width,\r\n ])\r\n\r\n return (\r\n <BlockWithAlignableContents\r\n className={className}\r\n format={format}\r\n nodeKey={nodeKey}\r\n >\r\n <div\r\n style={{\r\n width: fullWidth\r\n ? \"100%\"\r\n : `${Math.max(safeRenderedWidth, 0)}px`,\r\n aspectRatio: cssAspectRatio,\r\n maxWidth: \"100%\",\r\n height: \"auto\",\r\n }}\r\n className={cn(\r\n \"editor-embed-frame relative inline-block\",\r\n fullWidth ? \"editor-embed-frame--full\" : \"editor-embed-frame--inline\"\r\n )}\r\n data-editor-embed-fullwidth={fullWidth ? \"true\" : \"false\"}\r\n ref={handleWrapperRef}\r\n >\r\n <iframe\r\n width={iframeWidth}\r\n height={iframeHeight}\r\n src={`https://www.youtube-nocookie.com/embed/${videoID}`}\r\n frameBorder=\"0\"\r\n allow={\r\n disablePlaybackInteractions\r\n ? \"accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture\"\r\n : \"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\"\r\n }\r\n allowFullScreen={true}\r\n title=\"YouTube video\"\r\n className={`block absolute inset-0 h-full w-full ${\r\n disablePlaybackInteractions ? \"pointer-events-none\" : \"\"\r\n }`}\r\n tabIndex={disablePlaybackInteractions ? -1 : undefined}\r\n aria-label={\r\n disablePlaybackInteractions\r\n ? \"YouTube video preview disabled while editing\"\r\n : \"YouTube video\"\r\n }\r\n />\r\n {isFocused && (\r\n <ImageResizer\r\n editor={editor}\r\n buttonRef={buttonRef}\r\n mediaRef={wrapperRef}\r\n onResizeStart={() => {\r\n setIsResizing(true)\r\n updateNode((node) => node.setFullWidth(false))\r\n }}\r\n onResizeEnd={(nextWidth, nextHeight) => {\r\n setTimeout(() => setIsResizing(false), 200)\r\n const finalWidth =\r\n typeof nextWidth === \"number\"\r\n ? clampToContainer(nextWidth)\r\n : nextWidth\r\n const finalHeight =\r\n typeof finalWidth === \"number\"\r\n ? Math.round(finalWidth / aspectRatio)\r\n : nextHeight\r\n updateNode((node) =>\r\n node.setWidthAndHeight(finalWidth, finalHeight)\r\n )\r\n }}\r\n onSetFullWidth={() => {\r\n updateNode((node) => node.setFullWidth(true))\r\n }}\r\n />\r\n )}\r\n </div>\r\n </BlockWithAlignableContents>\r\n )\r\n}\r\n\r\nexport type SerializedYouTubeNode = Spread<\r\n {\r\n videoID: string\r\n width?: number\r\n height?: number\r\n maxWidth?: number\r\n fullWidth?: boolean\r\n },\r\n SerializedDecoratorBlockNode\r\n>\r\n\r\nfunction $convertYoutubeElement(\r\n domNode: HTMLElement\r\n): null | DOMConversionOutput {\r\n const videoID = domNode.getAttribute(\"data-lexical-youtube\")\r\n if (videoID) {\r\n const node = $createYouTubeNode(videoID)\r\n return { node }\r\n }\r\n return null\r\n}\r\n\r\nexport class YouTubeNode extends DecoratorBlockNode {\r\n __id: string\r\n __width: \"inherit\" | number\r\n __height: \"inherit\" | number\r\n __maxWidth: number\r\n __fullWidth: boolean\r\n\r\n static getType(): string {\r\n return \"youtube\"\r\n }\r\n\r\n static clone(node: YouTubeNode): YouTubeNode {\r\n return new YouTubeNode(\r\n node.__id,\r\n node.__format,\r\n node.__width,\r\n node.__height,\r\n node.__maxWidth,\r\n node.__fullWidth,\r\n node.__key\r\n )\r\n }\r\n\r\n static importJSON(serializedNode: SerializedYouTubeNode): YouTubeNode {\r\n const node = $createYouTubeNode(\r\n serializedNode.videoID,\r\n serializedNode.width,\r\n serializedNode.height,\r\n serializedNode.maxWidth ?? 640,\r\n serializedNode.fullWidth\r\n )\r\n node.setFormat(serializedNode.format)\r\n return node\r\n }\r\n\r\n exportJSON(): SerializedYouTubeNode {\r\n return {\r\n ...super.exportJSON(),\r\n type: \"youtube\",\r\n version: 1,\r\n videoID: this.__id,\r\n width: this.__width === \"inherit\" ? undefined : (this.__width as number),\r\n height:\r\n this.__height === \"inherit\" ? undefined : (this.__height as number),\r\n maxWidth: this.__maxWidth,\r\n fullWidth: this.__fullWidth,\r\n }\r\n }\r\n\r\n constructor(\r\n id: string,\r\n format?: ElementFormatType,\r\n width?: \"inherit\" | number,\r\n height?: \"inherit\" | number,\r\n maxWidth: number = 640,\r\n fullWidth?: boolean,\r\n key?: NodeKey\r\n ) {\r\n super(format, key)\r\n this.__id = id\r\n this.__width = width ?? \"inherit\"\r\n this.__height = height ?? \"inherit\"\r\n this.__maxWidth = maxWidth\r\n // Default to not full width so align controls remain effective\r\n this.__fullWidth = fullWidth ?? false\r\n }\r\n\r\n exportDOM(): DOMExportOutput {\r\n const element = document.createElement(\"iframe\")\r\n element.setAttribute(\"data-lexical-youtube\", this.__id)\r\n if (typeof this.__width === \"number\") {\r\n element.setAttribute(\"width\", String(this.__width))\r\n }\r\n if (typeof this.__height === \"number\") {\r\n element.setAttribute(\"height\", String(this.__height))\r\n }\r\n element.setAttribute(\r\n \"src\",\r\n `https://www.youtube-nocookie.com/embed/${this.__id}`\r\n )\r\n element.setAttribute(\"frameborder\", \"0\")\r\n element.setAttribute(\"loading\", \"lazy\")\r\n element.setAttribute(\r\n \"allow\",\r\n \"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\"\r\n )\r\n element.setAttribute(\"allowfullscreen\", \"true\")\r\n element.setAttribute(\"title\", \"YouTube video\")\r\n return { element }\r\n }\r\n\r\n static importDOM(): DOMConversionMap | null {\r\n return {\r\n iframe: (domNode: HTMLElement) => {\r\n if (!domNode.hasAttribute(\"data-lexical-youtube\")) {\r\n return null\r\n }\r\n return {\r\n conversion: $convertYoutubeElement,\r\n priority: 1,\r\n }\r\n },\r\n }\r\n }\r\n\r\n updateDOM(): false {\r\n return false\r\n }\r\n\r\n getId(): string {\r\n return this.__id\r\n }\r\n\r\n getTextContent(\r\n _includeInert?: boolean | undefined,\r\n _includeDirectionless?: false | undefined\r\n ): string {\r\n return `https://www.youtube.com/watch?v=${this.__id}`\r\n }\r\n\r\n decorate(_editor: LexicalEditor, config: EditorConfig): JSX.Element {\r\n const embedBlockTheme = config.theme.embedBlock || {}\r\n const className = {\r\n base: embedBlockTheme.base || \"\",\r\n focus: embedBlockTheme.focus || \"\",\r\n }\r\n return (\r\n <YouTubeComponent\r\n className={className}\r\n format={this.__format}\r\n nodeKey={this.getKey()}\r\n videoID={this.__id}\r\n width={this.__width}\r\n height={this.__height}\r\n maxWidth={this.__maxWidth}\r\n fullWidth={this.__fullWidth}\r\n editor={_editor}\r\n />\r\n )\r\n }\r\n\r\n setWidthAndHeight(width: \"inherit\" | number, height: \"inherit\" | number) {\r\n const writable = this.getWritable()\r\n writable.__width = width\r\n writable.__height = height\r\n }\r\n getMaxWidth(): number {\r\n return this.__maxWidth\r\n }\r\n\r\n setMaxWidth(maxWidth: number) {\r\n const writable = this.getWritable()\r\n writable.__maxWidth = maxWidth\r\n }\r\n\r\n isFullWidth(): boolean {\r\n return this.__fullWidth\r\n }\r\n\r\n setFullWidth(fullWidth: boolean) {\r\n const writable = this.getWritable()\r\n writable.__fullWidth = fullWidth\r\n }\r\n}\r\n\r\nexport function $createYouTubeNode(\r\n videoID: string,\r\n width?: number,\r\n height?: number,\r\n maxWidth?: number,\r\n fullWidth?: boolean\r\n): YouTubeNode {\r\n return new YouTubeNode(videoID, undefined, width, height, maxWidth, fullWidth)\r\n}\r\n\r\nexport function $isYouTubeNode(\r\n node: YouTubeNode | LexicalNode | null | undefined\r\n): node is YouTubeNode {\r\n return node instanceof YouTubeNode\r\n}\r\n","import type {\r\n EditorConfig,\r\n LexicalNode,\r\n NodeKey,\r\n SerializedTextNode,\r\n Spread,\r\n} from \"lexical\"\r\nimport { $applyNodeReplacement, TextNode } from \"lexical\"\r\n\r\nexport type SerializedEmojiNode = Spread<\r\n {\r\n className: string\r\n },\r\n SerializedTextNode\r\n>\r\n\r\nexport class EmojiNode extends TextNode {\r\n __className: string\r\n\r\n static getType(): string {\r\n return \"emoji\"\r\n }\r\n\r\n static clone(node: EmojiNode): EmojiNode {\r\n return new EmojiNode(node.__className, node.__text, node.__key)\r\n }\r\n\r\n constructor(className: string, text: string, key?: NodeKey) {\r\n super(text, key)\r\n this.__className = className\r\n }\r\n\r\n createDOM(config: EditorConfig): HTMLElement {\r\n const dom = document.createElement(\"span\")\r\n const inner = super.createDOM(config)\r\n dom.className = this.__className\r\n inner.className = \"emoji-inner\"\r\n dom.appendChild(inner)\r\n return dom\r\n }\r\n\r\n updateDOM(prevNode: this, dom: HTMLElement, config: EditorConfig): boolean {\r\n const inner = dom.firstChild\r\n if (inner === null) {\r\n return true\r\n }\r\n super.updateDOM(prevNode, inner as HTMLElement, config)\r\n return false\r\n }\r\n\r\n static importJSON(serializedNode: SerializedEmojiNode): EmojiNode {\r\n return $createEmojiNode(\r\n serializedNode.className,\r\n serializedNode.text\r\n ).updateFromJSON(serializedNode)\r\n }\r\n\r\n exportJSON(): SerializedEmojiNode {\r\n return {\r\n ...super.exportJSON(),\r\n className: this.getClassName(),\r\n }\r\n }\r\n\r\n getClassName(): string {\r\n const self = this.getLatest()\r\n return self.__className\r\n }\r\n}\r\n\r\nexport function $isEmojiNode(\r\n node: LexicalNode | null | undefined\r\n): node is EmojiNode {\r\n return node instanceof EmojiNode\r\n}\r\n\r\nexport function $createEmojiNode(\r\n className: string,\r\n emojiText: string\r\n): EmojiNode {\r\n const node = new EmojiNode(className, emojiText).setMode(\"token\")\r\n return $applyNodeReplacement(node)\r\n}\r\n","import type { EditorConfig, LexicalNode, SerializedTextNode } from \"lexical\"\r\nimport { TextNode } from \"lexical\"\r\n\r\nexport type SerializedKeywordNode = SerializedTextNode\r\n\r\nexport class KeywordNode extends TextNode {\r\n static getType(): string {\r\n return \"keyword\"\r\n }\r\n\r\n static clone(node: KeywordNode): KeywordNode {\r\n return new KeywordNode(node.__text, node.__key)\r\n }\r\n\r\n static importJSON(serializedNode: SerializedKeywordNode): KeywordNode {\r\n const node = $createKeywordNode(serializedNode.text)\r\n node.setFormat(serializedNode.format)\r\n node.setDetail(serializedNode.detail)\r\n node.setMode(serializedNode.mode)\r\n node.setStyle(serializedNode.style)\r\n return node\r\n }\r\n\r\n exportJSON(): SerializedKeywordNode {\r\n return {\r\n ...super.exportJSON(),\r\n type: \"keyword\",\r\n version: 1,\r\n }\r\n }\r\n\r\n createDOM(config: EditorConfig): HTMLElement {\r\n const dom = super.createDOM(config)\r\n dom.style.cursor = \"default\"\r\n dom.className = \"keyword text-purple-900 font-bold\"\r\n return dom\r\n }\r\n\r\n canInsertTextBefore(): boolean {\r\n return false\r\n }\r\n\r\n canInsertTextAfter(): boolean {\r\n return false\r\n }\r\n\r\n isTextEntity(): true {\r\n return true\r\n }\r\n}\r\n\r\nexport function $createKeywordNode(keyword: string): KeywordNode {\r\n return new KeywordNode(keyword)\r\n}\r\n\r\nexport function $isKeywordNode(node: LexicalNode | null | undefined): boolean {\r\n return node instanceof KeywordNode\r\n}\r\n","import { addClassNamesToElement } from \"@lexical/utils\"\r\nimport type {\r\n DOMConversionMap,\r\n DOMConversionOutput,\r\n DOMExportOutput,\r\n EditorConfig,\r\n LexicalNode,\r\n NodeKey,\r\n SerializedElementNode,\r\n Spread,\r\n} from \"lexical\"\r\nimport { ElementNode } from \"lexical\"\r\n\r\nexport type SerializedLayoutContainerNode = Spread<\r\n {\r\n templateColumns: string\r\n },\r\n SerializedElementNode\r\n>\r\n\r\nfunction $convertLayoutContainerElement(\r\n domNode: HTMLElement\r\n): DOMConversionOutput | null {\r\n const styleAttributes = window.getComputedStyle(domNode)\r\n const templateColumns = styleAttributes.getPropertyValue(\r\n \"grid-template-columns\"\r\n )\r\n if (templateColumns) {\r\n const node = $createLayoutContainerNode(templateColumns)\r\n return { node }\r\n }\r\n return null\r\n}\r\n\r\nexport class LayoutContainerNode extends ElementNode {\r\n __templateColumns: string\r\n\r\n constructor(templateColumns: string, key?: NodeKey) {\r\n super(key)\r\n this.__templateColumns = templateColumns\r\n }\r\n\r\n static getType(): string {\r\n return \"layout-container\"\r\n }\r\n\r\n static clone(node: LayoutContainerNode): LayoutContainerNode {\r\n return new LayoutContainerNode(node.__templateColumns, node.__key)\r\n }\r\n\r\n createDOM(config: EditorConfig): HTMLElement {\r\n const dom = document.createElement(\"div\")\r\n dom.style.gridTemplateColumns = this.__templateColumns\r\n if (typeof config.theme.layoutContainer === \"string\") {\r\n addClassNamesToElement(dom, config.theme.layoutContainer)\r\n }\r\n return dom\r\n }\r\n\r\n exportDOM(): DOMExportOutput {\r\n const element = document.createElement(\"div\")\r\n element.style.gridTemplateColumns = this.__templateColumns\r\n element.setAttribute(\"data-lexical-layout-container\", \"true\")\r\n return { element }\r\n }\r\n\r\n updateDOM(prevNode: LayoutContainerNode, dom: HTMLElement): boolean {\r\n if (prevNode.__templateColumns !== this.__templateColumns) {\r\n dom.style.gridTemplateColumns = this.__templateColumns\r\n }\r\n return false\r\n }\r\n\r\n static importDOM(): DOMConversionMap | null {\r\n return {\r\n div: (domNode: HTMLElement) => {\r\n if (!domNode.hasAttribute(\"data-lexical-layout-container\")) {\r\n return null\r\n }\r\n return {\r\n conversion: $convertLayoutContainerElement,\r\n priority: 2,\r\n }\r\n },\r\n }\r\n }\r\n\r\n static importJSON(json: SerializedLayoutContainerNode): LayoutContainerNode {\r\n return $createLayoutContainerNode(json.templateColumns)\r\n }\r\n\r\n isShadowRoot(): boolean {\r\n return true\r\n }\r\n\r\n canBeEmpty(): boolean {\r\n return false\r\n }\r\n\r\n exportJSON(): SerializedLayoutContainerNode {\r\n return {\r\n ...super.exportJSON(),\r\n templateColumns: this.__templateColumns,\r\n type: \"layout-container\",\r\n version: 1,\r\n }\r\n }\r\n\r\n getTemplateColumns(): string {\r\n return this.getLatest().__templateColumns\r\n }\r\n\r\n setTemplateColumns(templateColumns: string) {\r\n this.getWritable().__templateColumns = templateColumns\r\n }\r\n}\r\n\r\nexport function $createLayoutContainerNode(\r\n templateColumns: string\r\n): LayoutContainerNode {\r\n return new LayoutContainerNode(templateColumns)\r\n}\r\n\r\nexport function $isLayoutContainerNode(\r\n node: LexicalNode | null | undefined\r\n): node is LayoutContainerNode {\r\n return node instanceof LayoutContainerNode\r\n}\r\n","import { addClassNamesToElement } from \"@lexical/utils\"\r\nimport type {\r\n DOMConversionMap,\r\n EditorConfig,\r\n LexicalNode,\r\n SerializedElementNode,\r\n} from \"lexical\"\r\nimport { ElementNode } from \"lexical\"\r\n\r\nexport type SerializedLayoutItemNode = SerializedElementNode & {\r\n style?: string\r\n}\r\n\r\nfunction withPaddingFallback(style: string): string {\r\n const normalizedStyle = style.trim()\r\n if (/padding\\s*:/i.test(normalizedStyle)) {\r\n return normalizedStyle\r\n }\r\n if (!normalizedStyle) {\r\n return \"padding: 12px;\"\r\n }\r\n return `${normalizedStyle.replace(/;?$/, \";\")} padding: 12px;`\r\n}\r\n\r\nfunction applyLayoutItemStyle(dom: HTMLElement, style: string): void {\r\n dom.style.cssText = style\r\n const padding = dom.style.padding || \"12px\"\r\n dom.style.setProperty(\"padding\", padding, \"important\")\r\n}\r\n\r\nfunction applyLayoutItemAttributes(dom: HTMLElement): void {\r\n dom.setAttribute(\"data-lexical-layout-item\", \"true\")\r\n}\r\n\r\nfunction getLayoutItemThemeClass(config: EditorConfig): string {\r\n return typeof config.theme.layoutItem === \"string\"\r\n ? config.theme.layoutItem\r\n : \"border border-dashed\"\r\n}\r\n\r\nexport class LayoutItemNode extends ElementNode {\r\n static getType(): string {\r\n return \"layout-item\"\r\n }\r\n\r\n static clone(node: LayoutItemNode): LayoutItemNode {\r\n return new LayoutItemNode(node.__key)\r\n }\r\n\r\n createDOM(config: EditorConfig): HTMLElement {\r\n const dom = document.createElement(\"div\")\r\n addClassNamesToElement(dom, getLayoutItemThemeClass(config))\r\n applyLayoutItemAttributes(dom)\r\n applyLayoutItemStyle(dom, withPaddingFallback(this.getStyle()))\r\n return dom\r\n }\r\n\r\n updateDOM(prevNode: LayoutItemNode, dom: HTMLElement, config: EditorConfig): boolean {\r\n const expectedClass = getLayoutItemThemeClass(config)\r\n if (dom.className !== expectedClass) {\r\n dom.className = \"\"\r\n addClassNamesToElement(dom, expectedClass)\r\n }\r\n applyLayoutItemAttributes(dom)\r\n\r\n const prevStyle = withPaddingFallback(prevNode.getStyle())\r\n const nextStyle = withPaddingFallback(this.getStyle())\r\n if (prevStyle !== nextStyle) {\r\n applyLayoutItemStyle(dom, nextStyle)\r\n }\r\n return false\r\n }\r\n\r\n static importDOM(): DOMConversionMap | null {\r\n return {}\r\n }\r\n\r\n static importJSON(json: SerializedLayoutItemNode): LayoutItemNode {\r\n const node = $createLayoutItemNode()\r\n if (json.format) {\r\n node.setFormat(json.format)\r\n }\r\n if (json.indent) {\r\n node.setIndent(json.indent)\r\n }\r\n if (\"direction\" in json && json.direction !== null) {\r\n node.setDirection(json.direction)\r\n }\r\n if (\"style\" in json && typeof json.style === \"string\") {\r\n node.setStyle(json.style)\r\n }\r\n return node\r\n }\r\n\r\n isShadowRoot(): boolean {\r\n return true\r\n }\r\n\r\n exportJSON(): SerializedLayoutItemNode {\r\n const style = this.getStyle()\r\n return {\r\n ...super.exportJSON(),\r\n ...(style ? { style } : {}),\r\n type: \"layout-item\",\r\n version: 1,\r\n }\r\n }\r\n}\r\n\r\nexport function $createLayoutItemNode(): LayoutItemNode {\r\n return new LayoutItemNode()\r\n}\r\n\r\nexport function $isLayoutItemNode(\r\n node: LexicalNode | null | undefined\r\n): node is LayoutItemNode {\r\n return node instanceof LayoutItemNode\r\n}\r\n","\"use client\"\r\n\r\nimport type { DOMExportOutput, EditorConfig, LexicalEditor } from \"lexical\"\r\nimport {\r\n ListNode,\r\n type ListType,\r\n type SerializedListNode,\r\n} from \"@lexical/list\"\r\nimport type { LexicalNode, LexicalUpdateJSON, NodeKey } from \"lexical\"\r\nimport { $applyNodeReplacement } from \"lexical\"\r\n\r\nexport type SerializedListWithColorNode = Omit<SerializedListNode, \"type\"> & {\r\n type: \"listwithcolor\"\r\n listColor?: string\r\n}\r\n\r\nconst LIST_WITH_COLOR_TYPE = \"listwithcolor\"\r\n\r\nfunction applyListColorToDom(dom: HTMLElement, color: string): void {\r\n dom.style.setProperty(\"list-style-color\", color, \"important\")\r\n dom.style.setProperty(\"--list-marker-color\", color, \"important\")\r\n dom.setAttribute(\"data-list-color\", color)\r\n}\r\n\r\nexport class ListWithColorNode extends ListNode {\r\n __listColor?: string\r\n\r\n constructor(listType?: ListType, start?: number, key?: NodeKey) {\r\n super(listType, start, key)\r\n }\r\n\r\n static getType(): \"listwithcolor\" {\r\n return LIST_WITH_COLOR_TYPE\r\n }\r\n\r\n override getType(): \"listwithcolor\" {\r\n return LIST_WITH_COLOR_TYPE\r\n }\r\n\r\n static override clone(node: ListWithColorNode, key?: NodeKey): ListWithColorNode {\r\n const listType = node.getListType()\r\n const start = node.getStart()\r\n const sameKey = key ?? node.getKey()\r\n const cloned = new ListWithColorNode(listType, start, sameKey)\r\n if (node.__listColor) cloned.__listColor = node.__listColor\r\n return cloned\r\n }\r\n\r\n static override importJSON(\r\n serializedNode: SerializedListWithColorNode\r\n ): ListWithColorNode {\r\n const { listType, start, listColor } = serializedNode\r\n const node = new ListWithColorNode(listType, start)\r\n if (listColor != null) node.__listColor = listColor\r\n return node\r\n }\r\n\r\n override afterCloneFrom(prevNode: ListWithColorNode): void {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Lexical ListNode.afterCloneFrom(prevNode: this) không chấp nhận subtype\r\n super.afterCloneFrom(prevNode as any)\r\n this.__listColor = prevNode.__listColor\r\n }\r\n\r\n getListColor(): string | undefined {\r\n return this.getLatest().__listColor\r\n }\r\n\r\n setListColor(color: string | undefined): this {\r\n const writable = this.getWritable()\r\n writable.__listColor = color\r\n return this\r\n }\r\n\r\n override createDOM(config: EditorConfig, _editor?: LexicalEditor): HTMLElement {\r\n const dom = super.createDOM(config, _editor)\r\n const color = this.__listColor\r\n if (color) applyListColorToDom(dom, color)\r\n return dom\r\n }\r\n\r\n override updateDOM(\r\n prevNode: ListWithColorNode,\r\n dom: HTMLElement,\r\n config: EditorConfig\r\n ): boolean {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Lexical ListNode.updateDOM(prevNode: this)\r\n const result = super.updateDOM(prevNode as any, dom, config)\r\n if (result) return true\r\n if (prevNode.__listColor !== this.__listColor) {\r\n const color = this.__listColor\r\n if (color) {\r\n applyListColorToDom(dom, color)\r\n } else {\r\n dom.style.removeProperty(\"list-style-color\")\r\n dom.style.removeProperty(\"--list-marker-color\")\r\n dom.removeAttribute(\"data-list-color\")\r\n }\r\n }\r\n return false\r\n }\r\n\r\n override updateFromJSON(\r\n serializedNode: LexicalUpdateJSON<SerializedListWithColorNode>\r\n ): this {\r\n super.updateFromJSON(serializedNode)\r\n const color = (serializedNode as SerializedListWithColorNode).listColor\r\n if (color !== undefined) this.setListColor(color)\r\n return this\r\n }\r\n\r\n override exportDOM(editor: LexicalEditor): DOMExportOutput {\r\n const output = super.exportDOM(editor)\r\n const color = this.__listColor\r\n if (color && output.element && output.element instanceof HTMLElement)\r\n applyListColorToDom(output.element, color)\r\n return output\r\n }\r\n\r\n override exportJSON(): SerializedListWithColorNode {\r\n const json = super.exportJSON() as SerializedListWithColorNode\r\n json.type = LIST_WITH_COLOR_TYPE\r\n if (this.__listColor) json.listColor = this.__listColor\r\n return json\r\n }\r\n}\r\n\r\nexport function $createListWithColorNode(\r\n listType?: ListType,\r\n start?: number\r\n): ListWithColorNode {\r\n return $applyNodeReplacement(\r\n new ListWithColorNode(listType, start)\r\n ) as ListWithColorNode\r\n}\r\n\r\nexport function $isListWithColorNode(\r\n node: LexicalNode | null | undefined\r\n): node is ListWithColorNode {\r\n return node instanceof ListWithColorNode\r\n}\r\n","import {\r\n $applyNodeReplacement,\r\n TextNode,\r\n type DOMConversionMap,\r\n type DOMConversionOutput,\r\n type DOMExportOutput,\r\n type EditorConfig,\r\n type LexicalNode,\r\n type NodeKey,\r\n type SerializedTextNode,\r\n type Spread,\r\n} from \"lexical\"\r\n\r\nexport type SerializedMentionNode = Spread<\r\n {\r\n mentionName: string\r\n },\r\n SerializedTextNode\r\n>\r\n\r\nfunction $convertMentionElement(\r\n domNode: HTMLElement\r\n): DOMConversionOutput | null {\r\n const textContent = domNode.textContent\r\n\r\n if (textContent !== null) {\r\n const node = $createMentionNode(textContent)\r\n return {\r\n node,\r\n }\r\n }\r\n\r\n return null\r\n}\r\n\r\nconst mentionStyle = \"background-color: rgba(24, 119, 232, 0.2)\"\r\nexport class MentionNode extends TextNode {\r\n __mention: string\r\n\r\n static getType(): string {\r\n return \"mention\"\r\n }\r\n\r\n static clone(node: MentionNode): MentionNode {\r\n return new MentionNode(node.__mention, node.__text, node.__key)\r\n }\r\n static importJSON(serializedNode: SerializedMentionNode): MentionNode {\r\n const node = $createMentionNode(serializedNode.mentionName)\r\n node.setTextContent(serializedNode.text)\r\n node.setFormat(serializedNode.format)\r\n node.setDetail(serializedNode.detail)\r\n node.setMode(serializedNode.mode)\r\n node.setStyle(serializedNode.style)\r\n return node\r\n }\r\n\r\n constructor(mentionName: string, text?: string, key?: NodeKey) {\r\n super(text ?? mentionName, key)\r\n this.__mention = mentionName\r\n }\r\n\r\n exportJSON(): SerializedMentionNode {\r\n return {\r\n ...super.exportJSON(),\r\n mentionName: this.__mention,\r\n type: \"mention\",\r\n version: 1,\r\n }\r\n }\r\n\r\n createDOM(config: EditorConfig): HTMLElement {\r\n const dom = super.createDOM(config)\r\n dom.style.cssText = mentionStyle\r\n dom.className = \"mention\"\r\n return dom\r\n }\r\n\r\n exportDOM(): DOMExportOutput {\r\n const element = document.createElement(\"span\")\r\n element.setAttribute(\"data-lexical-mention\", \"true\")\r\n element.textContent = this.__text\r\n return { element }\r\n }\r\n\r\n static importDOM(): DOMConversionMap | null {\r\n return {\r\n span: (domNode: HTMLElement) => {\r\n if (!domNode.hasAttribute(\"data-lexical-mention\")) {\r\n return null\r\n }\r\n return {\r\n conversion: $convertMentionElement,\r\n priority: 1,\r\n }\r\n },\r\n }\r\n }\r\n\r\n isTextEntity(): true {\r\n return true\r\n }\r\n\r\n canInsertTextBefore(): boolean {\r\n return false\r\n }\r\n\r\n canInsertTextAfter(): boolean {\r\n return false\r\n }\r\n}\r\n\r\nexport function $createMentionNode(mentionName: string): MentionNode {\r\n const mentionNode = new MentionNode(mentionName)\r\n mentionNode.setMode(\"segmented\").toggleDirectionless()\r\n return $applyNodeReplacement(mentionNode)\r\n}\r\n\r\nexport function $isMentionNode(\r\n node: LexicalNode | null | undefined\r\n): node is MentionNode {\r\n return node instanceof MentionNode\r\n}\r\n","import { type CSSProperties, useMemo, useState } from \"react\"\r\nimport {\r\n CHECK_LIST,\r\n ELEMENT_TRANSFORMERS,\r\n MULTILINE_ELEMENT_TRANSFORMERS,\r\n TEXT_FORMAT_TRANSFORMERS,\r\n TEXT_MATCH_TRANSFORMERS,\r\n} from \"@lexical/markdown\"\r\nimport { CheckListPlugin } from \"@lexical/react/LexicalCheckListPlugin\"\r\nimport { ClearEditorPlugin } from \"@lexical/react/LexicalClearEditorPlugin\"\r\nimport { ClickableLinkPlugin } from \"@lexical/react/LexicalClickableLinkPlugin\"\r\nimport { LexicalErrorBoundary } from \"@lexical/react/LexicalErrorBoundary\"\r\nimport { HashtagPlugin } from \"@lexical/react/LexicalHashtagPlugin\"\r\nimport { HistoryPlugin } from \"@lexical/react/LexicalHistoryPlugin\"\r\nimport { HorizontalRulePlugin } from \"@lexical/react/LexicalHorizontalRulePlugin\"\r\nimport { ListPlugin } from \"@lexical/react/LexicalListPlugin\"\r\nimport { MarkdownShortcutPlugin } from \"@lexical/react/LexicalMarkdownShortcutPlugin\"\r\nimport { RichTextPlugin } from \"@lexical/react/LexicalRichTextPlugin\"\r\nimport { TabIndentationPlugin } from \"@lexical/react/LexicalTabIndentationPlugin\"\r\nimport { TablePlugin } from \"@lexical/react/LexicalTablePlugin\"\r\n\r\nimport { ContentEditable } from \"@/components/editor/editor-ui/content-editable\"\r\nimport { ActionsPlugin } from \"@/components/editor/plugins/actions/actions-plugin\"\r\nimport { ClearEditorActionPlugin } from \"@/components/editor/plugins/actions/clear-editor-plugin\"\r\nimport { CounterCharacterPlugin } from \"@/components/editor/plugins/actions/counter-character-plugin\"\r\nimport { EditModeTogglePlugin } from \"@/components/editor/plugins/actions/edit-mode-toggle-plugin\"\r\nimport { ImportExportPlugin } from \"@/components/editor/plugins/actions/import-export-plugin\"\r\nimport { MarkdownTogglePlugin } from \"@/components/editor/plugins/actions/markdown-toggle-plugin\"\r\nimport { ShareContentPlugin } from \"@/components/editor/plugins/actions/share-content-plugin\"\r\nimport { SpeechToTextPlugin } from \"@/components/editor/plugins/actions/speech-to-text-plugin\"\r\nimport { TreeViewPlugin } from \"@/components/editor/plugins/actions/tree-view-plugin\"\r\nimport { AutoLinkPlugin } from \"@/components/editor/plugins/auto-link-plugin\"\r\nimport { AutocompletePlugin } from \"@/components/editor/plugins/autocomplete-plugin\"\r\nimport { CodeActionMenuPlugin } from \"@/components/editor/plugins/code-action-menu-plugin\"\r\nimport { CodeHighlightPlugin } from \"@/components/editor/plugins/code-highlight-plugin\"\r\nimport { ComponentPickerMenuPlugin } from \"@/components/editor/plugins/component-picker-menu-plugin\"\r\nimport { ContextMenuPlugin } from \"@/components/editor/plugins/context-menu-plugin\"\r\nimport { DragDropPastePlugin } from \"@/components/editor/plugins/drag-drop-paste-plugin\"\r\nimport { DraggableBlockPlugin } from \"@/components/editor/plugins/draggable-block-plugin\"\r\nimport { AutoEmbedPlugin } from \"@/components/editor/plugins/embeds/auto-embed-plugin\"\r\nimport { TwitterPlugin } from \"@/components/editor/plugins/embeds/twitter-plugin\"\r\nimport { YouTubePlugin } from \"@/components/editor/plugins/embeds/youtube-plugin\"\r\nimport { EmojiPickerPlugin } from \"@/components/editor/plugins/emoji-picker-plugin\"\r\nimport { EmojisPlugin } from \"@/components/editor/plugins/emojis-plugin\"\r\nimport { FloatingLinkEditorPlugin } from \"@/components/editor/plugins/floating-link-editor-plugin\"\r\nimport { FloatingTextFormatToolbarPlugin } from \"@/components/editor/plugins/floating-text-format-plugin\"\r\nimport { ImagesPlugin } from \"@/components/editor/plugins/images-plugin\"\r\nimport { KeywordsPlugin } from \"@/components/editor/plugins/keywords-plugin\"\r\nimport { LayoutPlugin } from \"@/components/editor/plugins/layout-plugin\"\r\nimport { LinkPlugin } from \"@/components/editor/plugins/link-plugin\"\r\nimport { ListColorPlugin } from \"@/components/editor/plugins/list-color-plugin\"\r\nimport { ListMaxIndentLevelPlugin } from \"@/components/editor/plugins/list-max-indent-level-plugin\"\r\nimport { MentionsPlugin } from \"@/components/editor/plugins/mentions-plugin\"\r\nimport { AlignmentPickerPlugin } from \"@/components/editor/plugins/picker/alignment-picker-plugin\"\r\nimport { BulletedListPickerPlugin } from \"@/components/editor/plugins/picker/bulleted-list-picker-plugin\"\r\nimport { CheckListPickerPlugin } from \"@/components/editor/plugins/picker/check-list-picker-plugin\"\r\nimport { CodePickerPlugin } from \"@/components/editor/plugins/picker/code-picker-plugin\"\r\nimport { ColumnsLayoutPickerPlugin } from \"@/components/editor/plugins/picker/columns-layout-picker-plugin\"\r\nimport { DividerPickerPlugin } from \"@/components/editor/plugins/picker/divider-picker-plugin\"\r\nimport { EmbedsPickerPlugin } from \"@/components/editor/plugins/picker/embeds-picker-plugin\"\r\nimport { HeadingPickerPlugin } from \"@/components/editor/plugins/picker/heading-picker-plugin\"\r\nimport { ImagePickerPlugin } from \"@/components/editor/plugins/picker/image-picker-plugin\"\r\nimport { NumberedListPickerPlugin } from \"@/components/editor/plugins/picker/numbered-list-picker-plugin\"\r\nimport { ParagraphPickerPlugin } from \"@/components/editor/plugins/picker/paragraph-picker-plugin\"\r\nimport { QuotePickerPlugin } from \"@/components/editor/plugins/picker/quote-picker-plugin\"\r\nimport {\r\n DynamicTablePickerPlugin,\r\n TablePickerPlugin,\r\n} from \"@/components/editor/plugins/picker/table-picker-plugin\"\r\nimport { TabFocusPlugin } from \"@/components/editor/plugins/tab-focus-plugin\"\r\nimport { TableColumnResizerPlugin } from \"@/components/editor/plugins/table-column-resizer-plugin\"\r\nimport {\r\n InsertTableCommandPlugin,\r\n} from \"@/components/editor/plugins/table-plugin\"\r\nimport { BlockFormatDropDown } from \"@/components/editor/plugins/toolbar/block-format-toolbar-plugin\"\r\nimport { FormatBulletedList } from \"@/components/editor/plugins/toolbar/block-format/format-bulleted-list\"\r\nimport { FormatCheckList } from \"@/components/editor/plugins/toolbar/block-format/format-check-list\"\r\nimport { FormatCodeBlock } from \"@/components/editor/plugins/toolbar/block-format/format-code-block\"\r\nimport { FormatHeading } from \"@/components/editor/plugins/toolbar/block-format/format-heading\"\r\nimport { FormatNumberedList } from \"@/components/editor/plugins/toolbar/block-format/format-numbered-list\"\r\nimport { FormatParagraph } from \"@/components/editor/plugins/toolbar/block-format/format-paragraph\"\r\nimport { FormatQuote } from \"@/components/editor/plugins/toolbar/block-format/format-quote\"\r\nimport { BlockInsertPlugin } from \"@/components/editor/plugins/toolbar/block-insert-plugin\"\r\nimport { InsertColumnsLayout } from \"@/components/editor/plugins/toolbar/block-insert/insert-columns-layout\"\r\nimport { InsertEmbeds } from \"@/components/editor/plugins/toolbar/block-insert/insert-embeds\"\r\nimport { InsertHorizontalRule } from \"@/components/editor/plugins/toolbar/block-insert/insert-horizontal-rule\"\r\nimport { InsertImage } from \"@/components/editor/plugins/toolbar/block-insert/insert-image\"\r\nimport { InsertTable } from \"@/components/editor/plugins/toolbar/block-insert/insert-table\"\r\nimport { ClearFormattingToolbarPlugin } from \"@/components/editor/plugins/toolbar/clear-formatting-toolbar-plugin\"\r\nimport { CodeLanguageToolbarPlugin } from \"@/components/editor/plugins/toolbar/code-language-toolbar-plugin\"\r\nimport { ElementFormatToolbarPlugin } from \"@/components/editor/plugins/toolbar/element-format-toolbar-plugin\"\r\nimport { FontBackgroundToolbarPlugin } from \"@/components/editor/plugins/toolbar/font-background-toolbar-plugin\"\r\nimport { FontColorToolbarPlugin } from \"@/components/editor/plugins/toolbar/font-color-toolbar-plugin\"\r\nimport { FontFamilyToolbarPlugin } from \"@/components/editor/plugins/toolbar/font-family-toolbar-plugin\"\r\nimport { FontFormatToolbarPlugin } from \"@/components/editor/plugins/toolbar/font-format-toolbar-plugin\"\r\nimport { FontSizeToolbarPlugin } from \"@/components/editor/plugins/toolbar/font-size-toolbar-plugin\"\r\nimport { HistoryToolbarPlugin } from \"@/components/editor/plugins/toolbar/history-toolbar-plugin\"\r\nimport { LinkToolbarPlugin } from \"@/components/editor/plugins/toolbar/link-toolbar-plugin\"\r\nimport { SubSuperToolbarPlugin } from \"@/components/editor/plugins/toolbar/subsuper-toolbar-plugin\"\r\nimport { ToolbarPlugin } from \"@/components/editor/plugins/toolbar/toolbar-plugin\"\r\nimport { TypingPerfPlugin } from \"@/components/editor/plugins/typing-pref-plugin\"\r\nimport { EMOJI } from \"@/components/editor/transformers/markdown-emoji-transformer\"\r\nimport { HR } from \"@/components/editor/transformers/markdown-hr-transformer\"\r\nimport { IMAGE } from \"@/components/editor/transformers/markdown-image-transformer\"\r\nimport { TABLE } from \"@/components/editor/transformers/markdown-table-transformer\"\r\nimport { TWEET } from \"@/components/editor/transformers/markdown-tweet-transformer\"\r\nimport { Separator } from \"@/components/ui/separator\"\r\nimport { useEditorContainer } from \"@/components/editor/context/editor-container-context\"\r\n\r\nconst placeholder = \"Press / for commands...\"\r\n\r\nexport function Plugins({\r\n readOnly = false,\r\n}: {\r\n readOnly?: boolean\r\n}) {\r\n const [floatingAnchorElem, setFloatingAnchorElem] =\r\n useState<HTMLDivElement | null>(null)\r\n const [isLinkEditMode, setIsLinkEditMode] = useState<boolean>(false)\r\n const editorContainer = useEditorContainer()\r\n const editorMaxWidth = editorContainer?.maxWidth\r\n\r\n const onRef = (_floatingAnchorElem: HTMLDivElement) => {\r\n if (_floatingAnchorElem !== null) {\r\n setFloatingAnchorElem(_floatingAnchorElem)\r\n }\r\n }\r\n\r\n const constrainedWidthStyle = useMemo<CSSProperties | undefined>(() => {\r\n if (!editorMaxWidth || Number.isNaN(editorMaxWidth)) {\r\n return undefined\r\n }\r\n return {\r\n width: \"100%\",\r\n maxWidth: editorMaxWidth,\r\n }\r\n }, [editorMaxWidth])\r\n\r\n return (\r\n <div className=\"relative w-full\" style={constrainedWidthStyle}>\r\n {!readOnly && (\r\n <ToolbarPlugin\r\n className=\"w-full\"\r\n style={constrainedWidthStyle}\r\n >\r\n {({ blockType }) => (\r\n <div className=\"flex w-full flex-wrap items-center gap-2 p-1\">\r\n <HistoryToolbarPlugin />\r\n <Separator orientation=\"vertical\" className=\"h-7\" />\r\n <BlockInsertPlugin>\r\n <InsertHorizontalRule />\r\n <InsertImage />\r\n <InsertTable />\r\n <InsertColumnsLayout />\r\n <InsertEmbeds />\r\n </BlockInsertPlugin>\r\n <Separator orientation=\"vertical\" className=\"h-7\" />\r\n <BlockFormatDropDown>\r\n <FormatParagraph />\r\n <FormatHeading levels={[\"h1\", \"h2\", \"h3\"]} />\r\n <FormatNumberedList />\r\n <FormatBulletedList />\r\n <FormatCheckList />\r\n <FormatCodeBlock />\r\n <FormatQuote />\r\n </BlockFormatDropDown>\r\n {blockType === \"code\" ? (\r\n <CodeLanguageToolbarPlugin />\r\n ) : (\r\n <>\r\n <FontFamilyToolbarPlugin />\r\n <FontSizeToolbarPlugin />\r\n <Separator orientation=\"vertical\" className=\"h-7\" />\r\n <FontFormatToolbarPlugin />\r\n <Separator orientation=\"vertical\" className=\"h-7\" />\r\n <SubSuperToolbarPlugin />\r\n <LinkToolbarPlugin setIsLinkEditMode={setIsLinkEditMode} />\r\n <Separator orientation=\"vertical\" className=\"h-7\" />\r\n <ClearFormattingToolbarPlugin />\r\n <Separator orientation=\"vertical\" className=\"h-7\" />\r\n <FontColorToolbarPlugin />\r\n <FontBackgroundToolbarPlugin />\r\n <Separator orientation=\"vertical\" className=\"h-7\" />\r\n <ElementFormatToolbarPlugin />\r\n\r\n </>\r\n )}\r\n </div>\r\n )}\r\n </ToolbarPlugin>\r\n )}\r\n\r\n <div className=\"relative w-full\" style={constrainedWidthStyle}>\r\n {/* AutoFocusPlugin removed to prevent auto-scroll on page load */}\r\n <RichTextPlugin\r\n contentEditable={\r\n <div className=\"\">\r\n <div className=\"\" ref={onRef}>\r\n <ContentEditable\r\n placeholder={readOnly ? \"\" : placeholder}\r\n className={`ContentEditable__root relative block min-h-72 px-8 py-4 focus:outline-none ${readOnly ? \"cursor-default select-text border border-border rounded-md\" : \"\"}`}\r\n />\r\n </div>\r\n </div>\r\n }\r\n ErrorBoundary={LexicalErrorBoundary}\r\n placeholder={readOnly ? null : <div className=\"text-muted-foreground pointer-events-none absolute top-0 left-0 overflow-hidden px-8 py-[18px] text-ellipsis select-none\">{placeholder}</div>}\r\n />\r\n\r\n <ClickableLinkPlugin />\r\n {!readOnly && (\r\n <>\r\n <CheckListPlugin />\r\n <HorizontalRulePlugin />\r\n <TablePlugin hasHorizontalScroll={true} />\r\n <InsertTableCommandPlugin />\r\n <TableColumnResizerPlugin />\r\n <ListPlugin />\r\n <TabIndentationPlugin />\r\n <HistoryPlugin />\r\n </>\r\n )}\r\n <HashtagPlugin />\r\n\r\n <MentionsPlugin />\r\n {!readOnly && <DraggableBlockPlugin anchorElem={floatingAnchorElem} />}\r\n <KeywordsPlugin />\r\n <EmojisPlugin />\r\n {!readOnly && <ImagesPlugin />}\r\n\r\n {!readOnly && <LayoutPlugin />}\r\n {!readOnly && <ListColorPlugin />}\r\n\r\n {!readOnly && (\r\n <>\r\n <AutoEmbedPlugin />\r\n <TwitterPlugin />\r\n <YouTubePlugin />\r\n </>\r\n )}\r\n\r\n <CodeHighlightPlugin />\r\n {!readOnly && <CodeActionMenuPlugin anchorElem={floatingAnchorElem} />}\r\n\r\n {!readOnly && (\r\n <>\r\n <MarkdownShortcutPlugin\r\n transformers={[\r\n TABLE,\r\n HR,\r\n IMAGE,\r\n EMOJI,\r\n TWEET,\r\n CHECK_LIST,\r\n ...ELEMENT_TRANSFORMERS,\r\n ...MULTILINE_ELEMENT_TRANSFORMERS,\r\n ...TEXT_FORMAT_TRANSFORMERS,\r\n ...TEXT_MATCH_TRANSFORMERS,\r\n ]}\r\n />\r\n <TypingPerfPlugin />\r\n <TabFocusPlugin />\r\n <AutocompletePlugin />\r\n <AutoLinkPlugin />\r\n <LinkPlugin />\r\n\r\n <ComponentPickerMenuPlugin\r\n baseOptions={[\r\n ParagraphPickerPlugin(),\r\n HeadingPickerPlugin({ n: 1 }),\r\n HeadingPickerPlugin({ n: 2 }),\r\n HeadingPickerPlugin({ n: 3 }),\r\n TablePickerPlugin(),\r\n CheckListPickerPlugin(),\r\n NumberedListPickerPlugin(),\r\n BulletedListPickerPlugin(),\r\n QuotePickerPlugin(),\r\n CodePickerPlugin(),\r\n DividerPickerPlugin(),\r\n EmbedsPickerPlugin({ embed: \"tweet\" }),\r\n EmbedsPickerPlugin({ embed: \"youtube-video\" }),\r\n ImagePickerPlugin(),\r\n ColumnsLayoutPickerPlugin(),\r\n AlignmentPickerPlugin({ alignment: \"left\" }),\r\n AlignmentPickerPlugin({ alignment: \"center\" }),\r\n AlignmentPickerPlugin({ alignment: \"right\" }),\r\n AlignmentPickerPlugin({ alignment: \"justify\" }),\r\n ]}\r\n dynamicOptionsFn={DynamicTablePickerPlugin}\r\n />\r\n\r\n <ContextMenuPlugin />\r\n <DragDropPastePlugin />\r\n <EmojiPickerPlugin />\r\n\r\n <FloatingLinkEditorPlugin\r\n anchorElem={floatingAnchorElem}\r\n isLinkEditMode={isLinkEditMode}\r\n setIsLinkEditMode={setIsLinkEditMode}\r\n />\r\n <FloatingTextFormatToolbarPlugin\r\n anchorElem={floatingAnchorElem}\r\n setIsLinkEditMode={setIsLinkEditMode}\r\n />\r\n\r\n <ListMaxIndentLevelPlugin />\r\n </>\r\n )}\r\n </div>\r\n {!readOnly && (\r\n <ActionsPlugin>\r\n <div\r\n className=\"clear-both flex w-full items-center justify-between gap-2 overflow-auto border-t p-1\"\r\n style={constrainedWidthStyle}\r\n >\r\n <div className=\"flex flex-1 justify-start\" />\r\n <div>\r\n <CounterCharacterPlugin charset=\"UTF-16\" />\r\n </div>\r\n <div className=\"flex flex-1 justify-end\">\r\n <SpeechToTextPlugin />\r\n <ShareContentPlugin />\r\n <ImportExportPlugin />\r\n <MarkdownTogglePlugin\r\n shouldPreserveNewLinesInMarkdown={true}\r\n transformers={[\r\n TABLE,\r\n HR,\r\n IMAGE,\r\n EMOJI,\r\n TWEET,\r\n CHECK_LIST,\r\n ...ELEMENT_TRANSFORMERS,\r\n ...MULTILINE_ELEMENT_TRANSFORMERS,\r\n ...TEXT_FORMAT_TRANSFORMERS,\r\n ...TEXT_MATCH_TRANSFORMERS,\r\n ]}\r\n />\r\n <EditModeTogglePlugin />\r\n <>\r\n <ClearEditorActionPlugin />\r\n <ClearEditorPlugin />\r\n </>\r\n <TreeViewPlugin />\r\n </div>\r\n </div>\r\n </ActionsPlugin>\r\n )}\r\n </div>\r\n )\r\n}\r\n","export function ActionsPlugin({ children }: { children: React.ReactNode }) {\r\n return children\r\n}\r\n","\"use client\"\r\n\r\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\"\r\nimport { CLEAR_EDITOR_COMMAND } from \"lexical\"\r\nimport { Trash2Icon } from \"lucide-react\"\r\n\r\nimport { Button } from \"@/components/ui/button\"\r\nimport {\r\n Dialog,\r\n DialogClose,\r\n DialogContent,\r\n DialogDescription,\r\n DialogFooter,\r\n DialogHeader,\r\n DialogTitle,\r\n DialogTrigger,\r\n} from \"@/components/ui/dialog\"\r\nimport {\r\n Tooltip,\r\n TooltipContent,\r\n TooltipTrigger,\r\n} from \"@/components/ui/tooltip\"\r\nimport { IconSize } from \"@/components/ui/typography\"\r\n\r\nexport function ClearEditorActionPlugin() {\r\n const [editor] = useLexicalComposerContext()\r\n\r\n return (\r\n <Dialog>\r\n <Tooltip disableHoverableContent>\r\n <TooltipTrigger asChild>\r\n <DialogTrigger asChild>\r\n <Button size={\"sm\"} variant={\"ghost\"} className=\"p-2\">\r\n <IconSize size=\"sm\">\r\n <Trash2Icon />\r\n </IconSize>\r\n </Button>\r\n </DialogTrigger>\r\n </TooltipTrigger>\r\n <TooltipContent>Clear Editor</TooltipContent>\r\n </Tooltip>\r\n\r\n <DialogContent>\r\n <DialogHeader>\r\n <DialogTitle>Clear Editor</DialogTitle>\r\n <DialogDescription>\r\n Are you sure you want to clear the editor?\r\n </DialogDescription>\r\n </DialogHeader>\r\n <DialogFooter>\r\n <DialogClose asChild>\r\n <Button variant=\"outline\">Cancel</Button>\r\n </DialogClose>\r\n\r\n <DialogClose asChild>\r\n <Button\r\n variant=\"destructive\"\r\n onClick={() => {\r\n editor.dispatchCommand(CLEAR_EDITOR_COMMAND, undefined)\r\n }}\r\n >\r\n Clear\r\n </Button>\r\n </DialogClose>\r\n </DialogFooter>\r\n </DialogContent>\r\n </Dialog>\r\n )\r\n}\r\n","\"use client\"\r\n\r\nimport { useEffect, useState } from \"react\"\r\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\"\r\nimport { $rootTextContent } from \"@lexical/text\"\r\nimport { TypographySpanSmallMuted } from \"@/components/ui/typography\"\r\nimport { Separator } from \"@/components/ui/separator\"\r\nimport { Flex } from \"@/components/ui/flex\"\r\n\r\nlet textEncoderInstance: null | TextEncoder = null\r\n\r\nfunction textEncoder(): null | TextEncoder {\r\n if (window.TextEncoder === undefined) {\r\n return null\r\n }\r\n\r\n if (textEncoderInstance === null) {\r\n textEncoderInstance = new window.TextEncoder()\r\n }\r\n\r\n return textEncoderInstance\r\n}\r\n\r\nfunction utf8Length(text: string) {\r\n const currentTextEncoder = textEncoder()\r\n\r\n if (currentTextEncoder === null) {\r\n // http://stackoverflow.com/a/5515960/210370\r\n const m = encodeURIComponent(text).match(/%[89ABab]/g)\r\n return text.length + (m ? m.length : 0)\r\n }\r\n\r\n return currentTextEncoder.encode(text).length\r\n}\r\n\r\ninterface CounterCharacterPluginProps {\r\n charset?: \"UTF-8\" | \"UTF-16\"\r\n}\r\n\r\nconst strlen = (text: string, charset: \"UTF-8\" | \"UTF-16\") => {\r\n if (charset === \"UTF-8\") {\r\n return utf8Length(text)\r\n } else if (charset === \"UTF-16\") {\r\n return text.length\r\n }\r\n}\r\n\r\nconst countWords = (text: string) => {\r\n return text.split(/\\s+/).filter((word) => word.length > 0).length\r\n}\r\n\r\nexport function CounterCharacterPlugin({\r\n charset = \"UTF-16\",\r\n}: CounterCharacterPluginProps) {\r\n const [editor] = useLexicalComposerContext()\r\n const [stats, setStats] = useState(() => {\r\n const initialText = editor.getEditorState().read($rootTextContent)\r\n return {\r\n characters: strlen(initialText, charset),\r\n words: countWords(initialText),\r\n }\r\n })\r\n\r\n useEffect(() => {\r\n return editor.registerTextContentListener((currentText: string) => {\r\n setStats({\r\n characters: strlen(currentText, charset),\r\n words: countWords(currentText),\r\n })\r\n })\r\n }, [editor, charset])\r\n\r\n return (\r\n <Flex gap={2} className=\"whitespace-nowrap\">\r\n <TypographySpanSmallMuted>{stats.characters} characters</TypographySpanSmallMuted>\r\n <Separator orientation=\"vertical\" className=\"h-4\" />\r\n <TypographySpanSmallMuted>{stats.words} words</TypographySpanSmallMuted>\r\n </Flex>\r\n )\r\n}\r\n","\"use client\"\r\n\r\nimport * as React from \"react\"\r\nimport * as SeparatorPrimitive from \"@radix-ui/react-separator\"\r\nimport { cva, type VariantProps } from \"class-variance-authority\"\r\nimport { cn } from \"@/utils\"\r\n\r\nconst separatorVariants = cva(\"shrink-0\", {\r\n variants: {\r\n orientation: {\r\n horizontal: \"h-px w-full\",\r\n vertical: \"h-full w-[1px] min-w-[1px]\",\r\n },\r\n variant: {\r\n default: \"bg-border\",\r\n gradient: \"bg-gradient-to-r from-transparent via-border to-transparent\",\r\n gradientWhite: \"bg-gradient-to-r from-transparent via-white/20 to-transparent\",\r\n },\r\n margin: {\r\n none: \"\",\r\n \"y-4\": \"my-4\",\r\n \"y-2\": \"my-2\",\r\n \"y-6\": \"my-6\",\r\n \"y-8\": \"my-8\",\r\n },\r\n },\r\n defaultVariants: {\r\n orientation: \"horizontal\",\r\n variant: \"default\",\r\n margin: \"none\",\r\n },\r\n})\r\n\r\nexport interface SeparatorProps\r\n extends Omit<React.ComponentProps<typeof SeparatorPrimitive.Root>, \"orientation\">,\r\n Omit<VariantProps<typeof separatorVariants>, \"orientation\"> {\r\n orientation?: \"horizontal\" | \"vertical\"\r\n}\r\n\r\nconst Separator = React.forwardRef<\r\n React.ElementRef<typeof SeparatorPrimitive.Root>,\r\n SeparatorProps\r\n>(({ className, orientation = \"horizontal\", variant = \"default\", margin = \"none\", decorative = true, ...props }, ref) => (\r\n <SeparatorPrimitive.Root\r\n ref={ref}\r\n data-slot=\"separator\"\r\n decorative={decorative}\r\n orientation={orientation}\r\n className={cn(separatorVariants({ orientation, variant, margin }), className)}\r\n {...props}\r\n />\r\n))\r\n\r\nSeparator.displayName = \"Separator\"\r\n\r\nexport { Separator }\r\n\r\n","import * as React from \"react\"\r\nimport { cva, type VariantProps } from \"class-variance-authority\"\r\nimport { cn } from \"@/utils\"\r\n\r\n// Shared utilities\r\nconst numberToRem = (value: number): string => `${value * 0.25}rem`\r\nconst isStandardFlex = (value: string): boolean => \r\n [\"normal\", \"none\", \"1\", \"auto\", \"initial\"].includes(value)\r\n\r\n// Shared valid values constants\r\nconst VALID_SPACING_VALUES = [0, 0.5, 1, 2, 3, 4, 5, 6, 8, 10, 12, 16] as const\r\nconst VALID_GAP_VALUES = [0, 0.5, 1, 1.5, 2, 3, 4, 5, 6, 8, 12, 16] as const\r\nconst VALID_SPACING_STRING_VALUES = [\"0\", \"0.5\", \"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"8\", \"10\", \"12\", \"16\"] as const\r\n\r\n// Generate spacing variants (padding/margin)\r\nconst createSpacingVariants = (prefix: \"p\" | \"px\" | \"py\" | \"pt\" | \"pb\" | \"mx\" | \"my\" | \"mt\" | \"mb\" | \"ml\" | \"mr\") => {\r\n const base: Record<string, string> = { none: \"\" }\r\n VALID_SPACING_VALUES.forEach(v => base[v] = `${prefix}-${v}`)\r\n return base\r\n}\r\n\r\n// Generate gap variants for gapX/gapY\r\nconst createGapVariants = (prefix: string) => {\r\n const variants: Record<string, string> = {}\r\n VALID_GAP_VALUES.forEach(v => variants[String(v)] = `${prefix}-${v}`)\r\n return variants\r\n}\r\n\r\nconst flexVariants = cva(\"flex\", {\r\n variants: {\r\n direction: {\r\n row: \"flex-row\",\r\n col: \"flex-col\",\r\n \"col-lg-row\": \"flex-col lg:flex-row\",\r\n \"col-md-row\": \"flex-col md:flex-row\",\r\n \"col-sm-row\": \"flex-col sm:flex-row\",\r\n \"row-lg-col\": \"flex-row lg:flex-col\",\r\n \"row-md-col\": \"flex-row md:flex-col\",\r\n \"row-sm-col\": \"flex-row sm:flex-col\",\r\n \"col-lg-row-items-center\": \"flex-col lg:flex-row lg:items-center\",\r\n \"row-lg-col-items-center\": \"flex-row lg:flex-col lg:items-center\",\r\n },\r\n align: {\r\n start: \"items-start\",\r\n center: \"items-center\",\r\n end: \"items-end\",\r\n stretch: \"items-stretch\",\r\n baseline: \"items-baseline\",\r\n normal: \"items-normal\",\r\n },\r\n justify: {\r\n start: \"justify-start\",\r\n center: \"justify-center\",\r\n end: \"justify-end\",\r\n between: \"justify-between\",\r\n around: \"justify-around\",\r\n evenly: \"justify-evenly\",\r\n normal: \"justify-normal\",\r\n \"start-lg-end\": \"justify-start lg:justify-end\",\r\n \"start-sm-end\": \"justify-start sm:justify-end\",\r\n },\r\n gap: {\r\n \"0\": \"gap-0\",\r\n \"0.5\": \"gap-0.5\",\r\n \"1\": \"gap-1\",\r\n \"1.5\": \"gap-1.5\",\r\n \"2\": \"gap-2\",\r\n \"3\": \"gap-3\",\r\n \"4\": \"gap-4\",\r\n \"5\": \"gap-5\",\r\n \"6\": \"gap-6\",\r\n \"8\": \"gap-8\",\r\n \"12\": \"gap-12\",\r\n \"16\": \"gap-16\",\r\n small: \"gap-2\",\r\n middle: \"gap-4\",\r\n large: \"gap-8\",\r\n \"6-lg-8\": \"gap-6 lg:gap-8\",\r\n \"2-md-4\": \"gap-2 md:gap-4\",\r\n \"2-lg-6\": \"gap-2 lg:gap-6\",\r\n \"4-lg-6\": \"gap-4 lg:gap-6\",\r\n \"4-lg-8\": \"gap-4 lg:gap-8\",\r\n responsive: \"gap-2 sm:gap-4 md:gap-5 lg:gap-6\",\r\n },\r\n gapX: { none: \"\", ...createGapVariants(\"gap-x\") },\r\n gapY: { none: \"\", ...createGapVariants(\"gap-y\") },\r\n wrap: {\r\n true: \"flex-wrap\",\r\n false: \"flex-nowrap\",\r\n wrap: \"flex-wrap\",\r\n nowrap: \"flex-nowrap\",\r\n \"wrap-reverse\": \"flex-wrap-reverse\",\r\n },\r\n fullWidth: { true: \"w-full\", false: \"\" },\r\n container: { true: \"container mx-auto\", false: \"\" },\r\n padding: {\r\n none: \"\",\r\n xs: \"p-1\",\r\n sm: \"p-2\",\r\n md: \"p-4\",\r\n lg: \"p-6\",\r\n xl: \"p-8\",\r\n \"xs-x\": \"px-1\",\r\n \"sm-x\": \"px-2\",\r\n \"md-x\": \"px-4\",\r\n \"lg-x\": \"px-6\",\r\n \"xs-y\": \"py-1\",\r\n \"sm-y\": \"py-2\",\r\n \"md-y\": \"py-4\",\r\n \"lg-y\": \"py-6\",\r\n \"py-2.5\": \"py-2.5\",\r\n \"pt-0\": \"pt-0\",\r\n \"pb-3\": \"pb-3\",\r\n \"pb-4\": \"pb-4\",\r\n \"pb-6\": \"pb-6\",\r\n \"pt-6\": \"pt-6\",\r\n \"mt-0.5\": \"mt-0.5\",\r\n responsive: \"px-4 sm:px-6 md:px-7 lg:px-8 xl:px-9 2xl:px-10\",\r\n \"responsive-y\": \"py-4 sm:py-6 md:py-6 lg:py-8 xl:py-10 2xl:py-10\",\r\n \"responsive-full\": \"px-4 sm:px-6 md:px-7 lg:px-8 xl:px-9 2xl:px-10 py-4 sm:py-6 md:py-6 lg:py-8 xl:py-10 2xl:py-10\",\r\n \"responsive-lg\": \"px-4 sm:px-6 md:px-7 lg:px-8 xl:px-9 2xl:px-10 py-8\",\r\n \"md-lg\": \"p-6 md:p-8\",\r\n \"sm-md\": \"p-4 sm:p-6\",\r\n },\r\n paddingX: { none: \"\", ...createSpacingVariants(\"px\"), responsive: \"px-4 sm:px-6 md:px-7 lg:px-8 xl:px-9 2xl:px-10\" },\r\n paddingY: { none: \"\", ...createSpacingVariants(\"py\"), responsive: \"py-4 sm:py-6 md:py-6 lg:py-8 xl:py-10 2xl:py-10\" },\r\n paddingTop: { none: \"\", ...createSpacingVariants(\"pt\") },\r\n paddingBottom: { none: \"\", ...createSpacingVariants(\"pb\") },\r\n margin: {\r\n none: \"\",\r\n auto: \"mx-auto\",\r\n \"y-auto\": \"my-auto\",\r\n \"r-6-sm-0\": \"mr-6 sm:mr-0\",\r\n \"t-auto\": \"mt-auto\",\r\n \"b-4\": \"mb-4\",\r\n },\r\n marginX: { none: \"\", auto: \"mx-auto\", ...createSpacingVariants(\"mx\") },\r\n marginY: { none: \"\", auto: \"my-auto\", ...createSpacingVariants(\"my\") },\r\n marginTop: { none: \"\", auto: \"mt-auto\", ...createSpacingVariants(\"mt\") },\r\n marginBottom: { none: \"\", ...createSpacingVariants(\"mb\") },\r\n marginLeft: { none: \"\", ...createSpacingVariants(\"ml\") },\r\n marginRight: { none: \"\", ...createSpacingVariants(\"mr\") },\r\n position: {\r\n relative: \"relative\",\r\n absolute: \"absolute\",\r\n fixed: \"fixed\",\r\n sticky: \"sticky\",\r\n static: \"static\",\r\n \"absolute-bottom-right\": \"absolute bottom-0 right-0\",\r\n \"absolute-left-center\": \"absolute left-6 top-1/2 transform -translate-y-1/2\",\r\n \"absolute-right-top\": \"absolute right-0 top-0\",\r\n \"absolute-inset\": \"absolute inset-0\",\r\n \"absolute-top-right\": \"absolute top-2 right-2\",\r\n },\r\n objectFit: { none: \"\", cover: \"object-cover\", contain: \"object-contain\", fill: \"object-fill\" },\r\n imageStyle: {\r\n none: \"\",\r\n \"cover-dark\": \"object-cover dark:brightness-[0.2] dark:grayscale\",\r\n \"contain-dark\": \"object-contain dark:brightness-[0.2] dark:grayscale\",\r\n },\r\n border: {\r\n none: \"\",\r\n all: \"border\",\r\n top: \"border-t\",\r\n bottom: \"border-b\",\r\n left: \"border-l\",\r\n right: \"border-r\",\r\n x: \"border-x\",\r\n y: \"border-y\",\r\n \"b-border\": \"border-b border-border\",\r\n \"b-border-50\": \"border-b border-border/50\",\r\n },\r\n height: {\r\n auto: \"\",\r\n full: \"h-full\",\r\n screen: \"h-screen\",\r\n \"2\": \"h-2\",\r\n \"4\": \"h-4\",\r\n \"6\": \"h-6\",\r\n \"8\": \"h-8\",\r\n \"10\": \"h-10\",\r\n \"12\": \"h-12\",\r\n \"14\": \"h-14\",\r\n \"16\": \"h-16\",\r\n \"24\": \"h-24\",\r\n \"28\": \"h-28\",\r\n \"32\": \"h-32\",\r\n \"64\": \"h-64\",\r\n \"min-full\": \"min-h-full\",\r\n hero: \"min-h-[300px] sm:min-h-[350px] lg:min-h-[400px] xxl:min-h-[500px]\",\r\n },\r\n maxHeight: {\r\n none: \"\",\r\n full: \"max-h-full\",\r\n screen: \"max-h-screen\",\r\n \"400\": \"max-h-[400px]\",\r\n \"500\": \"max-h-[500px]\",\r\n \"600\": \"max-h-[600px]\",\r\n \"48\": \"max-h-48\",\r\n },\r\n shrink: { true: \"shrink-0\", false: \"\", \"1\": \"shrink\" },\r\n overflow: { none: \"\", hidden: \"overflow-hidden\", auto: \"overflow-auto\", scroll: \"overflow-scroll\" },\r\n minWidth: { none: \"\", \"0\": \"min-w-0\", full: \"min-w-full\", \"120\": \"min-w-[120px]\", \"140\": \"min-w-[140px]\" },\r\n maxWidth: {\r\n none: \"\",\r\n full: \"max-w-full\",\r\n screen: \"max-w-screen\",\r\n \"100vw\": \"max-w-[100dvw]\",\r\n \"75\": \"max-w-[75%]\",\r\n \"70\": \"max-w-[70%]\",\r\n \"32\": \"max-w-[32px]\",\r\n },\r\n rounded: { none: \"\", sm: \"rounded-sm\", md: \"rounded-md\", lg: \"rounded-lg\", xl: \"rounded-xl\", full: \"rounded-full\", \"[inherit]\": \"rounded-[inherit]\" },\r\n bg: {\r\n none: \"\",\r\n primary: \"bg-primary text-primary-foreground\",\r\n muted: \"bg-muted text-foreground\",\r\n \"muted-50\": \"bg-muted\",\r\n \"white-10\": \"bg-white/10\",\r\n white: \"bg-white\",\r\n background: \"bg-background\",\r\n card: \"bg-card\",\r\n destructive: \"bg-destructive/10\",\r\n \"accent-10\": \"bg-accent/10\",\r\n \"green-500\": \"bg-green-500\",\r\n \"green-500-border\": \"bg-green-500 border-2 border-background\",\r\n \"destructive-text\": \"bg-destructive/10 text-destructive\",\r\n \"background-80\": \"bg-background/80\",\r\n \"primary-20\": \"bg-primary/20\",\r\n \"primary-10\": \"bg-primary/10\",\r\n \"primary-10-dark-20\": \"bg-primary/10 dark:bg-primary/20\",\r\n \"secondary-10\": \"bg-secondary/10\",\r\n \"secondary-10-dark-15\": \"bg-secondary/10 dark:bg-secondary/15\",\r\n \"green-100\": \"bg-green-100 text-green-800 dark:bg-green-900/30 dark:text-green-400\",\r\n \"gray-100\": \"bg-gray-100 text-gray-800 dark:bg-gray-800 dark:text-gray-300\",\r\n },\r\n hover: { none: \"\", default: \"hover:bg-primary/10\", destructive: \"hover:bg-destructive/10\", \"accent-10\": \"hover:bg-accent/10\" },\r\n opacity: { none: \"\", \"60\": \"opacity-60\", \"80\": \"opacity-80\" },\r\n width: {\r\n none: \"\",\r\n full: \"w-full\",\r\n \"2\": \"w-2\",\r\n \"4\": \"w-4\",\r\n \"6\": \"w-6\",\r\n \"8\": \"w-8\",\r\n \"10\": \"w-10\",\r\n \"12\": \"w-12\",\r\n \"16\": \"w-16\",\r\n \"100\": \"min-w-[100px]\",\r\n \"1/3\": \"w-full lg:w-1/3\",\r\n \"2/3\": \"w-full lg:w-2/3\",\r\n \"400\": \"w-[400px] max-w-full\",\r\n },\r\n cursor: { none: \"\", pointer: \"cursor-pointer\" },\r\n textAlign: { none: \"\", center: \"text-center\", left: \"text-left\" },\r\n flex: { none: \"\", \"1\": \"flex-1\", auto: \"flex-auto\", initial: \"flex-initial\", normal: \"\" },\r\n grow: { true: \"grow\", false: \"\" },\r\n truncate: { true: \"truncate\", false: \"\" },\r\n lineClamp: { none: \"\", \"1\": \"line-clamp-1\", \"2\": \"line-clamp-2\", \"3\": \"line-clamp-3\" },\r\n display: { none: \"\", \"hidden-md-flex\": \"hidden md:flex\" },\r\n blur: { none: \"\", xl: \"blur-xl\", \"2xl\": \"blur-2xl\", \"3xl\": \"blur-3xl\" },\r\n animate: { none: \"\", pulse: \"animate-pulse\" },\r\n },\r\n defaultVariants: {\r\n direction: \"row\",\r\n align: \"normal\",\r\n justify: \"normal\",\r\n gap: \"0\",\r\n gapX: \"none\",\r\n gapY: \"none\",\r\n wrap: false,\r\n fullWidth: false,\r\n container: false,\r\n padding: \"none\",\r\n paddingX: \"none\",\r\n paddingY: \"none\",\r\n paddingTop: \"none\",\r\n paddingBottom: \"none\",\r\n margin: \"none\",\r\n marginX: \"none\",\r\n marginY: \"none\",\r\n marginTop: \"none\",\r\n marginBottom: \"none\",\r\n marginLeft: \"none\",\r\n marginRight: \"none\",\r\n position: \"static\",\r\n border: \"none\",\r\n height: \"auto\",\r\n shrink: false,\r\n overflow: \"none\",\r\n minWidth: \"none\",\r\n maxWidth: \"none\",\r\n rounded: \"none\",\r\n bg: \"none\",\r\n hover: \"none\",\r\n opacity: \"none\",\r\n width: \"none\",\r\n cursor: \"none\",\r\n textAlign: \"none\",\r\n flex: \"normal\",\r\n grow: false,\r\n truncate: false,\r\n lineClamp: \"none\",\r\n display: \"none\",\r\n objectFit: \"none\",\r\n imageStyle: \"none\",\r\n blur: \"none\",\r\n animate: \"none\",\r\n maxHeight: \"none\",\r\n },\r\n})\r\n\r\n// Helper functions\r\nconst computeDirection = (\r\n direction?: VariantProps<typeof flexVariants>[\"direction\"],\r\n vertical?: boolean,\r\n orientation?: \"horizontal\" | \"vertical\"\r\n): VariantProps<typeof flexVariants>[\"direction\"] => {\r\n if (direction) return direction\r\n return (vertical || orientation === \"vertical\") ? \"col\" : \"row\"\r\n}\r\n\r\nconst processGap = (\r\n gap: VariantProps<typeof flexVariants>[\"gap\"] | string | number | undefined,\r\n validGapVariants: (string | number)[]\r\n): { gapVariant?: VariantProps<typeof flexVariants>[\"gap\"]; gapStyle?: string } => {\r\n if (!gap) return {}\r\n if (validGapVariants.includes(gap as string | number)) {\r\n return { gapVariant: (typeof gap === \"number\" ? String(gap) : gap) as VariantProps<typeof flexVariants>[\"gap\"] }\r\n }\r\n return typeof gap === \"number\" ? { gapStyle: numberToRem(gap) } : typeof gap === \"string\" ? { gapStyle: gap } : {}\r\n}\r\n\r\nconst processFlex = (\r\n flexProp: string | undefined,\r\n style: React.CSSProperties\r\n): { flexVariant: VariantProps<typeof flexVariants>[\"flex\"]; flexStyle: React.CSSProperties } => {\r\n const flexStyle = { ...style }\r\n const isStandard = flexProp ? isStandardFlex(flexProp) : true\r\n const flexVariant: VariantProps<typeof flexVariants>[\"flex\"] = isStandard \r\n ? (flexProp as VariantProps<typeof flexVariants>[\"flex\"] || \"normal\") \r\n : \"normal\"\r\n if (flexProp && !isStandard) flexStyle.flex = flexProp\r\n return { flexVariant, flexStyle }\r\n}\r\n\r\nconst processWrap = (\r\n wrap: boolean | VariantProps<typeof flexVariants>[\"wrap\"] | undefined\r\n): VariantProps<typeof flexVariants>[\"wrap\"] => {\r\n if (wrap === true) return \"wrap\"\r\n if (wrap === false) return \"nowrap\"\r\n if (typeof wrap === \"string\") return wrap\r\n return \"nowrap\"\r\n}\r\n\r\nconst processSpacing = <T extends VariantProps<typeof flexVariants>[\"paddingX\"] | VariantProps<typeof flexVariants>[\"marginLeft\"] | VariantProps<typeof flexVariants>[\"marginX\"]>(\r\n spacing: T | number | string | undefined\r\n): T | undefined => {\r\n if (!spacing) return undefined\r\n if (typeof spacing === \"number\" && VALID_SPACING_VALUES.includes(spacing as typeof VALID_SPACING_VALUES[number])) {\r\n return String(spacing) as T\r\n }\r\n if (typeof spacing === \"string\" && VALID_SPACING_STRING_VALUES.includes(spacing as typeof VALID_SPACING_STRING_VALUES[number])) {\r\n return spacing as T\r\n }\r\n return spacing as T\r\n}\r\n\r\nexport interface FlexProps\r\n extends Omit<React.HTMLAttributes<HTMLDivElement>, \"style\">,\r\n Omit<VariantProps<typeof flexVariants>, \"flex\" | \"gap\" | \"wrap\" | \"paddingX\" | \"paddingY\" | \"paddingTop\" | \"paddingBottom\" | \"marginX\" | \"marginY\" | \"marginTop\" | \"marginBottom\" | \"marginLeft\" | \"marginRight\"> {\r\n component?: React.ComponentType<React.HTMLAttributes<HTMLElement>>\r\n vertical?: boolean\r\n orientation?: \"horizontal\" | \"vertical\"\r\n flex?: \"none\" | \"1\" | \"auto\" | \"initial\" | \"normal\" | string\r\n gap?: VariantProps<typeof flexVariants>[\"gap\"] | string | number\r\n wrap?: VariantProps<typeof flexVariants>[\"wrap\"] | boolean\r\n paddingX?: VariantProps<typeof flexVariants>[\"paddingX\"] | number | \"0\" | \"0.5\" | \"1\" | \"2\" | \"3\" | \"4\" | \"5\" | \"6\" | \"8\" | \"10\" | \"12\" | \"16\"\r\n paddingY?: VariantProps<typeof flexVariants>[\"paddingY\"] | number | \"0\" | \"0.5\" | \"1\" | \"2\" | \"3\" | \"4\" | \"5\" | \"6\" | \"8\" | \"10\" | \"12\" | \"16\"\r\n paddingTop?: VariantProps<typeof flexVariants>[\"paddingTop\"] | number\r\n paddingBottom?: VariantProps<typeof flexVariants>[\"paddingBottom\"] | number\r\n marginX?: VariantProps<typeof flexVariants>[\"marginX\"] | number\r\n marginY?: VariantProps<typeof flexVariants>[\"marginY\"] | number\r\n marginTop?: VariantProps<typeof flexVariants>[\"marginTop\"] | number\r\n marginBottom?: VariantProps<typeof flexVariants>[\"marginBottom\"] | number\r\n marginLeft?: VariantProps<typeof flexVariants>[\"marginLeft\"] | number\r\n marginRight?: VariantProps<typeof flexVariants>[\"marginRight\"] | number\r\n as?: React.ElementType\r\n style?: React.CSSProperties\r\n}\r\n\r\nexport const Flex = React.forwardRef<HTMLDivElement, FlexProps>(\r\n (\r\n {\r\n className,\r\n direction,\r\n align,\r\n justify,\r\n gap,\r\n gapX,\r\n gapY,\r\n wrap = false,\r\n fullWidth,\r\n container,\r\n padding,\r\n paddingX,\r\n paddingY,\r\n paddingTop,\r\n paddingBottom,\r\n margin,\r\n marginX,\r\n marginY,\r\n marginTop,\r\n marginBottom,\r\n marginLeft,\r\n marginRight,\r\n position,\r\n border,\r\n height,\r\n maxHeight,\r\n shrink,\r\n overflow,\r\n minWidth,\r\n maxWidth,\r\n rounded,\r\n bg,\r\n hover,\r\n opacity,\r\n width,\r\n cursor,\r\n textAlign,\r\n flex: flexProp = \"normal\",\r\n grow,\r\n truncate,\r\n lineClamp,\r\n display,\r\n objectFit,\r\n imageStyle,\r\n blur,\r\n animate,\r\n component,\r\n vertical = false,\r\n orientation = \"horizontal\",\r\n as: Component = component || \"div\",\r\n style,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const validGapVariants = React.useMemo(() => [\r\n ...VALID_GAP_VALUES,\r\n \"small\", \"middle\", \"large\",\r\n \"6-lg-8\", \"2-md-4\", \"2-lg-6\", \"4-lg-6\", \"4-lg-8\", \"responsive\"\r\n ], [])\r\n\r\n const computedDirection = React.useMemo(\r\n () => computeDirection(direction, vertical, orientation),\r\n [direction, vertical, orientation]\r\n )\r\n\r\n const { gapVariant, gapStyle } = React.useMemo(\r\n () => processGap(gap, validGapVariants),\r\n [gap, validGapVariants]\r\n )\r\n\r\n const { flexVariant, flexStyle: processedFlexStyle } = React.useMemo(\r\n () => processFlex(flexProp, style || {}),\r\n [flexProp, style]\r\n )\r\n\r\n const wrapVariant = React.useMemo(() => processWrap(wrap), [wrap])\r\n\r\n // Process all spacing props\r\n const spacingVariants = React.useMemo(() => ({\r\n paddingX: processSpacing(paddingX),\r\n paddingY: processSpacing(paddingY),\r\n paddingTop: processSpacing(paddingTop),\r\n paddingBottom: processSpacing(paddingBottom),\r\n marginX: processSpacing(marginX),\r\n marginY: processSpacing(marginY),\r\n marginTop: processSpacing(marginTop),\r\n marginBottom: processSpacing(marginBottom),\r\n marginLeft: processSpacing(marginLeft),\r\n marginRight: processSpacing(marginRight),\r\n }), [paddingX, paddingY, paddingTop, paddingBottom, marginX, marginY, marginTop, marginBottom, marginLeft, marginRight])\r\n\r\n const mergedStyle = React.useMemo(() => {\r\n const styles: React.CSSProperties = { ...processedFlexStyle }\r\n if (gapStyle) styles.gap = gapStyle\r\n return Object.keys(styles).length > 0 ? styles : undefined\r\n }, [processedFlexStyle, gapStyle])\r\n\r\n return (\r\n <Component\r\n ref={ref}\r\n className={cn(\r\n flexVariants({\r\n direction: computedDirection,\r\n align,\r\n justify,\r\n gap: gapVariant,\r\n gapX,\r\n gapY,\r\n wrap: wrapVariant,\r\n fullWidth,\r\n container,\r\n padding,\r\n paddingX: spacingVariants.paddingX,\r\n paddingY: spacingVariants.paddingY,\r\n paddingTop: spacingVariants.paddingTop,\r\n paddingBottom: spacingVariants.paddingBottom,\r\n margin,\r\n marginX: spacingVariants.marginX,\r\n marginY: spacingVariants.marginY,\r\n marginTop: spacingVariants.marginTop,\r\n marginBottom: spacingVariants.marginBottom,\r\n marginLeft: spacingVariants.marginLeft,\r\n marginRight: spacingVariants.marginRight,\r\n position,\r\n border,\r\n height,\r\n maxHeight,\r\n shrink,\r\n overflow,\r\n minWidth,\r\n maxWidth,\r\n rounded,\r\n bg,\r\n hover,\r\n opacity,\r\n width,\r\n cursor,\r\n textAlign,\r\n flex: flexVariant,\r\n grow,\r\n truncate,\r\n lineClamp,\r\n display,\r\n objectFit,\r\n imageStyle,\r\n blur,\r\n animate,\r\n }),\r\n className\r\n )}\r\n style={mergedStyle}\r\n {...props}\r\n />\r\n )\r\n }\r\n)\r\n\r\nFlex.displayName = \"Flex\"\r\n\r\n","\"use client\"\r\n\r\nimport { useState } from \"react\"\r\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\"\r\nimport { LockIcon, UnlockIcon } from \"lucide-react\"\r\n\r\nimport { Button } from \"@/components/ui/button\"\r\nimport {\r\n Tooltip,\r\n TooltipContent,\r\n TooltipTrigger,\r\n} from \"@/components/ui/tooltip\"\r\nimport { IconSize } from \"@/components/ui/typography\"\r\n\r\nexport function EditModeTogglePlugin() {\r\n const [editor] = useLexicalComposerContext()\r\n const [isEditable, setIsEditable] = useState(() => editor.isEditable())\r\n\r\n return (\r\n <Tooltip>\r\n <TooltipTrigger asChild>\r\n <Button\r\n variant={\"ghost\"}\r\n onClick={() => {\r\n editor.setEditable(!editor.isEditable())\r\n setIsEditable(editor.isEditable())\r\n }}\r\n title=\"Read-Only Mode\"\r\n aria-label={`${!isEditable ? \"Unlock\" : \"Lock\"} read-only mode`}\r\n size={\"sm\"}\r\n className=\"p-2\"\r\n >\r\n {isEditable ? (\r\n <IconSize size=\"sm\">\r\n <LockIcon />\r\n </IconSize>\r\n ) : (\r\n <IconSize size=\"sm\">\r\n <UnlockIcon />\r\n </IconSize>\r\n )}\r\n </Button>\r\n </TooltipTrigger>\r\n <TooltipContent>\r\n {isEditable ? \"View Only Mode\" : \"Edit Mode\"}\r\n </TooltipContent>\r\n </Tooltip>\r\n )\r\n}\r\n","\"use client\"\r\n\r\nimport { exportFile, importFile } from \"@lexical/file\"\r\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\"\r\nimport { DownloadIcon, UploadIcon } from \"lucide-react\"\r\n\r\nimport { Button } from \"@/components/ui/button\"\r\nimport {\r\n Tooltip,\r\n TooltipContent,\r\n TooltipTrigger,\r\n} from \"@/components/ui/tooltip\"\r\nimport { IconSize } from \"@/components/ui/typography\"\r\n\r\nexport function ImportExportPlugin() {\r\n const [editor] = useLexicalComposerContext()\r\n return (\r\n <>\r\n <Tooltip>\r\n <TooltipTrigger asChild>\r\n <Button\r\n variant={\"ghost\"}\r\n onClick={() => importFile(editor)}\r\n title=\"Import\"\r\n aria-label=\"Import editor state from JSON\"\r\n size={\"sm\"}\r\n className=\"p-2\"\r\n >\r\n <IconSize size=\"sm\">\r\n <UploadIcon />\r\n </IconSize>\r\n </Button>\r\n </TooltipTrigger>\r\n <TooltipContent>Import Content</TooltipContent>\r\n </Tooltip>\r\n\r\n <Tooltip>\r\n <TooltipTrigger asChild>\r\n <Button\r\n variant={\"ghost\"}\r\n onClick={() =>\r\n exportFile(editor, {\r\n fileName: `Playground ${new Date().toISOString()}`,\r\n source: \"Playground\",\r\n })\r\n }\r\n title=\"Export\"\r\n aria-label=\"Export editor state to JSON\"\r\n size={\"sm\"}\r\n className=\"p-2\"\r\n >\r\n <IconSize size=\"sm\">\r\n <DownloadIcon />\r\n </IconSize>\r\n </Button>\r\n </TooltipTrigger>\r\n <TooltipContent>Export Content</TooltipContent>\r\n </Tooltip>\r\n </>\r\n )\r\n}\r\n","\"use client\"\r\n\r\nimport { useCallback } from \"react\"\r\nimport { $createCodeNode, $isCodeNode } from \"@lexical/code\"\r\nimport {\r\n $convertFromMarkdownString,\r\n $convertToMarkdownString,\r\n Transformer,\r\n} from \"@lexical/markdown\"\r\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\"\r\nimport { $createTextNode, $getRoot } from \"lexical\"\r\nimport { FileTextIcon } from \"lucide-react\"\r\n\r\nimport { Button } from \"@/components/ui/button\"\r\nimport { IconSize } from \"@/components/ui/typography\"\r\n\r\nexport function MarkdownTogglePlugin({\r\n shouldPreserveNewLinesInMarkdown,\r\n transformers,\r\n}: {\r\n shouldPreserveNewLinesInMarkdown: boolean\r\n transformers: Array<Transformer>\r\n}) {\r\n const [editor] = useLexicalComposerContext()\r\n\r\n const handleMarkdownToggle = useCallback(() => {\r\n editor.update(() => {\r\n const root = $getRoot()\r\n const firstChild = root.getFirstChild()\r\n if ($isCodeNode(firstChild) && firstChild.getLanguage() === \"markdown\") {\r\n $convertFromMarkdownString(\r\n firstChild.getTextContent(),\r\n transformers,\r\n undefined, // node\r\n shouldPreserveNewLinesInMarkdown\r\n )\r\n } else {\r\n const markdown = $convertToMarkdownString(\r\n transformers,\r\n undefined, //node\r\n shouldPreserveNewLinesInMarkdown\r\n )\r\n const codeNode = $createCodeNode(\"markdown\")\r\n codeNode.append($createTextNode(markdown))\r\n root.clear().append(codeNode)\r\n if (markdown.length === 0) {\r\n codeNode.select()\r\n }\r\n }\r\n })\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [editor, shouldPreserveNewLinesInMarkdown])\r\n\r\n return (\r\n <Button\r\n variant={\"ghost\"}\r\n onClick={handleMarkdownToggle}\r\n title=\"Convert From Markdown\"\r\n aria-label=\"Convert from markdown\"\r\n size={\"sm\"}\r\n className=\"p-2\"\r\n >\r\n <IconSize size=\"sm\">\r\n <FileTextIcon />\r\n </IconSize>\r\n </Button>\r\n )\r\n}\r\n","\"use client\"\r\n\r\nimport { useEffect } from \"react\"\r\nimport {\r\n editorStateFromSerializedDocument,\r\n SerializedDocument,\r\n serializedDocumentFromEditorState,\r\n} from \"@lexical/file\"\r\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\"\r\nimport { CLEAR_HISTORY_COMMAND } from \"lexical\"\r\nimport { SendIcon } from \"lucide-react\"\r\nimport { toast } from \"sonner\"\r\n\r\nimport {\r\n docFromHash,\r\n docToHash,\r\n} from \"@/components/editor/utils/doc-serialization\"\r\nimport { Button } from \"@/components/ui/button\"\r\nimport {\r\n Tooltip,\r\n TooltipContent,\r\n TooltipTrigger,\r\n} from \"@/components/ui/tooltip\"\r\nimport { IconSize } from \"@/components/ui/typography\"\r\n\r\nexport function ShareContentPlugin() {\r\n const [editor] = useLexicalComposerContext()\r\n async function shareDoc(doc: SerializedDocument): Promise<void> {\r\n const url = new URL(window.location.toString())\r\n url.hash = await docToHash(doc)\r\n const newUrl = url.toString()\r\n window.history.replaceState({}, \"\", newUrl)\r\n await window.navigator.clipboard.writeText(newUrl)\r\n }\r\n useEffect(() => {\r\n docFromHash(window.location.hash).then((doc) => {\r\n if (doc && doc.source === \"editor\") {\r\n editor.setEditorState(editorStateFromSerializedDocument(editor, doc))\r\n editor.dispatchCommand(CLEAR_HISTORY_COMMAND, undefined)\r\n }\r\n })\r\n }, [editor])\r\n\r\n return (\r\n <Tooltip>\r\n <TooltipTrigger asChild>\r\n <Button\r\n variant={\"ghost\"}\r\n onClick={() =>\r\n shareDoc(\r\n serializedDocumentFromEditorState(editor.getEditorState(), {\r\n source: \"editor\",\r\n })\r\n ).then(\r\n () => toast.success(\"URL copied to clipboard\"),\r\n () => toast.error(\"URL could not be copied to clipboard\")\r\n )\r\n }\r\n title=\"Share\"\r\n aria-label=\"Share Playground link to current editor state\"\r\n size={\"sm\"}\r\n className=\"p-2\"\r\n >\r\n <IconSize size=\"sm\">\r\n <SendIcon />\r\n </IconSize>\r\n </Button>\r\n </TooltipTrigger>\r\n <TooltipContent>Share Content</TooltipContent>\r\n </Tooltip>\r\n )\r\n}\r\n","import { SerializedDocument } from \"@lexical/file\"\r\n\r\nasync function* generateReader<T = unknown>(\r\n reader: ReadableStreamDefaultReader<T>\r\n) {\r\n let done = false\r\n while (!done) {\r\n const res = await reader.read()\r\n const { value } = res\r\n if (value !== undefined) {\r\n yield value\r\n }\r\n done = res.done\r\n }\r\n}\r\n\r\nasync function readBytestoString(\r\n reader: ReadableStreamDefaultReader\r\n): Promise<string> {\r\n const output = []\r\n const chunkSize = 0x8000\r\n for await (const value of generateReader(reader)) {\r\n for (let i = 0; i < value.length; i += chunkSize) {\r\n output.push(String.fromCharCode(...value.subarray(i, i + chunkSize)))\r\n }\r\n }\r\n return output.join(\"\")\r\n}\r\n\r\nexport async function docToHash(doc: SerializedDocument): Promise<string> {\r\n const cs = new CompressionStream(\"gzip\")\r\n const writer = cs.writable.getWriter()\r\n const [, output] = await Promise.all([\r\n writer\r\n .write(new TextEncoder().encode(JSON.stringify(doc)))\r\n .then(() => writer.close()),\r\n readBytestoString(cs.readable.getReader()),\r\n ])\r\n return `#doc=${btoa(output)\r\n .replace(/\\//g, \"_\")\r\n .replace(/\\+/g, \"-\")\r\n .replace(/=+$/, \"\")}`\r\n}\r\n\r\nexport async function docFromHash(\r\n hash: string\r\n): Promise<SerializedDocument | null> {\r\n const m = /^#doc=(.*)$/.exec(hash)\r\n if (!m) {\r\n return null\r\n }\r\n const ds = new DecompressionStream(\"gzip\")\r\n const writer = ds.writable.getWriter()\r\n const b64 = atob(m[1].replace(/_/g, \"/\").replace(/-/g, \"+\"))\r\n const array = new Uint8Array(b64.length)\r\n for (let i = 0; i < b64.length; i++) {\r\n array[i] = b64.charCodeAt(i)\r\n }\r\n const closed = writer.write(array).then(() => writer.close())\r\n const output = []\r\n for await (const chunk of generateReader(\r\n ds.readable.pipeThrough(new TextDecoderStream()).getReader()\r\n )) {\r\n output.push(chunk)\r\n }\r\n await closed\r\n return JSON.parse(output.join(\"\"))\r\n}\r\n","\"use client\"\r\n\r\n/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\nimport { useEffect, useRef, useState } from \"react\"\r\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\"\r\nimport type { LexicalCommand, LexicalEditor, RangeSelection } from \"lexical\"\r\nimport {\r\n $getSelection,\r\n $isRangeSelection,\r\n COMMAND_PRIORITY_EDITOR,\r\n createCommand,\r\n REDO_COMMAND,\r\n UNDO_COMMAND,\r\n} from \"lexical\"\r\nimport { MicIcon } from \"lucide-react\"\r\n\r\nimport { useReport } from \"@/components/editor/editor-hooks/use-report\"\r\nimport { CAN_USE_DOM } from \"@/components/editor/shared/can-use-dom\"\r\nimport { Button } from \"@/components/ui/button\"\r\nimport {\r\n Tooltip,\r\n TooltipContent,\r\n TooltipTrigger,\r\n} from \"@/components/ui/tooltip\"\r\nimport { IconSize } from \"@/components/ui/typography\"\r\n\r\nexport const SPEECH_TO_TEXT_COMMAND: LexicalCommand<boolean> = createCommand(\r\n \"SPEECH_TO_TEXT_COMMAND\"\r\n)\r\n\r\nconst VOICE_COMMANDS: Readonly<\r\n Record<\r\n string,\r\n (arg0: { editor: LexicalEditor; selection: RangeSelection }) => void\r\n >\r\n> = {\r\n \"\\n\": ({ selection }) => {\r\n selection.insertParagraph()\r\n },\r\n redo: ({ editor }) => {\r\n editor.dispatchCommand(REDO_COMMAND, undefined)\r\n },\r\n undo: ({ editor }) => {\r\n editor.dispatchCommand(UNDO_COMMAND, undefined)\r\n },\r\n}\r\n\r\nexport const SUPPORT_SPEECH_RECOGNITION: boolean =\r\n CAN_USE_DOM &&\r\n (\"SpeechRecognition\" in window || \"webkitSpeechRecognition\" in window)\r\n\r\nfunction SpeechToTextPluginImpl() {\r\n const [editor] = useLexicalComposerContext()\r\n const [isEnabled, setIsEnabled] = useState<boolean>(false)\r\n const [isSpeechToText, setIsSpeechToText] = useState<boolean>(false)\r\n const SpeechRecognition =\r\n CAN_USE_DOM &&\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n ((window as any).SpeechRecognition || (window as any).webkitSpeechRecognition)\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n const recognition = useRef<any | null>(null)\r\n const report = useReport()\r\n\r\n useEffect(() => {\r\n if (isEnabled && recognition.current === null) {\r\n recognition.current = new SpeechRecognition()\r\n recognition.current.continuous = true\r\n recognition.current.interimResults = true\r\n recognition.current.addEventListener(\r\n \"result\",\r\n (event: typeof SpeechRecognition) => {\r\n const resultItem = event.results.item(event.resultIndex)\r\n const { transcript } = resultItem.item(0)\r\n report(transcript)\r\n\r\n if (!resultItem.isFinal) {\r\n return\r\n }\r\n\r\n editor.update(() => {\r\n const selection = $getSelection()\r\n\r\n if ($isRangeSelection(selection)) {\r\n const command = VOICE_COMMANDS[transcript.toLowerCase().trim()]\r\n\r\n if (command) {\r\n command({\r\n editor,\r\n selection,\r\n })\r\n } else if (transcript.match(/\\s*\\n\\s*/)) {\r\n selection.insertParagraph()\r\n } else {\r\n selection.insertText(transcript)\r\n }\r\n }\r\n })\r\n }\r\n )\r\n }\r\n\r\n if (recognition.current) {\r\n if (isEnabled) {\r\n recognition.current.start()\r\n } else {\r\n recognition.current.stop()\r\n }\r\n }\r\n\r\n return () => {\r\n if (recognition.current !== null) {\r\n recognition.current.stop()\r\n }\r\n }\r\n }, [SpeechRecognition, editor, isEnabled, report])\r\n useEffect(() => {\r\n return editor.registerCommand(\r\n SPEECH_TO_TEXT_COMMAND,\r\n (_isEnabled: boolean) => {\r\n setIsEnabled(_isEnabled)\r\n return true\r\n },\r\n COMMAND_PRIORITY_EDITOR\r\n )\r\n }, [editor])\r\n\r\n return (\r\n <Tooltip>\r\n <TooltipTrigger asChild>\r\n <Button\r\n onClick={() => {\r\n editor.dispatchCommand(SPEECH_TO_TEXT_COMMAND, !isSpeechToText)\r\n setIsSpeechToText(!isSpeechToText)\r\n }}\r\n variant={isSpeechToText ? \"secondary\" : \"ghost\"}\r\n title=\"Speech To Text\"\r\n aria-label={`${isSpeechToText ? \"Enable\" : \"Disable\"} speech to text`}\r\n className=\"p-2\"\r\n size={\"sm\"}\r\n >\r\n <IconSize size=\"sm\">\r\n <MicIcon />\r\n </IconSize>\r\n </Button>\r\n </TooltipTrigger>\r\n <TooltipContent>Speech To Text</TooltipContent>\r\n </Tooltip>\r\n )\r\n}\r\n\r\nexport const SpeechToTextPlugin = SUPPORT_SPEECH_RECOGNITION\r\n ? SpeechToTextPluginImpl\r\n : () => null\r\n","import { useCallback, useEffect, useRef } from \"react\"\r\nimport { logger } from \"@/utils\"\r\n\r\nconst getElement = (): HTMLElement => {\r\n let element = document.getElementById(\"report-container\")\r\n\r\n if (element === null) {\r\n element = document.createElement(\"div\")\r\n element.id = \"report-container\"\r\n element.style.position = \"fixed\"\r\n element.style.top = \"50%\"\r\n element.style.left = \"50%\"\r\n element.style.fontSize = \"32px\"\r\n element.style.transform = \"translate(-50%, -50px)\"\r\n element.style.padding = \"20px\"\r\n element.style.background = \"rgba(240, 240, 240, 0.4)\"\r\n element.style.borderRadius = \"20px\"\r\n\r\n if (document.body) {\r\n document.body.appendChild(element)\r\n }\r\n }\r\n\r\n return element\r\n}\r\n\r\nexport function useReport(): (arg0: string) => ReturnType<typeof setTimeout> {\r\n const timer = useRef<ReturnType<typeof setTimeout> | null>(null)\r\n const cleanup = useCallback(() => {\r\n if (timer.current !== null) {\r\n clearTimeout(timer.current)\r\n timer.current = null\r\n }\r\n\r\n if (document.body) {\r\n document.body.removeChild(getElement())\r\n }\r\n }, [])\r\n\r\n useEffect(() => {\r\n return cleanup\r\n }, [cleanup])\r\n\r\n return useCallback(\r\n (content) => {\r\n logger.debug(\"Report content\", { content })\r\n const element = getElement()\r\n if (timer.current !== null) {\r\n clearTimeout(timer.current)\r\n }\r\n element.innerHTML = content\r\n timer.current = setTimeout(cleanup, 1000)\r\n return timer.current\r\n },\r\n [cleanup]\r\n )\r\n}\r\n","\"use client\"\r\n\r\nimport { JSX } from \"react\"\r\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\"\r\nimport { TreeView } from \"@lexical/react/LexicalTreeView\"\r\nimport { NotebookPenIcon } from \"lucide-react\"\r\n\r\nimport { Button } from \"@/components/ui/button\"\r\nimport {\r\n Dialog,\r\n DialogContent,\r\n DialogDescription,\r\n DialogHeader,\r\n DialogTitle,\r\n DialogTrigger,\r\n} from \"@/components/ui/dialog\"\r\nimport { ScrollArea, ScrollBar } from \"@/components/ui/scroll-area\"\r\nimport { IconSize } from \"@/components/ui/typography\"\r\n\r\nexport function TreeViewPlugin(): JSX.Element {\r\n const [editor] = useLexicalComposerContext()\r\n return (\r\n <Dialog>\r\n <DialogTrigger asChild>\r\n <Button size={\"sm\"} variant={\"ghost\"} className=\"p-2\">\r\n <IconSize size=\"sm\">\r\n <NotebookPenIcon />\r\n </IconSize>\r\n </Button>\r\n </DialogTrigger>\r\n <DialogContent>\r\n <DialogHeader>\r\n <DialogTitle>Tree View</DialogTitle>\r\n <DialogDescription>\r\n Xem cấu trúc cây của nội dung editor\r\n </DialogDescription>\r\n </DialogHeader>\r\n <ScrollArea className=\"bg-foreground text-background h-96 overflow-hidden rounded-lg p-2\">\r\n <TreeView\r\n viewClassName=\"tree-view-output\"\r\n treeTypeButtonClassName=\"debug-treetype-button\"\r\n timeTravelPanelClassName=\"debug-timetravel-panel\"\r\n timeTravelButtonClassName=\"debug-timetravel-button\"\r\n timeTravelPanelSliderClassName=\"debug-timetravel-panel-slider\"\r\n timeTravelPanelButtonClassName=\"debug-timetravel-panel-button\"\r\n editor={editor}\r\n />\r\n <ScrollBar orientation=\"vertical\" />\r\n </ScrollArea>\r\n </DialogContent>\r\n </Dialog>\r\n )\r\n}\r\n","\"use client\"\r\n\r\nimport * as React from \"react\"\r\nimport * as ScrollAreaPrimitive from \"@radix-ui/react-scroll-area\"\r\nimport { cva, type VariantProps } from \"class-variance-authority\"\r\n\r\nimport { cn } from \"@/utils\"\r\n\r\nconst scrollAreaVariants = cva(\"relative\", {\r\n variants: {\r\n fullWidth: {\r\n true: \"w-full flex-1\",\r\n false: \"\",\r\n },\r\n },\r\n defaultVariants: {\r\n fullWidth: false,\r\n },\r\n})\r\n\r\nexport interface ScrollAreaProps\r\n extends React.ComponentProps<typeof ScrollAreaPrimitive.Root>,\r\n VariantProps<typeof scrollAreaVariants> {}\r\n\r\nfunction ScrollArea({\r\n className,\r\n children,\r\n fullWidth,\r\n ...props\r\n}: ScrollAreaProps) {\r\n return (\r\n <ScrollAreaPrimitive.Root\r\n data-slot=\"scroll-area\"\r\n className={cn(scrollAreaVariants({ fullWidth }), className)}\r\n suppressHydrationWarning\r\n {...props}\r\n >\r\n <ScrollAreaPrimitive.Viewport\r\n data-slot=\"scroll-area-viewport\"\r\n className=\"focus-visible:ring-ring/50 size-full min-w-0 max-w-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-[3px] focus-visible:outline-1 overflow-x-hidden\"\r\n suppressHydrationWarning\r\n >\r\n {children}\r\n </ScrollAreaPrimitive.Viewport>\r\n <ScrollBar />\r\n <ScrollAreaPrimitive.Corner />\r\n </ScrollAreaPrimitive.Root>\r\n )\r\n}\r\n\r\nfunction ScrollBar({\r\n className,\r\n orientation = \"vertical\",\r\n ...props\r\n}: React.ComponentProps<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>) {\r\n return (\r\n <ScrollAreaPrimitive.ScrollAreaScrollbar\r\n data-slot=\"scroll-area-scrollbar\"\r\n orientation={orientation}\r\n className={cn(\r\n \"flex touch-none p-px transition-colors select-none\",\r\n orientation === \"vertical\" &&\r\n \"h-full w-2.5 border-l border-l-transparent\",\r\n orientation === \"horizontal\" &&\r\n \"h-2.5 flex-col border-t border-t-transparent\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n <ScrollAreaPrimitive.ScrollAreaThumb\r\n data-slot=\"scroll-area-thumb\"\r\n className=\"bg-border relative flex-1 rounded-full\"\r\n />\r\n </ScrollAreaPrimitive.ScrollAreaScrollbar>\r\n )\r\n}\r\n\r\nexport { ScrollArea, ScrollBar }\r\n\r\n","\"use client\"\r\n\r\n/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\nimport * as React from \"react\"\r\nimport { JSX } from \"react\"\r\nimport {\r\n createLinkMatcherWithRegExp,\r\n AutoLinkPlugin as LexicalAutoLinkPlugin,\r\n} from \"@lexical/react/LexicalAutoLinkPlugin\"\r\n\r\nconst URL_REGEX =\r\n /((https?:\\/\\/(www\\.)?)|(www\\.))[-a-zA-Z0-9@:%._+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b([-a-zA-Z0-9()@:%_+.~#?&//=]*)(?<![-.+():%])/\r\n\r\nconst EMAIL_REGEX =\r\n /(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))/\r\n\r\nconst MATCHERS = [\r\n createLinkMatcherWithRegExp(URL_REGEX, (text) => {\r\n return text.startsWith(\"http\") ? text : `https://${text}`\r\n }),\r\n createLinkMatcherWithRegExp(EMAIL_REGEX, (text) => {\r\n return `mailto:${text}`\r\n }),\r\n]\r\n\r\nexport function AutoLinkPlugin(): JSX.Element {\r\n return <LexicalAutoLinkPlugin matchers={MATCHERS} />\r\n}\r\n","\"use client\"\r\n\r\n/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\nimport { JSX, useEffect, useRef, useState } from \"react\"\r\nimport {\r\n $isCodeNode,\r\n CodeNode,\r\n getLanguageFriendlyName,\r\n normalizeCodeLang,\r\n} from \"@lexical/code\"\r\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\"\r\nimport { $getNearestNodeFromDOMNode, isHTMLElement } from \"lexical\"\r\nimport { createPortal } from \"react-dom\"\r\n\r\nimport { useDebounce } from \"@/components/editor/editor-hooks/use-debounce\"\r\nimport { CopyButton } from \"@/components/editor/editor-ui/code-button\"\r\n\r\nconst CODE_PADDING = 8\r\n\r\ninterface Position {\r\n top: string\r\n right: string\r\n}\r\n\r\nfunction CodeActionMenuContainer({\r\n anchorElem,\r\n}: {\r\n anchorElem: HTMLElement\r\n}): JSX.Element {\r\n const [editor] = useLexicalComposerContext()\r\n\r\n const [lang, setLang] = useState(\"\")\r\n const [isShown, setShown] = useState<boolean>(false)\r\n const [shouldListenMouseMove, setShouldListenMouseMove] =\r\n useState<boolean>(false)\r\n const [position, setPosition] = useState<Position>({\r\n right: \"0\",\r\n top: \"0\",\r\n })\r\n const codeSetRef = useRef<Set<string>>(new Set())\r\n const codeDOMNodeRef = useRef<HTMLElement | null>(null)\r\n\r\n function getCodeDOMNode(): HTMLElement | null {\r\n return codeDOMNodeRef.current\r\n }\r\n\r\n const debouncedOnMouseMove = useDebounce(\r\n (event: MouseEvent) => {\r\n const { codeDOMNode, isOutside } = getMouseInfo(event)\r\n if (isOutside) {\r\n setShown(false)\r\n return\r\n }\r\n\r\n if (!codeDOMNode) {\r\n return\r\n }\r\n\r\n codeDOMNodeRef.current = codeDOMNode\r\n\r\n let codeNode: CodeNode | null = null\r\n let _lang = \"\"\r\n\r\n editor.update(() => {\r\n const maybeCodeNode = $getNearestNodeFromDOMNode(codeDOMNode)\r\n\r\n if ($isCodeNode(maybeCodeNode)) {\r\n codeNode = maybeCodeNode\r\n _lang = codeNode.getLanguage() || \"\"\r\n }\r\n })\r\n\r\n if (codeNode) {\r\n const { y: editorElemY, right: editorElemRight } =\r\n anchorElem.getBoundingClientRect()\r\n const { y, right } = codeDOMNode.getBoundingClientRect()\r\n setLang(_lang)\r\n setShown(true)\r\n setPosition({\r\n right: `${editorElemRight - right + CODE_PADDING}px`,\r\n top: `${y - editorElemY}px`,\r\n })\r\n }\r\n },\r\n 50,\r\n 1000\r\n )\r\n\r\n useEffect(() => {\r\n if (!shouldListenMouseMove) {\r\n return\r\n }\r\n\r\n document.addEventListener(\"mousemove\", debouncedOnMouseMove)\r\n\r\n return () => {\r\n setShown(false)\r\n debouncedOnMouseMove.cancel()\r\n document.removeEventListener(\"mousemove\", debouncedOnMouseMove)\r\n }\r\n }, [shouldListenMouseMove, debouncedOnMouseMove])\r\n\r\n useEffect(() => {\r\n return editor.registerMutationListener(\r\n CodeNode,\r\n (mutations) => {\r\n editor.getEditorState().read(() => {\r\n for (const [key, type] of mutations) {\r\n switch (type) {\r\n case \"created\":\r\n codeSetRef.current.add(key)\r\n break\r\n\r\n case \"destroyed\":\r\n codeSetRef.current.delete(key)\r\n break\r\n\r\n default:\r\n break\r\n }\r\n }\r\n })\r\n setShouldListenMouseMove(codeSetRef.current.size > 0)\r\n },\r\n { skipInitialization: false }\r\n )\r\n }, [editor])\r\n\r\n const _normalizedLang = normalizeCodeLang(lang)\r\n const codeFriendlyName = getLanguageFriendlyName(lang)\r\n\r\n return (\r\n <>\r\n {isShown ? (\r\n <div className=\"code-action-menu-container\" style={{ ...position }}>\r\n <div className=\"code-highlight-language\">{codeFriendlyName}</div>\r\n <CopyButton editor={editor} getCodeDOMNode={getCodeDOMNode} />\r\n </div>\r\n ) : null}\r\n </>\r\n )\r\n}\r\n\r\nfunction getMouseInfo(event: MouseEvent): {\r\n codeDOMNode: HTMLElement | null\r\n isOutside: boolean\r\n} {\r\n const target = event.target\r\n\r\n if (isHTMLElement(target)) {\r\n const codeDOMNode = target.closest<HTMLElement>(\r\n \"code.PlaygroundEditorTheme__code\"\r\n )\r\n const isOutside = !(\r\n codeDOMNode ||\r\n target.closest<HTMLElement>(\"div.code-action-menu-container\")\r\n )\r\n\r\n return { codeDOMNode, isOutside }\r\n } else {\r\n return { codeDOMNode: null, isOutside: true }\r\n }\r\n}\r\n\r\nexport function CodeActionMenuPlugin({\r\n anchorElem = document.body,\r\n}: {\r\n anchorElem: HTMLElement | null\r\n}): React.ReactPortal | null {\r\n if (!anchorElem) {\r\n return null\r\n }\r\n\r\n return createPortal(\r\n <CodeActionMenuContainer anchorElem={anchorElem} />,\r\n anchorElem\r\n )\r\n}\r\n","import { useEffect, useMemo, useRef } from \"react\"\r\n// Import debounce directly to avoid loading entire lodash library\r\n// This reduces bundle size significantly\r\nimport debounce from \"lodash/debounce\"\r\n\r\nexport function useDebounce<T extends (...args: never[]) => void>(\r\n fn: T,\r\n ms: number,\r\n maxWait?: number\r\n) {\r\n const funcRef = useRef<T>(fn)\r\n \r\n // Update ref in effect to avoid accessing refs during render\r\n useEffect(() => {\r\n funcRef.current = fn\r\n }, [fn])\r\n\r\n return useMemo(\r\n () => {\r\n // Create a stable reference to the current function\r\n const callFn = (...args: Parameters<T>) => {\r\n // Accessing ref in debounced callback is safe - it's called asynchronously, not during render\r\n // The ref is updated in useEffect, and this callback only runs asynchronously via debounce\r\n funcRef.current(...args)\r\n }\r\n // eslint-disable-next-line react-hooks/refs\r\n return debounce(callFn, ms, { maxWait })\r\n },\r\n [ms, maxWait]\r\n )\r\n}\r\n","import * as React from \"react\"\r\nimport { useState } from \"react\"\r\nimport { $isCodeNode } from \"@lexical/code\"\r\nimport {\r\n $getNearestNodeFromDOMNode,\r\n $getSelection,\r\n $setSelection,\r\n LexicalEditor,\r\n} from \"lexical\"\r\nimport { CircleCheckIcon, CopyIcon } from \"lucide-react\"\r\nimport { logger } from \"@/utils\"\r\n\r\nimport { useDebounce } from \"@/components/editor/editor-hooks/use-debounce\"\r\nimport { IconSize } from \"@/components/ui/typography\"\r\n\r\ninterface Props {\r\n editor: LexicalEditor\r\n getCodeDOMNode: () => HTMLElement | null\r\n}\r\n\r\nexport function CopyButton({ editor, getCodeDOMNode }: Props) {\r\n const [isCopyCompleted, setCopyCompleted] = useState<boolean>(false)\r\n\r\n const removeSuccessIcon = useDebounce(() => {\r\n setCopyCompleted(false)\r\n }, 1000)\r\n\r\n async function handleClick(): Promise<void> {\r\n const codeDOMNode = getCodeDOMNode()\r\n\r\n if (!codeDOMNode) {\r\n return\r\n }\r\n\r\n let content = \"\"\r\n\r\n editor.update(() => {\r\n const codeNode = $getNearestNodeFromDOMNode(codeDOMNode)\r\n\r\n if ($isCodeNode(codeNode)) {\r\n content = codeNode.getTextContent()\r\n }\r\n\r\n const selection = $getSelection()\r\n $setSelection(selection)\r\n })\r\n\r\n try {\r\n await navigator.clipboard.writeText(content)\r\n setCopyCompleted(true)\r\n removeSuccessIcon()\r\n } catch (err) {\r\n logger.error(\"Failed to copy: \", err)\r\n }\r\n }\r\n\r\n return (\r\n <button\r\n className=\"text-foreground/50 flex shrink-0 cursor-pointer items-center rounded border border-transparent bg-none p-1 uppercase\"\r\n onClick={handleClick}\r\n aria-label=\"copy\"\r\n >\r\n {isCopyCompleted ? (\r\n <IconSize size=\"sm\">\r\n <CircleCheckIcon />\r\n </IconSize>\r\n ) : (\r\n <IconSize size=\"sm\">\r\n <CopyIcon />\r\n </IconSize>\r\n )}\r\n </button>\r\n )\r\n}\r\n","\"use client\"\r\n\r\n/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\nimport { JSX, useEffect } from \"react\"\r\nimport { registerCodeHighlighting } from \"@lexical/code\"\r\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\"\r\n\r\nexport function CodeHighlightPlugin(): JSX.Element | null {\r\n const [editor] = useLexicalComposerContext()\r\n\r\n useEffect(() => {\r\n return registerCodeHighlighting(editor)\r\n }, [editor])\r\n\r\n return null\r\n}\r\n","\"use client\"\r\n\r\n/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\nimport { JSX, useCallback, useEffect, useMemo, useRef, useState } from \"react\"\r\nimport dynamic from \"next/dynamic\"\r\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\"\r\nimport { useBasicTypeaheadTriggerMatch } from \"@lexical/react/LexicalTypeaheadMenuPlugin\"\r\nimport { TextNode } from \"lexical\"\r\nimport { createPortal } from \"react-dom\"\r\n\r\nimport { useEditorModal } from \"@/components/editor/editor-hooks/use-modal\"\r\nimport {\r\n Command,\r\n CommandGroup,\r\n CommandItem,\r\n CommandList,\r\n} from \"@/components/ui/command\"\r\nimport { logger } from \"@/utils\"\r\n\r\nimport { ComponentPickerOption } from \"./picker/component-picker-option\"\r\n\r\n// Component wrapper để xử lý scroll tự động\r\nfunction MenuContent({\r\n options,\r\n selectedIndex,\r\n selectOptionAndCleanUp,\r\n setHighlightedIndex,\r\n}: {\r\n options: Array<ComponentPickerOption>\r\n selectedIndex: number | null\r\n selectOptionAndCleanUp: (option: ComponentPickerOption) => void\r\n setHighlightedIndex: (index: number) => void\r\n}) {\r\n const containerRef = useRef<HTMLDivElement | null>(null)\r\n\r\n // Scroll to selected item when selectedIndex changes\r\n useEffect(() => {\r\n if (selectedIndex !== null && selectedIndex >= 0 && selectedIndex < options.length) {\r\n // Sử dụng setTimeout để đảm bảo DOM đã được render và cmdk đã update selected state\r\n const timeoutId = setTimeout(() => {\r\n const container = containerRef.current\r\n if (!container) {\r\n logger.debug(\"MenuContent: No container ref\", { selectedIndex })\r\n return\r\n }\r\n\r\n // Tìm item được chọn bằng cách tìm element có data-selected=\"true\" hoặc aria-selected=\"true\"\r\n let selectedItem = container.querySelector(\r\n '[data-selected=\"true\"], [aria-selected=\"true\"]'\r\n ) as HTMLElement\r\n\r\n // Fallback: nếu không tìm thấy bằng attribute, tìm theo index\r\n if (!selectedItem) {\r\n const allItems = container.querySelectorAll('[data-slot=\"command-item\"]')\r\n selectedItem = allItems[selectedIndex] as HTMLElement\r\n logger.debug(\"MenuContent: Found item by index\", {\r\n selectedIndex,\r\n totalItems: allItems.length,\r\n found: !!selectedItem,\r\n })\r\n } else {\r\n logger.debug(\"MenuContent: Found item by attribute\", { selectedIndex })\r\n }\r\n\r\n if (selectedItem) {\r\n // Tìm ScrollArea viewport\r\n const scrollContainer = container.querySelector(\r\n '[data-radix-scroll-area-viewport]'\r\n ) as HTMLElement\r\n\r\n if (scrollContainer) {\r\n const currentScrollTop = scrollContainer.scrollTop\r\n const containerHeight = scrollContainer.clientHeight\r\n const scrollHeight = scrollContainer.scrollHeight\r\n\r\n // Tìm tất cả items để tính offset\r\n const allItems = container.querySelectorAll('[data-slot=\"command-item\"]')\r\n let itemOffsetTop = 0\r\n\r\n // Tính offset của item bằng cách cộng offsetHeight của tất cả items trước nó\r\n for (let i = 0; i < selectedIndex && i < allItems.length; i++) {\r\n const item = allItems[i] as HTMLElement\r\n itemOffsetTop += item.offsetHeight || 32 // Default height nếu không có\r\n }\r\n\r\n // Thêm padding của CommandGroup nếu có\r\n const commandGroup = selectedItem.closest('[data-slot=\"command-group\"]') as HTMLElement\r\n if (commandGroup) {\r\n const groupStyle = window.getComputedStyle(commandGroup)\r\n const paddingTop = parseFloat(groupStyle.paddingTop) || 0\r\n itemOffsetTop += paddingTop\r\n }\r\n\r\n const itemHeight = selectedItem.offsetHeight || 32\r\n const itemRect = selectedItem.getBoundingClientRect()\r\n const containerRect = scrollContainer.getBoundingClientRect()\r\n\r\n logger.debug(\"MenuContent: Scrolling to item\", {\r\n selectedIndex,\r\n currentScrollTop,\r\n containerHeight,\r\n scrollHeight,\r\n itemOffsetTop,\r\n itemHeight,\r\n itemTop: itemRect.top,\r\n containerTop: containerRect.top,\r\n itemVisible: itemRect.top >= containerRect.top && itemRect.bottom <= containerRect.bottom,\r\n })\r\n\r\n // Kiểm tra xem item có đang visible trong viewport không\r\n const isItemVisible = itemRect.top >= containerRect.top && itemRect.bottom <= containerRect.bottom\r\n const itemNearTop = itemRect.top < containerRect.top + 20\r\n const itemNearBottom = itemRect.bottom > containerRect.bottom - 20\r\n\r\n // Tính toán scroll position để item nằm ở giữa container\r\n let targetScrollTop = itemOffsetTop - containerHeight / 2 + itemHeight / 2\r\n\r\n // Tính maxScroll dựa trên tổng chiều cao của tất cả items\r\n // Nếu scrollHeight === containerHeight, tính toán dựa trên items\r\n let calculatedMaxScroll = scrollHeight - containerHeight\r\n if (calculatedMaxScroll <= 0 && allItems.length > 0) {\r\n // Tính tổng chiều cao của tất cả items\r\n let totalHeight = 0\r\n for (let i = 0; i < allItems.length; i++) {\r\n const item = allItems[i] as HTMLElement\r\n totalHeight += item.offsetHeight || 32\r\n }\r\n // Thêm padding của CommandGroup\r\n if (commandGroup) {\r\n const groupStyle = window.getComputedStyle(commandGroup)\r\n const paddingTop = parseFloat(groupStyle.paddingTop) || 0\r\n const paddingBottom = parseFloat(groupStyle.paddingBottom) || 0\r\n totalHeight += paddingTop + paddingBottom\r\n }\r\n calculatedMaxScroll = Math.max(0, totalHeight - containerHeight)\r\n }\r\n\r\n // Đảm bảo không scroll quá đầu hoặc cuối\r\n targetScrollTop = Math.max(0, Math.min(targetScrollTop, calculatedMaxScroll))\r\n\r\n // Scroll nếu item không visible hoặc gần edge\r\n const needsScroll = !isItemVisible || itemNearTop || itemNearBottom\r\n\r\n if (needsScroll && Math.abs(targetScrollTop - currentScrollTop) > 1 && calculatedMaxScroll > 0) {\r\n scrollContainer.scrollTo({\r\n top: targetScrollTop,\r\n behavior: \"smooth\",\r\n })\r\n\r\n logger.debug(\"MenuContent: Scrolled\", {\r\n selectedIndex,\r\n fromScrollTop: currentScrollTop,\r\n toScrollTop: targetScrollTop,\r\n itemOffsetTop,\r\n calculatedMaxScroll,\r\n scrollHeight,\r\n containerHeight,\r\n needsScroll,\r\n })\r\n } else {\r\n logger.debug(\"MenuContent: No scroll needed\", {\r\n selectedIndex,\r\n currentScrollTop,\r\n targetScrollTop,\r\n itemOffsetTop,\r\n isItemVisible,\r\n itemNearTop,\r\n itemNearBottom,\r\n scrollHeight,\r\n containerHeight,\r\n calculatedMaxScroll,\r\n })\r\n }\r\n } else {\r\n // Fallback: scroll directly\r\n logger.debug(\"MenuContent: No scroll container, scrolling directly\", {\r\n selectedIndex,\r\n })\r\n selectedItem.scrollIntoView({ block: \"nearest\", behavior: \"smooth\" })\r\n }\r\n } else {\r\n logger.warn(\"MenuContent: Could not find selected item\", { selectedIndex })\r\n }\r\n }, 10) // Tăng delay một chút để đảm bảo cmdk đã update state\r\n\r\n return () => clearTimeout(timeoutId)\r\n }\r\n }, [selectedIndex, options.length])\r\n\r\n return (\r\n <div ref={containerRef}>\r\n <Command\r\n onKeyDown={(e) => {\r\n if (e.key === \"ArrowUp\") {\r\n e.preventDefault()\r\n setHighlightedIndex(\r\n selectedIndex !== null\r\n ? (selectedIndex - 1 + options.length) % options.length\r\n : options.length - 1\r\n )\r\n } else if (e.key === \"ArrowDown\") {\r\n e.preventDefault()\r\n setHighlightedIndex(\r\n selectedIndex !== null ? (selectedIndex + 1) % options.length : 0\r\n )\r\n }\r\n }}\r\n >\r\n <CommandList>\r\n <CommandGroup>\r\n {options.map((option) => (\r\n <CommandItem\r\n key={option.key}\r\n value={option.title}\r\n onSelect={() => {\r\n selectOptionAndCleanUp(option)\r\n }}\r\n className=\"flex items-center gap-2 cursor-pointer\"\r\n >\r\n {option.icon}\r\n <span>{option.title}</span>\r\n </CommandItem>\r\n ))}\r\n </CommandGroup>\r\n </CommandList>\r\n </Command>\r\n </div>\r\n )\r\n}\r\n\r\nconst LexicalTypeaheadMenuPlugin = dynamic(\r\n () =>\r\n import(\"@lexical/react/LexicalTypeaheadMenuPlugin\").then(\r\n (mod) => mod.LexicalTypeaheadMenuPlugin<ComponentPickerOption>\r\n ),\r\n { ssr: false }\r\n)\r\n\r\nexport function ComponentPickerMenuPlugin({\r\n baseOptions = [],\r\n dynamicOptionsFn,\r\n}: {\r\n baseOptions?: Array<ComponentPickerOption>\r\n dynamicOptionsFn?: ({\r\n queryString,\r\n }: {\r\n queryString: string\r\n }) => Array<ComponentPickerOption>\r\n}): JSX.Element {\r\n const [editor] = useLexicalComposerContext()\r\n const [modal, showModal] = useEditorModal()\r\n const [queryString, setQueryString] = useState<string | null>(null)\r\n\r\n logger.debug(\"ComponentPickerMenuPlugin initialized\", {\r\n baseOptionsCount: baseOptions.length,\r\n hasDynamicOptionsFn: !!dynamicOptionsFn,\r\n })\r\n\r\n const checkForTriggerMatch = useBasicTypeaheadTriggerMatch(\"/\", {\r\n minLength: 0,\r\n })\r\n\r\n const options = useMemo(() => {\r\n if (!queryString) {\r\n logger.debug(\"ComponentPickerMenuPlugin: No query string, returning baseOptions\", {\r\n baseOptionsCount: baseOptions.length,\r\n baseOptionsTitles: baseOptions.map((opt) => opt.title),\r\n })\r\n return baseOptions\r\n }\r\n\r\n logger.debug(\"ComponentPickerMenuPlugin: Filtering options\", {\r\n queryString,\r\n baseOptionsCount: baseOptions.length,\r\n })\r\n\r\n const regex = new RegExp(queryString, \"i\")\r\n\r\n const filtered = [\r\n ...(dynamicOptionsFn?.({ queryString }) || []),\r\n ...baseOptions.filter(\r\n (option) =>\r\n regex.test(option.title) ||\r\n option.keywords.some((keyword) => regex.test(keyword))\r\n ),\r\n ]\r\n \r\n logger.debug(\"ComponentPickerMenuPlugin: Filtered options\", {\r\n filteredCount: filtered.length,\r\n filteredTitles: filtered.map((opt) => opt.title),\r\n })\r\n \r\n return filtered\r\n }, [baseOptions, dynamicOptionsFn, queryString])\r\n\r\n const onSelectOption = useCallback(\r\n (\r\n selectedOption: ComponentPickerOption,\r\n nodeToRemove: TextNode | null,\r\n closeMenu: () => void,\r\n matchingString: string\r\n ) => {\r\n editor.update(() => {\r\n nodeToRemove?.remove()\r\n selectedOption.onSelect(matchingString, editor, showModal)\r\n closeMenu()\r\n })\r\n },\r\n [editor, showModal]\r\n )\r\n\r\n return (\r\n <>\r\n {modal}\r\n <LexicalTypeaheadMenuPlugin\r\n onQueryChange={(query) => {\r\n logger.debug(\"ComponentPickerMenuPlugin: Query changed\", { query })\r\n setQueryString(query)\r\n }}\r\n onSelectOption={onSelectOption}\r\n triggerFn={(text, editor) => {\r\n const match = checkForTriggerMatch(text, editor)\r\n logger.debug(\"ComponentPickerMenuPlugin: Trigger check\", {\r\n text,\r\n hasMatch: !!match,\r\n matchString: match?.matchingString,\r\n })\r\n return match\r\n }}\r\n options={options}\r\n menuRenderFn={(\r\n anchorElementRef,\r\n { selectedIndex, selectOptionAndCleanUp, setHighlightedIndex }\r\n ) => {\r\n logger.debug(\"ComponentPickerMenuPlugin: menuRenderFn called\", {\r\n hasAnchorElement: !!anchorElementRef.current,\r\n optionsLength: options.length,\r\n selectedIndex,\r\n })\r\n\r\n if (!anchorElementRef.current) {\r\n logger.warn(\"ComponentPickerMenuPlugin: No anchor element\", {\r\n anchorElementRef: anchorElementRef.current,\r\n })\r\n return null\r\n }\r\n\r\n if (!options.length) {\r\n logger.warn(\"ComponentPickerMenuPlugin: No options available\", {\r\n optionsLength: options.length,\r\n })\r\n return null\r\n }\r\n\r\n const anchorRect = anchorElementRef.current.getBoundingClientRect()\r\n const menuHeight = Math.min(options.length * 40 + 16, 300)\r\n const viewportHeight = window.innerHeight\r\n const viewportWidth = window.innerWidth\r\n \r\n // Với fixed positioning, sử dụng getBoundingClientRect() đã trả về vị trí relative to viewport\r\n // Không cần cộng window.scrollY vì fixed position đã relative to viewport\r\n let top = anchorRect.bottom + 4\r\n if (top + menuHeight > viewportHeight) {\r\n top = anchorRect.top - menuHeight - 4\r\n }\r\n \r\n // Đảm bảo menu không bị tràn ra ngoài viewport\r\n top = Math.max(4, Math.min(top, viewportHeight - menuHeight - 4))\r\n \r\n // Tính toán left position, đảm bảo menu không bị tràn ra ngoài viewport\r\n let left = anchorRect.left\r\n const menuWidth = 250\r\n if (left + menuWidth > viewportWidth) {\r\n left = viewportWidth - menuWidth - 4\r\n }\r\n left = Math.max(4, left)\r\n \r\n const menuPosition = {\r\n top: `${top}px`,\r\n left: `${left}px`,\r\n }\r\n\r\n logger.debug(\"ComponentPickerMenuPlugin: Rendering menu\", {\r\n menuPosition,\r\n anchorRect: {\r\n top: anchorRect.top,\r\n left: anchorRect.left,\r\n bottom: anchorRect.bottom,\r\n right: anchorRect.right,\r\n width: anchorRect.width,\r\n height: anchorRect.height,\r\n },\r\n viewport: {\r\n height: viewportHeight,\r\n width: viewportWidth,\r\n },\r\n optionsCount: options.length,\r\n })\r\n \r\n return createPortal(\r\n <div \r\n className=\"fixed z-[100] w-[250px] rounded-md border border-border bg-popover text-popover-foreground shadow-lg overflow-hidden\"\r\n style={{\r\n top: `${top}px`,\r\n left: `${left}px`,\r\n maxHeight: \"300px\",\r\n position: \"fixed\",\r\n visibility: \"visible\",\r\n opacity: 1,\r\n }}\r\n >\r\n <MenuContent\r\n options={options}\r\n selectedIndex={selectedIndex}\r\n selectOptionAndCleanUp={selectOptionAndCleanUp}\r\n setHighlightedIndex={setHighlightedIndex}\r\n />\r\n </div>,\r\n document.body\r\n )\r\n }}\r\n />\r\n </>\r\n )\r\n}\r\n","import { JSX, useCallback, useMemo, useState } from \"react\"\r\nimport * as React from \"react\"\r\n\r\nimport {\r\n Dialog,\r\n DialogContent,\r\n DialogDescription,\r\n DialogHeader,\r\n DialogTitle,\r\n} from \"@/components/ui/dialog\"\r\n\r\nexport function useEditorModal(): [\r\n JSX.Element | null,\r\n (title: string, showModal: (onClose: () => void) => JSX.Element) => void,\r\n] {\r\n const [modalContent, setModalContent] = useState<null | {\r\n closeOnClickOutside: boolean\r\n content: JSX.Element\r\n title: string\r\n }>(null)\r\n\r\n const onClose = useCallback(() => {\r\n setModalContent(null)\r\n }, [])\r\n\r\n const modal = useMemo(() => {\r\n if (modalContent === null) {\r\n return null\r\n }\r\n const { title, content } = modalContent\r\n return (\r\n <Dialog open={true} onOpenChange={onClose}>\r\n <DialogContent>\r\n <DialogHeader>\r\n <DialogTitle>{title}</DialogTitle>\r\n <DialogDescription>{title}</DialogDescription>\r\n </DialogHeader>\r\n {content}\r\n </DialogContent>\r\n </Dialog>\r\n )\r\n }, [modalContent, onClose])\r\n\r\n const showModal = useCallback(\r\n (\r\n title: string,\r\n getContent: (onClose: () => void) => JSX.Element,\r\n closeOnClickOutside = false\r\n ) => {\r\n setModalContent({\r\n closeOnClickOutside,\r\n content: getContent(onClose),\r\n title,\r\n })\r\n },\r\n [onClose]\r\n )\r\n\r\n return [modal, showModal]\r\n}\r\n","\"use client\"\r\n\r\nimport * as React from \"react\"\r\nimport { Command as CommandPrimitive } from \"cmdk\"\r\nimport { SearchIcon } from \"lucide-react\"\r\n\r\nimport { cn } from \"@/utils\"\r\nimport { responsiveTextSizes, fontWeights, lineHeights, iconSizes } from \"@/constants\"\r\n\r\nconst commandBodySmall = `${responsiveTextSizes.small} ${fontWeights.normal} ${lineHeights.relaxed}`\r\nconst commandIconSizeSm = iconSizes.sm\r\nconst commandIconSizeMd = iconSizes.md\r\nimport {\r\n Dialog,\r\n DialogContent,\r\n DialogDescription,\r\n DialogHeader,\r\n DialogTitle,\r\n} from \"@/components/ui/dialog\"\r\nimport { ScrollArea } from \"@/components/ui/scroll-area\"\r\n\r\nfunction Command({\r\n className,\r\n ...props\r\n}: React.ComponentProps<typeof CommandPrimitive>) {\r\n return (\r\n <CommandPrimitive\r\n data-slot=\"command\"\r\n className={cn(\r\n \"bg-popover text-popover-foreground flex h-full w-full flex-col overflow-hidden rounded-md\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nfunction CommandDialog({\r\n title = \"Command Palette\",\r\n description = \"Search for a command to run...\",\r\n children,\r\n className,\r\n showCloseButton = true,\r\n ...props\r\n}: React.ComponentProps<typeof Dialog> & {\r\n title?: string\r\n description?: string\r\n className?: string\r\n showCloseButton?: boolean\r\n}) {\r\n return (\r\n <Dialog {...props}>\r\n <DialogHeader className=\"sr-only\">\r\n <DialogTitle>{title}</DialogTitle>\r\n <DialogDescription>{description}</DialogDescription>\r\n </DialogHeader>\r\n <DialogContent\r\n className={cn(\"overflow-hidden p-0\", className)}\r\n showCloseButton={showCloseButton}\r\n >\r\n <Command className={`[&_[cmdk-group-heading]]:text-muted-foreground **:data-[slot=command-input-wrapper]:h-12 [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group]]:px-2 [&_[cmdk-group]:not([hidden])_~[cmdk-group]]:pt-0 [&_[cmdk-input-wrapper]_svg]:${commandIconSizeMd} [&_[cmdk-input]]:h-12 [&_[cmdk-item]]:px-2 [&_[cmdk-item]]:py-3 [&_[cmdk-item]_svg]:${commandIconSizeMd}`}>\r\n {children}\r\n </Command>\r\n </DialogContent>\r\n </Dialog>\r\n )\r\n}\r\n\r\nfunction CommandInput({\r\n className,\r\n ...props\r\n}: React.ComponentProps<typeof CommandPrimitive.Input>) {\r\n return (\r\n <div\r\n data-slot=\"command-input-wrapper\"\r\n className=\"flex h-9 items-center gap-2 border-b px-3\"\r\n >\r\n <SearchIcon className={`${commandIconSizeSm} shrink-0 opacity-50`} />\r\n <CommandPrimitive.Input\r\n data-slot=\"command-input\"\r\n className={cn(\r\n `placeholder:text-muted-foreground flex h-10 w-full rounded-md bg-transparent py-3 ${commandBodySmall} outline-hidden disabled:cursor-not-allowed disabled:opacity-50`,\r\n className\r\n )}\r\n {...props}\r\n />\r\n </div>\r\n )\r\n}\r\n\r\nfunction CommandList({\r\n className,\r\n ...props\r\n}: React.ComponentProps<typeof CommandPrimitive.List>) {\r\n return (\r\n <ScrollArea className=\"max-h-[200px] overflow-y-auto\">\r\n <CommandPrimitive.List\r\n data-slot=\"command-list\"\r\n className={cn(\r\n \"scroll-py-1 overflow-x-hidden\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n </ScrollArea>\r\n )\r\n}\r\n\r\nfunction CommandEmpty({\r\n ...props\r\n}: React.ComponentProps<typeof CommandPrimitive.Empty>) {\r\n return (\r\n <CommandPrimitive.Empty\r\n data-slot=\"command-empty\"\r\n className={`py-6 text-center ${commandBodySmall}`}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nfunction CommandGroup({\r\n className,\r\n ...props\r\n}: React.ComponentProps<typeof CommandPrimitive.Group>) {\r\n return (\r\n <CommandPrimitive.Group\r\n data-slot=\"command-group\"\r\n className={cn(\r\n `text-foreground [&_[cmdk-group-heading]]:text-muted-foreground overflow-hidden p-1 [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:${commandBodySmall} [&_[cmdk-group-heading]]:font-medium`,\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nfunction CommandSeparator({\r\n className,\r\n ...props\r\n}: React.ComponentProps<typeof CommandPrimitive.Separator>) {\r\n return (\r\n <CommandPrimitive.Separator\r\n data-slot=\"command-separator\"\r\n className={cn(\"bg-border -mx-1 h-px\", className)}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nfunction CommandItem({\r\n className,\r\n ...props\r\n}: React.ComponentProps<typeof CommandPrimitive.Item>) {\r\n return (\r\n <CommandPrimitive.Item\r\n data-slot=\"command-item\"\r\n className={cn(\r\n `data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground data-[selected=true]:[&_svg:not([class*='text-'])]:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground hover:[&_svg:not([class*='text-'])]:text-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 ${commandBodySmall} outline-hidden select-none data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:${commandIconSizeSm} w-full`,\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nfunction CommandShortcut({\r\n className,\r\n ...props\r\n}: React.ComponentProps<\"span\">) {\r\n return (\r\n <span\r\n data-slot=\"command-shortcut\"\r\n className={cn(\r\n `text-muted-foreground ml-auto ${commandBodySmall} tracking-widest`,\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nexport {\r\n Command,\r\n CommandDialog,\r\n CommandInput,\r\n CommandList,\r\n CommandEmpty,\r\n CommandGroup,\r\n CommandItem,\r\n CommandShortcut,\r\n CommandSeparator,\r\n}\r\n\r\n","import type { JSX } from \"react\"\r\nimport { useMemo } from \"react\"\r\nimport { $isLinkNode, TOGGLE_LINK_COMMAND } from \"@lexical/link\"\r\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\"\r\nimport {\r\n NodeContextMenuOption,\r\n NodeContextMenuPlugin,\r\n NodeContextMenuSeparator,\r\n} from \"@lexical/react/LexicalNodeContextMenuPlugin\"\r\nimport { $mergeCells, $isTableCellNode, $isTableSelection, $unmergeCell, $insertTableColumnAtSelection, $insertTableRowAtSelection } from \"@lexical/table\"\r\nimport type { TableCellNode } from \"@lexical/table\"\r\nimport { $isListNode } from \"@lexical/list\"\r\nimport { $findMatchingParent } from \"@lexical/utils\"\r\nimport {\r\n $getSelection,\r\n $isDecoratorNode,\r\n $isNodeSelection,\r\n $isRangeSelection,\r\n COPY_COMMAND,\r\n CUT_COMMAND,\r\n PASTE_COMMAND,\r\n type LexicalNode,\r\n} from \"lexical\"\r\nimport { $isLayoutItemNode } from \"@/components/editor/nodes/layout-item-node\"\r\nimport { OPEN_UPDATE_LAYOUT_MODAL_COMMAND } from \"@/components/editor/plugins/layout-plugin\"\r\nimport { OPEN_LIST_COLOR_PICKER_COMMAND } from \"@/components/editor/plugins/list-color-plugin\"\r\nimport {\r\n Clipboard,\r\n ClipboardType,\r\n Copy,\r\n Link2Off,\r\n Scissors,\r\n Trash2,\r\n Combine,\r\n SplitSquareVertical,\r\n Columns3,\r\n Rows3,\r\n LayoutGrid,\r\n Palette,\r\n} from \"lucide-react\"\r\nimport { IconSize } from \"@/components/ui/typography\"\r\n\r\nexport function ContextMenuPlugin(): JSX.Element {\r\n const [editor] = useLexicalComposerContext()\r\n\r\n const isInTable = (node: LexicalNode) =>\r\n $findMatchingParent(node, $isTableCellNode) !== null\r\n\r\n const isMergedCell = (node: LexicalNode) => {\r\n const cell = $findMatchingParent(node, $isTableCellNode)\r\n if (!cell || !$isTableCellNode(cell)) return false\r\n const c = cell as TableCellNode\r\n const colSpan =\r\n typeof (c as { getColSpan?: () => number }).getColSpan === \"function\"\r\n ? (c as { getColSpan: () => number }).getColSpan()\r\n : (c as { __colSpan?: number }).__colSpan ?? 1\r\n const rowSpan =\r\n typeof (c as { getRowSpan?: () => number }).getRowSpan === \"function\"\r\n ? (c as { getRowSpan: () => number }).getRowSpan()\r\n : (c as { __rowSpan?: number }).__rowSpan ?? 1\r\n return colSpan > 1 || rowSpan > 1\r\n }\r\n\r\n const isInLayoutItem = (node: LexicalNode) =>\r\n $findMatchingParent(node, $isLayoutItemNode) !== null\r\n\r\n const isInList = (node: LexicalNode) =>\r\n $findMatchingParent(node, $isListNode) !== null\r\n\r\n const items = useMemo(() => {\r\n return [\r\n new NodeContextMenuOption(`Gộp ô`, {\r\n $onSelect: () => {\r\n editor.update(() => {\r\n const selection = $getSelection()\r\n if (!$isTableSelection(selection)) return\r\n const nodes = selection.getNodes()\r\n const seen = new Set<string>()\r\n const cellNodes: import(\"@lexical/table\").TableCellNode[] = []\r\n for (const n of nodes) {\r\n const cell = $findMatchingParent(n, $isTableCellNode)\r\n if (cell && !seen.has(cell.getKey())) {\r\n seen.add(cell.getKey())\r\n cellNodes.push(cell)\r\n }\r\n }\r\n if (cellNodes.length >= 2) $mergeCells(cellNodes)\r\n })\r\n },\r\n $showOn: isInTable,\r\n disabled: false,\r\n icon: <IconSize size=\"sm\"><Combine /></IconSize>,\r\n }),\r\n new NodeContextMenuOption(`Tách ô`, {\r\n $onSelect: () => {\r\n editor.update(() => {\r\n $unmergeCell()\r\n })\r\n },\r\n $showOn: isMergedCell,\r\n disabled: false,\r\n icon: <IconSize size=\"sm\"><SplitSquareVertical /></IconSize>,\r\n }),\r\n new NodeContextMenuOption(`Chèn cột bên phải`, {\r\n $onSelect: () => {\r\n editor.update(() => {\r\n $insertTableColumnAtSelection(true)\r\n })\r\n },\r\n $showOn: isInTable,\r\n disabled: false,\r\n icon: <IconSize size=\"sm\"><Columns3 /></IconSize>,\r\n }),\r\n new NodeContextMenuOption(`Chèn cột bên trái`, {\r\n $onSelect: () => {\r\n editor.update(() => {\r\n $insertTableColumnAtSelection(false)\r\n })\r\n },\r\n $showOn: isInTable,\r\n disabled: false,\r\n icon: <IconSize size=\"sm\"><Columns3 /></IconSize>,\r\n }),\r\n new NodeContextMenuOption(`Chèn dòng bên dưới`, {\r\n $onSelect: () => {\r\n editor.update(() => {\r\n $insertTableRowAtSelection(true)\r\n })\r\n },\r\n $showOn: isInTable,\r\n disabled: false,\r\n icon: <IconSize size=\"sm\"><Rows3 /></IconSize>,\r\n }),\r\n new NodeContextMenuOption(`Chèn dòng bên trên`, {\r\n $onSelect: () => {\r\n editor.update(() => {\r\n $insertTableRowAtSelection(false)\r\n })\r\n },\r\n $showOn: isInTable,\r\n disabled: false,\r\n icon: <IconSize size=\"sm\"><Rows3 /></IconSize>,\r\n }),\r\n new NodeContextMenuSeparator({\r\n $showOn: isInTable,\r\n }),\r\n new NodeContextMenuOption(`Cập nhật column layout`, {\r\n $onSelect: () => {\r\n let layoutItemKey: string | null = null\r\n editor.getEditorState().read(() => {\r\n const selection = $getSelection()\r\n if (!$isRangeSelection(selection)) return\r\n const layoutItem = $findMatchingParent(\r\n selection.anchor.getNode(),\r\n $isLayoutItemNode\r\n )\r\n if ($isLayoutItemNode(layoutItem)) layoutItemKey = layoutItem.getKey()\r\n })\r\n if (layoutItemKey)\r\n editor.dispatchCommand(OPEN_UPDATE_LAYOUT_MODAL_COMMAND, {\r\n layoutItemKey,\r\n })\r\n },\r\n $showOn: isInLayoutItem,\r\n disabled: false,\r\n icon: <IconSize size=\"sm\"><LayoutGrid /></IconSize>,\r\n }),\r\n new NodeContextMenuSeparator({\r\n $showOn: isInLayoutItem,\r\n }),\r\n new NodeContextMenuOption(`Đổi màu list`, {\r\n $onSelect: () => {\r\n let listKey: string | null = null\r\n editor.getEditorState().read(() => {\r\n const selection = $getSelection()\r\n if (!$isRangeSelection(selection)) return\r\n const listNode = $findMatchingParent(\r\n selection.anchor.getNode(),\r\n $isListNode\r\n )\r\n if ($isListNode(listNode)) listKey = listNode.getKey()\r\n })\r\n if (listKey)\r\n editor.dispatchCommand(OPEN_LIST_COLOR_PICKER_COMMAND, {\r\n listKey,\r\n })\r\n },\r\n $showOn: isInList,\r\n disabled: false,\r\n icon: <IconSize size=\"sm\"><Palette /></IconSize>,\r\n }),\r\n new NodeContextMenuSeparator({\r\n $showOn: isInList,\r\n }),\r\n new NodeContextMenuOption(`Remove Link`, {\r\n $onSelect: () => {\r\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null)\r\n },\r\n $showOn: (node: LexicalNode) => $isLinkNode(node.getParent()),\r\n disabled: false,\r\n icon: <IconSize size=\"sm\"><Link2Off /></IconSize>,\r\n }),\r\n new NodeContextMenuSeparator({\r\n $showOn: (node: LexicalNode) => $isLinkNode(node.getParent()),\r\n }),\r\n new NodeContextMenuOption(`Cut`, {\r\n $onSelect: () => {\r\n editor.dispatchCommand(CUT_COMMAND, null)\r\n },\r\n disabled: false,\r\n icon: <IconSize size=\"sm\"><Scissors /></IconSize>,\r\n }),\r\n new NodeContextMenuOption(`Copy`, {\r\n $onSelect: () => {\r\n editor.dispatchCommand(COPY_COMMAND, null)\r\n },\r\n disabled: false,\r\n icon: <IconSize size=\"sm\"><Copy /></IconSize>,\r\n }),\r\n new NodeContextMenuOption(`Paste`, {\r\n $onSelect: () => {\r\n navigator.clipboard.read().then(async function (..._args) {\r\n const data = new DataTransfer()\r\n\r\n const readClipboardItems = await navigator.clipboard.read()\r\n const item = readClipboardItems[0]\r\n\r\n const permission = await navigator.permissions.query({\r\n name: \"clipboard-read\" as PermissionName,\r\n })\r\n if (permission.state === \"denied\") {\r\n alert(\"Not allowed to paste from clipboard.\")\r\n return\r\n }\r\n\r\n for (const type of item.types) {\r\n const dataString = await (await item.getType(type)).text()\r\n data.setData(type, dataString)\r\n }\r\n\r\n const event = new ClipboardEvent(\"paste\", {\r\n clipboardData: data,\r\n })\r\n\r\n editor.dispatchCommand(PASTE_COMMAND, event)\r\n })\r\n },\r\n disabled: false,\r\n icon: <IconSize size=\"sm\"><Clipboard /></IconSize>,\r\n }),\r\n new NodeContextMenuOption(`Paste as Plain Text`, {\r\n $onSelect: () => {\r\n navigator.clipboard.read().then(async function (..._args) {\r\n const permission = await navigator.permissions.query({\r\n name: \"clipboard-read\" as PermissionName,\r\n })\r\n\r\n if (permission.state === \"denied\") {\r\n alert(\"Not allowed to paste from clipboard.\")\r\n return\r\n }\r\n\r\n const data = new DataTransfer()\r\n const clipboardText = await navigator.clipboard.readText()\r\n data.setData(\"text/plain\", clipboardText)\r\n\r\n const event = new ClipboardEvent(\"paste\", {\r\n clipboardData: data,\r\n })\r\n editor.dispatchCommand(PASTE_COMMAND, event)\r\n })\r\n },\r\n disabled: false,\r\n icon: <IconSize size=\"sm\"><ClipboardType /></IconSize>,\r\n }),\r\n new NodeContextMenuSeparator(),\r\n new NodeContextMenuOption(`Delete Node`, {\r\n $onSelect: () => {\r\n const selection = $getSelection()\r\n if ($isRangeSelection(selection)) {\r\n const currentNode = selection.anchor.getNode()\r\n const ancestorNodeWithRootAsParent = currentNode.getParents().at(-2)\r\n\r\n ancestorNodeWithRootAsParent?.remove()\r\n } else if ($isNodeSelection(selection)) {\r\n const selectedNodes = selection.getNodes()\r\n selectedNodes.forEach((node) => {\r\n if ($isDecoratorNode(node)) {\r\n node.remove()\r\n }\r\n })\r\n }\r\n },\r\n disabled: false,\r\n icon: <IconSize size=\"sm\"><Trash2 /></IconSize>,\r\n }),\r\n ]\r\n }, [editor])\r\n\r\n return (\r\n <NodeContextMenuPlugin\r\n className=\"bg-popover text-popover-foreground z-50 overflow-hidden rounded-md border shadow-md outline-none [&:has(*)]:z-10\"\r\n itemClassName=\"relative w-full flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none select-none hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50\"\r\n separatorClassName=\"bg-border -mx-1 h-px\"\r\n items={items}\r\n />\r\n )\r\n}\r\n","\"use client\"\r\n\r\n/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\nimport * as React from \"react\"\r\nimport { JSX, useEffect, useRef, useState } from \"react\"\r\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\"\r\nimport {\r\n $findMatchingParent,\r\n $insertNodeToNearestRoot,\r\n mergeRegister,\r\n} from \"@lexical/utils\"\r\nimport {\r\n $createParagraphNode,\r\n $getNodeByKey,\r\n $getNearestNodeFromDOMNode,\r\n $getSelection,\r\n $isRangeSelection,\r\n COMMAND_PRIORITY_EDITOR,\r\n COMMAND_PRIORITY_LOW,\r\n createCommand,\r\n KEY_ARROW_DOWN_COMMAND,\r\n KEY_ARROW_LEFT_COMMAND,\r\n KEY_ARROW_RIGHT_COMMAND,\r\n KEY_ARROW_UP_COMMAND,\r\n LexicalEditor,\r\n} from \"lexical\"\r\nimport type { ElementNode, LexicalCommand, LexicalNode, NodeKey } from \"lexical\"\r\n\r\nimport {\r\n $createLayoutContainerNode,\r\n $isLayoutContainerNode,\r\n LayoutContainerNode,\r\n} from \"@/components/editor/nodes/layout-container-node\"\r\nimport {\r\n $createLayoutItemNode,\r\n $isLayoutItemNode,\r\n LayoutItemNode,\r\n} from \"@/components/editor/nodes/layout-item-node\"\r\nimport { Button } from \"@/components/ui/button\"\r\nimport {\r\n Select,\r\n SelectContent,\r\n SelectItem,\r\n SelectTrigger,\r\n SelectValue,\r\n} from \"@/components/ui/select\"\r\nimport {\r\n ColorPicker,\r\n ColorPickerAlphaSlider,\r\n ColorPickerArea,\r\n ColorPickerContent,\r\n ColorPickerEyeDropper,\r\n ColorPickerFormatSelect,\r\n ColorPickerHueSlider,\r\n ColorPickerInput,\r\n ColorPickerPresets,\r\n ColorPickerTrigger,\r\n} from \"@/components/editor/editor-ui/color-picker\"\r\nimport { Input } from \"@/components/ui/input\"\r\nimport { Flex } from \"@/components/ui/flex\"\r\nimport { useEditorModal } from \"@/components/editor/editor-hooks/use-modal\"\r\nimport { logger } from \"@/utils\"\r\n\r\nconst LAYOUTS = [\r\n { label: \"1 column\", value: \"1fr\" },\r\n { label: \"2 columns (equal width)\", value: \"1fr 1fr\" },\r\n { label: \"2 columns (75% - 25%)\", value: \"3fr 1fr\" },\r\n { label: \"2 columns (25% - 75%)\", value: \"1fr 3fr\" },\r\n { label: \"3 columns (equal width)\", value: \"1fr 1fr 1fr\" },\r\n { label: \"3 columns (25% - 50% - 25%)\", value: \"1fr 2fr 1fr\" },\r\n { label: \"4 columns (equal width)\", value: \"1fr 1fr 1fr 1fr\" },\r\n]\r\n\r\ntype InsertLayoutPayload =\r\n | string\r\n | {\r\n template: string\r\n itemBackgroundColor?: string\r\n itemPaddingPx?: number\r\n itemBorderRadiusPx?: number\r\n }\r\n\r\ntype LayoutDialogValues = {\r\n template: string\r\n itemBackgroundColor: string\r\n itemPaddingPx: number\r\n itemBorderRadiusPx: number\r\n}\r\n\r\ntype LayoutTargetPayload = {\r\n containerKey: NodeKey\r\n layoutItemKey: NodeKey\r\n values: LayoutDialogValues\r\n}\r\n\r\nexport function InsertLayoutDialog({\r\n activeEditor,\r\n onClose,\r\n initialValues,\r\n submitLabel = \"Insert\",\r\n onSubmit,\r\n}: {\r\n activeEditor: LexicalEditor\r\n onClose: () => void\r\n initialValues?: Partial<LayoutDialogValues>\r\n submitLabel?: string\r\n onSubmit?: (values: LayoutDialogValues) => void\r\n}): JSX.Element {\r\n const [layout, setLayout] = useState(initialValues?.template ?? LAYOUTS[0].value)\r\n const [backgroundColor, setBackgroundColor] = useState(\r\n initialValues?.itemBackgroundColor ?? \"#ffffff\"\r\n )\r\n const [paddingPx, setPaddingPx] = useState(initialValues?.itemPaddingPx ?? 12)\r\n const [borderRadiusPx, setBorderRadiusPx] = useState(\r\n initialValues?.itemBorderRadiusPx ?? 8\r\n )\r\n const layoutRef = useRef(layout)\r\n const backgroundColorRef = useRef(backgroundColor)\r\n const paddingPxRef = useRef(paddingPx)\r\n const borderRadiusPxRef = useRef(borderRadiusPx)\r\n\r\n useEffect(() => {\r\n layoutRef.current = layout\r\n }, [layout])\r\n useEffect(() => {\r\n backgroundColorRef.current = backgroundColor\r\n }, [backgroundColor])\r\n useEffect(() => {\r\n paddingPxRef.current = paddingPx\r\n }, [paddingPx])\r\n useEffect(() => {\r\n borderRadiusPxRef.current = borderRadiusPx\r\n }, [borderRadiusPx])\r\n\r\n const onBackgroundColorChange = (value: string) => {\r\n backgroundColorRef.current = value\r\n setBackgroundColor(value)\r\n }\r\n\r\n const onPaddingChange = (next: number) => {\r\n const value = Math.min(Math.max(next, 0), 64)\r\n paddingPxRef.current = value\r\n setPaddingPx(value)\r\n }\r\n\r\n const onBorderRadiusChange = (next: number) => {\r\n const value = Math.min(Math.max(next, 0), 64)\r\n borderRadiusPxRef.current = value\r\n setBorderRadiusPx(value)\r\n }\r\n const buttonLabel = LAYOUTS.find((item) => item.value === layout)?.label\r\n\r\n const onClick = () => {\r\n const values: LayoutDialogValues = {\r\n template: layoutRef.current,\r\n itemBackgroundColor: backgroundColorRef.current,\r\n itemPaddingPx: paddingPxRef.current,\r\n itemBorderRadiusPx: borderRadiusPxRef.current,\r\n }\r\n logger.info(\"[Layout] Submit dialog values\", {\r\n mode: submitLabel,\r\n values,\r\n })\r\n if (onSubmit) {\r\n onSubmit(values)\r\n onClose()\r\n return\r\n }\r\n activeEditor.dispatchCommand(INSERT_LAYOUT_COMMAND, values)\r\n onClose()\r\n }\r\n\r\n return (\r\n <>\r\n <Select onValueChange={setLayout} defaultValue={layout}>\r\n <SelectTrigger className=\"h-11 w-full\">\r\n <SelectValue placeholder={buttonLabel} />\r\n </SelectTrigger>\r\n <SelectContent className=\"w-full\">\r\n {LAYOUTS.map(({ label, value }) => (\r\n <SelectItem key={value} value={value}>\r\n {label}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n <div className=\"grid grid-cols-1 gap-3 md:grid-cols-3\">\r\n <div className=\"space-y-1\">\r\n <div className=\"text-xs text-muted-foreground\">Background</div>\r\n <ColorPicker\r\n modal\r\n defaultFormat=\"hex\"\r\n value={backgroundColor}\r\n onValueChange={onBackgroundColorChange}\r\n >\r\n <ColorPickerTrigger asChild>\r\n <Button\r\n variant=\"outline\"\r\n className=\"h-11 w-full justify-start gap-2 px-2 text-xs\"\r\n >\r\n <span\r\n className=\"size-4 shrink-0 rounded border\"\r\n style={{ backgroundColor }}\r\n />\r\n <span>{backgroundColor.toUpperCase()}</span>\r\n </Button>\r\n </ColorPickerTrigger>\r\n <ColorPickerContent>\r\n <ColorPickerArea />\r\n <Flex align=\"center\" gap={2}>\r\n <ColorPickerEyeDropper />\r\n <Flex direction=\"col\" gap={2} className=\"flex-1\">\r\n <ColorPickerHueSlider />\r\n <ColorPickerAlphaSlider />\r\n </Flex>\r\n </Flex>\r\n <Flex align=\"center\" gap={2}>\r\n <ColorPickerFormatSelect />\r\n <ColorPickerInput />\r\n </Flex>\r\n <ColorPickerPresets />\r\n </ColorPickerContent>\r\n </ColorPicker>\r\n </div>\r\n <div className=\"space-y-1\">\r\n <div className=\"text-xs text-muted-foreground\">Padding (px)</div>\r\n <Input\r\n type=\"number\"\r\n min={0}\r\n max={64}\r\n step={1}\r\n value={paddingPx}\r\n onChange={(event) => {\r\n const next = Number.parseInt(event.target.value, 10)\r\n if (Number.isFinite(next)) {\r\n onPaddingChange(next)\r\n } else {\r\n onPaddingChange(0)\r\n }\r\n }}\r\n className=\"h-11 w-full\"\r\n />\r\n </div>\r\n <div className=\"space-y-1\">\r\n <div className=\"text-xs text-muted-foreground\">Border radius (px)</div>\r\n <Input\r\n type=\"number\"\r\n min={0}\r\n max={64}\r\n step={1}\r\n value={borderRadiusPx}\r\n onChange={(event) => {\r\n const next = Number.parseInt(event.target.value, 10)\r\n if (Number.isFinite(next)) {\r\n onBorderRadiusChange(next)\r\n } else {\r\n onBorderRadiusChange(0)\r\n }\r\n }}\r\n className=\"h-11 w-full\"\r\n />\r\n </div>\r\n </div>\r\n <Button onClick={onClick}>{submitLabel}</Button>\r\n </>\r\n )\r\n}\r\n\r\nexport const INSERT_LAYOUT_COMMAND: LexicalCommand<InsertLayoutPayload> =\r\n createCommand<InsertLayoutPayload>()\r\n\r\nexport const UPDATE_LAYOUT_COMMAND: LexicalCommand<{\r\n template: string\r\n nodeKey: NodeKey\r\n}> = createCommand<{ template: string; nodeKey: NodeKey }>()\r\n\r\nexport const OPEN_UPDATE_LAYOUT_MODAL_COMMAND: LexicalCommand<{\r\n layoutItemKey: NodeKey\r\n}> = createCommand<{ layoutItemKey: NodeKey }>(\"OPEN_UPDATE_LAYOUT_MODAL_COMMAND\")\r\n\r\nexport function LayoutPlugin(): JSX.Element | null {\r\n const [editor] = useLexicalComposerContext()\r\n const [modal, showModal] = useEditorModal()\r\n useEffect(() => {\r\n if (!editor.hasNodes([LayoutContainerNode, LayoutItemNode])) {\r\n throw new Error(\r\n \"LayoutPlugin: LayoutContainerNode, or LayoutItemNode not registered on editor\"\r\n )\r\n }\r\n\r\n const $onEscape = (before: boolean) => {\r\n const selection = $getSelection()\r\n if (\r\n $isRangeSelection(selection) &&\r\n selection.isCollapsed() &&\r\n selection.anchor.offset === 0\r\n ) {\r\n const container = $findMatchingParent(\r\n selection.anchor.getNode(),\r\n $isLayoutContainerNode\r\n )\r\n\r\n if ($isLayoutContainerNode(container)) {\r\n const parent = container.getParent<ElementNode>()\r\n const child =\r\n parent &&\r\n (before\r\n ? parent.getFirstChild<LexicalNode>()\r\n : parent?.getLastChild<LexicalNode>())\r\n const descendant = before\r\n ? container.getFirstDescendant<LexicalNode>()?.getKey()\r\n : container.getLastDescendant<LexicalNode>()?.getKey()\r\n\r\n if (\r\n parent !== null &&\r\n child === container &&\r\n selection.anchor.key === descendant\r\n ) {\r\n if (before) {\r\n container.insertBefore($createParagraphNode())\r\n } else {\r\n container.insertAfter($createParagraphNode())\r\n }\r\n }\r\n }\r\n }\r\n\r\n return false\r\n }\r\n\r\n const extractStyleValue = (style: string, property: string): string | undefined => {\r\n const match = style.match(new RegExp(`${property}\\\\s*:\\\\s*([^;]+)`, \"i\"))\r\n return match?.[1]?.trim()\r\n }\r\n\r\n const extractNumericStyle = (style: string, property: string): number | undefined => {\r\n const value = extractStyleValue(style, property)\r\n if (!value) {\r\n return undefined\r\n }\r\n const match = value.match(/^(\\d+)px$/i)\r\n if (!match?.[1]) {\r\n return undefined\r\n }\r\n const parsed = Number.parseInt(match[1], 10)\r\n return Number.isFinite(parsed) ? parsed : undefined\r\n }\r\n\r\n const buildLayoutItemStyle = ({\r\n itemBackgroundColor,\r\n itemPaddingPx,\r\n itemBorderRadiusPx,\r\n }: LayoutDialogValues): string => {\r\n const itemStyles: string[] = []\r\n if (itemBackgroundColor.trim()) {\r\n itemStyles.push(`background-color: ${itemBackgroundColor.trim()}`)\r\n }\r\n itemStyles.push(`padding: ${Math.min(Math.max(itemPaddingPx, 0), 64)}px`)\r\n itemStyles.push(\r\n `border-radius: ${Math.min(Math.max(itemBorderRadiusPx, 0), 64)}px`\r\n )\r\n return itemStyles.join(\"; \")\r\n }\r\n\r\n const syncLayoutItemDomStyle = (itemKey: NodeKey, values: LayoutDialogValues) => {\r\n const element = editor.getElementByKey(itemKey)\r\n if (!(element instanceof HTMLElement)) {\r\n logger.warn(\"[Layout] Cannot resolve DOM element by item key\", { itemKey })\r\n return\r\n }\r\n\r\n const background = values.itemBackgroundColor.trim()\r\n const padding = `${Math.min(Math.max(values.itemPaddingPx, 0), 64)}px`\r\n const borderRadius = `${Math.min(Math.max(values.itemBorderRadiusPx, 0), 64)}px`\r\n if (background) {\r\n element.style.setProperty(\"background-color\", background)\r\n }\r\n element.style.setProperty(\"padding\", padding, \"important\")\r\n element.style.setProperty(\"border-radius\", borderRadius)\r\n\r\n logger.info(\"[Layout] Synced DOM style by key\", {\r\n itemKey,\r\n domStyle: element.getAttribute(\"style\"),\r\n })\r\n }\r\n\r\n const updateLayoutContainerTemplate = (\r\n container: LayoutContainerNode,\r\n template: string\r\n ) => {\r\n const itemsCount = getItemsCountFromTemplate(template)\r\n const prevItemsCount = getItemsCountFromTemplate(container.getTemplateColumns())\r\n\r\n if (itemsCount > prevItemsCount) {\r\n for (let i = prevItemsCount; i < itemsCount; i++) {\r\n container.append($createLayoutItemNode().append($createParagraphNode()))\r\n }\r\n } else if (itemsCount < prevItemsCount) {\r\n for (let i = prevItemsCount - 1; i >= itemsCount; i--) {\r\n const layoutItem = container.getChildAtIndex<LexicalNode>(i)\r\n if ($isLayoutItemNode(layoutItem)) {\r\n layoutItem.remove()\r\n }\r\n }\r\n }\r\n\r\n container.setTemplateColumns(template)\r\n }\r\n\r\n const getLayoutPayloadFromTarget = (\r\n target: HTMLElement\r\n ): LayoutTargetPayload | null => {\r\n let payload: LayoutTargetPayload | null = null\r\n\r\n editor.read(() => {\r\n const lexicalNode = $getNearestNodeFromDOMNode(target)\r\n if (!lexicalNode) {\r\n logger.warn(\"[Layout] Cannot resolve lexical node from DOM target\")\r\n return\r\n }\r\n const layoutItem = $findMatchingParent(lexicalNode, (node) =>\r\n $isLayoutItemNode(node)\r\n )\r\n if (!$isLayoutItemNode(layoutItem)) {\r\n logger.warn(\"[Layout] Click target is not layout item node\")\r\n return\r\n }\r\n const parentContainer = layoutItem.getParent()\r\n if (!$isLayoutContainerNode(parentContainer)) {\r\n logger.warn(\"[Layout] Layout item has no layout container parent\")\r\n return\r\n }\r\n\r\n const style = layoutItem.getStyle()\r\n payload = {\r\n containerKey: parentContainer.getKey(),\r\n layoutItemKey: layoutItem.getKey(),\r\n values: {\r\n template: parentContainer.getTemplateColumns(),\r\n itemBackgroundColor:\r\n extractStyleValue(style, \"background-color\") ?? \"#ffffff\",\r\n itemPaddingPx: extractNumericStyle(style, \"padding\") ?? 12,\r\n itemBorderRadiusPx: extractNumericStyle(style, \"border-radius\") ?? 8,\r\n },\r\n }\r\n logger.debug(\"[Layout] Resolved payload from target\", payload)\r\n })\r\n\r\n return payload\r\n }\r\n\r\n const openUpdateLayoutModal = (payload: LayoutTargetPayload) => {\r\n logger.info(\"[Layout] Open Update Columns Layout\", payload)\r\n showModal(\"Update Columns Layout\", (onClose) => (\r\n <InsertLayoutDialog\r\n activeEditor={editor}\r\n onClose={onClose}\r\n initialValues={payload.values}\r\n submitLabel=\"Update\"\r\n onSubmit={(values) => {\r\n logger.info(\"[Layout] Start applying update\", { payload, values })\r\n editor.update(() => {\r\n const nextStyle = buildLayoutItemStyle(values)\r\n logger.info(\"[Layout] Computed next style\", { nextStyle })\r\n let updatedItemsCount = 0\r\n const container = $getNodeByKey<LexicalNode>(payload.containerKey)\r\n if ($isLayoutContainerNode(container)) {\r\n updateLayoutContainerTemplate(container, values.template)\r\n const items = container.getChildren<LexicalNode>()\r\n logger.info(\"[Layout] Updating container items\", {\r\n containerKey: payload.containerKey,\r\n itemsCount: items.length,\r\n })\r\n for (const item of items) {\r\n if ($isLayoutItemNode(item)) {\r\n item.setStyle(nextStyle)\r\n updatedItemsCount += 1\r\n logger.info(\"[Layout] Applied style to item\", {\r\n itemKey: item.getKey(),\r\n appliedStyle: item.getStyle(),\r\n })\r\n syncLayoutItemDomStyle(item.getKey(), values)\r\n }\r\n }\r\n }\r\n\r\n // Always apply clicked item as source-of-truth (handles stale/mismatched container).\r\n const layoutItem = $getNodeByKey<LexicalNode>(payload.layoutItemKey)\r\n if ($isLayoutItemNode(layoutItem)) {\r\n layoutItem.setStyle(nextStyle)\r\n logger.info(\"[Layout] Applied style to clicked layout item\", {\r\n layoutItemKey: payload.layoutItemKey,\r\n appliedStyle: layoutItem.getStyle(),\r\n })\r\n syncLayoutItemDomStyle(layoutItem.getKey(), values)\r\n logger.info(\"[Layout] Update summary\", {\r\n containerKey: payload.containerKey,\r\n layoutItemKey: payload.layoutItemKey,\r\n updatedItemsCount,\r\n })\r\n return\r\n }\r\n logger.error(\"[Layout] Failed to resolve container and layout item keys\", {\r\n containerKey: payload.containerKey,\r\n layoutItemKey: payload.layoutItemKey,\r\n })\r\n })\r\n }}\r\n />\r\n ))\r\n }\r\n\r\n return mergeRegister(\r\n editor.registerCommand(\r\n OPEN_UPDATE_LAYOUT_MODAL_COMMAND,\r\n ({ layoutItemKey }) => {\r\n const element = editor.getElementByKey(layoutItemKey)\r\n if (element instanceof HTMLElement) {\r\n const layoutPayload = getLayoutPayloadFromTarget(element)\r\n if (layoutPayload) openUpdateLayoutModal(layoutPayload)\r\n }\r\n return true\r\n },\r\n COMMAND_PRIORITY_EDITOR\r\n ),\r\n // When layout is the last child pressing down/right arrow will insert paragraph\r\n // below it to allow adding more content. It's similar what $insertBlockNode\r\n // (mainly for decorators), except it'll always be possible to continue adding\r\n // new content even if trailing paragraph is accidentally deleted\r\n editor.registerCommand(\r\n KEY_ARROW_DOWN_COMMAND,\r\n () => $onEscape(false),\r\n COMMAND_PRIORITY_LOW\r\n ),\r\n editor.registerCommand(\r\n KEY_ARROW_RIGHT_COMMAND,\r\n () => $onEscape(false),\r\n COMMAND_PRIORITY_LOW\r\n ),\r\n // When layout is the first child pressing up/left arrow will insert paragraph\r\n // above it to allow adding more content. It's similar what $insertBlockNode\r\n // (mainly for decorators), except it'll always be possible to continue adding\r\n // new content even if leading paragraph is accidentally deleted\r\n editor.registerCommand(\r\n KEY_ARROW_UP_COMMAND,\r\n () => $onEscape(true),\r\n COMMAND_PRIORITY_LOW\r\n ),\r\n editor.registerCommand(\r\n KEY_ARROW_LEFT_COMMAND,\r\n () => $onEscape(true),\r\n COMMAND_PRIORITY_LOW\r\n ),\r\n editor.registerCommand(\r\n INSERT_LAYOUT_COMMAND,\r\n (payload) => {\r\n editor.update(() => {\r\n const template = typeof payload === \"string\" ? payload : payload.template\r\n const itemBackgroundColor =\r\n typeof payload === \"string\"\r\n ? undefined\r\n : payload.itemBackgroundColor?.trim()\r\n const itemPaddingPx =\r\n typeof payload === \"string\"\r\n ? undefined\r\n : Number.isFinite(payload.itemPaddingPx)\r\n ? Math.min(Math.max(payload.itemPaddingPx ?? 0, 0), 64)\r\n : undefined\r\n const itemBorderRadiusPx =\r\n typeof payload === \"string\"\r\n ? undefined\r\n : Number.isFinite(payload.itemBorderRadiusPx)\r\n ? Math.min(Math.max(payload.itemBorderRadiusPx ?? 0, 0), 64)\r\n : undefined\r\n\r\n const itemStyle = buildLayoutItemStyle({\r\n template,\r\n itemBackgroundColor: itemBackgroundColor ?? \"#ffffff\",\r\n itemPaddingPx: itemPaddingPx ?? 12,\r\n itemBorderRadiusPx: itemBorderRadiusPx ?? 8,\r\n })\r\n\r\n const container = $createLayoutContainerNode(template)\r\n const itemsCount = getItemsCountFromTemplate(template)\r\n\r\n for (let i = 0; i < itemsCount; i++) {\r\n const item = $createLayoutItemNode()\r\n if (itemStyle) {\r\n item.setStyle(itemStyle)\r\n }\r\n container.append(\r\n item.append($createParagraphNode())\r\n )\r\n }\r\n\r\n $insertNodeToNearestRoot(container)\r\n container.selectStart()\r\n })\r\n\r\n return true\r\n },\r\n COMMAND_PRIORITY_EDITOR\r\n ),\r\n editor.registerCommand(\r\n UPDATE_LAYOUT_COMMAND,\r\n ({ template, nodeKey }) => {\r\n editor.update(() => {\r\n const container = $getNodeByKey<LexicalNode>(nodeKey)\r\n\r\n if (!$isLayoutContainerNode(container)) {\r\n return\r\n }\r\n updateLayoutContainerTemplate(container, template)\r\n })\r\n\r\n return true\r\n },\r\n COMMAND_PRIORITY_EDITOR\r\n ),\r\n // Structure enforcing transformers for each node type. In case nesting structure is not\r\n // \"Container > Item\" it'll unwrap nodes and convert it back\r\n // to regular content.\r\n editor.registerNodeTransform(LayoutItemNode, (node) => {\r\n const parent = node.getParent<ElementNode>()\r\n if (!$isLayoutContainerNode(parent)) {\r\n const children = node.getChildren<LexicalNode>()\r\n for (const child of children) {\r\n node.insertBefore(child)\r\n }\r\n node.remove()\r\n }\r\n }),\r\n editor.registerNodeTransform(LayoutContainerNode, (node) => {\r\n const children = node.getChildren<LexicalNode>()\r\n if (!children.every($isLayoutItemNode)) {\r\n for (const child of children) {\r\n node.insertBefore(child)\r\n }\r\n node.remove()\r\n }\r\n })\r\n )\r\n }, [editor, showModal])\r\n\r\n return <>{modal}</>\r\n}\r\n\r\nfunction getItemsCountFromTemplate(template: string): number {\r\n return template.trim().split(/\\s+/).length\r\n}\r\n","\"use client\"\r\n\r\nimport * as React from \"react\"\r\nimport * as SelectPrimitive from \"@radix-ui/react-select\"\r\nimport { CheckIcon, ChevronDownIcon, ChevronUpIcon } from \"lucide-react\"\r\n\r\nimport { cn } from \"@/utils\"\r\nimport { responsiveTextSizes, fontWeights, lineHeights, iconSizes } from \"@/constants\"\r\n\r\nconst selectBodySmall = `${responsiveTextSizes.small} ${fontWeights.normal} ${lineHeights.relaxed}`\r\nconst selectIconSizeSm = iconSizes.sm\r\nconst selectIconSizeXs = iconSizes.xs\r\n\r\ninterface SelectProps extends React.ComponentProps<typeof SelectPrimitive.Root> {\r\n modal?: boolean\r\n}\r\n\r\nconst Select = (props: SelectProps) => (\r\n <SelectPrimitive.Root {...props} />\r\n)\r\nconst SelectGroup = SelectPrimitive.Group\r\nconst SelectValue = SelectPrimitive.Value\r\n\r\nconst SelectTrigger = React.forwardRef<\r\n React.ElementRef<typeof SelectPrimitive.Trigger>,\r\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger> & {\r\n size?: \"sm\" | \"default\"\r\n }\r\n>(({ className, size = \"default\", children, ...props }, ref) => (\r\n <SelectPrimitive.Trigger\r\n ref={ref}\r\n data-slot=\"select-trigger\"\r\n data-size={size}\r\n className={cn(\r\n `border-input data-[placeholder]:text-muted-foreground [&_svg:not([class*='text-'])]:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 dark:hover:bg-input/50 flex w-fit items-center justify-between gap-2 rounded-md border bg-background px-3 py-2 whitespace-nowrap shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 [&_svg]:pointer-events-none [&_svg]:shrink-0 ${selectBodySmall} [&_svg:not([class*='size-'])]:${selectIconSizeSm}`,\r\n className\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n <SelectPrimitive.Icon asChild>\r\n <ChevronDownIcon className={`${selectIconSizeSm} opacity-50`} />\r\n </SelectPrimitive.Icon>\r\n </SelectPrimitive.Trigger>\r\n))\r\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName\r\n\r\nconst SelectContent = React.forwardRef<\r\n React.ElementRef<typeof SelectPrimitive.Content>,\r\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>\r\n>(({ className, children, position = \"popper\", align = \"center\", ...props }, ref) => (\r\n <SelectPrimitive.Portal>\r\n <SelectPrimitive.Content\r\n ref={ref}\r\n data-slot=\"select-content\"\r\n className={cn(\r\n \"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 relative z-200 max-h-(--radix-select-content-available-height) min-w-[8rem] origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border shadow-md\",\r\n position === \"popper\" &&\r\n \"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1\",\r\n className\r\n )}\r\n position={position}\r\n align={align}\r\n {...props}\r\n >\r\n <SelectScrollUpButton />\r\n <SelectPrimitive.Viewport\r\n className={cn(\r\n \"p-1\",\r\n position === \"popper\" &&\r\n \"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1\"\r\n )}\r\n >\r\n {children}\r\n </SelectPrimitive.Viewport>\r\n <SelectScrollDownButton />\r\n </SelectPrimitive.Content>\r\n </SelectPrimitive.Portal>\r\n))\r\nSelectContent.displayName = SelectPrimitive.Content.displayName\r\n\r\nconst SelectLabel = React.forwardRef<\r\n React.ElementRef<typeof SelectPrimitive.Label>,\r\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>\r\n>(({ className, ...props }, ref) => (\r\n <SelectPrimitive.Label\r\n ref={ref}\r\n data-slot=\"select-label\"\r\n className={cn(`text-muted-foreground px-2 py-1.5 ${selectBodySmall}`, className)}\r\n {...props}\r\n />\r\n))\r\nSelectLabel.displayName = SelectPrimitive.Label.displayName\r\n\r\nconst SelectItem = React.forwardRef<\r\n React.ElementRef<typeof SelectPrimitive.Item>,\r\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>\r\n>(({ className, children, ...props }, ref) => (\r\n <SelectPrimitive.Item\r\n ref={ref}\r\n data-slot=\"select-item\"\r\n className={cn(\r\n `focus:bg-accent focus:text-accent-foreground focus:[&_svg:not([class*='text-'])]:text-accent-foreground hover:[&_svg:not([class*='text-'])]:text-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex w-full cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 ${selectBodySmall} [&_svg:not([class*='size-'])]:${selectIconSizeSm} *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2 w-full`,\r\n className\r\n )}\r\n {...props}\r\n >\r\n <span className={`absolute right-2 flex ${selectIconSizeXs} items-center justify-center`}>\r\n <SelectPrimitive.ItemIndicator>\r\n <CheckIcon className={selectIconSizeXs} />\r\n </SelectPrimitive.ItemIndicator>\r\n </span>\r\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\r\n </SelectPrimitive.Item>\r\n))\r\nSelectItem.displayName = SelectPrimitive.Item.displayName\r\n\r\nconst SelectSeparator = React.forwardRef<\r\n React.ElementRef<typeof SelectPrimitive.Separator>,\r\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>\r\n>(({ className, ...props }, ref) => (\r\n <SelectPrimitive.Separator\r\n ref={ref}\r\n data-slot=\"select-separator\"\r\n className={cn(\"bg-border pointer-events-none -mx-1 my-1 h-px\", className)}\r\n {...props}\r\n />\r\n))\r\nSelectSeparator.displayName = SelectPrimitive.Separator.displayName\r\n\r\nconst SelectScrollUpButton = React.forwardRef<\r\n React.ElementRef<typeof SelectPrimitive.ScrollUpButton>,\r\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollUpButton>\r\n>(({ className, ...props }, ref) => (\r\n <SelectPrimitive.ScrollUpButton\r\n ref={ref}\r\n data-slot=\"select-scroll-up-button\"\r\n className={cn(\r\n \"flex cursor-default items-center justify-center py-1\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n <ChevronUpIcon className={selectIconSizeSm} />\r\n </SelectPrimitive.ScrollUpButton>\r\n))\r\nSelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName\r\n\r\nconst SelectScrollDownButton = React.forwardRef<\r\n React.ElementRef<typeof SelectPrimitive.ScrollDownButton>,\r\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollDownButton>\r\n>(({ className, ...props }, ref) => (\r\n <SelectPrimitive.ScrollDownButton\r\n ref={ref}\r\n data-slot=\"select-scroll-down-button\"\r\n className={cn(\r\n \"flex cursor-default items-center justify-center py-1\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n <ChevronDownIcon className={selectIconSizeSm} />\r\n </SelectPrimitive.ScrollDownButton>\r\n))\r\nSelectScrollDownButton.displayName = SelectPrimitive.ScrollDownButton.displayName\r\n\r\nexport {\r\n Select,\r\n SelectContent,\r\n SelectGroup,\r\n SelectItem,\r\n SelectLabel,\r\n SelectScrollDownButton,\r\n SelectScrollUpButton,\r\n SelectSeparator,\r\n SelectTrigger,\r\n SelectValue,\r\n}\r\n\r\n","\"use client\"\r\n\r\nimport * as React from \"react\"\r\nimport * as SliderPrimitive from \"@radix-ui/react-slider\"\r\nimport { Slot } from \"@radix-ui/react-slot\"\r\nimport { cva, type VariantProps } from \"class-variance-authority\"\r\nimport { PipetteIcon } from \"lucide-react\"\r\n\r\nimport { cn } from \"@/utils\"\r\nimport { logger } from \"@/utils\"\r\nimport { Button } from \"@/components/ui/button\"\r\nimport { Input } from \"@/components/ui/input\"\r\nimport {\r\n Popover,\r\n PopoverContent,\r\n PopoverTrigger,\r\n} from \"@/components/ui/popover\"\r\nimport {\r\n Select,\r\n SelectContent,\r\n SelectItem,\r\n SelectTrigger,\r\n SelectValue,\r\n} from \"@/components/ui/select\"\r\n\r\n/**\r\n * @see https://github.com/radix-ui/primitives/blob/main/packages/react/compose-refs/src/compose-refs.tsx\r\n */\r\n\r\ntype PossibleRef<T> = React.Ref<T> | undefined\r\n\r\n/**\r\n * Set a given ref to a given value\r\n * This utility takes care of different types of refs: callback refs and RefObject(s)\r\n */\r\nfunction setRef<T>(ref: PossibleRef<T>, value: T) {\r\n if (typeof ref === \"function\") {\r\n return ref(value)\r\n }\r\n\r\n if (ref !== null && ref !== undefined) {\r\n ref.current = value\r\n }\r\n}\r\n\r\n/**\r\n * A utility to compose multiple refs together\r\n * Accepts callback refs and RefObject(s)\r\n */\r\nfunction composeRefs<T>(...refs: PossibleRef<T>[]): React.RefCallback<T> {\r\n return (node) => {\r\n let hasCleanup = false\r\n const cleanups = refs.map((ref) => {\r\n const cleanup = setRef(ref, node)\r\n if (!hasCleanup && typeof cleanup === \"function\") {\r\n hasCleanup = true\r\n }\r\n return cleanup\r\n })\r\n\r\n // React <19 will log an error to the console if a callback ref returns a\r\n // value. We don't use ref cleanups internally so this will only happen if a\r\n // user's ref callback returns a value, which we only expect if they are\r\n // using the cleanup functionality added in React 19.\r\n if (hasCleanup) {\r\n return () => {\r\n for (let i = 0; i < cleanups.length; i++) {\r\n const cleanup = cleanups[i]\r\n if (typeof cleanup === \"function\") {\r\n cleanup()\r\n } else {\r\n setRef(refs[i], null)\r\n }\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * A custom hook that composes multiple refs\r\n * Accepts callback refs and RefObject(s)\r\n */\r\nfunction useComposedRefs<T>(...refs: PossibleRef<T>[]): React.RefCallback<T> {\r\n // biome-ignore lint/correctness/useExhaustiveDependencies: we want to memoize by all values\r\n return React.useCallback(\r\n (value: T) => {\r\n composeRefs(...refs)(value)\r\n },\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n refs\r\n )\r\n}\r\n\r\ntype InputValue = string[] | string\r\n\r\ninterface VisuallyHiddenInputProps<T = InputValue>\r\n extends Omit<\r\n React.InputHTMLAttributes<HTMLInputElement>,\r\n \"value\" | \"checked\" | \"onReset\"\r\n > {\r\n value?: T\r\n checked?: boolean\r\n control: HTMLElement | null\r\n bubbles?: boolean\r\n}\r\n\r\nfunction VisuallyHiddenInput<T = InputValue>(\r\n props: VisuallyHiddenInputProps<T>\r\n) {\r\n const {\r\n control,\r\n value,\r\n checked,\r\n bubbles = true,\r\n type = \"hidden\",\r\n style,\r\n ...inputProps\r\n } = props\r\n\r\n const isCheckInput = React.useMemo(\r\n () => type === \"checkbox\" || type === \"radio\" || type === \"switch\",\r\n [type]\r\n )\r\n const inputRef = React.useRef<HTMLInputElement>(null)\r\n\r\n const prevValueRef = React.useRef<{\r\n value: T | boolean | undefined\r\n previous: T | boolean | undefined\r\n }>({\r\n value: isCheckInput ? checked : value,\r\n previous: isCheckInput ? checked : value,\r\n })\r\n\r\n // Use useEffect to update ref instead of useMemo to avoid accessing refs during render\r\n const [prevValue, setPrevValue] = React.useState<T | boolean | undefined>(\r\n isCheckInput ? checked : value\r\n )\r\n\r\n React.useEffect(() => {\r\n const currentValue = isCheckInput ? checked : value\r\n if (prevValueRef.current.value !== currentValue) {\r\n prevValueRef.current.previous = prevValueRef.current.value\r\n prevValueRef.current.value = currentValue\r\n setPrevValue(prevValueRef.current.previous)\r\n }\r\n }, [isCheckInput, value, checked])\r\n\r\n const [controlSize, setControlSize] = React.useState<{\r\n width?: number\r\n height?: number\r\n }>({})\r\n\r\n React.useLayoutEffect(() => {\r\n if (!control) {\r\n setControlSize({})\r\n return\r\n }\r\n\r\n setControlSize({\r\n width: control.offsetWidth,\r\n height: control.offsetHeight,\r\n })\r\n\r\n if (typeof window === \"undefined\") return\r\n\r\n const resizeObserver = new ResizeObserver((entries) => {\r\n if (!Array.isArray(entries) || !entries.length) return\r\n\r\n const entry = entries[0]\r\n if (!entry) return\r\n\r\n let width: number\r\n let height: number\r\n\r\n if (\"borderBoxSize\" in entry) {\r\n const borderSizeEntry = entry.borderBoxSize\r\n const borderSize = Array.isArray(borderSizeEntry)\r\n ? borderSizeEntry[0]\r\n : borderSizeEntry\r\n width = borderSize.inlineSize\r\n height = borderSize.blockSize\r\n } else {\r\n width = control.offsetWidth\r\n height = control.offsetHeight\r\n }\r\n\r\n setControlSize({ width, height })\r\n })\r\n\r\n resizeObserver.observe(control, { box: \"border-box\" })\r\n return () => {\r\n resizeObserver.disconnect()\r\n }\r\n }, [control])\r\n\r\n React.useEffect(() => {\r\n const input = inputRef.current\r\n if (!input) return\r\n\r\n const inputProto = window.HTMLInputElement.prototype\r\n const propertyKey = isCheckInput ? \"checked\" : \"value\"\r\n const eventType = isCheckInput ? \"click\" : \"input\"\r\n const currentValue = isCheckInput ? checked : value\r\n\r\n const serializedCurrentValue = isCheckInput\r\n ? checked\r\n : typeof value === \"object\" && value !== null\r\n ? JSON.stringify(value)\r\n : value\r\n\r\n const descriptor = Object.getOwnPropertyDescriptor(inputProto, propertyKey)\r\n\r\n const setter = descriptor?.set\r\n\r\n if (prevValue !== currentValue && setter) {\r\n const event = new Event(eventType, { bubbles })\r\n setter.call(input, serializedCurrentValue)\r\n input.dispatchEvent(event)\r\n }\r\n }, [prevValue, value, checked, bubbles, isCheckInput])\r\n\r\n const composedStyle = React.useMemo<React.CSSProperties>(() => {\r\n return {\r\n ...style,\r\n ...(controlSize.width !== undefined && controlSize.height !== undefined\r\n ? controlSize\r\n : {}),\r\n border: 0,\r\n clip: \"rect(0 0 0 0)\",\r\n clipPath: \"inset(50%)\",\r\n height: \"1px\",\r\n margin: \"-1px\",\r\n overflow: \"hidden\",\r\n padding: 0,\r\n position: \"absolute\",\r\n whiteSpace: \"nowrap\",\r\n width: \"1px\",\r\n }\r\n }, [style, controlSize])\r\n\r\n return (\r\n <input\r\n type={type}\r\n {...inputProps}\r\n ref={inputRef}\r\n aria-hidden={isCheckInput}\r\n tabIndex={-1}\r\n defaultChecked={isCheckInput ? checked : undefined}\r\n style={composedStyle}\r\n />\r\n )\r\n}\r\n\r\n/**\r\n * @see https://gist.github.com/bkrmendy/f4582173f50fab209ddfef1377ab31e3\r\n */\r\ninterface EyeDropper {\r\n open: (options?: { signal?: AbortSignal }) => Promise<{ sRGBHex: string }>\r\n}\r\n\r\ndeclare global {\r\n interface Window {\r\n EyeDropper?: {\r\n new (): EyeDropper\r\n }\r\n }\r\n}\r\n\r\nconst colorFormats = [\"hex\", \"rgb\", \"hsl\", \"hsb\"] as const\r\ntype ColorFormat = (typeof colorFormats)[number]\r\nconst colorPresets = [\r\n { label: \"Primary\", value: \"#1F3368\" },\r\n { label: \"Secondary\", value: \"#A71B29\" },\r\n // --muted in light theme is #F5F5F5, /50 -> alpha 0.5\r\n { label: \"bg-muted/50\", value: \"#F5F5F5\", alpha: 0.5 },\r\n] as const\r\n\r\ninterface ColorValue {\r\n r: number\r\n g: number\r\n b: number\r\n a: number\r\n}\r\n\r\ninterface HSVColorValue {\r\n h: number\r\n s: number\r\n v: number\r\n a: number\r\n}\r\n\r\nfunction hexToRgb(hex: string, alpha?: number): ColorValue {\r\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex)\r\n return result\r\n ? {\r\n r: Number.parseInt(result[1] ?? \"0\", 16),\r\n g: Number.parseInt(result[2] ?? \"0\", 16),\r\n b: Number.parseInt(result[3] ?? \"0\", 16),\r\n a: alpha ?? 1,\r\n }\r\n : { r: 0, g: 0, b: 0, a: alpha ?? 1 }\r\n}\r\n\r\nfunction rgbToHex(color: ColorValue): string {\r\n const toHex = (n: number) => {\r\n const hex = Math.round(n).toString(16)\r\n return hex.length === 1 ? `0${hex}` : hex\r\n }\r\n return `#${toHex(color.r)}${toHex(color.g)}${toHex(color.b)}`\r\n}\r\n\r\nfunction rgbToHsv(color: ColorValue): HSVColorValue {\r\n const r = color.r / 255\r\n const g = color.g / 255\r\n const b = color.b / 255\r\n\r\n const max = Math.max(r, g, b)\r\n const min = Math.min(r, g, b)\r\n const diff = max - min\r\n\r\n let h = 0\r\n if (diff !== 0) {\r\n switch (max) {\r\n case r:\r\n h = ((g - b) / diff) % 6\r\n break\r\n case g:\r\n h = (b - r) / diff + 2\r\n break\r\n case b:\r\n h = (r - g) / diff + 4\r\n break\r\n }\r\n }\r\n h = Math.round(h * 60)\r\n if (h < 0) h += 360\r\n\r\n const s = max === 0 ? 0 : diff / max\r\n const v = max\r\n\r\n return {\r\n h,\r\n s: Math.round(s * 100),\r\n v: Math.round(v * 100),\r\n a: color.a,\r\n }\r\n}\r\n\r\nfunction hsvToRgb(hsv: HSVColorValue): ColorValue {\r\n const h = hsv.h / 360\r\n const s = hsv.s / 100\r\n const v = hsv.v / 100\r\n\r\n const i = Math.floor(h * 6)\r\n const f = h * 6 - i\r\n const p = v * (1 - s)\r\n const q = v * (1 - f * s)\r\n const t = v * (1 - (1 - f) * s)\r\n\r\n let r: number\r\n let g: number\r\n let b: number\r\n\r\n switch (i % 6) {\r\n case 0: {\r\n r = v\r\n g = t\r\n b = p\r\n break\r\n }\r\n case 1: {\r\n r = q\r\n g = v\r\n b = p\r\n break\r\n }\r\n case 2: {\r\n r = p\r\n g = v\r\n b = t\r\n break\r\n }\r\n case 3: {\r\n r = p\r\n g = q\r\n b = v\r\n break\r\n }\r\n case 4: {\r\n r = t\r\n g = p\r\n b = v\r\n break\r\n }\r\n case 5: {\r\n r = v\r\n g = p\r\n b = q\r\n break\r\n }\r\n default: {\r\n r = 0\r\n g = 0\r\n b = 0\r\n }\r\n }\r\n\r\n return {\r\n r: Math.round(r * 255),\r\n g: Math.round(g * 255),\r\n b: Math.round(b * 255),\r\n a: hsv.a,\r\n }\r\n}\r\n\r\nfunction colorToString(color: ColorValue, format: ColorFormat = \"hex\"): string {\r\n switch (format) {\r\n case \"hex\":\r\n return rgbToHex(color)\r\n case \"rgb\":\r\n return color.a < 1\r\n ? `rgba(${color.r}, ${color.g}, ${color.b}, ${color.a})`\r\n : `rgb(${color.r}, ${color.g}, ${color.b})`\r\n case \"hsl\": {\r\n const hsl = rgbToHsl(color)\r\n return color.a < 1\r\n ? `hsla(${hsl.h}, ${hsl.s}%, ${hsl.l}%, ${color.a})`\r\n : `hsl(${hsl.h}, ${hsl.s}%, ${hsl.l}%)`\r\n }\r\n case \"hsb\": {\r\n const hsv = rgbToHsv(color)\r\n return color.a < 1\r\n ? `hsba(${hsv.h}, ${hsv.s}%, ${hsv.v}%, ${color.a})`\r\n : `hsb(${hsv.h}, ${hsv.s}%, ${hsv.v}%)`\r\n }\r\n default:\r\n return rgbToHex(color)\r\n }\r\n}\r\n\r\nfunction rgbToHsl(color: ColorValue) {\r\n const r = color.r / 255\r\n const g = color.g / 255\r\n const b = color.b / 255\r\n\r\n const max = Math.max(r, g, b)\r\n const min = Math.min(r, g, b)\r\n const diff = max - min\r\n const sum = max + min\r\n\r\n const l = sum / 2\r\n\r\n let h = 0\r\n let s = 0\r\n\r\n if (diff !== 0) {\r\n s = l > 0.5 ? diff / (2 - sum) : diff / sum\r\n\r\n if (max === r) {\r\n h = (g - b) / diff + (g < b ? 6 : 0)\r\n } else if (max === g) {\r\n h = (b - r) / diff + 2\r\n } else if (max === b) {\r\n h = (r - g) / diff + 4\r\n }\r\n h /= 6\r\n }\r\n\r\n return {\r\n h: Math.round(h * 360),\r\n s: Math.round(s * 100),\r\n l: Math.round(l * 100),\r\n }\r\n}\r\n\r\nfunction hslToRgb(\r\n hsl: { h: number; s: number; l: number },\r\n alpha = 1\r\n): ColorValue {\r\n const h = hsl.h / 360\r\n const s = hsl.s / 100\r\n const l = hsl.l / 100\r\n\r\n const c = (1 - Math.abs(2 * l - 1)) * s\r\n const x = c * (1 - Math.abs(((h * 6) % 2) - 1))\r\n const m = l - c / 2\r\n\r\n let r = 0\r\n let g = 0\r\n let b = 0\r\n\r\n if (h >= 0 && h < 1 / 6) {\r\n r = c\r\n g = x\r\n b = 0\r\n } else if (h >= 1 / 6 && h < 2 / 6) {\r\n r = x\r\n g = c\r\n b = 0\r\n } else if (h >= 2 / 6 && h < 3 / 6) {\r\n r = 0\r\n g = c\r\n b = x\r\n } else if (h >= 3 / 6 && h < 4 / 6) {\r\n r = 0\r\n g = x\r\n b = c\r\n } else if (h >= 4 / 6 && h < 5 / 6) {\r\n r = x\r\n g = 0\r\n b = c\r\n } else if (h >= 5 / 6 && h < 1) {\r\n r = c\r\n g = 0\r\n b = x\r\n }\r\n\r\n return {\r\n r: Math.round((r + m) * 255),\r\n g: Math.round((g + m) * 255),\r\n b: Math.round((b + m) * 255),\r\n a: alpha,\r\n }\r\n}\r\n\r\nfunction parseColorString(value: string): ColorValue | null {\r\n const trimmed = value.trim()\r\n\r\n // Parse hex colors\r\n if (trimmed.startsWith(\"#\")) {\r\n const hexMatch = trimmed.match(/^#([a-fA-F0-9]{3}|[a-fA-F0-9]{6})$/)\r\n if (hexMatch) {\r\n return hexToRgb(trimmed)\r\n }\r\n }\r\n\r\n // Parse rgb/rgba colors\r\n const rgbMatch = trimmed.match(\r\n /^rgba?\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(?:,\\s*([\\d.]+))?\\s*\\)$/\r\n )\r\n if (rgbMatch) {\r\n return {\r\n r: Number.parseInt(rgbMatch[1] ?? \"0\", 10),\r\n g: Number.parseInt(rgbMatch[2] ?? \"0\", 10),\r\n b: Number.parseInt(rgbMatch[3] ?? \"0\", 10),\r\n a: rgbMatch[4] ? Number.parseFloat(rgbMatch[4]) : 1,\r\n }\r\n }\r\n\r\n // Parse hsl/hsla colors\r\n const hslMatch = trimmed.match(\r\n /^hsla?\\(\\s*(\\d+)\\s*,\\s*(\\d+)%\\s*,\\s*(\\d+)%\\s*(?:,\\s*([\\d.]+))?\\s*\\)$/\r\n )\r\n if (hslMatch) {\r\n const h = Number.parseInt(hslMatch[1] ?? \"0\", 10)\r\n const s = Number.parseInt(hslMatch[2] ?? \"0\", 10) / 100\r\n const l = Number.parseInt(hslMatch[3] ?? \"0\", 10) / 100\r\n const a = hslMatch[4] ? Number.parseFloat(hslMatch[4]) : 1\r\n\r\n // Convert HSL to RGB\r\n const c = (1 - Math.abs(2 * l - 1)) * s\r\n const x = c * (1 - Math.abs(((h / 60) % 2) - 1))\r\n const m = l - c / 2\r\n\r\n let r = 0\r\n let g = 0\r\n let b = 0\r\n\r\n if (h >= 0 && h < 60) {\r\n r = c\r\n g = x\r\n b = 0\r\n } else if (h >= 60 && h < 120) {\r\n r = x\r\n g = c\r\n b = 0\r\n } else if (h >= 120 && h < 180) {\r\n r = 0\r\n g = c\r\n b = x\r\n } else if (h >= 180 && h < 240) {\r\n r = 0\r\n g = x\r\n b = c\r\n } else if (h >= 240 && h < 300) {\r\n r = x\r\n g = 0\r\n b = c\r\n } else if (h >= 300 && h < 360) {\r\n r = c\r\n g = 0\r\n b = x\r\n }\r\n\r\n return {\r\n r: Math.round((r + m) * 255),\r\n g: Math.round((g + m) * 255),\r\n b: Math.round((b + m) * 255),\r\n a,\r\n }\r\n }\r\n\r\n // Parse hsb/hsba colors\r\n const hsbMatch = trimmed.match(\r\n /^hsba?\\(\\s*(\\d+)\\s*,\\s*(\\d+)%\\s*,\\s*(\\d+)%\\s*(?:,\\s*([\\d.]+))?\\s*\\)$/\r\n )\r\n if (hsbMatch) {\r\n const h = Number.parseInt(hsbMatch[1] ?? \"0\", 10)\r\n const s = Number.parseInt(hsbMatch[2] ?? \"0\", 10)\r\n const v = Number.parseInt(hsbMatch[3] ?? \"0\", 10)\r\n const a = hsbMatch[4] ? Number.parseFloat(hsbMatch[4]) : 1\r\n\r\n return hsvToRgb({ h, s, v, a })\r\n }\r\n\r\n return null\r\n}\r\n\r\ntype Direction = \"ltr\" | \"rtl\"\r\n\r\nconst DirectionContext = React.createContext<Direction | undefined>(undefined)\r\n\r\nfunction useDirection(dirProp?: Direction): Direction {\r\n const contextDir = React.useContext(DirectionContext)\r\n return dirProp ?? contextDir ?? \"ltr\"\r\n}\r\n\r\nfunction useLazyRef<T>(fn: () => T) {\r\n const ref = React.useRef<T | null>(null)\r\n\r\n if (ref.current === null) {\r\n ref.current = fn()\r\n }\r\n\r\n return ref as React.RefObject<T>\r\n}\r\n\r\ninterface ColorPickerStoreState {\r\n color: ColorValue\r\n hsv: HSVColorValue\r\n open: boolean\r\n format: ColorFormat\r\n}\r\n\r\ninterface ColorPickerStoreCallbacks {\r\n onColorChange?: (colorString: string) => void\r\n onOpenChange?: (open: boolean) => void\r\n onFormatChange?: (format: ColorFormat) => void\r\n}\r\n\r\ninterface ColorPickerStore {\r\n subscribe: (cb: () => void) => () => void\r\n getState: () => ColorPickerStoreState\r\n setColor: (value: ColorValue) => void\r\n setHsv: (value: HSVColorValue) => void\r\n setOpen: (value: boolean) => void\r\n setFormat: (value: ColorFormat) => void\r\n notify: () => void\r\n}\r\n\r\nfunction createColorPickerStore(\r\n listenersRef: React.RefObject<Set<() => void>>,\r\n stateRef: React.RefObject<ColorPickerStoreState>,\r\n callbacks?: ColorPickerStoreCallbacks\r\n): ColorPickerStore {\r\n const store: ColorPickerStore = {\r\n subscribe: (cb) => {\r\n if (listenersRef.current) {\r\n listenersRef.current.add(cb)\r\n return () => listenersRef.current?.delete(cb)\r\n }\r\n return () => {}\r\n },\r\n getState: () =>\r\n stateRef.current || {\r\n color: { r: 0, g: 0, b: 0, a: 1 },\r\n hsv: { h: 0, s: 0, v: 0, a: 1 },\r\n open: false,\r\n format: \"hex\" as ColorFormat,\r\n },\r\n setColor: (value: ColorValue) => {\r\n if (!stateRef.current) return\r\n if (Object.is(stateRef.current.color, value)) return\r\n\r\n const prevState = { ...stateRef.current }\r\n stateRef.current.color = value\r\n\r\n if (callbacks?.onColorChange) {\r\n const colorString = colorToString(value, prevState.format)\r\n callbacks.onColorChange(colorString)\r\n }\r\n\r\n store.notify()\r\n },\r\n setHsv: (value: HSVColorValue) => {\r\n if (!stateRef.current) return\r\n if (Object.is(stateRef.current.hsv, value)) return\r\n\r\n const prevState = { ...stateRef.current }\r\n stateRef.current.hsv = value\r\n\r\n if (callbacks?.onColorChange) {\r\n const colorValue = hsvToRgb(value)\r\n const colorString = colorToString(colorValue, prevState.format)\r\n callbacks.onColorChange(colorString)\r\n }\r\n\r\n store.notify()\r\n },\r\n setOpen: (value: boolean) => {\r\n if (!stateRef.current) return\r\n if (Object.is(stateRef.current.open, value)) return\r\n\r\n stateRef.current.open = value\r\n\r\n if (callbacks?.onOpenChange) {\r\n callbacks.onOpenChange(value)\r\n }\r\n\r\n store.notify()\r\n },\r\n setFormat: (value: ColorFormat) => {\r\n if (!stateRef.current) return\r\n if (Object.is(stateRef.current.format, value)) return\r\n\r\n stateRef.current.format = value\r\n\r\n if (callbacks?.onFormatChange) {\r\n callbacks.onFormatChange(value)\r\n }\r\n\r\n store.notify()\r\n },\r\n notify: () => {\r\n if (listenersRef.current) {\r\n for (const cb of listenersRef.current) {\r\n cb()\r\n }\r\n }\r\n },\r\n }\r\n\r\n return store\r\n}\r\n\r\nfunction useColorPickerStoreContext(consumerName: string) {\r\n const context = React.useContext(ColorPickerStoreContext)\r\n if (!context) {\r\n throw new Error(\r\n `\\`${consumerName}\\` must be used within \\`ColorPickerRoot\\``\r\n )\r\n }\r\n return context\r\n}\r\n\r\nfunction useColorPickerStore<U>(\r\n selector: (state: ColorPickerStoreState) => U\r\n): U {\r\n const store = useColorPickerStoreContext(\"useColorPickerStoreSelector\")\r\n\r\n const getSnapshot = React.useCallback(\r\n () => selector(store.getState()),\r\n [store, selector]\r\n )\r\n\r\n return React.useSyncExternalStore(store.subscribe, getSnapshot, getSnapshot)\r\n}\r\n\r\ninterface ColorPickerContextValue {\r\n dir: Direction\r\n disabled?: boolean\r\n inline?: boolean\r\n readOnly?: boolean\r\n required?: boolean\r\n}\r\n\r\nconst ColorPickerStoreContext = React.createContext<ColorPickerStore | null>(\r\n null\r\n)\r\nconst ColorPickerContext = React.createContext<ColorPickerContextValue | null>(\r\n null\r\n)\r\n\r\nfunction useColorPickerContext(consumerName: string) {\r\n const context = React.useContext(ColorPickerContext)\r\n if (!context) {\r\n throw new Error(\r\n `\\`${consumerName}\\` must be used within \\`ColorPickerRoot\\``\r\n )\r\n }\r\n return context\r\n}\r\n\r\ninterface ColorPickerRootProps\r\n extends Omit<React.ComponentProps<\"div\">, \"onValueChange\">,\r\n Pick<\r\n React.ComponentProps<typeof Popover>,\r\n \"defaultOpen\" | \"open\" | \"onOpenChange\" | \"modal\"\r\n > {\r\n value?: string\r\n defaultValue?: string\r\n onValueChange?: (value: string) => void\r\n dir?: Direction\r\n format?: ColorFormat\r\n defaultFormat?: ColorFormat\r\n onFormatChange?: (format: ColorFormat) => void\r\n name?: string\r\n asChild?: boolean\r\n disabled?: boolean\r\n inline?: boolean\r\n readOnly?: boolean\r\n required?: boolean\r\n}\r\n\r\nconst ColorPickerRoot = React.memo(function ColorPickerRoot(props: ColorPickerRootProps) {\r\n const {\r\n value: valueProp,\r\n defaultValue = \"#000000\",\r\n onValueChange,\r\n format: formatProp,\r\n defaultFormat = \"hex\",\r\n onFormatChange,\r\n defaultOpen,\r\n open: openProp,\r\n onOpenChange,\r\n name,\r\n disabled,\r\n inline,\r\n readOnly,\r\n required,\r\n ...rootProps\r\n } = props\r\n\r\n const initialColor = React.useMemo(() => {\r\n const colorString = valueProp ?? defaultValue\r\n const color = hexToRgb(colorString)\r\n\r\n return {\r\n color,\r\n hsv: rgbToHsv(color),\r\n open: openProp ?? defaultOpen ?? false,\r\n format: formatProp ?? defaultFormat,\r\n }\r\n }, [\r\n valueProp,\r\n defaultValue,\r\n formatProp,\r\n defaultFormat,\r\n openProp,\r\n defaultOpen,\r\n ])\r\n\r\n const stateRef = useLazyRef(() => initialColor)\r\n const listenersRef = useLazyRef(() => new Set<() => void>())\r\n\r\n const storeCallbacks = React.useMemo<ColorPickerStoreCallbacks>(\r\n () => ({\r\n onColorChange: onValueChange,\r\n onOpenChange: onOpenChange,\r\n onFormatChange: onFormatChange,\r\n }),\r\n [onValueChange, onOpenChange, onFormatChange]\r\n )\r\n\r\n const store = React.useMemo(\r\n () => createColorPickerStore(listenersRef, stateRef, storeCallbacks),\r\n [listenersRef, stateRef, storeCallbacks]\r\n )\r\n\r\n return (\r\n <ColorPickerStoreContext.Provider value={store}>\r\n <ColorPickerRootImpl\r\n {...rootProps}\r\n value={valueProp}\r\n defaultOpen={defaultOpen}\r\n open={openProp}\r\n onOpenChange={onOpenChange}\r\n name={name}\r\n disabled={disabled}\r\n inline={inline}\r\n readOnly={readOnly}\r\n required={required}\r\n />\r\n </ColorPickerStoreContext.Provider>\r\n )\r\n})\r\n\r\n// Type alias instead of empty interface to avoid lint error\r\ntype ColorPickerRootImplProps = Omit<\r\n ColorPickerRootProps,\r\n | \"defaultValue\"\r\n | \"onValueChange\"\r\n | \"format\"\r\n | \"defaultFormat\"\r\n | \"onFormatChange\"\r\n>\r\n\r\nfunction ColorPickerRootImpl(props: ColorPickerRootImplProps) {\r\n const {\r\n value: valueProp,\r\n dir: dirProp,\r\n defaultOpen,\r\n open: openProp,\r\n onOpenChange,\r\n name,\r\n ref,\r\n asChild,\r\n disabled,\r\n inline,\r\n modal,\r\n readOnly,\r\n required,\r\n ...rootProps\r\n } = props\r\n\r\n const store = useColorPickerStoreContext(\"ColorPickerRootImpl\")\r\n\r\n const dir = useDirection(dirProp)\r\n\r\n const [formTrigger, setFormTrigger] = React.useState<HTMLDivElement | null>(\r\n null\r\n )\r\n const composedRef = useComposedRefs(ref, (node) => setFormTrigger(node))\r\n\r\n const isFormControl = formTrigger ? !!formTrigger.closest(\"form\") : true\r\n\r\n React.useEffect(() => {\r\n if (valueProp !== undefined) {\r\n const currentState = store.getState()\r\n const color = hexToRgb(valueProp, currentState.color.a)\r\n const hsv = rgbToHsv(color)\r\n store.setColor(color)\r\n store.setHsv(hsv)\r\n }\r\n }, [valueProp, store])\r\n\r\n React.useEffect(() => {\r\n if (openProp !== undefined) {\r\n store.setOpen(openProp)\r\n }\r\n }, [openProp, store])\r\n\r\n const contextValue = React.useMemo<ColorPickerContextValue>(\r\n () => ({\r\n dir,\r\n disabled,\r\n inline,\r\n readOnly,\r\n required,\r\n }),\r\n [dir, disabled, inline, readOnly, required]\r\n )\r\n\r\n const value = useColorPickerStore((state) => rgbToHex(state.color))\r\n\r\n const open = useColorPickerStore((state) => state.open)\r\n\r\n const onPopoverOpenChange = React.useCallback(\r\n (newOpen: boolean) => {\r\n store.setOpen(newOpen)\r\n onOpenChange?.(newOpen)\r\n },\r\n [store, onOpenChange]\r\n )\r\n\r\n const RootPrimitive = asChild ? Slot : \"div\"\r\n\r\n if (inline) {\r\n return (\r\n <ColorPickerContext.Provider value={contextValue}>\r\n <RootPrimitive {...rootProps} ref={composedRef} />\r\n {isFormControl && (\r\n <VisuallyHiddenInput\r\n type=\"hidden\"\r\n control={formTrigger}\r\n name={name}\r\n value={value}\r\n disabled={disabled}\r\n readOnly={readOnly}\r\n required={required}\r\n />\r\n )}\r\n </ColorPickerContext.Provider>\r\n )\r\n }\r\n\r\n return (\r\n <ColorPickerContext.Provider value={contextValue}>\r\n <Popover\r\n defaultOpen={defaultOpen}\r\n open={open}\r\n onOpenChange={onPopoverOpenChange}\r\n modal={modal}\r\n >\r\n <RootPrimitive {...rootProps} ref={composedRef} />\r\n {isFormControl && (\r\n <VisuallyHiddenInput\r\n type=\"hidden\"\r\n control={formTrigger}\r\n name={name}\r\n value={value}\r\n disabled={disabled}\r\n readOnly={readOnly}\r\n required={required}\r\n />\r\n )}\r\n </Popover>\r\n </ColorPickerContext.Provider>\r\n )\r\n}\r\n\r\n// Type alias instead of empty interface to avoid lint error\r\ntype ColorPickerTriggerProps = React.ComponentProps<typeof PopoverTrigger>\r\n\r\nfunction ColorPickerTrigger(props: ColorPickerTriggerProps) {\r\n const { asChild, ...triggerProps } = props\r\n const context = useColorPickerContext(\"ColorPickerTrigger\")\r\n\r\n const TriggerPrimitive = asChild ? Slot : Button\r\n\r\n return (\r\n <PopoverTrigger asChild disabled={context.disabled}>\r\n <TriggerPrimitive data-slot=\"color-picker-trigger\" {...triggerProps} />\r\n </PopoverTrigger>\r\n )\r\n}\r\n\r\n// Type alias instead of empty interface to avoid lint error\r\ntype ColorPickerContentProps = React.ComponentProps<typeof PopoverContent>\r\n\r\nfunction ColorPickerContent(props: ColorPickerContentProps) {\r\n const { asChild, className, children, ...popoverContentProps } = props\r\n const context = useColorPickerContext(\"ColorPickerContent\")\r\n\r\n if (context.inline) {\r\n const ContentPrimitive = asChild ? Slot : \"div\"\r\n\r\n return (\r\n <ContentPrimitive\r\n data-slot=\"color-picker-content\"\r\n {...popoverContentProps}\r\n className={cn(\"flex w-[340px] flex-col gap-4 p-4\", className)}\r\n >\r\n {children}\r\n </ContentPrimitive>\r\n )\r\n }\r\n\r\n return (\r\n <PopoverContent\r\n data-slot=\"color-picker-content\"\r\n asChild={asChild}\r\n {...popoverContentProps}\r\n className={cn(\"flex w-[340px] flex-col gap-4 p-4\", className)}\r\n >\r\n {children}\r\n </PopoverContent>\r\n )\r\n}\r\n\r\ninterface ColorPickerAreaProps extends React.ComponentProps<\"div\"> {\r\n asChild?: boolean\r\n}\r\n\r\nfunction ColorPickerArea(props: ColorPickerAreaProps) {\r\n const { asChild, className, ref, ...areaProps } = props\r\n const context = useColorPickerContext(\"ColorPickerArea\")\r\n const store = useColorPickerStoreContext(\"ColorPickerArea\")\r\n\r\n const hsv = useColorPickerStore((state) => state.hsv)\r\n\r\n const isDraggingRef = React.useRef(false)\r\n const areaRef = React.useRef<HTMLDivElement>(null)\r\n const composedRef = useComposedRefs(ref, areaRef)\r\n\r\n const updateColorFromPosition = React.useCallback(\r\n (clientX: number, clientY: number) => {\r\n if (!areaRef.current) return\r\n\r\n const rect = areaRef.current.getBoundingClientRect()\r\n const x = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width))\r\n const y = Math.max(0, Math.min(1, 1 - (clientY - rect.top) / rect.height))\r\n\r\n const newHsv: HSVColorValue = {\r\n h: hsv?.h ?? 0,\r\n s: Math.round(x * 100),\r\n v: Math.round(y * 100),\r\n a: hsv?.a ?? 1,\r\n }\r\n\r\n store.setHsv(newHsv)\r\n store.setColor(hsvToRgb(newHsv))\r\n },\r\n [hsv, store]\r\n )\r\n\r\n const onPointerDown = React.useCallback(\r\n (event: React.PointerEvent) => {\r\n if (context.disabled) return\r\n\r\n isDraggingRef.current = true\r\n areaRef.current?.setPointerCapture(event.pointerId)\r\n updateColorFromPosition(event.clientX, event.clientY)\r\n },\r\n [context.disabled, updateColorFromPosition]\r\n )\r\n\r\n const onPointerMove = React.useCallback(\r\n (event: React.PointerEvent) => {\r\n if (isDraggingRef.current) {\r\n updateColorFromPosition(event.clientX, event.clientY)\r\n }\r\n },\r\n [updateColorFromPosition]\r\n )\r\n\r\n const onPointerUp = React.useCallback((event: React.PointerEvent) => {\r\n isDraggingRef.current = false\r\n areaRef.current?.releasePointerCapture(event.pointerId)\r\n }, [])\r\n\r\n const hue = hsv?.h ?? 0\r\n const backgroundHue = hsvToRgb({ h: hue, s: 100, v: 100, a: 1 })\r\n\r\n const AreaPrimitive = asChild ? Slot : \"div\"\r\n\r\n return (\r\n <AreaPrimitive\r\n data-slot=\"color-picker-area\"\r\n {...areaProps}\r\n className={cn(\r\n \"relative h-40 w-full cursor-crosshair touch-none rounded-sm border\",\r\n context.disabled && \"pointer-events-none opacity-50\",\r\n className\r\n )}\r\n ref={composedRef}\r\n onPointerDown={onPointerDown}\r\n onPointerMove={onPointerMove}\r\n onPointerUp={onPointerUp}\r\n >\r\n <div className=\"absolute inset-0 overflow-hidden rounded-sm\">\r\n <div\r\n className=\"absolute inset-0\"\r\n style={{\r\n backgroundColor: `rgb(${backgroundHue.r}, ${backgroundHue.g}, ${backgroundHue.b})`,\r\n }}\r\n />\r\n <div\r\n className=\"absolute inset-0\"\r\n style={{\r\n background: \"linear-gradient(to right, #fff, transparent)\",\r\n }}\r\n />\r\n <div\r\n className=\"absolute inset-0\"\r\n style={{\r\n background: \"linear-gradient(to bottom, transparent, #000)\",\r\n }}\r\n />\r\n </div>\r\n <div\r\n className=\"absolute size-3 -translate-x-1/2 -translate-y-1/2 rounded-full border-2 border-white shadow-sm\"\r\n style={{\r\n left: `${hsv?.s ?? 0}%`,\r\n top: `${100 - (hsv?.v ?? 0)}%`,\r\n }}\r\n />\r\n </AreaPrimitive>\r\n )\r\n}\r\n\r\n// Type alias instead of empty interface to avoid lint error\r\ntype ColorPickerHueSliderProps = React.ComponentProps<typeof SliderPrimitive.Root>\r\n\r\nfunction ColorPickerHueSlider(props: ColorPickerHueSliderProps) {\r\n const { className, ...sliderProps } = props\r\n const context = useColorPickerContext(\"ColorPickerHueSlider\")\r\n const store = useColorPickerStoreContext(\"ColorPickerHueSlider\")\r\n\r\n const hsv = useColorPickerStore((state) => state.hsv)\r\n\r\n const onValueChange = React.useCallback(\r\n (values: number[]) => {\r\n const newHsv: HSVColorValue = {\r\n h: values[0] ?? 0,\r\n s: hsv?.s ?? 0,\r\n v: hsv?.v ?? 0,\r\n a: hsv?.a ?? 1,\r\n }\r\n store.setHsv(newHsv)\r\n store.setColor(hsvToRgb(newHsv))\r\n },\r\n [hsv, store]\r\n )\r\n\r\n return (\r\n <SliderPrimitive.Root\r\n data-slot=\"color-picker-hue-slider\"\r\n {...sliderProps}\r\n max={360}\r\n step={1}\r\n className={cn(\r\n \"relative flex w-full touch-none items-center select-none\",\r\n className\r\n )}\r\n value={[hsv?.h ?? 0]}\r\n onValueChange={onValueChange}\r\n disabled={context.disabled}\r\n >\r\n <SliderPrimitive.Track className=\"relative h-3 w-full grow overflow-hidden rounded-full bg-[linear-gradient(to_right,#ff0000_0%,#ffff00_16.66%,#00ff00_33.33%,#00ffff_50%,#0000ff_66.66%,#ff00ff_83.33%,#ff0000_100%)]\">\r\n <SliderPrimitive.Range className=\"absolute h-full\" />\r\n </SliderPrimitive.Track>\r\n <SliderPrimitive.Thumb className=\"border-primary/50 bg-background focus-visible:ring-ring block size-4 rounded-full border shadow transition-colors focus-visible:ring-1 focus-visible:outline-none disabled:pointer-events-none disabled:opacity-50\" />\r\n </SliderPrimitive.Root>\r\n )\r\n}\r\n\r\n// Type alias instead of empty interface to avoid lint error\r\ntype ColorPickerAlphaSliderProps = React.ComponentProps<typeof SliderPrimitive.Root>\r\n\r\nfunction ColorPickerAlphaSlider(props: ColorPickerAlphaSliderProps) {\r\n const { className, ...sliderProps } = props\r\n const context = useColorPickerContext(\"ColorPickerAlphaSlider\")\r\n const store = useColorPickerStoreContext(\"ColorPickerAlphaSlider\")\r\n\r\n const color = useColorPickerStore((state) => state.color)\r\n const hsv = useColorPickerStore((state) => state.hsv)\r\n\r\n const onValueChange = React.useCallback(\r\n (values: number[]) => {\r\n const alpha = (values[0] ?? 0) / 100\r\n const newColor = { ...color, a: alpha }\r\n const newHsv = { ...hsv, a: alpha }\r\n store.setColor(newColor)\r\n store.setHsv(newHsv)\r\n },\r\n [color, hsv, store]\r\n )\r\n\r\n const gradientColor = `rgb(${color?.r ?? 0}, ${color?.g ?? 0}, ${color?.b ?? 0})`\r\n\r\n return (\r\n <SliderPrimitive.Root\r\n data-slot=\"color-picker-alpha-slider\"\r\n {...sliderProps}\r\n max={100}\r\n step={1}\r\n disabled={context.disabled}\r\n className={cn(\r\n \"relative flex w-full touch-none items-center select-none\",\r\n className\r\n )}\r\n value={[Math.round((color?.a ?? 1) * 100)]}\r\n onValueChange={onValueChange}\r\n >\r\n <SliderPrimitive.Track\r\n className=\"relative h-3 w-full grow overflow-hidden rounded-full\"\r\n style={{\r\n background:\r\n \"linear-gradient(45deg, #ccc 25%, transparent 25%), linear-gradient(-45deg, #ccc 25%, transparent 25%), linear-gradient(45deg, transparent 75%, #ccc 75%), linear-gradient(-45deg, transparent 75%, #ccc 75%)\",\r\n backgroundSize: \"8px 8px\",\r\n backgroundPosition: \"0 0, 0 4px, 4px -4px, -4px 0px\",\r\n }}\r\n >\r\n <div\r\n className=\"absolute inset-0 rounded-full\"\r\n style={{\r\n background: `linear-gradient(to right, transparent, ${gradientColor})`,\r\n }}\r\n />\r\n <SliderPrimitive.Range className=\"absolute h-full\" />\r\n </SliderPrimitive.Track>\r\n <SliderPrimitive.Thumb className=\"border-primary/50 bg-background focus-visible:ring-ring block size-4 rounded-full border shadow transition-colors focus-visible:ring-1 focus-visible:outline-none disabled:pointer-events-none disabled:opacity-50\" />\r\n </SliderPrimitive.Root>\r\n )\r\n}\r\n\r\ninterface ColorPickerSwatchProps extends React.ComponentProps<\"div\"> {\r\n asChild?: boolean\r\n}\r\n\r\nfunction ColorPickerSwatch(props: ColorPickerSwatchProps) {\r\n const { asChild, className, ...swatchProps } = props\r\n const context = useColorPickerContext(\"ColorPickerSwatch\")\r\n\r\n const color = useColorPickerStore((state) => state.color)\r\n const format = useColorPickerStore((state) => state.format)\r\n\r\n const backgroundStyle = React.useMemo(() => {\r\n if (!color) {\r\n return {\r\n background:\r\n \"linear-gradient(to bottom right, transparent calc(50% - 1px), hsl(var(--destructive)) calc(50% - 1px) calc(50% + 1px), transparent calc(50% + 1px)) no-repeat\",\r\n }\r\n }\r\n\r\n const colorString = `rgba(${color.r}, ${color.g}, ${color.b}, ${color.a})`\r\n\r\n if (color.a < 1) {\r\n return {\r\n background: `linear-gradient(${colorString}, ${colorString}), repeating-conic-gradient(#ccc 0% 25%, #fff 0% 50%) 0% 50% / 8px 8px`,\r\n }\r\n }\r\n\r\n return {\r\n backgroundColor: colorString,\r\n }\r\n }, [color])\r\n\r\n const ariaLabel = !color\r\n ? \"No color selected\"\r\n : `Current color: ${colorToString(color, format)}`\r\n\r\n const SwatchPrimitive = asChild ? Slot : \"div\"\r\n\r\n return (\r\n <SwatchPrimitive\r\n role=\"img\"\r\n aria-label={ariaLabel}\r\n data-slot=\"color-picker-swatch\"\r\n {...swatchProps}\r\n className={cn(\r\n \"box-border size-8 rounded-sm border shadow-sm\",\r\n context.disabled && \"opacity-50\",\r\n className\r\n )}\r\n style={{\r\n ...backgroundStyle,\r\n forcedColorAdjust: \"none\",\r\n }}\r\n />\r\n )\r\n}\r\n\r\n// Type alias instead of empty interface to avoid lint error\r\ntype ColorPickerEyeDropperProps = React.ComponentProps<typeof Button>\r\n\r\nfunction ColorPickerEyeDropper(props: ColorPickerEyeDropperProps) {\r\n const { children, size, ...buttonProps } = props\r\n const context = useColorPickerContext(\"ColorPickerEyeDropper\")\r\n const store = useColorPickerStoreContext(\"ColorPickerEyeDropper\")\r\n\r\n const color = useColorPickerStore((state) => state.color)\r\n\r\n const onEyeDropper = React.useCallback(async () => {\r\n if (!window.EyeDropper) return\r\n\r\n try {\r\n const eyeDropper = new window.EyeDropper()\r\n const result = await eyeDropper.open()\r\n\r\n if (result.sRGBHex) {\r\n const currentAlpha = color?.a ?? 1\r\n const newColor = hexToRgb(result.sRGBHex, currentAlpha)\r\n const newHsv = rgbToHsv(newColor)\r\n store.setColor(newColor)\r\n store.setHsv(newHsv)\r\n }\r\n } catch (error) {\r\n logger.warn(\"EyeDropper error\", { error })\r\n }\r\n }, [color, store])\r\n\r\n const hasEyeDropper = typeof window !== \"undefined\" && !!window.EyeDropper\r\n\r\n if (!hasEyeDropper) return null\r\n\r\n const buttonSize = size ?? (children ? \"default\" : \"icon\")\r\n\r\n return (\r\n <Button\r\n data-slot=\"color-picker-eye-dropper\"\r\n {...buttonProps}\r\n variant=\"outline\"\r\n size={buttonSize}\r\n onClick={onEyeDropper}\r\n disabled={context.disabled}\r\n >\r\n {children ?? <PipetteIcon />}\r\n </Button>\r\n )\r\n}\r\n\r\ninterface ColorPickerFormatSelectProps\r\n extends Omit<React.ComponentProps<typeof Select>, \"value\" | \"onValueChange\">,\r\n Pick<React.ComponentProps<typeof SelectTrigger>, \"size\" | \"className\"> {}\r\n\r\nfunction ColorPickerFormatSelect(props: ColorPickerFormatSelectProps) {\r\n const { size, className, ...selectProps } = props\r\n const context = useColorPickerContext(\"ColorPickerFormatSelector\")\r\n const store = useColorPickerStoreContext(\"ColorPickerFormatSelector\")\r\n\r\n const format = useColorPickerStore((state) => state.format)\r\n\r\n const onFormatChange = React.useCallback(\r\n (value: ColorFormat) => {\r\n store.setFormat(value)\r\n },\r\n [store]\r\n )\r\n\r\n return (\r\n <Select\r\n data-slot=\"color-picker-format-select\"\r\n {...selectProps}\r\n value={format}\r\n onValueChange={onFormatChange}\r\n disabled={context.disabled}\r\n >\r\n <SelectTrigger\r\n data-slot=\"color-picker-format-select-trigger\"\r\n size={size ?? \"sm\"}\r\n className={cn(\"w-[72px] min-w-[72px] shrink-0\", className)}\r\n >\r\n <SelectValue />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {colorFormats.map((format) => (\r\n <SelectItem key={format} value={format}>\r\n {format.toUpperCase()}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n )\r\n}\r\n\r\ninterface ColorPickerInputProps\r\n extends Omit<\r\n React.ComponentProps<typeof Input>,\r\n \"value\" | \"onChange\" | \"color\"\r\n > {\r\n withoutAlpha?: boolean\r\n}\r\n\r\nfunction ColorPickerInput(props: ColorPickerInputProps) {\r\n const context = useColorPickerContext(\"ColorPickerInput\")\r\n const store = useColorPickerStoreContext(\"ColorPickerInput\")\r\n\r\n const color = useColorPickerStore((state) => state.color)\r\n const format = useColorPickerStore((state) => state.format)\r\n const hsv = useColorPickerStore((state) => state.hsv)\r\n\r\n const onColorChange = React.useCallback(\r\n (newColor: ColorValue) => {\r\n const newHsv = rgbToHsv(newColor)\r\n store.setColor(newColor)\r\n store.setHsv(newHsv)\r\n },\r\n [store]\r\n )\r\n\r\n if (format === \"hex\") {\r\n return (\r\n <HexInput\r\n color={color}\r\n onColorChange={onColorChange}\r\n context={context}\r\n {...props}\r\n />\r\n )\r\n }\r\n\r\n if (format === \"rgb\") {\r\n return (\r\n <RgbInput\r\n color={color}\r\n onColorChange={onColorChange}\r\n context={context}\r\n {...props}\r\n />\r\n )\r\n }\r\n\r\n if (format === \"hsl\") {\r\n return (\r\n <HslInput\r\n color={color}\r\n onColorChange={onColorChange}\r\n context={context}\r\n {...props}\r\n />\r\n )\r\n }\r\n\r\n if (format === \"hsb\") {\r\n return (\r\n <HsbInput\r\n hsv={hsv}\r\n onColorChange={onColorChange}\r\n context={context}\r\n {...props}\r\n />\r\n )\r\n }\r\n}\r\n\r\nconst inputGroupItemVariants = cva(\r\n \"h-8 [-moz-appearance:_textfield] focus-visible:z-10 focus-visible:ring-1 [&::-webkit-inner-spin-button]:m-0 [&::-webkit-inner-spin-button]:appearance-none [&::-webkit-outer-spin-button]:m-0 [&::-webkit-outer-spin-button]:appearance-none\",\r\n {\r\n variants: {\r\n position: {\r\n first: \"rounded-e-none\",\r\n middle: \"-ms-px rounded-none border-l-0\",\r\n last: \"-ms-px rounded-s-none border-l-0\",\r\n isolated: \"\",\r\n },\r\n },\r\n defaultVariants: {\r\n position: \"isolated\",\r\n },\r\n }\r\n)\r\n\r\ninterface InputGroupItemProps\r\n extends React.ComponentProps<typeof Input>,\r\n VariantProps<typeof inputGroupItemVariants> {}\r\n\r\nfunction InputGroupItem({\r\n className,\r\n position,\r\n ...props\r\n}: InputGroupItemProps) {\r\n return (\r\n <Input\r\n data-slot=\"color-picker-input\"\r\n className={cn(inputGroupItemVariants({ position }), className)}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\ninterface FormatInputProps extends ColorPickerInputProps {\r\n color: ColorValue\r\n onColorChange: (color: ColorValue) => void\r\n context: ColorPickerContextValue\r\n}\r\n\r\nfunction HexInput(props: FormatInputProps) {\r\n const {\r\n color,\r\n onColorChange,\r\n context,\r\n withoutAlpha,\r\n className,\r\n ...inputProps\r\n } = props\r\n\r\n const hexValue = rgbToHex(color)\r\n const alphaValue = Math.round((color?.a ?? 1) * 100)\r\n\r\n const onHexChange = React.useCallback(\r\n (event: React.ChangeEvent<HTMLInputElement>) => {\r\n const value = event.target.value\r\n const parsedColor = parseColorString(value)\r\n if (parsedColor) {\r\n onColorChange({ ...parsedColor, a: color?.a ?? 1 })\r\n }\r\n },\r\n [color, onColorChange]\r\n )\r\n\r\n const onAlphaChange = React.useCallback(\r\n (event: React.ChangeEvent<HTMLInputElement>) => {\r\n const value = Number.parseInt(event.target.value, 10)\r\n if (!Number.isNaN(value) && value >= 0 && value <= 100) {\r\n onColorChange({ ...color, a: value / 100 })\r\n }\r\n },\r\n [color, onColorChange]\r\n )\r\n\r\n if (withoutAlpha) {\r\n return (\r\n <InputGroupItem\r\n aria-label=\"Hex color value\"\r\n position=\"isolated\"\r\n {...inputProps}\r\n placeholder=\"#000000\"\r\n className={cn(\"font-mono\", className)}\r\n value={hexValue}\r\n onChange={onHexChange}\r\n disabled={context.disabled}\r\n />\r\n )\r\n }\r\n\r\n return (\r\n <div\r\n data-slot=\"color-picker-input-wrapper\"\r\n className={cn(\"flex items-center\", className)}\r\n >\r\n <InputGroupItem\r\n aria-label=\"Hex color value\"\r\n position=\"first\"\r\n {...inputProps}\r\n placeholder=\"#000000\"\r\n className=\"flex-1 font-mono\"\r\n value={hexValue}\r\n onChange={onHexChange}\r\n disabled={context.disabled}\r\n />\r\n <InputGroupItem\r\n aria-label=\"Alpha transparency percentage\"\r\n position=\"last\"\r\n {...inputProps}\r\n placeholder=\"100\"\r\n inputMode=\"numeric\"\r\n pattern=\"[0-9]*\"\r\n min=\"0\"\r\n max=\"100\"\r\n className=\"w-14\"\r\n value={alphaValue}\r\n onChange={onAlphaChange}\r\n disabled={context.disabled}\r\n />\r\n </div>\r\n )\r\n}\r\n\r\nfunction RgbInput(props: FormatInputProps) {\r\n const {\r\n color,\r\n onColorChange,\r\n context,\r\n withoutAlpha,\r\n className,\r\n ...inputProps\r\n } = props\r\n\r\n const rValue = Math.round(color?.r ?? 0)\r\n const gValue = Math.round(color?.g ?? 0)\r\n const bValue = Math.round(color?.b ?? 0)\r\n const alphaValue = Math.round((color?.a ?? 1) * 100)\r\n\r\n const onChannelChange = React.useCallback(\r\n (channel: \"r\" | \"g\" | \"b\" | \"a\", max: number, isAlpha = false) =>\r\n (event: React.ChangeEvent<HTMLInputElement>) => {\r\n const value = Number.parseInt(event.target.value, 10)\r\n if (!Number.isNaN(value) && value >= 0 && value <= max) {\r\n const newValue = isAlpha ? value / 100 : value\r\n onColorChange({ ...color, [channel]: newValue })\r\n }\r\n },\r\n [color, onColorChange]\r\n )\r\n\r\n return (\r\n <div\r\n data-slot=\"color-picker-input-wrapper\"\r\n className={cn(\"flex items-center\", className)}\r\n >\r\n <InputGroupItem\r\n aria-label=\"Red color component (0-255)\"\r\n position=\"first\"\r\n {...inputProps}\r\n placeholder=\"0\"\r\n inputMode=\"numeric\"\r\n pattern=\"[0-9]*\"\r\n min=\"0\"\r\n max=\"255\"\r\n className=\"w-14\"\r\n value={rValue}\r\n onChange={onChannelChange(\"r\", 255)}\r\n disabled={context.disabled}\r\n />\r\n <InputGroupItem\r\n aria-label=\"Green color component (0-255)\"\r\n position=\"middle\"\r\n {...inputProps}\r\n placeholder=\"0\"\r\n inputMode=\"numeric\"\r\n pattern=\"[0-9]*\"\r\n min=\"0\"\r\n max=\"255\"\r\n className=\"w-14\"\r\n value={gValue}\r\n onChange={onChannelChange(\"g\", 255)}\r\n disabled={context.disabled}\r\n />\r\n <InputGroupItem\r\n aria-label=\"Blue color component (0-255)\"\r\n position={withoutAlpha ? \"last\" : \"middle\"}\r\n {...inputProps}\r\n placeholder=\"0\"\r\n inputMode=\"numeric\"\r\n pattern=\"[0-9]*\"\r\n min=\"0\"\r\n max=\"255\"\r\n className=\"w-14\"\r\n value={bValue}\r\n onChange={onChannelChange(\"b\", 255)}\r\n disabled={context.disabled}\r\n />\r\n {!withoutAlpha && (\r\n <InputGroupItem\r\n aria-label=\"Alpha transparency percentage\"\r\n position=\"last\"\r\n {...inputProps}\r\n placeholder=\"100\"\r\n inputMode=\"numeric\"\r\n pattern=\"[0-9]*\"\r\n min=\"0\"\r\n max=\"100\"\r\n className=\"w-14\"\r\n value={alphaValue}\r\n onChange={onChannelChange(\"a\", 100, true)}\r\n disabled={context.disabled}\r\n />\r\n )}\r\n </div>\r\n )\r\n}\r\n\r\nfunction HslInput(props: FormatInputProps) {\r\n const {\r\n color,\r\n onColorChange,\r\n context,\r\n withoutAlpha,\r\n className,\r\n ...inputProps\r\n } = props\r\n\r\n const hsl = React.useMemo(() => rgbToHsl(color), [color])\r\n const alphaValue = Math.round((color?.a ?? 1) * 100)\r\n\r\n const onHslChannelChange = React.useCallback(\r\n (channel: \"h\" | \"s\" | \"l\", max: number) =>\r\n (event: React.ChangeEvent<HTMLInputElement>) => {\r\n const value = Number.parseInt(event.target.value, 10)\r\n if (!Number.isNaN(value) && value >= 0 && value <= max) {\r\n const newHsl = { ...hsl, [channel]: value }\r\n const newColor = hslToRgb(newHsl, color?.a ?? 1)\r\n onColorChange(newColor)\r\n }\r\n },\r\n [hsl, color, onColorChange]\r\n )\r\n\r\n const onAlphaChange = React.useCallback(\r\n (event: React.ChangeEvent<HTMLInputElement>) => {\r\n const value = Number.parseInt(event.target.value, 10)\r\n if (!Number.isNaN(value) && value >= 0 && value <= 100) {\r\n onColorChange({ ...color, a: value / 100 })\r\n }\r\n },\r\n [color, onColorChange]\r\n )\r\n\r\n return (\r\n <div\r\n data-slot=\"color-picker-input-wrapper\"\r\n className={cn(\"flex items-center\", className)}\r\n >\r\n <InputGroupItem\r\n aria-label=\"Hue degree (0-360)\"\r\n position=\"first\"\r\n {...inputProps}\r\n placeholder=\"0\"\r\n inputMode=\"numeric\"\r\n pattern=\"[0-9]*\"\r\n min=\"0\"\r\n max=\"360\"\r\n className=\"w-14\"\r\n value={hsl.h}\r\n onChange={onHslChannelChange(\"h\", 360)}\r\n disabled={context.disabled}\r\n />\r\n <InputGroupItem\r\n aria-label=\"Saturation percentage (0-100)\"\r\n position=\"middle\"\r\n {...inputProps}\r\n placeholder=\"0\"\r\n inputMode=\"numeric\"\r\n pattern=\"[0-9]*\"\r\n min=\"0\"\r\n max=\"100\"\r\n className=\"w-14\"\r\n value={hsl.s}\r\n onChange={onHslChannelChange(\"s\", 100)}\r\n disabled={context.disabled}\r\n />\r\n <InputGroupItem\r\n aria-label=\"Lightness percentage (0-100)\"\r\n position={withoutAlpha ? \"last\" : \"middle\"}\r\n {...inputProps}\r\n placeholder=\"0\"\r\n inputMode=\"numeric\"\r\n pattern=\"[0-9]*\"\r\n min=\"0\"\r\n max=\"100\"\r\n className=\"w-14\"\r\n value={hsl.l}\r\n onChange={onHslChannelChange(\"l\", 100)}\r\n disabled={context.disabled}\r\n />\r\n {!withoutAlpha && (\r\n <InputGroupItem\r\n aria-label=\"Alpha transparency percentage\"\r\n position=\"last\"\r\n {...inputProps}\r\n placeholder=\"100\"\r\n inputMode=\"numeric\"\r\n pattern=\"[0-9]*\"\r\n min=\"0\"\r\n max=\"100\"\r\n className=\"w-14\"\r\n value={alphaValue}\r\n onChange={onAlphaChange}\r\n disabled={context.disabled}\r\n />\r\n )}\r\n </div>\r\n )\r\n}\r\n\r\ninterface HsbInputProps extends Omit<FormatInputProps, \"color\"> {\r\n hsv: HSVColorValue\r\n}\r\n\r\nfunction HsbInput(props: HsbInputProps) {\r\n const {\r\n hsv,\r\n onColorChange,\r\n context,\r\n withoutAlpha,\r\n className,\r\n ...inputProps\r\n } = props\r\n\r\n const alphaValue = Math.round((hsv?.a ?? 1) * 100)\r\n\r\n const onHsvChannelChange = React.useCallback(\r\n (channel: \"h\" | \"s\" | \"v\", max: number) =>\r\n (event: React.ChangeEvent<HTMLInputElement>) => {\r\n const value = Number.parseInt(event.target.value, 10)\r\n if (!Number.isNaN(value) && value >= 0 && value <= max) {\r\n const newHsv = { ...hsv, [channel]: value }\r\n const newColor = hsvToRgb(newHsv)\r\n onColorChange(newColor)\r\n }\r\n },\r\n [hsv, onColorChange]\r\n )\r\n\r\n const onAlphaChange = React.useCallback(\r\n (event: React.ChangeEvent<HTMLInputElement>) => {\r\n const value = Number.parseInt(event.target.value, 10)\r\n if (!Number.isNaN(value) && value >= 0 && value <= 100) {\r\n const currentColor = hsvToRgb(hsv)\r\n onColorChange({ ...currentColor, a: value / 100 })\r\n }\r\n },\r\n [hsv, onColorChange]\r\n )\r\n\r\n return (\r\n <div\r\n data-slot=\"color-picker-input-wrapper\"\r\n className={cn(\"flex items-center\", className)}\r\n >\r\n <InputGroupItem\r\n aria-label=\"Hue degree (0-360)\"\r\n position=\"first\"\r\n {...inputProps}\r\n placeholder=\"0\"\r\n inputMode=\"numeric\"\r\n pattern=\"[0-9]*\"\r\n min=\"0\"\r\n max=\"360\"\r\n className=\"w-14\"\r\n value={hsv?.h ?? 0}\r\n onChange={onHsvChannelChange(\"h\", 360)}\r\n disabled={context.disabled}\r\n />\r\n <InputGroupItem\r\n aria-label=\"Saturation percentage (0-100)\"\r\n position=\"middle\"\r\n {...inputProps}\r\n placeholder=\"0\"\r\n inputMode=\"numeric\"\r\n pattern=\"[0-9]*\"\r\n min=\"0\"\r\n max=\"100\"\r\n className=\"w-14\"\r\n value={hsv?.s ?? 0}\r\n onChange={onHsvChannelChange(\"s\", 100)}\r\n disabled={context.disabled}\r\n />\r\n <InputGroupItem\r\n aria-label=\"Brightness percentage (0-100)\"\r\n position={withoutAlpha ? \"last\" : \"middle\"}\r\n {...inputProps}\r\n placeholder=\"0\"\r\n inputMode=\"numeric\"\r\n pattern=\"[0-9]*\"\r\n min=\"0\"\r\n max=\"100\"\r\n className=\"w-14\"\r\n value={hsv?.v ?? 0}\r\n onChange={onHsvChannelChange(\"v\", 100)}\r\n disabled={context.disabled}\r\n />\r\n {!withoutAlpha && (\r\n <InputGroupItem\r\n aria-label=\"Alpha transparency percentage\"\r\n position=\"last\"\r\n {...inputProps}\r\n placeholder=\"100\"\r\n inputMode=\"numeric\"\r\n pattern=\"[0-9]*\"\r\n min=\"0\"\r\n max=\"100\"\r\n className=\"w-14\"\r\n value={alphaValue}\r\n onChange={onAlphaChange}\r\n disabled={context.disabled}\r\n />\r\n )}\r\n </div>\r\n )\r\n}\r\n\r\ninterface ColorPickerPresetsProps extends React.ComponentProps<\"div\"> {\r\n asChild?: boolean\r\n}\r\n\r\nfunction ColorPickerPresets(props: ColorPickerPresetsProps) {\r\n const { asChild, className, ...presetProps } = props\r\n const context = useColorPickerContext(\"ColorPickerPresets\")\r\n const store = useColorPickerStoreContext(\"ColorPickerPresets\")\r\n const color = useColorPickerStore((state) => state.color)\r\n\r\n const onPresetClick = React.useCallback(\r\n (hex: string, alpha?: number) => {\r\n const nextAlpha = alpha ?? (color?.a ?? 1)\r\n const newColor = hexToRgb(hex, nextAlpha)\r\n store.setColor(newColor)\r\n store.setHsv(rgbToHsv(newColor))\r\n },\r\n [color, store]\r\n )\r\n\r\n const PresetsPrimitive = asChild ? Slot : \"div\"\r\n\r\n return (\r\n <PresetsPrimitive\r\n data-slot=\"color-picker-presets\"\r\n {...presetProps}\r\n className={cn(\"flex items-center gap-2\", className)}\r\n >\r\n {colorPresets.map((preset) => (\r\n <Button\r\n key={preset.value}\r\n type=\"button\"\r\n variant=\"outline\"\r\n size=\"sm\"\r\n onClick={() =>\r\n onPresetClick(preset.value, \"alpha\" in preset ? preset.alpha : undefined)\r\n }\r\n disabled={context.disabled}\r\n className=\"h-8 px-2\"\r\n title={preset.label}\r\n >\r\n <span\r\n aria-hidden=\"true\"\r\n className=\"size-3 rounded-full border\"\r\n style={{ backgroundColor: preset.value }}\r\n />\r\n <span className=\"font-mono text-xs\">{preset.value}</span>\r\n </Button>\r\n ))}\r\n </PresetsPrimitive>\r\n )\r\n}\r\n\r\nexport {\r\n ColorPickerRoot as ColorPicker,\r\n ColorPickerTrigger,\r\n ColorPickerContent,\r\n ColorPickerArea,\r\n ColorPickerHueSlider,\r\n ColorPickerAlphaSlider,\r\n ColorPickerSwatch,\r\n ColorPickerEyeDropper,\r\n ColorPickerFormatSelect,\r\n ColorPickerInput,\r\n ColorPickerPresets,\r\n //\r\n ColorPickerRoot as Root,\r\n ColorPickerTrigger as Trigger,\r\n ColorPickerContent as Content,\r\n ColorPickerArea as Area,\r\n ColorPickerHueSlider as HueSlider,\r\n ColorPickerAlphaSlider as AlphaSlider,\r\n ColorPickerSwatch as Swatch,\r\n ColorPickerEyeDropper as EyeDropper,\r\n ColorPickerFormatSelect as FormatSelect,\r\n ColorPickerInput as Input,\r\n ColorPickerPresets as Presets,\r\n //\r\n useColorPickerStore as useColorPicker,\r\n}\r\n","\"use client\"\r\n\r\nimport * as React from \"react\"\r\nimport * as PopoverPrimitive from \"@radix-ui/react-popover\"\r\n\r\nimport { cn } from \"@/utils\"\r\n\r\nfunction Popover({\r\n ...props\r\n}: React.ComponentProps<typeof PopoverPrimitive.Root>) {\r\n return <PopoverPrimitive.Root data-slot=\"popover\" {...props} />\r\n}\r\n\r\nfunction PopoverTrigger({\r\n ...props\r\n}: React.ComponentProps<typeof PopoverPrimitive.Trigger>) {\r\n return <PopoverPrimitive.Trigger data-slot=\"popover-trigger\" {...props} />\r\n}\r\n\r\nfunction PopoverContent({\r\n className,\r\n align = \"center\",\r\n sideOffset = 4,\r\n ...props\r\n}: React.ComponentProps<typeof PopoverPrimitive.Content>) {\r\n return (\r\n <PopoverPrimitive.Portal>\r\n <PopoverPrimitive.Content\r\n data-slot=\"popover-content\"\r\n align={align}\r\n sideOffset={sideOffset}\r\n className={cn(\r\n \"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-200 w-72 origin-(--radix-popover-content-transform-origin) rounded-md border p-4 shadow-md outline-hidden\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n </PopoverPrimitive.Portal>\r\n )\r\n}\r\n\r\nfunction PopoverAnchor({\r\n ...props\r\n}: React.ComponentProps<typeof PopoverPrimitive.Anchor>) {\r\n return <PopoverPrimitive.Anchor data-slot=\"popover-anchor\" {...props} />\r\n}\r\n\r\nexport { Popover, PopoverTrigger, PopoverContent, PopoverAnchor }\r\n\r\n","\"use client\"\r\n\r\nimport type { JSX } from \"react\"\r\nimport * as React from \"react\"\r\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\"\r\nimport { mergeRegister } from \"@lexical/utils\"\r\nimport { COMMAND_PRIORITY_EDITOR, createCommand, $getNodeByKey } from \"lexical\"\r\nimport type { LexicalCommand, NodeKey } from \"lexical\"\r\nimport {\r\n ColorPicker,\r\n ColorPickerArea,\r\n ColorPickerContent,\r\n ColorPickerHueSlider,\r\n ColorPickerInput,\r\n ColorPickerPresets,\r\n ColorPickerSwatch,\r\n ColorPickerTrigger,\r\n} from \"@/components/editor/editor-ui/color-picker\"\r\nimport { useEditorModal } from \"@/components/editor/editor-hooks/use-modal\"\r\nimport {\r\n $isListWithColorNode,\r\n} from \"@/components/editor/nodes/list-with-color-node\"\r\nimport { createListWithColorNodeFromRegistry } from \"@/components/editor/editor-x/nodes\"\r\nimport { $isListNode, ListNode } from \"@lexical/list\"\r\nimport { Button } from \"@/components/ui/button\"\r\n\r\nexport const OPEN_LIST_COLOR_PICKER_COMMAND: LexicalCommand<{\r\n listKey: NodeKey\r\n}> = createCommand<{ listKey: NodeKey }>(\"OPEN_LIST_COLOR_PICKER_COMMAND\")\r\n\r\nconst listColorStore = new Map<NodeKey, string>()\r\n\r\n/** Patch serialized state: thêm listColor vào list nodes theo listColorStore (fallback khi load content cũ). */\r\nexport function patchListColorsInSerializedState(\r\n json: Record<string, unknown>\r\n): void {\r\n const root = json.root as Record<string, unknown> | undefined\r\n if (!root || typeof root !== \"object\") return\r\n const children = root.children as Array<Record<string, unknown>> | undefined\r\n if (!Array.isArray(children)) return\r\n\r\n function walk(nodes: Array<Record<string, unknown>>): void {\r\n for (const node of nodes) {\r\n const key = node.key as string | undefined\r\n const type = node.type as string | undefined\r\n if (type === \"list\" && key && listColorStore.has(key)) {\r\n ;(node as Record<string, unknown>).listColor = listColorStore.get(key)\r\n }\r\n const childList = node.children as Array<Record<string, unknown>> | undefined\r\n if (Array.isArray(childList)) walk(childList)\r\n }\r\n }\r\n walk(children)\r\n}\r\n\r\nfunction getListElement(element: HTMLElement): HTMLElement | null {\r\n const tag = element.tagName.toUpperCase()\r\n if (tag === \"UL\" || tag === \"OL\") return element\r\n const list = element.querySelector(\"ul, ol\")\r\n return list instanceof HTMLElement ? list : null\r\n}\r\n\r\nfunction applyListColor(editor: ReturnType<typeof useLexicalComposerContext>[0]) {\r\n listColorStore.forEach((color, listKey) => {\r\n const element = editor.getElementByKey(listKey)\r\n if (!(element instanceof HTMLElement)) return\r\n const listEl = getListElement(element)\r\n if (!listEl) return\r\n listEl.style.setProperty(\"list-style-color\", color, \"important\")\r\n listEl.style.setProperty(\"--list-marker-color\", color, \"important\")\r\n listEl.setAttribute(\"data-list-color\", color)\r\n })\r\n}\r\n\r\nexport function ListColorPlugin(): JSX.Element | null {\r\n const [editor] = useLexicalComposerContext()\r\n const [modal, showModal] = useEditorModal()\r\n\r\n React.useEffect(() => {\r\n const applyColor = (color: string, listKey: NodeKey) => {\r\n listColorStore.set(listKey, color)\r\n editor.update(() => {\r\n const node = $getNodeByKey(listKey)\r\n if ($isListWithColorNode(node)) {\r\n node.setListColor(color)\r\n return\r\n }\r\n if ($isListNode(node)) {\r\n const listType = node.getListType()\r\n const start = node.getStart()\r\n const newList = createListWithColorNodeFromRegistry(editor, listType, start)\r\n newList.setListColor(color)\r\n const children = node.getChildren()\r\n for (const c of children) newList.append(c)\r\n node.replace(newList)\r\n }\r\n })\r\n applyListColor(editor)\r\n }\r\n\r\n return mergeRegister(\r\n editor.registerNodeTransform(ListNode, (node) => {\r\n if ($isListWithColorNode(node)) return\r\n const listType = node.getListType()\r\n const start = node.getStart()\r\n const newList = createListWithColorNodeFromRegistry(editor, listType, start)\r\n const children = node.getChildren()\r\n for (const c of children) newList.append(c)\r\n node.replace(newList)\r\n }),\r\n editor.registerUpdateListener(() => {\r\n applyListColor(editor)\r\n }),\r\n editor.registerCommand(\r\n OPEN_LIST_COLOR_PICKER_COMMAND,\r\n ({ listKey }) => {\r\n const element = editor.getElementByKey(listKey)\r\n if (!(element instanceof HTMLElement)) return true\r\n const listEl = getListElement(element)\r\n if (!listEl) return true\r\n\r\n const fromStore = listColorStore.get(listKey)\r\n const fromStyle = listEl.style.getPropertyValue(\"list-style-color\")\r\n const fromVar = listEl.style.getPropertyValue(\"--list-marker-color\")\r\n const fromAttr = listEl.getAttribute(\"data-list-color\")\r\n const initialColor =\r\n fromStore || fromStyle || fromVar || fromAttr || \"#000000\"\r\n\r\n function ListColorModalContent({ onClose }: { onClose: () => void }) {\r\n const [color, setColor] = React.useState(initialColor)\r\n return (\r\n <div className=\"flex flex-col gap-5 py-2\">\r\n <p className=\"text-muted-foreground text-sm\">\r\n Chọn màu cho bullet hoặc số thứ tự của list. Màu sẽ áp dụng ngay khi chọn.\r\n </p>\r\n <ColorPicker\r\n value={color}\r\n onValueChange={(next) => {\r\n setColor(next)\r\n applyColor(next, listKey)\r\n applyListColor(editor)\r\n }}\r\n >\r\n <ColorPickerTrigger asChild>\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n className=\"h-11 w-full min-h-11 flex items-center justify-start gap-3 rounded-lg border-2 px-4 text-left font-medium shadow-sm transition-colors hover:bg-accent/50\"\r\n >\r\n <ColorPickerSwatch\r\n className=\"size-8 shrink-0 rounded-md border-2 border-border shadow-inner\"\r\n aria-hidden\r\n />\r\n <span className=\"flex-1\">Màu bullet / số</span>\r\n <span className=\"text-muted-foreground font-mono text-xs tabular-nums\">\r\n {color}\r\n </span>\r\n </Button>\r\n </ColorPickerTrigger>\r\n <ColorPickerContent>\r\n <ColorPickerArea />\r\n <div className=\"flex flex-col gap-2\">\r\n <ColorPickerHueSlider />\r\n <ColorPickerInput />\r\n </div>\r\n <ColorPickerPresets />\r\n </ColorPickerContent>\r\n </ColorPicker>\r\n <div className=\"flex justify-end gap-2 border-t pt-4\">\r\n <Button variant=\"outline\" size=\"sm\" onClick={onClose}>\r\n Đóng\r\n </Button>\r\n </div>\r\n </div>\r\n )\r\n }\r\n\r\n showModal(\"Đổi màu list\", (onClose) => (\r\n <ListColorModalContent onClose={onClose} />\r\n ))\r\n return true\r\n },\r\n COMMAND_PRIORITY_EDITOR\r\n )\r\n )\r\n }, [editor, showModal])\r\n\r\n return <>{modal}</>\r\n}\r\n","\"use client\"\r\n\r\n/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\nimport { useEffect } from \"react\"\r\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\"\r\nimport { DRAG_DROP_PASTE } from \"@lexical/rich-text\"\r\nimport { isMimeType, mediaFileReader } from \"@lexical/utils\"\r\nimport { COMMAND_PRIORITY_LOW } from \"lexical\"\r\n\r\nimport { INSERT_IMAGE_COMMAND } from \"@/components/editor/plugins/images-plugin\"\r\n\r\nconst ACCEPTABLE_IMAGE_TYPES = [\r\n \"image/\",\r\n \"image/heic\",\r\n \"image/heif\",\r\n \"image/gif\",\r\n \"image/webp\",\r\n]\r\n\r\nexport function DragDropPastePlugin(): null {\r\n const [editor] = useLexicalComposerContext()\r\n useEffect(() => {\r\n return editor.registerCommand(\r\n DRAG_DROP_PASTE,\r\n (files) => {\r\n ;(async () => {\r\n const filesResult = await mediaFileReader(\r\n files,\r\n [ACCEPTABLE_IMAGE_TYPES].flatMap((x) => x)\r\n )\r\n for (const { file, result } of filesResult) {\r\n if (isMimeType(file, ACCEPTABLE_IMAGE_TYPES)) {\r\n editor.dispatchCommand(INSERT_IMAGE_COMMAND, {\r\n altText: file.name,\r\n src: result,\r\n })\r\n }\r\n }\r\n })()\r\n return true\r\n },\r\n COMMAND_PRIORITY_LOW\r\n )\r\n }, [editor])\r\n return null\r\n}\r\n","\"use client\"\r\n\r\nimport { JSX, useRef } from \"react\"\r\nimport { DraggableBlockPlugin_EXPERIMENTAL } from \"@lexical/react/LexicalDraggableBlockPlugin\"\r\nimport { GripVerticalIcon } from \"lucide-react\"\r\nimport { IconSize } from \"@/components/ui/typography\"\r\n\r\nconst DRAGGABLE_BLOCK_MENU_CLASSNAME = \"draggable-block-menu\"\r\n\r\nfunction isOnMenu(element: HTMLElement): boolean {\r\n return !!element.closest(`.${DRAGGABLE_BLOCK_MENU_CLASSNAME}`)\r\n}\r\n\r\nexport function DraggableBlockPlugin({\r\n anchorElem,\r\n}: {\r\n anchorElem: HTMLElement | null\r\n}): JSX.Element | null {\r\n const menuRef = useRef<HTMLDivElement>(null)\r\n const targetLineRef = useRef<HTMLDivElement>(null)\r\n\r\n if (!anchorElem) {\r\n return null\r\n }\r\n\r\n return (\r\n <DraggableBlockPlugin_EXPERIMENTAL\r\n anchorElem={anchorElem}\r\n menuRef={menuRef as React.RefObject<HTMLDivElement>}\r\n targetLineRef={targetLineRef as React.RefObject<HTMLDivElement>}\r\n menuComponent={\r\n <div\r\n ref={menuRef}\r\n className=\"draggable-block-menu absolute top-0 left-0 cursor-grab rounded-sm px-[1px] py-0.5 opacity-0 will-change-transform hover:bg-gray-100 active:cursor-grabbing\"\r\n >\r\n <IconSize size=\"sm\" className=\"opacity-30\">\r\n <GripVerticalIcon />\r\n </IconSize>\r\n </div>\r\n }\r\n targetLineComponent={\r\n <div\r\n ref={targetLineRef}\r\n className=\"bg-secondary-foreground pointer-events-none absolute top-0 left-0 h-1 opacity-0 will-change-transform\"\r\n />\r\n }\r\n isOnMenu={isOnMenu}\r\n />\r\n )\r\n}\r\n","\"use client\"\r\n\r\n/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\nimport { JSX, useMemo, useState } from \"react\"\r\nimport {\r\n AutoEmbedOption,\r\n EmbedConfig,\r\n EmbedMatchResult,\r\n LexicalAutoEmbedPlugin,\r\n URL_MATCHER,\r\n} from \"@lexical/react/LexicalAutoEmbedPlugin\"\r\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\"\r\nimport { PopoverPortal } from \"@radix-ui/react-popover\"\r\nimport type { LexicalEditor } from \"lexical\"\r\nimport { TwitterIcon, YoutubeIcon } from \"lucide-react\"\r\n\r\nimport { useEditorModal } from \"@/components/editor/editor-hooks/use-modal\"\r\nimport { INSERT_TWEET_COMMAND } from \"@/components/editor/plugins/embeds/twitter-plugin\"\r\nimport { INSERT_YOUTUBE_COMMAND } from \"@/components/editor/plugins/embeds/youtube-plugin\"\r\nimport { Button } from \"@/components/ui/button\"\r\nimport {\r\n Command,\r\n CommandGroup,\r\n CommandItem,\r\n CommandList,\r\n} from \"@/components/ui/command\"\r\nimport { IconSize } from \"@/components/ui/typography\"\r\nimport { DialogFooter } from \"@/components/ui/dialog\"\r\nimport { Input } from \"@/components/ui/input\"\r\nimport {\r\n Popover,\r\n PopoverContent,\r\n PopoverTrigger,\r\n} from \"@/components/ui/popover\"\r\n\r\nexport interface CustomEmbedConfig extends EmbedConfig {\r\n // Human readable name of the embeded content e.g. Tweet or Google Map.\r\n contentName: string\r\n\r\n // Icon for display.\r\n icon?: JSX.Element\r\n\r\n // An example of a matching url https://twitter.com/jack/status/20\r\n exampleUrl: string\r\n\r\n // For extra searching.\r\n keywords: Array<string>\r\n\r\n // Embed a Project.\r\n description?: string\r\n}\r\n\r\nexport const YoutubeEmbedConfig: CustomEmbedConfig = {\r\n contentName: \"Youtube Video\",\r\n\r\n exampleUrl: \"https://www.youtube.com/watch?v=jNQXAC9IVRw\",\r\n\r\n // Icon for display.\r\n icon: <IconSize size=\"sm\"><YoutubeIcon /></IconSize>,\r\n\r\n insertNode: (editor: LexicalEditor, result: EmbedMatchResult) => {\r\n editor.dispatchCommand(INSERT_YOUTUBE_COMMAND, result.id)\r\n },\r\n\r\n keywords: [\"youtube\", \"video\"],\r\n\r\n // Determine if a given URL is a match and return url data.\r\n parseUrl: async (url: string) => {\r\n const match =\r\n /^.*(youtu\\.be\\/|v\\/|u\\/\\w\\/|embed\\/|watch\\?v=|&v=)([^#&?]*).*/.exec(url)\r\n\r\n const id = match ? (match?.[2].length === 11 ? match[2] : null) : null\r\n\r\n if (id != null) {\r\n return {\r\n id,\r\n url,\r\n }\r\n }\r\n\r\n return null\r\n },\r\n\r\n type: \"youtube-video\",\r\n}\r\n\r\nexport const TwitterEmbedConfig: CustomEmbedConfig = {\r\n // e.g. Tweet or Google Map.\r\n contentName: \"Tweet\",\r\n\r\n exampleUrl: \"https://twitter.com/jack/status/20\",\r\n\r\n // Icon for display.\r\n icon: <IconSize size=\"sm\"><TwitterIcon /></IconSize>,\r\n\r\n // Create the Lexical embed node from the url data.\r\n insertNode: (editor: LexicalEditor, result: EmbedMatchResult) => {\r\n editor.dispatchCommand(INSERT_TWEET_COMMAND, result.id)\r\n },\r\n\r\n // For extra searching.\r\n keywords: [\"tweet\", \"twitter\"],\r\n\r\n // Determine if a given URL is a match and return url data.\r\n parseUrl: (text: string) => {\r\n const match =\r\n /^https:\\/\\/(twitter|x)\\.com\\/(#!\\/)?(\\w+)\\/status(es)*\\/(\\d+)/.exec(text)\r\n\r\n if (match != null) {\r\n return {\r\n id: match[5],\r\n url: match[1],\r\n }\r\n }\r\n\r\n return null\r\n },\r\n\r\n type: \"tweet\",\r\n}\r\n\r\nexport const EmbedConfigs = [TwitterEmbedConfig, YoutubeEmbedConfig]\r\n\r\nconst debounce = (callback: (text: string) => void, delay: number) => {\r\n let timeoutId: number\r\n return (text: string) => {\r\n window.clearTimeout(timeoutId)\r\n timeoutId = window.setTimeout(() => {\r\n callback(text)\r\n }, delay)\r\n }\r\n}\r\n\r\n// Dialog content component that doesn't depend on context\r\nfunction AutoEmbedDialogContent({\r\n embedConfig,\r\n onClose,\r\n editor,\r\n}: {\r\n embedConfig: CustomEmbedConfig\r\n onClose: () => void\r\n editor: LexicalEditor\r\n}): JSX.Element {\r\n const [text, setText] = useState(\"\")\r\n const [embedResult, setEmbedResult] = useState<EmbedMatchResult | null>(null)\r\n\r\n const validateText = useMemo(\r\n () =>\r\n debounce((inputText: string) => {\r\n const urlMatch = URL_MATCHER.exec(inputText)\r\n if (embedConfig != null && inputText != null && urlMatch != null) {\r\n Promise.resolve(embedConfig.parseUrl(inputText)).then(\r\n (parseResult) => {\r\n setEmbedResult(parseResult)\r\n }\r\n )\r\n } else if (embedResult != null) {\r\n setEmbedResult(null)\r\n }\r\n }, 200),\r\n [embedConfig, embedResult]\r\n )\r\n\r\n const onClick = () => {\r\n if (embedResult != null) {\r\n embedConfig.insertNode(editor, embedResult)\r\n onClose()\r\n }\r\n }\r\n\r\n return (\r\n <div className=\"\">\r\n <div className=\"space-y-4\">\r\n <Input\r\n type=\"text\"\r\n placeholder={embedConfig.exampleUrl}\r\n value={text}\r\n data-test-id={`${embedConfig.type}-embed-modal-url`}\r\n onChange={(e) => {\r\n const { value } = e.target\r\n setText(value)\r\n validateText(value)\r\n }}\r\n />\r\n <DialogFooter>\r\n <Button\r\n disabled={!embedResult}\r\n onClick={onClick}\r\n data-test-id={`${embedConfig.type}-embed-modal-submit-btn`}\r\n >\r\n Embed\r\n </Button>\r\n </DialogFooter>\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\n// Wrapper that uses context for AutoEmbedPlugin\r\nexport function AutoEmbedDialog({\r\n embedConfig,\r\n onClose,\r\n editor,\r\n}: {\r\n embedConfig: CustomEmbedConfig\r\n onClose: () => void\r\n editor?: LexicalEditor\r\n}): JSX.Element {\r\n const [editorFromContext] = useLexicalComposerContext()\r\n const activeEditor = editor ?? editorFromContext\r\n \r\n return (\r\n <AutoEmbedDialogContent \r\n embedConfig={embedConfig} \r\n onClose={onClose} \r\n editor={activeEditor}\r\n />\r\n )\r\n}\r\n\r\n// Standalone version that doesn't use context (for toolbar usage)\r\nexport function AutoEmbedDialogStandalone({\r\n embedConfig,\r\n onClose,\r\n editor,\r\n}: {\r\n embedConfig: CustomEmbedConfig\r\n onClose: () => void\r\n editor: LexicalEditor\r\n}): JSX.Element {\r\n return (\r\n <AutoEmbedDialogContent \r\n embedConfig={embedConfig} \r\n onClose={onClose} \r\n editor={editor}\r\n />\r\n )\r\n}\r\n\r\nexport function AutoEmbedPlugin(): JSX.Element {\r\n const [modal, showModal] = useEditorModal()\r\n\r\n const openEmbedModal = (embedConfig: CustomEmbedConfig) => {\r\n showModal(`Embed ${embedConfig.contentName}`, (onClose) => (\r\n <AutoEmbedDialog embedConfig={embedConfig} onClose={onClose} />\r\n ))\r\n }\r\n\r\n const getMenuOptions = (\r\n activeEmbedConfig: CustomEmbedConfig,\r\n embedFn: () => void,\r\n dismissFn: () => void\r\n ) => {\r\n return [\r\n new AutoEmbedOption(\"Dismiss\", {\r\n onSelect: dismissFn,\r\n }),\r\n new AutoEmbedOption(`Embed ${activeEmbedConfig.contentName}`, {\r\n onSelect: embedFn,\r\n }),\r\n ]\r\n }\r\n\r\n return (\r\n <>\r\n {modal}\r\n <LexicalAutoEmbedPlugin<CustomEmbedConfig>\r\n embedConfigs={EmbedConfigs}\r\n onOpenEmbedModalForConfig={openEmbedModal}\r\n getMenuOptions={getMenuOptions}\r\n menuRenderFn={(\r\n anchorElementRef,\r\n {\r\n selectedIndex: _selectedIndex,\r\n options,\r\n selectOptionAndCleanUp,\r\n setHighlightedIndex: _setHighlightedIndex,\r\n }\r\n ) => {\r\n return anchorElementRef.current ? (\r\n <Popover open={true}>\r\n <PopoverPortal container={anchorElementRef.current}>\r\n <div className=\"-translate-y-full transform\">\r\n <PopoverTrigger />\r\n <PopoverContent\r\n className=\"w-[200px] p-0\"\r\n align=\"start\"\r\n side=\"right\"\r\n >\r\n <Command>\r\n <CommandList>\r\n <CommandGroup>\r\n {options.map((option) => (\r\n <CommandItem\r\n key={option.key}\r\n value={option.title}\r\n onSelect={() => {\r\n selectOptionAndCleanUp(option)\r\n }}\r\n className=\"flex items-center gap-2\"\r\n >\r\n {option.title}\r\n </CommandItem>\r\n ))}\r\n </CommandGroup>\r\n </CommandList>\r\n </Command>\r\n </PopoverContent>\r\n </div>\r\n </PopoverPortal>\r\n </Popover>\r\n ) : null\r\n }}\r\n />\r\n </>\r\n )\r\n}\r\n","\"use client\"\r\n\r\n/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\nimport { JSX, useEffect } from \"react\"\r\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\"\r\nimport { $insertNodeToNearestRoot } from \"@lexical/utils\"\r\nimport { COMMAND_PRIORITY_EDITOR, createCommand, LexicalCommand } from \"lexical\"\r\n\r\nimport {\r\n $createTweetNode,\r\n TweetNode,\r\n} from \"@/components/editor/nodes/embeds/tweet-node\"\r\n\r\nexport const INSERT_TWEET_COMMAND: LexicalCommand<string> = createCommand(\r\n \"INSERT_TWEET_COMMAND\"\r\n)\r\n\r\nexport function TwitterPlugin(): JSX.Element | null {\r\n const [editor] = useLexicalComposerContext()\r\n\r\n useEffect(() => {\r\n if (!editor.hasNodes([TweetNode])) {\r\n throw new Error(\"TwitterPlugin: TweetNode not registered on editor\")\r\n }\r\n\r\n return editor.registerCommand<string>(\r\n INSERT_TWEET_COMMAND,\r\n (payload) => {\r\n const tweetNode = $createTweetNode(payload)\r\n $insertNodeToNearestRoot(tweetNode)\r\n\r\n return true\r\n },\r\n COMMAND_PRIORITY_EDITOR\r\n )\r\n }, [editor])\r\n\r\n return null\r\n}\r\n","\"use client\"\r\n\r\n/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\nimport { JSX, useEffect } from \"react\"\r\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\"\r\nimport { $insertNodeToNearestRoot } from \"@lexical/utils\"\r\nimport { COMMAND_PRIORITY_EDITOR, createCommand, LexicalCommand } from \"lexical\"\r\n\r\nimport {\r\n $createYouTubeNode,\r\n YouTubeNode,\r\n} from \"@/components/editor/nodes/embeds/youtube-node\"\r\n\r\nexport type InsertYouTubePayload =\r\n | string\r\n | { id: string; width?: number; height?: number; maxWidth?: number; fullWidth?: boolean }\r\n\r\nexport const INSERT_YOUTUBE_COMMAND: LexicalCommand<InsertYouTubePayload> =\r\n createCommand(\"INSERT_YOUTUBE_COMMAND\")\r\n\r\nexport function YouTubePlugin(): JSX.Element | null {\r\n const [editor] = useLexicalComposerContext()\r\n\r\n useEffect(() => {\r\n if (!editor.hasNodes([YouTubeNode])) {\r\n throw new Error(\"YouTubePlugin: YouTubeNode not registered on editor\")\r\n }\r\n\r\n return editor.registerCommand<InsertYouTubePayload>(\r\n INSERT_YOUTUBE_COMMAND,\r\n (payload) => {\r\n const rootElement = editor.getRootElement()\r\n const fallbackWidth =\r\n rootElement?.getBoundingClientRect().width ?? 640\r\n const resolvedMaxWidth =\r\n fallbackWidth > 0 ? Math.round(fallbackWidth) : 640\r\n const clampToEditorWidth = (value?: number) => {\r\n if (typeof value !== \"number\") {\r\n return value\r\n }\r\n return Math.min(value, resolvedMaxWidth)\r\n }\r\n const normalizedPayload =\r\n typeof payload === \"string\"\r\n ? {\r\n id: payload,\r\n width: undefined,\r\n height: undefined,\r\n maxWidth: resolvedMaxWidth,\r\n fullWidth: false,\r\n }\r\n : {\r\n id: payload.id,\r\n width: clampToEditorWidth(payload.width),\r\n height: payload.height,\r\n maxWidth:\r\n payload.maxWidth !== undefined\r\n ? clampToEditorWidth(payload.maxWidth)\r\n : resolvedMaxWidth,\r\n fullWidth: payload.fullWidth ?? false,\r\n }\r\n const youTubeNode = $createYouTubeNode(\r\n normalizedPayload.id,\r\n normalizedPayload.width,\r\n normalizedPayload.height,\r\n normalizedPayload.maxWidth,\r\n normalizedPayload.fullWidth\r\n )\r\n $insertNodeToNearestRoot(youTubeNode)\r\n\r\n return true\r\n },\r\n COMMAND_PRIORITY_EDITOR\r\n )\r\n }, [editor])\r\n\r\n return null\r\n}\r\n","\"use client\"\r\n\r\n/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\nimport * as React from \"react\"\r\nimport { useCallback, useEffect, useMemo, useState } from \"react\"\r\nimport dynamic from \"next/dynamic\"\r\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\"\r\nimport {\r\n MenuOption,\r\n useBasicTypeaheadTriggerMatch,\r\n} from \"@lexical/react/LexicalTypeaheadMenuPlugin\"\r\nimport {\r\n $createTextNode,\r\n $getSelection,\r\n $isRangeSelection,\r\n TextNode,\r\n} from \"lexical\"\r\nimport { createPortal } from \"react-dom\"\r\n\r\nimport {\r\n Command,\r\n CommandGroup,\r\n CommandItem,\r\n CommandList,\r\n} from \"@/components/ui/command\"\r\n\r\nconst LexicalTypeaheadMenuPlugin = dynamic(\r\n () =>\r\n import(\"@lexical/react/LexicalTypeaheadMenuPlugin\").then(\r\n (mod) => mod.LexicalTypeaheadMenuPlugin<EmojiOption>\r\n ),\r\n { ssr: false }\r\n)\r\n\r\nclass EmojiOption extends MenuOption {\r\n title: string\r\n emoji: string\r\n keywords: Array<string>\r\n\r\n constructor(\r\n title: string,\r\n emoji: string,\r\n options: {\r\n keywords?: Array<string>\r\n }\r\n ) {\r\n super(title)\r\n this.title = title\r\n this.emoji = emoji\r\n this.keywords = options.keywords || []\r\n }\r\n}\r\n\r\ntype Emoji = {\r\n emoji: string\r\n description: string\r\n category: string\r\n aliases: Array<string>\r\n tags: Array<string>\r\n unicode_version: string\r\n ios_version: string\r\n skin_tones?: boolean\r\n}\r\n\r\nconst MAX_EMOJI_SUGGESTION_COUNT = 10\r\n\r\nexport function EmojiPickerPlugin() {\r\n const [editor] = useLexicalComposerContext()\r\n const [queryString, setQueryString] = useState<string | null>(null)\r\n const [emojis, setEmojis] = useState<Array<Emoji>>([])\r\n const [_isOpen, setIsOpen] = useState(false)\r\n useEffect(() => {\r\n import(\"../utils/emoji-list\").then((file) => setEmojis(file.default))\r\n }, [])\r\n\r\n const emojiOptions = useMemo(\r\n () =>\r\n emojis != null\r\n ? emojis.map(\r\n ({ emoji, aliases, tags }) =>\r\n new EmojiOption(aliases[0], emoji, {\r\n keywords: [...aliases, ...tags],\r\n })\r\n )\r\n : [],\r\n [emojis]\r\n )\r\n\r\n const checkForTriggerMatch = useBasicTypeaheadTriggerMatch(\":\", {\r\n minLength: 0,\r\n })\r\n\r\n const options: Array<EmojiOption> = useMemo(() => {\r\n return emojiOptions\r\n .filter((option: EmojiOption) => {\r\n return queryString != null\r\n ? new RegExp(queryString, \"gi\").exec(option.title) ||\r\n option.keywords != null\r\n ? option.keywords.some((keyword: string) =>\r\n new RegExp(queryString, \"gi\").exec(keyword)\r\n )\r\n : false\r\n : emojiOptions\r\n })\r\n .slice(0, MAX_EMOJI_SUGGESTION_COUNT)\r\n }, [emojiOptions, queryString])\r\n\r\n const onSelectOption = useCallback(\r\n (\r\n selectedOption: EmojiOption,\r\n nodeToRemove: TextNode | null,\r\n closeMenu: () => void\r\n ) => {\r\n editor.update(() => {\r\n const selection = $getSelection()\r\n\r\n if (!$isRangeSelection(selection) || selectedOption == null) {\r\n return\r\n }\r\n\r\n if (nodeToRemove) {\r\n nodeToRemove.remove()\r\n }\r\n\r\n selection.insertNodes([$createTextNode(selectedOption.emoji)])\r\n\r\n closeMenu()\r\n })\r\n },\r\n [editor]\r\n )\r\n\r\n return (\r\n <LexicalTypeaheadMenuPlugin\r\n onQueryChange={setQueryString}\r\n onSelectOption={onSelectOption}\r\n triggerFn={checkForTriggerMatch}\r\n options={options}\r\n onOpen={() => {\r\n setIsOpen(true)\r\n }}\r\n onClose={() => {\r\n setIsOpen(false)\r\n }}\r\n menuRenderFn={(\r\n anchorElementRef,\r\n { selectedIndex, selectOptionAndCleanUp, setHighlightedIndex }\r\n ) => {\r\n return anchorElementRef.current && options.length\r\n ? createPortal(\r\n <div className=\"fixed z-10 w-[200px] rounded-md shadow-md\">\r\n <Command\r\n onKeyDown={(e) => {\r\n if (e.key === \"ArrowUp\") {\r\n e.preventDefault()\r\n setHighlightedIndex(\r\n selectedIndex !== null\r\n ? (selectedIndex - 1 + options.length) %\r\n options.length\r\n : options.length - 1\r\n )\r\n } else if (e.key === \"ArrowDown\") {\r\n e.preventDefault()\r\n setHighlightedIndex(\r\n selectedIndex !== null\r\n ? (selectedIndex + 1) % options.length\r\n : 0\r\n )\r\n }\r\n }}\r\n >\r\n <CommandList>\r\n <CommandGroup>\r\n {options.map((option, index) => (\r\n <CommandItem\r\n key={option.key}\r\n value={option.title}\r\n onSelect={() => {\r\n selectOptionAndCleanUp(option)\r\n }}\r\n className={`flex items-center gap-2 ${\r\n selectedIndex === index\r\n ? \"bg-accent\"\r\n : \"bg-transparent\"\r\n }`}\r\n >\r\n {option.emoji} {option.title}\r\n </CommandItem>\r\n ))}\r\n </CommandGroup>\r\n </CommandList>\r\n </Command>\r\n </div>,\r\n anchorElementRef.current\r\n )\r\n : null\r\n }}\r\n />\r\n )\r\n}\r\n","\"use client\"\r\n\r\n/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\nimport { JSX, useEffect } from \"react\"\r\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\"\r\nimport type { LexicalEditor } from \"lexical\"\r\nimport { TextNode } from \"lexical\"\r\n\r\nimport {\r\n $createEmojiNode,\r\n EmojiNode,\r\n} from \"@/components/editor/nodes/emoji-node\"\r\n\r\nconst emojis: Map<string, [string, string]> = new Map([\r\n [\":)\", [\"emoji happysmile\", \"🙂\"]],\r\n [\":D\", [\"emoji veryhappysmile\", \"😀\"]],\r\n [\":(\", [\"emoji unhappysmile\", \"🙁\"]],\r\n [\"<3\", [\"emoji heart\", \"❤\"]],\r\n])\r\n\r\nfunction $findAndTransformEmoji(node: TextNode): null | TextNode {\r\n const text = node.getTextContent()\r\n\r\n for (let i = 0; i < text.length; i++) {\r\n const emojiData = emojis.get(text[i]) || emojis.get(text.slice(i, i + 2))\r\n\r\n if (emojiData !== undefined) {\r\n const [emojiStyle, emojiText] = emojiData\r\n let targetNode\r\n\r\n if (i === 0) {\r\n ;[targetNode] = node.splitText(i + 2)\r\n } else {\r\n ;[, targetNode] = node.splitText(i, i + 2)\r\n }\r\n\r\n const emojiNode = $createEmojiNode(emojiStyle, emojiText)\r\n targetNode.replace(emojiNode)\r\n return emojiNode\r\n }\r\n }\r\n\r\n return null\r\n}\r\n\r\nfunction $textNodeTransform(node: TextNode): void {\r\n let targetNode: TextNode | null = node\r\n\r\n while (targetNode !== null) {\r\n if (!targetNode.isSimpleText()) {\r\n return\r\n }\r\n\r\n targetNode = $findAndTransformEmoji(targetNode)\r\n }\r\n}\r\n\r\nfunction useEmojis(editor: LexicalEditor): void {\r\n useEffect(() => {\r\n if (!editor.hasNodes([EmojiNode])) {\r\n throw new Error(\"EmojisPlugin: EmojiNode not registered on editor\")\r\n }\r\n\r\n return editor.registerNodeTransform(TextNode, $textNodeTransform)\r\n }, [editor])\r\n}\r\n\r\nexport function EmojisPlugin(): JSX.Element | null {\r\n const [editor] = useLexicalComposerContext()\r\n useEmojis(editor)\r\n return null\r\n}\r\n","\"use client\"\r\n\r\n/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\nimport { Dispatch, JSX, useCallback, useEffect, useRef, useState } from \"react\"\r\nimport {\r\n $createLinkNode,\r\n $isAutoLinkNode,\r\n $isLinkNode,\r\n TOGGLE_LINK_COMMAND,\r\n} from \"@lexical/link\"\r\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\"\r\nimport { $findMatchingParent, $wrapNodeInElement, mergeRegister } from \"@lexical/utils\"\r\nimport {\r\n $getSelection,\r\n $isLineBreakNode,\r\n $isNodeSelection,\r\n $isRangeSelection,\r\n $setSelection,\r\n BaseSelection,\r\n CLICK_COMMAND,\r\n COMMAND_PRIORITY_CRITICAL,\r\n COMMAND_PRIORITY_HIGH,\r\n COMMAND_PRIORITY_LOW,\r\n KEY_ESCAPE_COMMAND,\r\n LexicalEditor,\r\n SELECTION_CHANGE_COMMAND,\r\n} from \"lexical\"\r\nimport { Check, Pencil, Trash, X } from \"lucide-react\"\r\nimport { createPortal } from \"react-dom\"\r\n\r\nimport { getSelectedNode } from \"@/components/editor/utils/get-selected-node\"\r\nimport { setFloatingElemPositionForLinkEditor } from \"@/components/editor/utils/set-floating-elem-position-for-link-editor\"\r\nimport { sanitizeUrl, validateUrl } from \"@/components/editor/utils/url\"\r\nimport { Button } from \"@/components/ui/button\"\r\nimport { Input } from \"@/components/ui/input\"\r\nimport { Flex } from \"@/components/ui/flex\"\r\nimport { TypographyPSmall } from \"@/components/ui/typography\"\r\nimport { $isImageNode } from \"@/components/editor/nodes/image-node\"\r\n\r\nfunction FloatingLinkEditor({\r\n editor,\r\n isLink,\r\n setIsLink,\r\n anchorElem,\r\n isLinkEditMode,\r\n setIsLinkEditMode,\r\n}: {\r\n editor: LexicalEditor\r\n isLink: boolean\r\n setIsLink: Dispatch<boolean>\r\n anchorElem: HTMLElement\r\n isLinkEditMode: boolean\r\n setIsLinkEditMode: Dispatch<boolean>\r\n}): JSX.Element {\r\n const editorRef = useRef<HTMLDivElement | null>(null)\r\n const inputRef = useRef<HTMLInputElement>(null)\r\n const [linkUrl, setLinkUrl] = useState(\"\")\r\n const [editedLinkUrl, setEditedLinkUrl] = useState(\"https://\")\r\n const [lastSelection, setLastSelection] = useState<BaseSelection | null>(null)\r\n\r\n const $updateLinkEditor = useCallback(() => {\r\n const selection = $getSelection()\r\n let linkNode = null\r\n let selectedNode = null\r\n\r\n if ($isRangeSelection(selection)) {\r\n const node = getSelectedNode(selection)\r\n selectedNode = node\r\n linkNode = $findMatchingParent(node, $isLinkNode)\r\n if (!linkNode && $isLinkNode(node)) {\r\n linkNode = node\r\n }\r\n } else if ($isNodeSelection(selection)) {\r\n const nodes = selection.getNodes()\r\n if (nodes.length > 0) {\r\n const node = nodes[0]\r\n selectedNode = node\r\n // Check if the node itself is a link node\r\n if ($isLinkNode(node)) {\r\n linkNode = node\r\n } else {\r\n // Check if the node is wrapped in a link (e.g., image node in link)\r\n linkNode = $findMatchingParent(node, $isLinkNode)\r\n // For image nodes, also check if parent is a link\r\n if (!linkNode && $isImageNode(node)) {\r\n const parent = node.getParent()\r\n if ($isLinkNode(parent)) {\r\n linkNode = parent\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (linkNode) {\r\n setLinkUrl(linkNode.getURL())\r\n } else {\r\n setLinkUrl(\"\")\r\n }\r\n\r\n if (isLinkEditMode && linkNode) {\r\n setEditedLinkUrl(linkUrl || linkNode.getURL())\r\n }\r\n\r\n const editorElem = editorRef.current\r\n const nativeSelection = window.getSelection()\r\n const activeElement = document.activeElement\r\n\r\n if (editorElem === null) {\r\n return\r\n }\r\n\r\n const rootElement = editor.getRootElement()\r\n\r\n // Check if we have a valid selection (with or without link)\r\n const hasValidSelection = selection !== null\r\n const hasValidNativeSelection = \r\n nativeSelection !== null && \r\n rootElement !== null &&\r\n (nativeSelection.anchorNode && rootElement.contains(nativeSelection.anchorNode))\r\n\r\n // Show floating editor if:\r\n // 1. We have a link node (existing link) - show to view/edit\r\n // 2. We're in edit mode (creating new link) - show input to create link\r\n const _hasImageNode = $isNodeSelection(selection) && selectedNode && $isImageNode(selectedNode)\r\n const shouldShowEditor = \r\n (linkNode !== null || isLinkEditMode) &&\r\n hasValidSelection &&\r\n editor.isEditable() &&\r\n (\r\n // If in edit mode, always show (even if nativeSelection is not valid)\r\n isLinkEditMode ||\r\n hasValidNativeSelection || \r\n ($isNodeSelection(selection) && selectedNode) ||\r\n ($isRangeSelection(selection) && selection.getTextContent().length > 0)\r\n )\r\n\r\n if (shouldShowEditor) {\r\n // For node selection (e.g., image), try to get the DOM element\r\n let domRect: DOMRect | undefined\r\n \r\n if ($isNodeSelection(selection) && selectedNode) {\r\n // Try to get DOM element using node key\r\n const nodeKey = selectedNode.getKey()\r\n const nodeElement = editor.getElementByKey(nodeKey)\r\n \r\n if (nodeElement) {\r\n // For image nodes wrapped in links, find the link element\r\n if ($isImageNode(selectedNode) && linkNode) {\r\n // Find the link element that wraps the image\r\n const linkElement = nodeElement.closest(\"a\") || nodeElement.parentElement?.closest(\"a\")\r\n if (linkElement) {\r\n domRect = linkElement.getBoundingClientRect()\r\n } else {\r\n domRect = nodeElement.getBoundingClientRect()\r\n }\r\n } else {\r\n domRect = nodeElement.getBoundingClientRect()\r\n }\r\n }\r\n }\r\n \r\n // Fallback to native selection if we don't have a specific DOM rect\r\n if (!domRect && nativeSelection) {\r\n // Try to find link element in DOM if we have a link node\r\n if (linkNode && nativeSelection.focusNode) {\r\n // focusNode can be a Text node, so we need to get the parent element\r\n let focusElement: HTMLElement | null = null\r\n if (nativeSelection.focusNode instanceof HTMLElement) {\r\n focusElement = nativeSelection.focusNode\r\n } else if (nativeSelection.focusNode.parentElement) {\r\n focusElement = nativeSelection.focusNode.parentElement\r\n }\r\n \r\n if (focusElement) {\r\n const linkElement = focusElement.closest(\"a\") || focusElement.parentElement?.closest(\"a\")\r\n if (linkElement) {\r\n domRect = linkElement.getBoundingClientRect()\r\n }\r\n }\r\n }\r\n if (!domRect && nativeSelection.focusNode) {\r\n // Get parent element if focusNode is not an HTMLElement\r\n const parentElement = nativeSelection.focusNode instanceof HTMLElement\r\n ? nativeSelection.focusNode\r\n : nativeSelection.focusNode.parentElement\r\n if (parentElement) {\r\n domRect = parentElement.getBoundingClientRect()\r\n }\r\n }\r\n }\r\n\r\n // If in edit mode but no domRect, try to get from range selection\r\n if (!domRect && isLinkEditMode && $isRangeSelection(selection)) {\r\n const range = nativeSelection?.getRangeAt(0)\r\n if (range) {\r\n domRect = range.getBoundingClientRect()\r\n }\r\n }\r\n\r\n if (domRect) {\r\n domRect.y += 40\r\n setFloatingElemPositionForLinkEditor(domRect, editorElem, anchorElem)\r\n } else if (isLinkEditMode) {\r\n // If in edit mode but no domRect, show editor at a default position\r\n // Use a fallback position based on editor root\r\n if (rootElement) {\r\n const rootRect = rootElement.getBoundingClientRect()\r\n const fallbackRect = new DOMRect(\r\n rootRect.left + 20,\r\n rootRect.top + 100,\r\n 300,\r\n 50\r\n )\r\n setFloatingElemPositionForLinkEditor(fallbackRect, editorElem, anchorElem)\r\n }\r\n }\r\n setLastSelection(selection)\r\n } else if (!activeElement || activeElement.className !== \"link-input\") {\r\n if (rootElement !== null) {\r\n setFloatingElemPositionForLinkEditor(null, editorElem, anchorElem)\r\n }\r\n setLastSelection(null)\r\n setIsLinkEditMode(false)\r\n if (!linkNode) {\r\n setLinkUrl(\"\")\r\n }\r\n }\r\n\r\n return true\r\n }, [anchorElem, editor, setIsLinkEditMode, isLinkEditMode, linkUrl])\r\n\r\n useEffect(() => {\r\n const scrollerElem = anchorElem.parentElement\r\n\r\n const update = () => {\r\n editor.getEditorState().read(() => {\r\n $updateLinkEditor()\r\n })\r\n }\r\n\r\n window.addEventListener(\"resize\", update)\r\n\r\n if (scrollerElem) {\r\n scrollerElem.addEventListener(\"scroll\", update, { passive: true })\r\n }\r\n\r\n return () => {\r\n window.removeEventListener(\"resize\", update)\r\n\r\n if (scrollerElem) {\r\n scrollerElem.removeEventListener(\"scroll\", update)\r\n }\r\n }\r\n }, [anchorElem.parentElement, editor, $updateLinkEditor])\r\n\r\n useEffect(() => {\r\n return mergeRegister(\r\n editor.registerUpdateListener(({ editorState }) => {\r\n editorState.read(() => {\r\n $updateLinkEditor()\r\n })\r\n }),\r\n\r\n editor.registerCommand(\r\n SELECTION_CHANGE_COMMAND,\r\n () => {\r\n $updateLinkEditor()\r\n return true\r\n },\r\n COMMAND_PRIORITY_LOW\r\n ),\r\n editor.registerCommand(\r\n KEY_ESCAPE_COMMAND,\r\n () => {\r\n if (isLink) {\r\n setIsLink(false)\r\n return true\r\n }\r\n return false\r\n },\r\n COMMAND_PRIORITY_HIGH\r\n )\r\n )\r\n }, [editor, $updateLinkEditor, setIsLink, isLink])\r\n\r\n useEffect(() => {\r\n editor.getEditorState().read(() => {\r\n $updateLinkEditor()\r\n })\r\n }, [editor, $updateLinkEditor])\r\n\r\n useEffect(() => {\r\n if (isLinkEditMode && inputRef.current) {\r\n inputRef.current.focus()\r\n // Use setTimeout to avoid calling setState synchronously within effect\r\n setTimeout(() => {\r\n setIsLink(true)\r\n }, 0)\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [isLinkEditMode, isLink])\r\n\r\n const monitorInputInteraction = (\r\n event: React.KeyboardEvent<HTMLInputElement>\r\n ) => {\r\n if (event.key === \"Enter\") {\r\n event.preventDefault()\r\n handleLinkSubmission()\r\n } else if (event.key === \"Escape\") {\r\n event.preventDefault()\r\n setIsLinkEditMode(false)\r\n }\r\n }\r\n\r\n const handleLinkSubmission = () => {\r\n const url = sanitizeUrl(editedLinkUrl)\r\n if (url && url !== \"https://\" && url !== \"http://\") {\r\n editor.update(() => {\r\n // Try to get current selection first\r\n let selection = $getSelection()\r\n \r\n // If no current selection, try to restore from lastSelection\r\n if (!selection && lastSelection !== null) {\r\n // Clone the selection to avoid frozen object error\r\n if ($isRangeSelection(lastSelection)) {\r\n const clonedSelection = lastSelection.clone()\r\n $setSelection(clonedSelection)\r\n selection = $getSelection()\r\n } else if ($isNodeSelection(lastSelection)) {\r\n const clonedSelection = lastSelection.clone()\r\n $setSelection(clonedSelection)\r\n selection = $getSelection()\r\n }\r\n }\r\n \r\n if (!selection) {\r\n return\r\n }\r\n \r\n // Handle node selection (e.g., image nodes)\r\n if ($isNodeSelection(selection)) {\r\n const nodes = selection.getNodes()\r\n if (nodes.length > 0) {\r\n const node = nodes[0]\r\n \r\n // If it's an image node\r\n if ($isImageNode(node)) {\r\n // Check if already wrapped in a link\r\n const existingLinkNode = $findMatchingParent(node, $isLinkNode) || \r\n ($isLinkNode(node.getParent()) ? node.getParent() : null)\r\n \r\n if (existingLinkNode) {\r\n // Update existing link\r\n existingLinkNode.setURL(url)\r\n } else {\r\n // Wrap image in link using wrapNodeInElement (safe for all cases including root)\r\n const linkNode = $createLinkNode(url)\r\n $wrapNodeInElement(node, () => linkNode)\r\n }\r\n }\r\n }\r\n }\r\n // Handle range selection\r\n else if ($isRangeSelection(selection)) {\r\n // Use default TOGGLE_LINK_COMMAND for range selection\r\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, url)\r\n const parent = getSelectedNode(selection).getParent()\r\n if ($isAutoLinkNode(parent)) {\r\n const linkNode = $createLinkNode(parent.getURL(), {\r\n rel: parent.__rel,\r\n target: parent.__target,\r\n title: parent.__title,\r\n })\r\n parent.replace(linkNode, true)\r\n }\r\n }\r\n })\r\n setEditedLinkUrl(\"https://\")\r\n setIsLinkEditMode(false)\r\n }\r\n }\r\n return (\r\n <div\r\n ref={editorRef}\r\n className=\"absolute top-0 left-0 w-full max-w-sm rounded-md opacity-0 shadow-lg z-50\"\r\n >\r\n {isLinkEditMode || isLink ? (\r\n isLinkEditMode ? (\r\n <Flex align=\"center\" gap={2} className=\"space-x-2 rounded-md border bg-background/95 backdrop-blur-sm p-1 pl-2 shadow-lg\">\r\n <Input\r\n ref={inputRef}\r\n value={editedLinkUrl}\r\n onChange={(event) => setEditedLinkUrl(event.target.value)}\r\n onKeyDown={monitorInputInteraction}\r\n className=\"flex-grow\"\r\n />\r\n <Button\r\n size=\"icon\"\r\n variant=\"ghost\"\r\n onClick={() => {\r\n setIsLinkEditMode(false)\r\n setIsLink(false)\r\n }}\r\n className=\"shrink-0\"\r\n >\r\n <X className=\"h-4 w-4\" />\r\n </Button>\r\n <Button\r\n size=\"icon\"\r\n onClick={handleLinkSubmission}\r\n className=\"shrink-0\"\r\n >\r\n <Check className=\"h-4 w-4\" />\r\n </Button>\r\n </Flex>\r\n ) : (\r\n <Flex align=\"center\" justify=\"between\" className=\"rounded-md border bg-background/95 backdrop-blur-sm p-1 pl-2 shadow-lg\">\r\n <a\r\n href={sanitizeUrl(linkUrl)}\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n className=\"overflow-hidden text-ellipsis whitespace-nowrap\"\r\n >\r\n <TypographyPSmall className=\"truncate\">{linkUrl}</TypographyPSmall>\r\n </a>\r\n <Flex gap={0}>\r\n <Button\r\n size=\"icon\"\r\n variant=\"ghost\"\r\n onClick={() => {\r\n setEditedLinkUrl(linkUrl)\r\n setIsLinkEditMode(true)\r\n }}\r\n >\r\n <Pencil className=\"h-4 w-4\" />\r\n </Button>\r\n <Button\r\n size=\"icon\"\r\n variant=\"destructive\"\r\n onClick={() => {\r\n editor.update(() => {\r\n const selection = $getSelection()\r\n // Handle node selection (e.g., image nodes)\r\n if ($isNodeSelection(selection)) {\r\n const nodes = selection.getNodes()\r\n if (nodes.length > 0) {\r\n const node = nodes[0]\r\n if ($isImageNode(node)) {\r\n const linkNode = $findMatchingParent(node, $isLinkNode) || \r\n ($isLinkNode(node.getParent()) ? node.getParent() : null)\r\n if (linkNode) {\r\n // Remove link by unwrapping - insert children into parent and remove link\r\n const parent = linkNode.getParent()\r\n if (parent) {\r\n const children = linkNode.getChildren()\r\n children.forEach((child) => {\r\n linkNode.insertBefore(child)\r\n })\r\n linkNode.remove()\r\n }\r\n }\r\n }\r\n }\r\n } else {\r\n // Use default TOGGLE_LINK_COMMAND for range selection\r\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null)\r\n }\r\n })\r\n }}\r\n >\r\n <Trash className=\"h-4 w-4\" />\r\n </Button>\r\n </Flex>\r\n </Flex>\r\n )\r\n ) : null}\r\n </div>\r\n )\r\n}\r\n\r\nfunction useFloatingLinkEditorToolbar(\r\n editor: LexicalEditor,\r\n anchorElem: HTMLDivElement | null,\r\n isLinkEditMode: boolean,\r\n setIsLinkEditMode: Dispatch<boolean>\r\n): JSX.Element | null {\r\n const [activeEditor, setActiveEditor] = useState(editor)\r\n const [isLink, setIsLink] = useState(false)\r\n\r\n useEffect(() => {\r\n function $updateToolbar() {\r\n const selection = $getSelection()\r\n if ($isRangeSelection(selection)) {\r\n const focusNode = getSelectedNode(selection)\r\n const focusLinkNode = $findMatchingParent(focusNode, $isLinkNode)\r\n const focusAutoLinkNode = $findMatchingParent(\r\n focusNode,\r\n $isAutoLinkNode\r\n )\r\n if (!(focusLinkNode || focusAutoLinkNode)) {\r\n setIsLink(false)\r\n return\r\n }\r\n const badNode = selection\r\n .getNodes()\r\n .filter((node) => !$isLineBreakNode(node))\r\n .find((node) => {\r\n const linkNode = $findMatchingParent(node, $isLinkNode)\r\n const autoLinkNode = $findMatchingParent(node, $isAutoLinkNode)\r\n return (\r\n (focusLinkNode && !focusLinkNode.is(linkNode)) ||\r\n (linkNode && !linkNode.is(focusLinkNode)) ||\r\n (focusAutoLinkNode && !focusAutoLinkNode.is(autoLinkNode)) ||\r\n (autoLinkNode &&\r\n (!autoLinkNode.is(focusAutoLinkNode) ||\r\n autoLinkNode.getIsUnlinked()))\r\n )\r\n })\r\n if (!badNode) {\r\n setIsLink(true)\r\n } else {\r\n setIsLink(false)\r\n }\r\n } else if ($isNodeSelection(selection)) {\r\n const nodes = selection.getNodes()\r\n if (nodes.length === 0) {\r\n setIsLink(false)\r\n return\r\n }\r\n const node = nodes[0]\r\n // Check if node itself is a link\r\n if ($isLinkNode(node)) {\r\n setIsLink(true)\r\n return\r\n }\r\n // Check if node is wrapped in a link (using $findMatchingParent for better traversal)\r\n const linkParent = $findMatchingParent(node, $isLinkNode)\r\n if (linkParent) {\r\n setIsLink(true)\r\n return\r\n }\r\n // For image nodes, also check direct parent\r\n if ($isImageNode(node)) {\r\n const parent = node.getParent()\r\n if ($isLinkNode(parent)) {\r\n setIsLink(true)\r\n return\r\n }\r\n }\r\n setIsLink(false)\r\n }\r\n }\r\n return mergeRegister(\r\n editor.registerUpdateListener(({ editorState }) => {\r\n editorState.read(() => {\r\n $updateToolbar()\r\n })\r\n }),\r\n // Register TOGGLE_LINK_COMMAND handler for node selection (image nodes)\r\n editor.registerCommand(\r\n TOGGLE_LINK_COMMAND,\r\n (url: string | null) => {\r\n const selection = $getSelection()\r\n \r\n // Handle node selection (e.g., image nodes)\r\n if ($isNodeSelection(selection)) {\r\n const nodes = selection.getNodes()\r\n if (nodes.length > 0) {\r\n const node = nodes[0]\r\n \r\n if ($isImageNode(node)) {\r\n if (url) {\r\n // Create or update link\r\n const existingLinkNode = $findMatchingParent(node, $isLinkNode) || \r\n ($isLinkNode(node.getParent()) ? node.getParent() : null)\r\n \r\n if (existingLinkNode) {\r\n // Update existing link\r\n existingLinkNode.setURL(url)\r\n } else {\r\n // Wrap image in link using wrapNodeInElement (safe for all cases including root)\r\n const linkNode = $createLinkNode(url)\r\n $wrapNodeInElement(node, () => linkNode)\r\n }\r\n } else {\r\n // Remove link\r\n const linkNode = $findMatchingParent(node, $isLinkNode) || \r\n ($isLinkNode(node.getParent()) ? node.getParent() : null)\r\n if (linkNode) {\r\n // Remove link by unwrapping - insert children into parent and remove link\r\n const parent = linkNode.getParent()\r\n if (parent) {\r\n const children = linkNode.getChildren()\r\n children.forEach((child) => {\r\n linkNode.insertBefore(child)\r\n })\r\n linkNode.remove()\r\n }\r\n }\r\n }\r\n return true\r\n }\r\n }\r\n }\r\n \r\n // Let default handler process range selection\r\n return false\r\n },\r\n COMMAND_PRIORITY_HIGH\r\n ),\r\n editor.registerCommand(\r\n SELECTION_CHANGE_COMMAND,\r\n (_payload, newEditor) => {\r\n editor.getEditorState().read(() => {\r\n $updateToolbar()\r\n })\r\n setActiveEditor(newEditor)\r\n return false\r\n },\r\n COMMAND_PRIORITY_CRITICAL\r\n ),\r\n // Register a listener for when node selection changes to image with link\r\n editor.registerCommand(\r\n SELECTION_CHANGE_COMMAND,\r\n () => {\r\n editor.getEditorState().read(() => {\r\n const selection = $getSelection()\r\n if ($isNodeSelection(selection)) {\r\n const nodes = selection.getNodes()\r\n if (nodes.length > 0) {\r\n const node = nodes[0]\r\n if ($isImageNode(node)) {\r\n const linkNode = $findMatchingParent(node, $isLinkNode) || \r\n ($isLinkNode(node.getParent()) ? node.getParent() : null)\r\n if (linkNode) {\r\n // Delay to ensure DOM is updated\r\n setTimeout(() => {\r\n editor.getEditorState().read(() => {\r\n $updateToolbar()\r\n })\r\n }, 10)\r\n }\r\n }\r\n }\r\n }\r\n })\r\n return false\r\n },\r\n COMMAND_PRIORITY_LOW\r\n ),\r\n editor.registerCommand(\r\n CLICK_COMMAND,\r\n (payload) => {\r\n let shouldReturnTrue = false\r\n \r\n editor.getEditorState().read(() => {\r\n const selection = $getSelection()\r\n \r\n // Check if we clicked on an image node (with or without link)\r\n let hasImageNode = false\r\n if ($isNodeSelection(selection)) {\r\n const nodes = selection.getNodes()\r\n if (nodes.length > 0) {\r\n const node = nodes[0]\r\n if ($isImageNode(node)) {\r\n hasImageNode = true\r\n }\r\n }\r\n }\r\n \r\n // Handle Ctrl/Cmd + click to open link\r\n if (payload.metaKey || payload.ctrlKey) {\r\n if ($isRangeSelection(selection)) {\r\n const node = getSelectedNode(selection)\r\n const linkNode = $findMatchingParent(node, $isLinkNode)\r\n if ($isLinkNode(linkNode)) {\r\n const url = linkNode.getURL()\r\n // Validate URL before opening to prevent errors with invalid URLs\r\n if (url && validateUrl(url)) {\r\n window.open(url, \"_blank\")\r\n }\r\n shouldReturnTrue = true\r\n return\r\n }\r\n } else if ($isNodeSelection(selection)) {\r\n const nodes = selection.getNodes()\r\n if (nodes.length > 0) {\r\n const node = nodes[0]\r\n let linkNode = null\r\n if ($isLinkNode(node)) {\r\n linkNode = node\r\n } else {\r\n linkNode = $findMatchingParent(node, $isLinkNode)\r\n if (!linkNode && $isImageNode(node)) {\r\n const parent = node.getParent()\r\n if ($isLinkNode(parent)) {\r\n linkNode = parent\r\n }\r\n }\r\n }\r\n if (linkNode) {\r\n const url = linkNode.getURL()\r\n if (url && validateUrl(url)) {\r\n window.open(url, \"_blank\")\r\n }\r\n shouldReturnTrue = true\r\n return\r\n }\r\n }\r\n }\r\n }\r\n \r\n // If we clicked on an image (with or without link), trigger toolbar update\r\n if (hasImageNode) {\r\n // Use requestAnimationFrame to ensure selection is updated\r\n requestAnimationFrame(() => {\r\n editor.getEditorState().read(() => {\r\n $updateToolbar()\r\n })\r\n })\r\n }\r\n })\r\n \r\n if (shouldReturnTrue) {\r\n return true\r\n }\r\n \r\n // Trigger toolbar update on click to ensure floating editor shows\r\n setTimeout(() => {\r\n editor.getEditorState().read(() => {\r\n $updateToolbar()\r\n })\r\n }, 0)\r\n return false\r\n },\r\n COMMAND_PRIORITY_HIGH\r\n )\r\n )\r\n }, [editor])\r\n\r\n if (!anchorElem) {\r\n return null\r\n }\r\n\r\n return createPortal(\r\n <FloatingLinkEditor\r\n editor={activeEditor}\r\n isLink={isLink}\r\n anchorElem={anchorElem}\r\n setIsLink={setIsLink}\r\n isLinkEditMode={isLinkEditMode}\r\n setIsLinkEditMode={setIsLinkEditMode}\r\n />,\r\n anchorElem\r\n )\r\n}\r\n\r\nexport function FloatingLinkEditorPlugin({\r\n anchorElem,\r\n isLinkEditMode,\r\n setIsLinkEditMode,\r\n}: {\r\n anchorElem: HTMLDivElement | null\r\n isLinkEditMode: boolean\r\n setIsLinkEditMode: Dispatch<boolean>\r\n}): JSX.Element | null {\r\n const [editor] = useLexicalComposerContext()\r\n\r\n return useFloatingLinkEditorToolbar(\r\n editor,\r\n anchorElem,\r\n isLinkEditMode,\r\n setIsLinkEditMode\r\n )\r\n}\r\n","import { $isAtNodeEnd } from \"@lexical/selection\"\r\nimport { ElementNode, RangeSelection, TextNode } from \"lexical\"\r\n\r\nexport function getSelectedNode(\r\n selection: RangeSelection\r\n): TextNode | ElementNode {\r\n const anchor = selection.anchor\r\n const focus = selection.focus\r\n const anchorNode = selection.anchor.getNode()\r\n const focusNode = selection.focus.getNode()\r\n if (anchorNode === focusNode) {\r\n return anchorNode\r\n }\r\n const isBackward = selection.isBackward()\r\n if (isBackward) {\r\n return $isAtNodeEnd(focus) ? anchorNode : focusNode\r\n } else {\r\n return $isAtNodeEnd(anchor) ? anchorNode : focusNode\r\n }\r\n}\r\n","const VERTICAL_GAP = 10\r\nconst HORIZONTAL_OFFSET = 5\r\n\r\nexport function setFloatingElemPositionForLinkEditor(\r\n targetRect: DOMRect | null,\r\n floatingElem: HTMLElement,\r\n anchorElem: HTMLElement,\r\n verticalGap: number = VERTICAL_GAP,\r\n horizontalOffset: number = HORIZONTAL_OFFSET\r\n): void {\r\n const scrollerElem = anchorElem.parentElement\r\n\r\n if (targetRect === null || !scrollerElem) {\r\n floatingElem.style.opacity = \"0\"\r\n floatingElem.style.transform = \"translate(-10000px, -10000px)\"\r\n return\r\n }\r\n\r\n const floatingElemRect = floatingElem.getBoundingClientRect()\r\n const anchorElementRect = anchorElem.getBoundingClientRect()\r\n const editorScrollerRect = scrollerElem.getBoundingClientRect()\r\n\r\n let top = targetRect.top - verticalGap\r\n let left = targetRect.left - horizontalOffset\r\n\r\n if (top < editorScrollerRect.top) {\r\n top += floatingElemRect.height + targetRect.height + verticalGap * 2\r\n }\r\n\r\n if (left + floatingElemRect.width > editorScrollerRect.right) {\r\n left = editorScrollerRect.right - floatingElemRect.width - horizontalOffset\r\n }\r\n\r\n top -= anchorElementRect.top\r\n left -= anchorElementRect.left\r\n\r\n floatingElem.style.opacity = \"1\"\r\n floatingElem.style.transform = `translate(${left}px, ${top}px)`\r\n}\r\n","const SUPPORTED_URL_PROTOCOLS = new Set([\r\n \"http:\",\r\n \"https:\",\r\n \"mailto:\",\r\n \"sms:\",\r\n \"tel:\",\r\n])\r\n\r\nexport function sanitizeUrl(url: string): string {\r\n try {\r\n const parsedUrl = new URL(url)\r\n if (!SUPPORTED_URL_PROTOCOLS.has(parsedUrl.protocol)) {\r\n return \"about:blank\"\r\n }\r\n } catch {\r\n return url\r\n }\r\n return url\r\n}\r\n\r\n// Source: https://stackoverflow.com/a/8234912/2013580\r\nconst urlRegExp = new RegExp(\r\n /((([A-Za-z]{3,9}:(?:\\/\\/)?)(?:[-;:&=+$,\\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=+$,\\w]+@)[A-Za-z0-9.-]+)((?:\\/[+~%/.\\w-_]*)?\\??(?:[-+=&;%@.\\w_]*)#?(?:[\\w]*))?)/\r\n)\r\nexport function validateUrl(url: string): boolean {\r\n // Reject invalid URLs like \"https://\" (incomplete URLs)\r\n if (!url || url === \"https://\" || url === \"http://\") {\r\n return false\r\n }\r\n // Validate using regex pattern\r\n return urlRegExp.test(url)\r\n}\r\n","\"use client\"\r\n\r\n/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\nimport { Dispatch, JSX, useCallback, useEffect, useRef, useState } from \"react\"\r\nimport * as React from \"react\"\r\nimport { $isCodeHighlightNode } from \"@lexical/code\"\r\nimport { $isLinkNode, TOGGLE_LINK_COMMAND } from \"@lexical/link\"\r\nimport {\r\n $getSelectionStyleValueForProperty,\r\n $patchStyleText,\r\n} from \"@lexical/selection\"\r\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\"\r\nimport { mergeRegister } from \"@lexical/utils\"\r\nimport {\r\n $getSelection,\r\n $isParagraphNode,\r\n $isRangeSelection,\r\n $isTextNode,\r\n COMMAND_PRIORITY_LOW,\r\n FORMAT_TEXT_COMMAND,\r\n LexicalEditor,\r\n SELECTION_CHANGE_COMMAND,\r\n} from \"lexical\"\r\nimport {\r\n BoldIcon,\r\n CodeIcon,\r\n ItalicIcon,\r\n LinkIcon,\r\n PaintBucketIcon,\r\n StrikethroughIcon,\r\n SubscriptIcon,\r\n SuperscriptIcon,\r\n UnderlineIcon,\r\n BaselineIcon,\r\n} from \"lucide-react\"\r\nimport { createPortal } from \"react-dom\"\r\n\r\nimport {\r\n ColorPicker,\r\n ColorPickerAlphaSlider,\r\n ColorPickerArea,\r\n ColorPickerContent,\r\n ColorPickerFormatSelect,\r\n ColorPickerHueSlider,\r\n ColorPickerInput,\r\n ColorPickerPresets,\r\n ColorPickerTrigger,\r\n} from \"@/components/editor/editor-ui/color-picker\"\r\nimport { getDOMRangeRect } from \"@/components/editor/utils/get-dom-range-rect\"\r\nimport { getSelectedNode } from \"@/components/editor/utils/get-selected-node\"\r\nimport { setFloatingElemPosition } from \"@/components/editor/utils/set-floating-elem-position\"\r\nimport { Button } from \"@/components/ui/button\"\r\nimport { Flex } from \"@/components/ui/flex\"\r\nimport { Separator } from \"@/components/ui/separator\"\r\nimport {\r\n ToggleGroup,\r\n ToggleGroupItem,\r\n} from \"@/components/ui/toggle-group\"\r\nimport { IconSize } from \"@/components/ui/typography\"\r\n\r\nfunction FloatingTextFormat({\r\n editor,\r\n anchorElem,\r\n isLink,\r\n isBold,\r\n isItalic,\r\n isUnderline,\r\n isCode,\r\n isStrikethrough,\r\n isSubscript,\r\n isSuperscript,\r\n fontColor,\r\n bgColor,\r\n setIsLinkEditMode,\r\n}: {\r\n editor: LexicalEditor\r\n anchorElem: HTMLElement\r\n isBold: boolean\r\n isCode: boolean\r\n isItalic: boolean\r\n isLink: boolean\r\n isStrikethrough: boolean\r\n isSubscript: boolean\r\n isSuperscript: boolean\r\n isUnderline: boolean\r\n fontColor: string\r\n bgColor: string\r\n setIsLinkEditMode: Dispatch<boolean>\r\n}): JSX.Element {\r\n const popupCharStylesEditorRef = useRef<HTMLDivElement | null>(null)\r\n\r\n const insertLink = useCallback(() => {\r\n if (!isLink) {\r\n setIsLinkEditMode(true)\r\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, \"https://\")\r\n } else {\r\n setIsLinkEditMode(false)\r\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null)\r\n }\r\n }, [editor, isLink, setIsLinkEditMode])\r\n\r\n const applyStyleText = useCallback(\r\n (styles: Record<string, string>) => {\r\n editor.update(() => {\r\n const selection = $getSelection()\r\n if ($isRangeSelection(selection)) {\r\n $patchStyleText(selection, styles)\r\n }\r\n })\r\n },\r\n [editor]\r\n )\r\n\r\n const onFontColorSelect = useCallback(\r\n (value: string) => {\r\n applyStyleText({ color: value })\r\n },\r\n [applyStyleText]\r\n )\r\n\r\n const onBgColorSelect = useCallback(\r\n (value: string) => {\r\n applyStyleText({ \"background-color\": value })\r\n },\r\n [applyStyleText]\r\n )\r\n\r\n function mouseMoveListener(e: MouseEvent) {\r\n if (\r\n popupCharStylesEditorRef?.current &&\r\n (e.buttons === 1 || e.buttons === 3)\r\n ) {\r\n if (popupCharStylesEditorRef.current.style.pointerEvents !== \"none\") {\r\n const x = e.clientX\r\n const y = e.clientY\r\n const elementUnderMouse = document.elementFromPoint(x, y)\r\n\r\n if (!popupCharStylesEditorRef.current.contains(elementUnderMouse)) {\r\n // Mouse is not over the target element => not a normal click, but probably a drag\r\n popupCharStylesEditorRef.current.style.pointerEvents = \"none\"\r\n }\r\n }\r\n }\r\n }\r\n function mouseUpListener(_e: MouseEvent) {\r\n if (popupCharStylesEditorRef?.current) {\r\n if (popupCharStylesEditorRef.current.style.pointerEvents !== \"auto\") {\r\n popupCharStylesEditorRef.current.style.pointerEvents = \"auto\"\r\n }\r\n }\r\n }\r\n\r\n useEffect(() => {\r\n if (popupCharStylesEditorRef?.current) {\r\n document.addEventListener(\"mousemove\", mouseMoveListener)\r\n document.addEventListener(\"mouseup\", mouseUpListener)\r\n\r\n return () => {\r\n document.removeEventListener(\"mousemove\", mouseMoveListener)\r\n document.removeEventListener(\"mouseup\", mouseUpListener)\r\n }\r\n }\r\n }, [popupCharStylesEditorRef])\r\n\r\n const $updateTextFormatFloatingToolbar = useCallback(() => {\r\n const selection = $getSelection()\r\n\r\n const popupCharStylesEditorElem = popupCharStylesEditorRef.current\r\n const nativeSelection = window.getSelection()\r\n\r\n if (popupCharStylesEditorElem === null) {\r\n return\r\n }\r\n\r\n const rootElement = editor.getRootElement()\r\n if (\r\n selection !== null &&\r\n nativeSelection !== null &&\r\n !nativeSelection.isCollapsed &&\r\n rootElement !== null &&\r\n rootElement.contains(nativeSelection.anchorNode)\r\n ) {\r\n const rangeRect = getDOMRangeRect(nativeSelection, rootElement)\r\n\r\n setFloatingElemPosition(\r\n rangeRect,\r\n popupCharStylesEditorElem,\r\n anchorElem,\r\n isLink\r\n )\r\n }\r\n }, [editor, anchorElem, isLink])\r\n\r\n useEffect(() => {\r\n const scrollerElem = anchorElem.parentElement\r\n\r\n const update = () => {\r\n editor.getEditorState().read(() => {\r\n $updateTextFormatFloatingToolbar()\r\n })\r\n }\r\n\r\n window.addEventListener(\"resize\", update)\r\n if (scrollerElem) {\r\n scrollerElem.addEventListener(\"scroll\", update, { passive: true })\r\n }\r\n\r\n return () => {\r\n window.removeEventListener(\"resize\", update)\r\n if (scrollerElem) {\r\n scrollerElem.removeEventListener(\"scroll\", update)\r\n }\r\n }\r\n }, [editor, $updateTextFormatFloatingToolbar, anchorElem])\r\n\r\n useEffect(() => {\r\n editor.getEditorState().read(() => {\r\n $updateTextFormatFloatingToolbar()\r\n })\r\n return mergeRegister(\r\n editor.registerUpdateListener(({ editorState }) => {\r\n editorState.read(() => {\r\n $updateTextFormatFloatingToolbar()\r\n })\r\n }),\r\n\r\n editor.registerCommand(\r\n SELECTION_CHANGE_COMMAND,\r\n () => {\r\n $updateTextFormatFloatingToolbar()\r\n return false\r\n },\r\n COMMAND_PRIORITY_LOW\r\n )\r\n )\r\n }, [editor, $updateTextFormatFloatingToolbar])\r\n\r\n return (\r\n <div\r\n ref={popupCharStylesEditorRef}\r\n className=\"bg-background absolute top-0 left-0 flex max-w-[560px] flex-wrap items-center gap-2 rounded-md border p-2 opacity-0 shadow-md transition-opacity duration-300 will-change-transform\"\r\n >\r\n {editor.isEditable() && (\r\n <>\r\n <div className=\"bg-muted/40 flex items-center gap-1 rounded-md border px-1 py-1\">\r\n <ToggleGroup\r\n type=\"multiple\"\r\n defaultValue={[\r\n isBold ? \"bold\" : \"\",\r\n isItalic ? \"italic\" : \"\",\r\n isUnderline ? \"underline\" : \"\",\r\n isStrikethrough ? \"strikethrough\" : \"\",\r\n isSubscript ? \"subscript\" : \"\",\r\n isSuperscript ? \"superscript\" : \"\",\r\n isCode ? \"code\" : \"\",\r\n isLink ? \"link\" : \"\",\r\n ]}\r\n >\r\n <ToggleGroupItem\r\n value=\"bold\"\r\n aria-label=\"Toggle bold\"\r\n onClick={() => {\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, \"bold\")\r\n }}\r\n size=\"sm\"\r\n >\r\n <IconSize size=\"sm\">\r\n <BoldIcon />\r\n </IconSize>\r\n </ToggleGroupItem>\r\n <ToggleGroupItem\r\n value=\"italic\"\r\n aria-label=\"Toggle italic\"\r\n onClick={() => {\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, \"italic\")\r\n }}\r\n size=\"sm\"\r\n >\r\n <IconSize size=\"sm\">\r\n <ItalicIcon />\r\n </IconSize>\r\n </ToggleGroupItem>\r\n <ToggleGroupItem\r\n value=\"underline\"\r\n aria-label=\"Toggle underline\"\r\n onClick={() => {\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, \"underline\")\r\n }}\r\n size=\"sm\"\r\n >\r\n <IconSize size=\"sm\">\r\n <UnderlineIcon />\r\n </IconSize>\r\n </ToggleGroupItem>\r\n <ToggleGroupItem\r\n value=\"strikethrough\"\r\n aria-label=\"Toggle strikethrough\"\r\n onClick={() => {\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, \"strikethrough\")\r\n }}\r\n size=\"sm\"\r\n >\r\n <IconSize size=\"sm\">\r\n <StrikethroughIcon />\r\n </IconSize>\r\n </ToggleGroupItem>\r\n <Separator orientation=\"vertical\" />\r\n <ToggleGroupItem\r\n value=\"code\"\r\n aria-label=\"Toggle code\"\r\n onClick={() => {\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, \"code\")\r\n }}\r\n size=\"sm\"\r\n >\r\n <IconSize size=\"sm\">\r\n <CodeIcon />\r\n </IconSize>\r\n </ToggleGroupItem>\r\n <ToggleGroupItem\r\n value=\"link\"\r\n aria-label=\"Toggle link\"\r\n onClick={insertLink}\r\n size=\"sm\"\r\n >\r\n <IconSize size=\"sm\">\r\n <LinkIcon />\r\n </IconSize>\r\n </ToggleGroupItem>\r\n </ToggleGroup>\r\n </div>\r\n <Flex align=\"center\" gap={2}>\r\n <div className=\"bg-muted/40 flex min-h-[54px] items-center gap-2 rounded-md border px-2 py-1\">\r\n <ColorPicker\r\n defaultFormat=\"hex\"\r\n defaultValue={fontColor}\r\n onValueChange={onFontColorSelect}\r\n >\r\n <ColorPickerTrigger asChild>\r\n <Button variant=\"ghost\" size=\"icon\" className=\"size-9\">\r\n <IconSize size=\"md\">\r\n <BaselineIcon />\r\n </IconSize>\r\n </Button>\r\n </ColorPickerTrigger>\r\n <ColorPickerContent>\r\n <ColorPickerArea />\r\n <Flex align=\"center\" gap={2}>\r\n <Flex direction=\"col\" gap={2} className=\"flex-1\">\r\n <ColorPickerHueSlider />\r\n <ColorPickerAlphaSlider />\r\n </Flex>\r\n </Flex>\r\n <Flex align=\"center\" gap={2}>\r\n <ColorPickerFormatSelect />\r\n <ColorPickerInput />\r\n </Flex>\r\n <ColorPickerPresets />\r\n </ColorPickerContent>\r\n </ColorPicker>\r\n <ColorPicker\r\n defaultFormat=\"hex\"\r\n defaultValue={bgColor}\r\n onValueChange={onBgColorSelect}\r\n >\r\n <ColorPickerTrigger asChild>\r\n <Button variant=\"ghost\" size=\"icon\" className=\"size-9\">\r\n <IconSize size=\"md\">\r\n <PaintBucketIcon />\r\n </IconSize>\r\n </Button>\r\n </ColorPickerTrigger>\r\n <ColorPickerContent>\r\n <ColorPickerArea />\r\n <Flex align=\"center\" gap={2}>\r\n <Flex direction=\"col\" gap={2} className=\"flex-1\">\r\n <ColorPickerHueSlider />\r\n <ColorPickerAlphaSlider />\r\n </Flex>\r\n </Flex>\r\n <Flex align=\"center\" gap={2}>\r\n <ColorPickerFormatSelect />\r\n <ColorPickerInput />\r\n </Flex>\r\n <ColorPickerPresets />\r\n </ColorPickerContent>\r\n </ColorPicker>\r\n </div>\r\n </Flex>\r\n <div className=\"bg-muted/40 flex items-center gap-1 rounded-md border px-1 py-1\">\r\n <ToggleGroup\r\n type=\"single\"\r\n defaultValue={\r\n isSubscript ? \"subscript\" : isSuperscript ? \"superscript\" : \"\"\r\n }\r\n >\r\n <ToggleGroupItem\r\n value=\"subscript\"\r\n aria-label=\"Toggle subscript\"\r\n onClick={() => {\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, \"subscript\")\r\n }}\r\n size=\"default\"\r\n className=\"h-11 min-h-11 w-11\"\r\n >\r\n <IconSize size=\"md\">\r\n <SubscriptIcon />\r\n </IconSize>\r\n </ToggleGroupItem>\r\n <ToggleGroupItem\r\n value=\"superscript\"\r\n aria-label=\"Toggle superscript\"\r\n onClick={() => {\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, \"superscript\")\r\n }}\r\n size=\"default\"\r\n className=\"h-11 min-h-11 w-11\"\r\n >\r\n <IconSize size=\"md\">\r\n <SuperscriptIcon />\r\n </IconSize>\r\n </ToggleGroupItem>\r\n </ToggleGroup>\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n )\r\n}\r\n\r\nfunction useFloatingTextFormatToolbar(\r\n editor: LexicalEditor,\r\n anchorElem: HTMLDivElement | null,\r\n setIsLinkEditMode: Dispatch<boolean>\r\n): JSX.Element | null {\r\n const [isText, setIsText] = useState(false)\r\n const [isLink, setIsLink] = useState(false)\r\n const [isBold, setIsBold] = useState(false)\r\n const [isItalic, setIsItalic] = useState(false)\r\n const [isUnderline, setIsUnderline] = useState(false)\r\n const [isStrikethrough, setIsStrikethrough] = useState(false)\r\n const [isSubscript, setIsSubscript] = useState(false)\r\n const [isSuperscript, setIsSuperscript] = useState(false)\r\n const [isCode, setIsCode] = useState(false)\r\n const [fontColor, setFontColor] = useState(\"#000\")\r\n const [bgColor, setBgColor] = useState(\"#fff\")\r\n\r\n const updatePopup = useCallback(() => {\r\n editor.getEditorState().read(() => {\r\n // Should not to pop up the floating toolbar when using IME input\r\n if (editor.isComposing()) {\r\n return\r\n }\r\n const selection = $getSelection()\r\n const nativeSelection = window.getSelection()\r\n const rootElement = editor.getRootElement()\r\n\r\n if (\r\n nativeSelection !== null &&\r\n (!$isRangeSelection(selection) ||\r\n rootElement === null ||\r\n !rootElement.contains(nativeSelection.anchorNode))\r\n ) {\r\n setIsText(false)\r\n return\r\n }\r\n\r\n if (!$isRangeSelection(selection)) {\r\n return\r\n }\r\n\r\n const node = getSelectedNode(selection)\r\n\r\n // Update text format\r\n setIsBold(selection.hasFormat(\"bold\"))\r\n setIsItalic(selection.hasFormat(\"italic\"))\r\n setIsUnderline(selection.hasFormat(\"underline\"))\r\n setIsStrikethrough(selection.hasFormat(\"strikethrough\"))\r\n setIsSubscript(selection.hasFormat(\"subscript\"))\r\n setIsSuperscript(selection.hasFormat(\"superscript\"))\r\n setIsCode(selection.hasFormat(\"code\"))\r\n setFontColor($getSelectionStyleValueForProperty(selection, \"color\", \"#000\"))\r\n setBgColor(\r\n $getSelectionStyleValueForProperty(selection, \"background-color\", \"#fff\")\r\n )\r\n\r\n // Update links\r\n const parent = node.getParent()\r\n if ($isLinkNode(parent) || $isLinkNode(node)) {\r\n setIsLink(true)\r\n } else {\r\n setIsLink(false)\r\n }\r\n\r\n if (\r\n !$isCodeHighlightNode(selection.anchor.getNode()) &&\r\n selection.getTextContent() !== \"\"\r\n ) {\r\n setIsText($isTextNode(node) || $isParagraphNode(node))\r\n } else {\r\n setIsText(false)\r\n }\r\n\r\n const rawTextContent = selection.getTextContent().replace(/\\n/g, \"\")\r\n if (!selection.isCollapsed() && rawTextContent === \"\") {\r\n setIsText(false)\r\n return\r\n }\r\n })\r\n }, [editor])\r\n\r\n useEffect(() => {\r\n document.addEventListener(\"selectionchange\", updatePopup)\r\n return () => {\r\n document.removeEventListener(\"selectionchange\", updatePopup)\r\n }\r\n }, [updatePopup])\r\n\r\n useEffect(() => {\r\n return mergeRegister(\r\n editor.registerUpdateListener(() => {\r\n updatePopup()\r\n }),\r\n editor.registerRootListener(() => {\r\n if (editor.getRootElement() === null) {\r\n setIsText(false)\r\n }\r\n })\r\n )\r\n }, [editor, updatePopup])\r\n\r\n if (!isText || !anchorElem) {\r\n return null\r\n }\r\n\r\n return createPortal(\r\n <FloatingTextFormat\r\n editor={editor}\r\n anchorElem={anchorElem}\r\n isLink={isLink}\r\n isBold={isBold}\r\n isItalic={isItalic}\r\n isStrikethrough={isStrikethrough}\r\n isSubscript={isSubscript}\r\n isSuperscript={isSuperscript}\r\n isUnderline={isUnderline}\r\n isCode={isCode}\r\n fontColor={fontColor}\r\n bgColor={bgColor}\r\n setIsLinkEditMode={setIsLinkEditMode}\r\n />,\r\n anchorElem\r\n )\r\n}\r\n\r\nexport function FloatingTextFormatToolbarPlugin({\r\n anchorElem,\r\n setIsLinkEditMode,\r\n}: {\r\n anchorElem: HTMLDivElement | null\r\n setIsLinkEditMode: Dispatch<boolean>\r\n}): JSX.Element | null {\r\n const [editor] = useLexicalComposerContext()\r\n\r\n return useFloatingTextFormatToolbar(editor, anchorElem, setIsLinkEditMode)\r\n}\r\n","export function getDOMRangeRect(\r\n nativeSelection: Selection,\r\n rootElement: HTMLElement\r\n): DOMRect {\r\n const domRange = nativeSelection.getRangeAt(0)\r\n\r\n let rect\r\n\r\n if (nativeSelection.anchorNode === rootElement) {\r\n let inner = rootElement\r\n while (inner.firstElementChild != null) {\r\n inner = inner.firstElementChild as HTMLElement\r\n }\r\n rect = inner.getBoundingClientRect()\r\n } else {\r\n rect = domRange.getBoundingClientRect()\r\n }\r\n\r\n return rect\r\n}\r\n","const VERTICAL_GAP = 10\r\nconst HORIZONTAL_OFFSET = 5\r\n\r\nexport function setFloatingElemPosition(\r\n targetRect: DOMRect | null,\r\n floatingElem: HTMLElement,\r\n anchorElem: HTMLElement,\r\n isLink: boolean = false,\r\n verticalGap: number = VERTICAL_GAP,\r\n horizontalOffset: number = HORIZONTAL_OFFSET\r\n): void {\r\n const scrollerElem = anchorElem.parentElement\r\n\r\n if (targetRect === null || !scrollerElem) {\r\n floatingElem.style.opacity = \"0\"\r\n floatingElem.style.transform = \"translate(-10000px, -10000px)\"\r\n return\r\n }\r\n\r\n const floatingElemRect = floatingElem.getBoundingClientRect()\r\n const anchorElementRect = anchorElem.getBoundingClientRect()\r\n const editorScrollerRect = scrollerElem.getBoundingClientRect()\r\n\r\n let top = targetRect.top - floatingElemRect.height - verticalGap\r\n let left = targetRect.left - horizontalOffset\r\n\r\n if (top < editorScrollerRect.top) {\r\n // adjusted height for link element if the element is at top\r\n top +=\r\n floatingElemRect.height +\r\n targetRect.height +\r\n verticalGap * (isLink ? 9 : 2)\r\n }\r\n\r\n if (left + floatingElemRect.width > editorScrollerRect.right) {\r\n left = editorScrollerRect.right - floatingElemRect.width - horizontalOffset\r\n }\r\n\r\n top -= anchorElementRect.top\r\n left -= anchorElementRect.left\r\n\r\n floatingElem.style.opacity = \"1\"\r\n floatingElem.style.transform = `translate(${left}px, ${top}px)`\r\n}\r\n","\"use client\"\r\n\r\nimport * as React from \"react\"\r\nimport * as ToggleGroupPrimitive from \"@radix-ui/react-toggle-group\"\r\nimport { type VariantProps } from \"class-variance-authority\"\r\n\r\nimport { cn } from \"@/utils\"\r\nimport { toggleVariants } from \"@/components/ui/toggle\"\r\n\r\nconst ToggleGroupContext = React.createContext<\r\n VariantProps<typeof toggleVariants> & {\r\n spacing?: number\r\n }\r\n>({\r\n size: \"default\",\r\n variant: \"default\",\r\n spacing: 0,\r\n})\r\n\r\nfunction ToggleGroup({\r\n className,\r\n variant,\r\n size,\r\n spacing = 0,\r\n children,\r\n ...props\r\n}: React.ComponentProps<typeof ToggleGroupPrimitive.Root> &\r\n VariantProps<typeof toggleVariants> & {\r\n spacing?: number\r\n }) {\r\n return (\r\n <ToggleGroupPrimitive.Root\r\n data-slot=\"toggle-group\"\r\n data-variant={variant}\r\n data-size={size}\r\n data-spacing={spacing}\r\n style={{ \"--gap\": spacing } as React.CSSProperties}\r\n className={cn(\r\n \"group/toggle-group flex w-fit items-center gap-[--spacing(var(--gap))] rounded-md data-[spacing=default]:data-[variant=outline]:shadow-xs\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n <ToggleGroupContext.Provider value={{ variant, size, spacing }}>\r\n {children}\r\n </ToggleGroupContext.Provider>\r\n </ToggleGroupPrimitive.Root>\r\n )\r\n}\r\n\r\nfunction ToggleGroupItem({\r\n className,\r\n children,\r\n variant,\r\n size,\r\n ...props\r\n}: React.ComponentProps<typeof ToggleGroupPrimitive.Item> &\r\n VariantProps<typeof toggleVariants>) {\r\n const context = React.useContext(ToggleGroupContext)\r\n\r\n return (\r\n <ToggleGroupPrimitive.Item\r\n data-slot=\"toggle-group-item\"\r\n data-variant={context.variant || variant}\r\n data-size={context.size || size}\r\n data-spacing={context.spacing}\r\n className={cn(\r\n toggleVariants({\r\n variant: context.variant || variant,\r\n size: context.size || size,\r\n }),\r\n \"w-auto min-w-0 shrink-0 px-3 focus:z-10 focus-visible:z-10\",\r\n \"data-[spacing=0]:rounded-none data-[spacing=0]:shadow-none data-[spacing=0]:first:rounded-l-md data-[spacing=0]:last:rounded-r-md data-[spacing=0]:data-[variant=outline]:border-l-0 data-[spacing=0]:data-[variant=outline]:first:border-l\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n </ToggleGroupPrimitive.Item>\r\n )\r\n}\r\n\r\nexport { ToggleGroup, ToggleGroupItem }\r\n\r\n","\"use client\"\r\n\r\nimport * as React from \"react\"\r\nimport * as TogglePrimitive from \"@radix-ui/react-toggle\"\r\nimport { cva, type VariantProps } from \"class-variance-authority\"\r\n\r\nimport { cn } from \"@/utils\"\r\nimport { responsiveTextSizes, fontWeights, lineHeights, iconSizes } from \"@/constants\"\r\n\r\nconst toggleBodySmall = `${responsiveTextSizes.small} ${fontWeights.normal} ${lineHeights.relaxed}`\r\nconst toggleIconSize = iconSizes.sm\r\n\r\nconst toggleVariants = cva(\r\n `inline-flex items-center justify-center gap-2 rounded-md font-medium hover:bg-muted hover:text-muted-foreground disabled:pointer-events-none disabled:opacity-50 data-[state=on]:bg-accent data-[state=on]:text-accent-foreground [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:${toggleIconSize} [&_svg]:shrink-0 focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] outline-none transition-[color,box-shadow] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive whitespace-nowrap ${toggleBodySmall}`,\r\n {\r\n variants: {\r\n variant: {\r\n default: \"bg-transparent\",\r\n outline:\r\n \"border border-input bg-background shadow-xs hover:bg-accent hover:text-accent-foreground\",\r\n },\r\n size: {\r\n default: \"h-9 px-2 min-w-9 min-h-[44px]\", // 44px minimum for mobile touch targets\r\n sm: \"h-8 px-1.5 min-w-8 min-h-[44px]\",\r\n lg: \"h-10 px-2.5 min-w-10 min-h-[44px]\",\r\n },\r\n },\r\n defaultVariants: {\r\n variant: \"default\",\r\n size: \"default\",\r\n },\r\n }\r\n)\r\n\r\nfunction Toggle({\r\n className,\r\n variant,\r\n size,\r\n ...props\r\n}: React.ComponentProps<typeof TogglePrimitive.Root> &\r\n VariantProps<typeof toggleVariants>) {\r\n return (\r\n <TogglePrimitive.Root\r\n data-slot=\"toggle\"\r\n className={cn(toggleVariants({ variant, size, className }))}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nexport { Toggle, toggleVariants }\r\n\r\n","\"use client\"\r\n\r\n/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\nimport { JSX, useCallback, useEffect } from \"react\"\r\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\"\r\nimport { useLexicalTextEntity } from \"@lexical/react/useLexicalTextEntity\"\r\nimport type { TextNode } from \"lexical\"\r\n\r\nimport {\r\n $createKeywordNode,\r\n KeywordNode,\r\n} from \"@/components/editor/nodes/keyword-node\"\r\n\r\nconst KEYWORDS_REGEX =\r\n /(^|$|[^A-Za-zªµºÀ-ÖØ-öø-ˁˆ-ˑˠ-ˤˬˮͰ-ʹͶͷͺ-ͽΆΈ-ΊΌΎ-ΡΣ-ϵϷ-ҁҊ-ԧԱ-Ֆՙա-ևא-תװ-ײؠ-يٮٯٱ-ۓەۥۦۮۯۺ-ۼۿܐܒ-ܯݍ-ޥޱߊ-ߪߴߵߺࠀ-ࠕࠚࠤࠨࡀ-ࡘࢠࢢ-ࢬऄ-हऽॐक़-ॡॱ-ॷॹ-ॿঅ-ঌএঐও-নপ-রলশ-হঽৎড়ঢ়য়-ৡৰৱਅ-ਊਏਐਓ-ਨਪ-ਰਲਲ਼ਵਸ਼ਸਹਖ਼-ੜਫ਼ੲ-ੴઅ-ઍએ-ઑઓ-નપ-રલળવ-હઽૐૠૡଅ-ଌଏଐଓ-ନପ-ରଲଳଵ-ହଽଡ଼ଢ଼ୟ-ୡୱஃஅ-ஊஎ-ஐஒ-கஙசஜஞடணதந-பம-ஹௐఅ-ఌఎ-ఐఒ-నప-ళవ-హఽౘౙౠౡಅ-ಌಎ-ಐಒ-ನಪ-ಳವ-ಹಽೞೠೡೱೲഅ-ഌഎ-ഐഒ-ഺഽൎൠൡൺ-ൿඅ-ඖක-නඳ-රලව-ෆก-ะาำเ-ๆກຂຄງຈຊຍດ-ທນ-ຟມ-ຣລວສຫອ-ະາຳຽເ-ໄໆໜ-ໟༀཀ-ཇཉ-ཬྈ-ྌက-ဪဿၐ-ၕၚ-ၝၡၥၦၮ-ၰၵ-ႁႎႠ-ჅჇჍა-ჺჼ-ቈቊ-ቍቐ-ቖቘቚ-ቝበ-ኈኊ-ኍነ-ኰኲ-ኵኸ-ኾዀዂ-ዅወ-ዖዘ-ጐጒ-ጕጘ-ፚᎀ-ᎏᎠ-Ᏼᐁ-ᙬᙯ-ᙿᚁ-ᚚᚠ-ᛪᜀ-ᜌᜎ-ᜑᜠ-ᜱᝀ-ᝑᝠ-ᝬᝮ-ᝰក-ឳៗៜᠠ-ᡷᢀ-ᢨᢪᢰ-ᣵᤀ-ᤜᥐ-ᥭᥰ-ᥴᦀ-ᦫᧁ-ᧇᨀ-ᨖᨠ-ᩔᪧᬅ-ᬳᭅ-ᭋᮃ-ᮠᮮᮯᮺ-ᯥᰀ-ᰣᱍ-ᱏᱚ-ᱽᳩ-ᳬᳮ-ᳱᳵᳶᴀ-ᶿḀ-ἕἘ-Ἕἠ-ὅὈ-Ὅὐ-ὗὙὛὝὟ-ώᾀ-ᾴᾶ-ᾼιῂ-ῄῆ-ῌῐ-ΐῖ-Ίῠ-Ῥῲ-ῴῶ-ῼⁱⁿₐ-ₜℂℇℊ-ℓℕℙ-ℝℤΩℨK-ℭℯ-ℹℼ-ℿⅅ-ⅉⅎↃↄⰀ-Ⱞⰰ-ⱞⱠ-ⳤⳫ-ⳮⳲⳳⴀ-ⴥⴧⴭⴰ-ⵧⵯⶀ-ⶖⶠ-ⶦⶨ-ⶮⶰ-ⶶⶸ-ⶾⷀ-ⷆⷈ-ⷎⷐ-ⷖⷘ-ⷞⸯ々〆〱-〵〻〼ぁ-ゖゝ-ゟァ-ヺー-ヿㄅ-ㄭㄱ-ㆎㆠ-ㆺㇰ-ㇿ㐀-䶵一-鿌ꀀ-ꒌꓐ-ꓽꔀ-ꘌꘐ-ꘟꘪꘫꙀ-ꙮꙿ-ꚗꚠ-ꛥꜗ-ꜟꜢ-ꞈꞋ-ꞎꞐ-ꞓꞠ-Ɦꟸ-ꠁꠃ-ꠅꠇ-ꠊꠌ-ꠢꡀ-ꡳꢂ-ꢳꣲ-ꣷꣻꤊ-ꤥꤰ-ꥆꥠ-ꥼꦄ-ꦲꧏꨀ-ꨨꩀ-ꩂꩄ-ꩋꩠ-ꩶꩺꪀ-ꪯꪱꪵꪶꪹ-ꪽꫀꫂꫛ-ꫝꫠ-ꫪꫲ-ꫴꬁ-ꬆꬉ-ꬎꬑ-ꬖꬠ-ꬦꬨ-ꬮꯀ-ꯢ가-힣ힰ-ퟆퟋ-ퟻ豈-舘並-龎ff-stﬓ-ﬗיִײַ-ﬨשׁ-זּטּ-לּמּנּסּףּפּצּ-ﮱﯓ-ﴽﵐ-ﶏﶒ-ﷇﷰ-ﷻﹰ-ﹴﹶ-ﻼA-Za-zヲ-하-ᅦᅧ-ᅬᅭ-ᅲᅳ-ᅵ])(congrats|congratulations|gratuluju|gratuluji|gratulujeme|blahopřeju|blahopřeji|blahopřejeme|Til lykke|Tillykke|Glückwunsch|Gratuliere|felicitaciones|enhorabuena|paljon onnea|onnittelut|Félicitations|gratula|gratulálok|gratulálunk|congratulazioni|complimenti|おめでとう|おめでとうございます|축하해|축하해요|gratulerer|Gefeliciteerd|gratulacje|Parabéns|parabéns|felicitações|felicitări|мои поздравления|поздравляем|поздравляю|gratulujem|blahoželám|ยินดีด้วย|ขอแสดงความยินดี|tebrikler|tebrik ederim|恭喜|祝贺你|恭喜你|恭喜|恭喜|baie geluk|veels geluk|অভিনন্দন|Čestitam|Čestitke|Čestitamo|Συγχαρητήρια|Μπράβο|અભિનંદન|badhai|बधाई|अभिनंदन|Честитам|Свака част|hongera|வாழ்த்துகள்|வாழ்த்துக்கள்|అభినందనలు|അഭിനന്ദനങ്ങൾ|Chúc mừng|מזל טוב|mazel tov|mazal tov)(^|$|[^A-Za-zªµºÀ-ÖØ-öø-ˁˆ-ˑˠ-ˤˬˮͰ-ʹͶͷͺ-ͽΆΈ-ΊΌΎ-ΡΣ-ϵϷ-ҁҊ-ԧԱ-Ֆՙա-ևא-תװ-ײؠ-يٮٯٱ-ۓەۥۦۮۯۺ-ۼۿܐܒ-ܯݍ-ޥޱߊ-ߪߴߵߺࠀ-ࠕࠚࠤࠨࡀ-ࡘࢠࢢ-ࢬऄ-हऽॐक़-ॡॱ-ॷॹ-ॿঅ-ঌএঐও-নপ-রলশ-হঽৎড়ঢ়য়-ৡৰৱਅ-ਊਏਐਓ-ਨਪ-ਰਲਲ਼ਵਸ਼ਸਹਖ਼-ੜਫ਼ੲ-ੴઅ-ઍએ-ઑઓ-નપ-રલળવ-હઽૐૠૡଅ-ଌଏଐଓ-ନପ-ରଲଳଵ-ହଽଡ଼ଢ଼ୟ-ୡୱஃஅ-ஊஎ-ஐஒ-கஙசஜஞடணதந-பம-ஹௐఅ-ఌఎ-ఐఒ-నప-ళవ-హఽౘౙౠౡಅ-ಌಎ-ಐಒ-ನಪ-ಳವ-ಹಽೞೠೡೱೲഅ-ഌഎ-ഐഒ-ഺഽൎൠൡൺ-ൿඅ-ඖක-නඳ-රලව-ෆก-ะาำเ-ๆກຂຄງຈຊຍດ-ທນ-ຟມ-ຣລວສຫອ-ະາຳຽເ-ໄໆໜ-ໟༀཀ-ཇཉ-ཬྈ-ྌက-ဪဿၐ-ၕၚ-ၝၡၥၦၮ-ၰၵ-ႁႎႠ-ჅჇჍა-ჺჼ-ቈቊ-ቍቐ-ቖቘቚ-ቝበ-ኈኊ-ኍነ-ኰኲ-ኵኸ-ኾዀዂ-ዅወ-ዖዘ-ጐጒ-ጕጘ-ፚᎀ-ᎏᎠ-Ᏼᐁ-ᙬᙯ-ᙿᚁ-ᚚᚠ-ᛪᜀ-ᜌᜎ-ᜑᜠ-ᜱᝀ-ᝑᝠ-ᝬᝮ-ᝰក-ឳៗៜᠠ-ᡷᢀ-ᢨᢪᢰ-ᣵᤀ-ᤜᥐ-ᥭᥰ-ᥴᦀ-ᦫᧁ-ᧇᨀ-ᨖᨠ-ᩔᪧᬅ-ᬳᭅ-ᭋᮃ-ᮠᮮᮯᮺ-ᯥᰀ-ᰣᱍ-ᱏᱚ-ᱽᳩ-ᳬᳮ-ᳱᳵᳶᴀ-ᶿḀ-ἕἘ-Ἕἠ-ὅὈ-Ὅὐ-ὗὙὛὝὟ-ώᾀ-ᾴᾶ-ᾼιῂ-ῄῆ-ῌῐ-ΐῖ-Ίῠ-Ῥῲ-ῴῶ-ῼⁱⁿₐ-ₜℂℇℊ-ℓℕℙ-ℝℤΩℨK-ℭℯ-ℹℼ-ℿⅅ-ⅉⅎↃↄⰀ-Ⱞⰰ-ⱞⱠ-ⳤⳫ-ⳮⳲⳳⴀ-ⴥⴧⴭⴰ-ⵧⵯⶀ-ⶖⶠ-ⶦⶨ-ⶮⶰ-ⶶⶸ-ⶾⷀ-ⷆⷈ-ⷎⷐ-ⷖⷘ-ⷞⸯ々〆〱-〵〻〼ぁ-ゖゝ-ゟァ-ヺー-ヿㄅ-ㄭㄱ-ㆎㆠ-ㆺㇰ-ㇿ㐀-䶵一-鿌ꀀ-ꒌꓐ-ꓽꔀ-ꘌꘐ-ꘟꘪꘫꙀ-ꙮꙿ-ꚗꚠ-ꛥꜗ-ꜟꜢ-ꞈꞋ-ꞎꞐ-ꞓꞠ-Ɦꟸ-ꠁꠃ-ꠅꠇ-ꠊꠌ-ꠢꡀ-ꡳꢂ-ꢳꣲ-ꣷꣻꤊ-ꤥꤰ-ꥆꥠ-ꥼꦄ-ꦲꧏꨀ-ꨨꩀ-ꩂꩄ-ꩋꩠ-ꩶꩺꪀ-ꪯꪱꪵꪶꪹ-ꪽꫀꫂꫛ-ꫝꫠ-ꫪꫲ-ꫴꬁ-ꬆꬉ-ꬎꬑ-ꬖꬠ-ꬦꬨ-ꬮꯀ-ꯢ가-힣ힰ-ퟆퟋ-ퟻ豈-舘並-龎ff-stﬓ-ﬗיִײַ-ﬨשׁ-זּטּ-לּמּנּסּףּפּצּ-ﮱﯓ-ﴽﵐ-ﶏﶒ-ﷇﷰ-ﷻﹰ-ﹴﹶ-ﻼA-Za-zヲ-하-ᅦᅧ-ᅬᅭ-ᅲᅳ-ᅵ])/i\r\n\r\nexport function KeywordsPlugin(): JSX.Element | null {\r\n const [editor] = useLexicalComposerContext()\r\n\r\n useEffect(() => {\r\n if (!editor.hasNodes([KeywordNode])) {\r\n throw new Error(\"KeywordsPlugin: KeywordNode not registered on editor\")\r\n }\r\n }, [editor])\r\n\r\n const $createKeywordNode_ = useCallback((textNode: TextNode): KeywordNode => {\r\n return $createKeywordNode(textNode.getTextContent())\r\n }, [])\r\n\r\n const getKeywordMatch = useCallback((text: string) => {\r\n const matchArr = KEYWORDS_REGEX.exec(text)\r\n\r\n if (matchArr === null) {\r\n return null\r\n }\r\n\r\n const hashtagLength = matchArr[2].length\r\n const startOffset = matchArr.index + matchArr[1].length\r\n const endOffset = startOffset + hashtagLength\r\n return {\r\n end: endOffset,\r\n start: startOffset,\r\n }\r\n }, [])\r\n\r\n useLexicalTextEntity<KeywordNode>(\r\n getKeywordMatch,\r\n KeywordNode,\r\n $createKeywordNode_\r\n )\r\n\r\n return null\r\n}\r\n","\"use client\"\r\n\r\n/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\nimport * as React from \"react\"\r\nimport { JSX } from \"react\"\r\nimport { LinkPlugin as LexicalLinkPlugin } from \"@lexical/react/LexicalLinkPlugin\"\r\n\r\nimport { validateUrl } from \"@/components/editor/utils/url\"\r\n\r\nexport function LinkPlugin(): JSX.Element {\r\n return <LexicalLinkPlugin validateUrl={validateUrl} />\r\n}\r\n","\"use client\"\r\n\r\n/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\nimport { useEffect } from \"react\"\r\nimport { $getListDepth, $isListItemNode, $isListNode } from \"@lexical/list\"\r\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\"\r\nimport type { ElementNode, RangeSelection } from \"lexical\"\r\nimport {\r\n $getSelection,\r\n $isElementNode,\r\n $isRangeSelection,\r\n COMMAND_PRIORITY_CRITICAL,\r\n INDENT_CONTENT_COMMAND,\r\n} from \"lexical\"\r\n\r\nfunction getElementNodesInSelection(\r\n selection: RangeSelection\r\n): Set<ElementNode> {\r\n const nodesInSelection = selection.getNodes()\r\n\r\n if (nodesInSelection.length === 0) {\r\n return new Set([\r\n selection.anchor.getNode().getParentOrThrow(),\r\n selection.focus.getNode().getParentOrThrow(),\r\n ])\r\n }\r\n\r\n return new Set(\r\n nodesInSelection.map((n) => ($isElementNode(n) ? n : n.getParentOrThrow()))\r\n )\r\n}\r\n\r\nfunction $shouldPreventIndent(maxDepth: number): boolean {\r\n const selection = $getSelection()\r\n\r\n if (!$isRangeSelection(selection)) {\r\n return false\r\n }\r\n\r\n const elementNodesInSelection: Set<ElementNode> =\r\n getElementNodesInSelection(selection)\r\n\r\n let totalDepth = 0\r\n\r\n for (const elementNode of Array.from(elementNodesInSelection)) {\r\n if ($isListNode(elementNode)) {\r\n totalDepth = Math.max($getListDepth(elementNode) + 1, totalDepth)\r\n } else if ($isListItemNode(elementNode)) {\r\n const parent = elementNode.getParent()\r\n\r\n if (!$isListNode(parent)) {\r\n throw new Error(\r\n \"ListMaxIndentLevelPlugin: A ListItemNode must have a ListNode for a parent.\"\r\n )\r\n }\r\n\r\n totalDepth = Math.max($getListDepth(parent) + 1, totalDepth)\r\n }\r\n }\r\n\r\n return totalDepth > maxDepth\r\n}\r\n\r\nexport function ListMaxIndentLevelPlugin({\r\n maxDepth = 7,\r\n}: {\r\n maxDepth?: number\r\n}): null {\r\n const [editor] = useLexicalComposerContext()\r\n\r\n useEffect(() => {\r\n return editor.registerCommand(\r\n INDENT_CONTENT_COMMAND,\r\n () => $shouldPreventIndent(maxDepth),\r\n COMMAND_PRIORITY_CRITICAL\r\n )\r\n }, [editor, maxDepth])\r\n return null\r\n}\r\n","\"use client\"\r\n\r\n/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\nimport * as React from \"react\"\r\nimport { JSX, useCallback, useEffect, useMemo, useState } from \"react\"\r\nimport dynamic from \"next/dynamic\"\r\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\"\r\nimport {\r\n MenuOption,\r\n MenuTextMatch,\r\n useBasicTypeaheadTriggerMatch,\r\n} from \"@lexical/react/LexicalTypeaheadMenuPlugin\"\r\nimport { TextNode } from \"lexical\"\r\nimport { CircleUserRoundIcon } from \"lucide-react\"\r\nimport { createPortal } from \"react-dom\"\r\n\r\nimport { $createMentionNode } from \"@/components/editor/nodes/mention-node\"\r\nimport {\r\n Command,\r\n CommandGroup,\r\n CommandItem,\r\n CommandList,\r\n} from \"@/components/ui/command\"\r\nimport { IconSize } from \"@/components/ui/typography\"\r\n\r\nconst LexicalTypeaheadMenuPlugin = dynamic(\r\n () =>\r\n import(\"@lexical/react/LexicalTypeaheadMenuPlugin\").then(\r\n (mod) => mod.LexicalTypeaheadMenuPlugin<MentionTypeaheadOption>\r\n ),\r\n { ssr: false }\r\n)\r\n\r\nconst PUNCTUATION =\r\n \"\\\\.,\\\\+\\\\*\\\\?\\\\$\\\\@\\\\|#{}\\\\(\\\\)\\\\^\\\\-\\\\[\\\\]\\\\\\\\/!%'\\\"~=<>_:;\"\r\nconst NAME = \"\\\\b[A-Z][^\\\\s\" + PUNCTUATION + \"]\"\r\n\r\nconst DocumentMentionsRegex = {\r\n NAME,\r\n PUNCTUATION,\r\n}\r\n\r\nconst PUNC = DocumentMentionsRegex.PUNCTUATION\r\n\r\nconst TRIGGERS = [\"@\"].join(\"\")\r\n\r\n// Chars we expect to see in a mention (non-space, non-punctuation).\r\nconst VALID_CHARS = \"[^\" + TRIGGERS + PUNC + \"\\\\s]\"\r\n\r\n// Non-standard series of chars. Each series must be preceded and followed by\r\n// a valid char.\r\nconst VALID_JOINS =\r\n \"(?:\" +\r\n \"\\\\.[ |$]|\" + // E.g. \"r. \" in \"Mr. Smith\"\r\n \" |\" + // E.g. \" \" in \"Josh Duck\"\r\n \"[\" +\r\n PUNC +\r\n \"]|\" + // E.g. \"-' in \"Salier-Hellendag\"\r\n \")\"\r\n\r\nconst LENGTH_LIMIT = 75\r\n\r\nconst AtSignMentionsRegex = new RegExp(\r\n \"(^|\\\\s|\\\\()(\" +\r\n \"[\" +\r\n TRIGGERS +\r\n \"]\" +\r\n \"((?:\" +\r\n VALID_CHARS +\r\n VALID_JOINS +\r\n \"){0,\" +\r\n LENGTH_LIMIT +\r\n \"})\" +\r\n \")$\"\r\n)\r\n\r\n// 50 is the longest alias length limit.\r\nconst ALIAS_LENGTH_LIMIT = 50\r\n\r\n// Regex used to match alias.\r\nconst AtSignMentionsRegexAliasRegex = new RegExp(\r\n \"(^|\\\\s|\\\\()(\" +\r\n \"[\" +\r\n TRIGGERS +\r\n \"]\" +\r\n \"((?:\" +\r\n VALID_CHARS +\r\n \"){0,\" +\r\n ALIAS_LENGTH_LIMIT +\r\n \"})\" +\r\n \")$\"\r\n)\r\n\r\n// At most, 5 suggestions are shown in the popup.\r\nconst SUGGESTION_LIST_LENGTH_LIMIT = 5\r\n\r\nconst mentionsCache = new Map()\r\n\r\nconst dummyMentionsData = [\r\n \"Aayla Secura\",\r\n \"Adi Gallia\",\r\n \"Admiral Dodd Rancit\",\r\n \"Admiral Firmus Piett\",\r\n \"Admiral Gial Ackbar\",\r\n \"Admiral Ozzel\",\r\n \"Admiral Raddus\",\r\n \"Admiral Terrinald Screed\",\r\n \"Admiral Trench\",\r\n \"Admiral U.O. Statura\",\r\n \"Agen Kolar\",\r\n \"Agent Kallus\",\r\n \"Aiolin and Morit Astarte\",\r\n \"Aks Moe\",\r\n \"Almec\",\r\n \"Alton Kastle\",\r\n \"Amee\",\r\n \"AP-5\",\r\n \"Armitage Hux\",\r\n \"Artoo\",\r\n \"Arvel Crynyd\",\r\n \"Asajj Ventress\",\r\n \"Aurra Sing\",\r\n \"AZI-3\",\r\n \"Bala-Tik\",\r\n \"Barada\",\r\n \"Bargwill Tomder\",\r\n \"Baron Papanoida\",\r\n \"Barriss Offee\",\r\n \"Baze Malbus\",\r\n \"Bazine Netal\",\r\n \"BB-8\",\r\n \"BB-9E\",\r\n \"Ben Quadinaros\",\r\n \"Berch Teller\",\r\n \"Beru Lars\",\r\n \"Bib Fortuna\",\r\n \"Biggs Darklighter\",\r\n \"Black Krrsantan\",\r\n \"Bo-Katan Kryze\",\r\n \"Boba Fett\",\r\n \"Bobbajo\",\r\n \"Bodhi Rook\",\r\n \"Borvo the Hutt\",\r\n \"Boss Nass\",\r\n \"Bossk\",\r\n \"Breha Antilles-Organa\",\r\n \"Bren Derlin\",\r\n \"Brendol Hux\",\r\n \"BT-1\",\r\n \"C-3PO\",\r\n \"C1-10P\",\r\n \"Cad Bane\",\r\n \"Caluan Ematt\",\r\n \"Captain Gregor\",\r\n \"Captain Phasma\",\r\n \"Captain Quarsh Panaka\",\r\n \"Captain Rex\",\r\n \"Carlist Rieekan\",\r\n \"Casca Panzoro\",\r\n \"Cassian Andor\",\r\n \"Cassio Tagge\",\r\n \"Cham Syndulla\",\r\n \"Che Amanwe Papanoida\",\r\n \"Chewbacca\",\r\n \"Chi Eekway Papanoida\",\r\n \"Chief Chirpa\",\r\n \"Chirrut Îmwe\",\r\n \"Ciena Ree\",\r\n \"Cin Drallig\",\r\n \"Clegg Holdfast\",\r\n \"Cliegg Lars\",\r\n \"Coleman Kcaj\",\r\n \"Coleman Trebor\",\r\n \"Colonel Kaplan\",\r\n \"Commander Bly\",\r\n \"Commander Cody (CC-2224)\",\r\n \"Commander Fil (CC-3714)\",\r\n \"Commander Fox\",\r\n \"Commander Gree\",\r\n \"Commander Jet\",\r\n \"Commander Wolffe\",\r\n \"Conan Antonio Motti\",\r\n \"Conder Kyl\",\r\n \"Constable Zuvio\",\r\n \"Cordé\",\r\n \"Cpatain Typho\",\r\n \"Crix Madine\",\r\n \"Cut Lawquane\",\r\n \"Dak Ralter\",\r\n \"Dapp\",\r\n \"Darth Bane\",\r\n \"Darth Maul\",\r\n \"Darth Tyranus\",\r\n \"Daultay Dofine\",\r\n \"Del Meeko\",\r\n \"Delian Mors\",\r\n \"Dengar\",\r\n \"Depa Billaba\",\r\n \"Derek Klivian\",\r\n \"Dexter Jettster\",\r\n \"Dineé Ellberger\",\r\n \"DJ\",\r\n \"Doctor Aphra\",\r\n \"Doctor Evazan\",\r\n \"Dogma\",\r\n \"Dormé\",\r\n \"Dr. Cylo\",\r\n \"Droidbait\",\r\n \"Droopy McCool\",\r\n \"Dryden Vos\",\r\n \"Dud Bolt\",\r\n \"Ebe E. Endocott\",\r\n \"Echuu Shen-Jon\",\r\n \"Eeth Koth\",\r\n \"Eighth Brother\",\r\n \"Eirtaé\",\r\n \"Eli Vanto\",\r\n \"Ellé\",\r\n \"Ello Asty\",\r\n \"Embo\",\r\n \"Eneb Ray\",\r\n \"Enfys Nest\",\r\n \"EV-9D9\",\r\n \"Evaan Verlaine\",\r\n \"Even Piell\",\r\n \"Ezra Bridger\",\r\n \"Faro Argyus\",\r\n \"Feral\",\r\n \"Fifth Brother\",\r\n \"Finis Valorum\",\r\n \"Finn\",\r\n \"Fives\",\r\n \"FN-1824\",\r\n \"FN-2003\",\r\n \"Fodesinbeed Annodue\",\r\n \"Fulcrum\",\r\n \"FX-7\",\r\n \"GA-97\",\r\n \"Galen Erso\",\r\n \"Gallius Rax\",\r\n 'Garazeb \"Zeb\" Orrelios',\r\n \"Gardulla the Hutt\",\r\n \"Garrick Versio\",\r\n \"Garven Dreis\",\r\n \"Gavyn Sykes\",\r\n \"Gideon Hask\",\r\n \"Gizor Dellso\",\r\n \"Gonk droid\",\r\n \"Grand Inquisitor\",\r\n \"Greeata Jendowanian\",\r\n \"Greedo\",\r\n \"Greer Sonnel\",\r\n \"Grievous\",\r\n \"Grummgar\",\r\n \"Gungi\",\r\n \"Hammerhead\",\r\n \"Han Solo\",\r\n \"Harter Kalonia\",\r\n \"Has Obbit\",\r\n \"Hera Syndulla\",\r\n \"Hevy\",\r\n \"Hondo Ohnaka\",\r\n \"Huyang\",\r\n \"Iden Versio\",\r\n \"IG-88\",\r\n \"Ima-Gun Di\",\r\n \"Inquisitors\",\r\n \"Inspector Thanoth\",\r\n \"Jabba\",\r\n \"Jacen Syndulla\",\r\n \"Jan Dodonna\",\r\n \"Jango Fett\",\r\n \"Janus Greejatus\",\r\n \"Jar Jar Binks\",\r\n \"Jas Emari\",\r\n \"Jaxxon\",\r\n \"Jek Tono Porkins\",\r\n \"Jeremoch Colton\",\r\n \"Jira\",\r\n \"Jobal Naberrie\",\r\n \"Jocasta Nu\",\r\n \"Joclad Danva\",\r\n \"Joh Yowza\",\r\n \"Jom Barell\",\r\n \"Joph Seastriker\",\r\n \"Jova Tarkin\",\r\n \"Jubnuk\",\r\n \"Jyn Erso\",\r\n \"K-2SO\",\r\n \"Kanan Jarrus\",\r\n \"Karbin\",\r\n \"Karina the Great\",\r\n \"Kes Dameron\",\r\n \"Ketsu Onyo\",\r\n \"Ki-Adi-Mundi\",\r\n \"King Katuunko\",\r\n \"Kit Fisto\",\r\n \"Kitster Banai\",\r\n \"Klaatu\",\r\n \"Klik-Klak\",\r\n \"Korr Sella\",\r\n \"Kylo Ren\",\r\n \"L3-37\",\r\n \"Lama Su\",\r\n \"Lando Calrissian\",\r\n \"Lanever Villecham\",\r\n \"Leia Organa\",\r\n \"Letta Turmond\",\r\n \"Lieutenant Kaydel Ko Connix\",\r\n \"Lieutenant Thire\",\r\n \"Lobot\",\r\n \"Logray\",\r\n \"Lok Durd\",\r\n \"Longo Two-Guns\",\r\n \"Lor San Tekka\",\r\n \"Lorth Needa\",\r\n \"Lott Dod\",\r\n \"Luke Skywalker\",\r\n \"Lumat\",\r\n \"Luminara Unduli\",\r\n \"Lux Bonteri\",\r\n \"Lyn Me\",\r\n \"Lyra Erso\",\r\n \"Mace Windu\",\r\n \"Malakili\",\r\n \"Mama the Hutt\",\r\n \"Mars Guo\",\r\n \"Mas Amedda\",\r\n \"Mawhonic\",\r\n \"Max Rebo\",\r\n \"Maximilian Veers\",\r\n \"Maz Kanata\",\r\n \"ME-8D9\",\r\n \"Meena Tills\",\r\n \"Mercurial Swift\",\r\n \"Mina Bonteri\",\r\n \"Miraj Scintel\",\r\n \"Mister Bones\",\r\n \"Mod Terrik\",\r\n \"Moden Canady\",\r\n \"Mon Mothma\",\r\n \"Moradmin Bast\",\r\n \"Moralo Eval\",\r\n \"Morley\",\r\n \"Mother Talzin\",\r\n \"Nahdar Vebb\",\r\n \"Nahdonnis Praji\",\r\n \"Nien Nunb\",\r\n \"Niima the Hutt\",\r\n \"Nines\",\r\n \"Norra Wexley\",\r\n \"Nute Gunray\",\r\n \"Nuvo Vindi\",\r\n \"Obi-Wan Kenobi\",\r\n \"Odd Ball\",\r\n \"Ody Mandrell\",\r\n \"Omi\",\r\n \"Onaconda Farr\",\r\n \"Oola\",\r\n \"OOM-9\",\r\n \"Oppo Rancisis\",\r\n \"Orn Free Taa\",\r\n \"Oro Dassyne\",\r\n \"Orrimarko\",\r\n \"Osi Sobeck\",\r\n \"Owen Lars\",\r\n \"Pablo-Jill\",\r\n \"Padmé Amidala\",\r\n \"Pagetti Rook\",\r\n \"Paige Tico\",\r\n \"Paploo\",\r\n \"Petty Officer Thanisson\",\r\n \"Pharl McQuarrie\",\r\n \"Plo Koon\",\r\n \"Po Nudo\",\r\n \"Poe Dameron\",\r\n \"Poggle the Lesser\",\r\n \"Pong Krell\",\r\n \"Pooja Naberrie\",\r\n \"PZ-4CO\",\r\n \"Quarrie\",\r\n \"Quay Tolsite\",\r\n \"Queen Apailana\",\r\n \"Queen Jamillia\",\r\n \"Queen Neeyutnee\",\r\n \"Qui-Gon Jinn\",\r\n \"Quiggold\",\r\n \"Quinlan Vos\",\r\n \"R2-D2\",\r\n \"R2-KT\",\r\n \"R3-S6\",\r\n \"R4-P17\",\r\n \"R5-D4\",\r\n \"RA-7\",\r\n \"Rabé\",\r\n \"Rako Hardeen\",\r\n \"Ransolm Casterfo\",\r\n \"Rappertunie\",\r\n \"Ratts Tyerell\",\r\n \"Raymus Antilles\",\r\n \"Ree-Yees\",\r\n \"Reeve Panzoro\",\r\n \"Rey\",\r\n \"Ric Olié\",\r\n \"Riff Tamson\",\r\n \"Riley\",\r\n \"Rinnriyin Di\",\r\n \"Rio Durant\",\r\n \"Rogue Squadron\",\r\n \"Romba\",\r\n \"Roos Tarpals\",\r\n \"Rose Tico\",\r\n \"Rotta the Hutt\",\r\n \"Rukh\",\r\n \"Rune Haako\",\r\n \"Rush Clovis\",\r\n \"Ruwee Naberrie\",\r\n \"Ryoo Naberrie\",\r\n \"Sabé\",\r\n \"Sabine Wren\",\r\n \"Saché\",\r\n \"Saelt-Marae\",\r\n \"Saesee Tiin\",\r\n \"Salacious B. Crumb\",\r\n \"San Hill\",\r\n \"Sana Starros\",\r\n \"Sarco Plank\",\r\n \"Sarkli\",\r\n \"Satine Kryze\",\r\n \"Savage Opress\",\r\n \"Sebulba\",\r\n \"Senator Organa\",\r\n \"Sergeant Kreel\",\r\n \"Seventh Sister\",\r\n \"Shaak Ti\",\r\n \"Shara Bey\",\r\n \"Shmi Skywalker\",\r\n \"Shu Mai\",\r\n \"Sidon Ithano\",\r\n \"Sifo-Dyas\",\r\n \"Sim Aloo\",\r\n \"Siniir Rath Velus\",\r\n \"Sio Bibble\",\r\n \"Sixth Brother\",\r\n \"Slowen Lo\",\r\n \"Sly Moore\",\r\n \"Snaggletooth\",\r\n \"Snap Wexley\",\r\n \"Snoke\",\r\n \"Sola Naberrie\",\r\n \"Sora Bulq\",\r\n \"Strono Tuggs\",\r\n \"Sy Snootles\",\r\n \"Tallissan Lintra\",\r\n \"Tarfful\",\r\n \"Tasu Leech\",\r\n \"Taun We\",\r\n \"TC-14\",\r\n \"Tee Watt Kaa\",\r\n \"Teebo\",\r\n \"Teedo\",\r\n \"Teemto Pagalies\",\r\n \"Temiri Blagg\",\r\n \"Tessek\",\r\n \"Tey How\",\r\n \"Thane Kyrell\",\r\n \"The Bendu\",\r\n \"The Smuggler\",\r\n \"Thrawn\",\r\n \"Tiaan Jerjerrod\",\r\n \"Tion Medon\",\r\n \"Tobias Beckett\",\r\n \"Tulon Voidgazer\",\r\n \"Tup\",\r\n \"U9-C4\",\r\n \"Unkar Plutt\",\r\n \"Val Beckett\",\r\n \"Vanden Willard\",\r\n \"Vice Admiral Amilyn Holdo\",\r\n \"Vober Dand\",\r\n \"WAC-47\",\r\n \"Wag Too\",\r\n \"Wald\",\r\n \"Walrus Man\",\r\n \"Warok\",\r\n \"Wat Tambor\",\r\n \"Watto\",\r\n \"Wedge Antilles\",\r\n \"Wes Janson\",\r\n \"Wicket W. Warrick\",\r\n \"Wilhuff Tarkin\",\r\n \"Wollivan\",\r\n \"Wuher\",\r\n \"Wullf Yularen\",\r\n \"Xamuel Lennox\",\r\n \"Yaddle\",\r\n \"Yarael Poof\",\r\n \"Yoda\",\r\n \"Zam Wesell\",\r\n \"Zev Senesca\",\r\n \"Ziro the Hutt\",\r\n \"Zuckuss\",\r\n]\r\n\r\nconst dummyLookupService = {\r\n search(string: string, callback: (results: Array<string>) => void): void {\r\n setTimeout(() => {\r\n const results = dummyMentionsData.filter((mention) =>\r\n mention.toLowerCase().includes(string.toLowerCase())\r\n )\r\n callback(results)\r\n }, 500)\r\n },\r\n}\r\n\r\nfunction useMentionLookupService(mentionString: string | null) {\r\n const [results, setResults] = useState<Array<string>>([])\r\n\r\n useEffect(() => {\r\n const cachedResults = mentionsCache.get(mentionString)\r\n\r\n if (mentionString == null) {\r\n // Use setTimeout to avoid calling setState synchronously within effect\r\n setTimeout(() => {\r\n setResults([])\r\n }, 0)\r\n return\r\n }\r\n\r\n if (cachedResults === null) {\r\n return\r\n } else if (cachedResults !== undefined) {\r\n // Use setTimeout to avoid calling setState synchronously within effect\r\n setTimeout(() => {\r\n setResults(cachedResults)\r\n }, 0)\r\n return\r\n }\r\n\r\n mentionsCache.set(mentionString, null)\r\n dummyLookupService.search(mentionString, (newResults) => {\r\n mentionsCache.set(mentionString, newResults)\r\n setResults(newResults)\r\n })\r\n }, [mentionString])\r\n\r\n return results\r\n}\r\n\r\nfunction checkForAtSignMentions(\r\n text: string,\r\n minMatchLength: number\r\n): MenuTextMatch | null {\r\n let match = AtSignMentionsRegex.exec(text)\r\n\r\n if (match === null) {\r\n match = AtSignMentionsRegexAliasRegex.exec(text)\r\n }\r\n if (match !== null) {\r\n // The strategy ignores leading whitespace but we need to know it's\r\n // length to add it to the leadOffset\r\n\r\n const maybeLeadingWhitespace = match[1]\r\n\r\n const matchingString = match[3]\r\n if (matchingString.length >= minMatchLength) {\r\n return {\r\n leadOffset: match.index + maybeLeadingWhitespace.length,\r\n matchingString,\r\n replaceableString: match[2],\r\n }\r\n }\r\n }\r\n return null\r\n}\r\n\r\nfunction getPossibleQueryMatch(text: string): MenuTextMatch | null {\r\n return checkForAtSignMentions(text, 1)\r\n}\r\n\r\nclass MentionTypeaheadOption extends MenuOption {\r\n name: string\r\n picture: JSX.Element\r\n\r\n constructor(name: string, picture: JSX.Element) {\r\n super(name)\r\n this.name = name\r\n this.picture = picture\r\n }\r\n}\r\n\r\nexport function MentionsPlugin(): JSX.Element | null {\r\n const [editor] = useLexicalComposerContext()\r\n\r\n const [queryString, setQueryString] = useState<string | null>(null)\r\n\r\n const results = useMentionLookupService(queryString)\r\n\r\n const checkForSlashTriggerMatch = useBasicTypeaheadTriggerMatch(\"/\", {\r\n minLength: 0,\r\n })\r\n\r\n const options = useMemo(\r\n () =>\r\n results\r\n .map(\r\n (result) =>\r\n new MentionTypeaheadOption(\r\n result,\r\n <IconSize size=\"sm\">\r\n <CircleUserRoundIcon />\r\n </IconSize>\r\n )\r\n )\r\n .slice(0, SUGGESTION_LIST_LENGTH_LIMIT),\r\n [results]\r\n )\r\n\r\n const onSelectOption = useCallback(\r\n (\r\n selectedOption: MentionTypeaheadOption,\r\n nodeToReplace: TextNode | null,\r\n closeMenu: () => void\r\n ) => {\r\n editor.update(() => {\r\n const mentionNode = $createMentionNode(selectedOption.name)\r\n if (nodeToReplace) {\r\n nodeToReplace.replace(mentionNode)\r\n }\r\n mentionNode.select()\r\n closeMenu()\r\n })\r\n },\r\n [editor]\r\n )\r\n\r\n const checkForMentionMatch = useCallback(\r\n (text: string) => {\r\n const slashMatch = checkForSlashTriggerMatch(text, editor)\r\n if (slashMatch !== null) {\r\n return null\r\n }\r\n return getPossibleQueryMatch(text)\r\n },\r\n [checkForSlashTriggerMatch, editor]\r\n )\r\n\r\n return (\r\n <LexicalTypeaheadMenuPlugin\r\n onQueryChange={setQueryString}\r\n onSelectOption={onSelectOption}\r\n triggerFn={checkForMentionMatch}\r\n options={options}\r\n menuRenderFn={(\r\n anchorElementRef,\r\n { selectedIndex, selectOptionAndCleanUp, setHighlightedIndex }\r\n ) => {\r\n return anchorElementRef.current && results.length\r\n ? createPortal(\r\n <div className=\"fixed z-10 w-[200px] rounded-md shadow-md\">\r\n <Command\r\n onKeyDown={(e) => {\r\n if (e.key === \"ArrowUp\") {\r\n e.preventDefault()\r\n setHighlightedIndex(\r\n selectedIndex !== null\r\n ? (selectedIndex - 1 + options.length) %\r\n options.length\r\n : options.length - 1\r\n )\r\n } else if (e.key === \"ArrowDown\") {\r\n e.preventDefault()\r\n setHighlightedIndex(\r\n selectedIndex !== null\r\n ? (selectedIndex + 1) % options.length\r\n : 0\r\n )\r\n }\r\n }}\r\n >\r\n <CommandList>\r\n <CommandGroup>\r\n {options.map((option, index) => (\r\n <CommandItem\r\n key={option.key}\r\n value={option.name}\r\n onSelect={() => {\r\n selectOptionAndCleanUp(option)\r\n }}\r\n className={`flex items-center gap-2 ${\r\n selectedIndex === index\r\n ? \"bg-accent\"\r\n : \"bg-transparent\"\r\n }`}\r\n >\r\n {option.picture}\r\n {option.name}\r\n </CommandItem>\r\n ))}\r\n </CommandGroup>\r\n </CommandList>\r\n </Command>\r\n </div>,\r\n anchorElementRef.current\r\n )\r\n : null\r\n }}\r\n />\r\n )\r\n}\r\n","import { FORMAT_ELEMENT_COMMAND } from \"lexical\"\r\nimport {\r\n AlignCenterIcon,\r\n AlignJustifyIcon,\r\n AlignLeftIcon,\r\n AlignRightIcon,\r\n} from \"lucide-react\"\r\n\r\nimport { ComponentPickerOption } from \"@/components/editor/plugins/picker/component-picker-option\"\r\nimport { IconSize } from \"@/components/ui/typography\"\r\n\r\nexport function AlignmentPickerPlugin({\r\n alignment,\r\n}: {\r\n alignment: \"left\" | \"center\" | \"right\" | \"justify\"\r\n}) {\r\n return new ComponentPickerOption(`Align ${alignment}`, {\r\n icon: <AlignIcons alignment={alignment} />,\r\n keywords: [\"align\", \"justify\", alignment],\r\n onSelect: (_, editor) =>\r\n editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, alignment),\r\n })\r\n}\r\n\r\nfunction AlignIcons({\r\n alignment,\r\n}: {\r\n alignment: \"left\" | \"center\" | \"right\" | \"justify\"\r\n}) {\r\n switch (alignment) {\r\n case \"left\":\r\n return <IconSize size=\"sm\"><AlignLeftIcon /></IconSize>\r\n case \"center\":\r\n return <IconSize size=\"sm\"><AlignCenterIcon /></IconSize>\r\n case \"right\":\r\n return <IconSize size=\"sm\"><AlignRightIcon /></IconSize>\r\n case \"justify\":\r\n return <IconSize size=\"sm\"><AlignJustifyIcon /></IconSize>\r\n }\r\n}\r\n","import { JSX } from \"react\"\r\nimport { MenuOption } from \"@lexical/react/LexicalTypeaheadMenuPlugin\"\r\nimport { LexicalEditor } from \"lexical\"\r\n\r\nexport class ComponentPickerOption extends MenuOption {\r\n // What shows up in the editor\r\n title: string\r\n // Icon for display\r\n icon?: JSX.Element\r\n // For extra searching.\r\n keywords: Array<string>\r\n // TBD\r\n keyboardShortcut?: string\r\n // What happens when you select this option?\r\n onSelect: (\r\n queryString: string,\r\n editor: LexicalEditor,\r\n showModal: (\r\n title: string,\r\n showModal: (onClose: () => void) => JSX.Element\r\n ) => void\r\n ) => void\r\n\r\n constructor(\r\n title: string,\r\n options: {\r\n icon?: JSX.Element\r\n keywords?: Array<string>\r\n keyboardShortcut?: string\r\n onSelect: (\r\n queryString: string,\r\n editor: LexicalEditor,\r\n showModal: (\r\n title: string,\r\n showModal: (onClose: () => void) => JSX.Element\r\n ) => void\r\n ) => void\r\n }\r\n ) {\r\n super(title)\r\n this.title = title\r\n this.keywords = options.keywords || []\r\n this.icon = options.icon\r\n this.keyboardShortcut = options.keyboardShortcut\r\n this.onSelect = options.onSelect.bind(this)\r\n }\r\n}\r\n","import { INSERT_UNORDERED_LIST_COMMAND } from \"@lexical/list\"\r\nimport { ListIcon } from \"lucide-react\"\r\n\r\nimport { ComponentPickerOption } from \"@/components/editor/plugins/picker/component-picker-option\"\r\nimport { IconSize } from \"@/components/ui/typography\"\r\n\r\nexport function BulletedListPickerPlugin() {\r\n return new ComponentPickerOption(\"Bulleted List\", {\r\n icon: <IconSize size=\"sm\"><ListIcon /></IconSize>,\r\n keywords: [\"bulleted list\", \"unordered list\", \"ul\"],\r\n onSelect: (_, editor) =>\r\n editor.dispatchCommand(INSERT_UNORDERED_LIST_COMMAND, undefined),\r\n })\r\n}\r\n","import { INSERT_CHECK_LIST_COMMAND } from \"@lexical/list\"\r\nimport { ListTodoIcon } from \"lucide-react\"\r\n\r\nimport { ComponentPickerOption } from \"@/components/editor/plugins/picker/component-picker-option\"\r\nimport { IconSize } from \"@/components/ui/typography\"\r\n\r\nexport function CheckListPickerPlugin() {\r\n return new ComponentPickerOption(\"Check List\", {\r\n icon: <IconSize size=\"sm\"><ListTodoIcon /></IconSize>,\r\n keywords: [\"check list\", \"todo list\"],\r\n onSelect: (_, editor) =>\r\n editor.dispatchCommand(INSERT_CHECK_LIST_COMMAND, undefined),\r\n })\r\n}\r\n","import { $createCodeNode } from \"@lexical/code\"\r\nimport { $setBlocksType } from \"@lexical/selection\"\r\nimport { $getSelection, $isRangeSelection } from \"lexical\"\r\nimport { CodeIcon } from \"lucide-react\"\r\n\r\nimport { ComponentPickerOption } from \"@/components/editor/plugins/picker/component-picker-option\"\r\nimport { IconSize } from \"@/components/ui/typography\"\r\n\r\nexport function CodePickerPlugin() {\r\n return new ComponentPickerOption(\"Code\", {\r\n icon: <IconSize size=\"sm\"><CodeIcon /></IconSize>,\r\n keywords: [\"javascript\", \"python\", \"js\", \"codeblock\"],\r\n onSelect: (_, editor) =>\r\n editor.update(() => {\r\n const selection = $getSelection()\r\n\r\n if ($isRangeSelection(selection)) {\r\n if (selection.isCollapsed()) {\r\n $setBlocksType(selection, () => $createCodeNode())\r\n } else {\r\n // Will this ever happen?\r\n const textContent = selection.getTextContent()\r\n const codeNode = $createCodeNode()\r\n selection.insertNodes([codeNode])\r\n selection.insertRawText(textContent)\r\n }\r\n }\r\n }),\r\n })\r\n}\r\n","import { Columns3Icon } from \"lucide-react\"\r\n\r\nimport { InsertLayoutDialog } from \"@/components/editor/plugins/layout-plugin\"\r\nimport { ComponentPickerOption } from \"@/components/editor/plugins/picker/component-picker-option\"\r\nimport { IconSize } from \"@/components/ui/typography\"\r\n\r\nexport function ColumnsLayoutPickerPlugin() {\r\n return new ComponentPickerOption(\"Columns Layout\", {\r\n icon: <IconSize size=\"sm\"><Columns3Icon /></IconSize>,\r\n keywords: [\"columns\", \"layout\", \"grid\"],\r\n onSelect: (_, editor, showModal) =>\r\n showModal(\"Insert Columns Layout\", (onClose) => (\r\n <InsertLayoutDialog activeEditor={editor} onClose={onClose} />\r\n )),\r\n })\r\n}\r\n","import { INSERT_HORIZONTAL_RULE_COMMAND } from \"@lexical/react/LexicalHorizontalRuleNode\"\r\nimport { MinusIcon } from \"lucide-react\"\r\n\r\nimport { ComponentPickerOption } from \"@/components/editor/plugins/picker/component-picker-option\"\r\nimport { IconSize } from \"@/components/ui/typography\"\r\n\r\nexport function DividerPickerPlugin() {\r\n return new ComponentPickerOption(\"Divider\", {\r\n icon: <IconSize size=\"sm\"><MinusIcon /></IconSize>,\r\n keywords: [\"horizontal rule\", \"divider\", \"hr\"],\r\n onSelect: (_, editor) =>\r\n editor.dispatchCommand(INSERT_HORIZONTAL_RULE_COMMAND, undefined),\r\n })\r\n}\r\n","import { INSERT_EMBED_COMMAND } from \"@lexical/react/LexicalAutoEmbedPlugin\"\r\n\r\nimport {\r\n CustomEmbedConfig,\r\n EmbedConfigs,\r\n} from \"@/components/editor/plugins/embeds/auto-embed-plugin\"\r\nimport { ComponentPickerOption } from \"@/components/editor/plugins/picker/component-picker-option\"\r\n\r\nexport function EmbedsPickerPlugin({\r\n embed,\r\n}: {\r\n embed: \"tweet\" | \"youtube-video\"\r\n}) {\r\n const embedConfig = EmbedConfigs.find(\r\n (config) => config.type === embed\r\n ) as CustomEmbedConfig\r\n\r\n return new ComponentPickerOption(`Embed ${embedConfig.contentName}`, {\r\n icon: embedConfig.icon,\r\n keywords: [...embedConfig.keywords, \"embed\"],\r\n onSelect: (_, editor) =>\r\n editor.dispatchCommand(INSERT_EMBED_COMMAND, embedConfig.type),\r\n })\r\n}\r\n","import { $createHeadingNode } from \"@lexical/rich-text\"\r\nimport { $setBlocksType } from \"@lexical/selection\"\r\nimport { $getSelection, $isRangeSelection } from \"lexical\"\r\nimport { Heading1Icon, Heading2Icon, Heading3Icon } from \"lucide-react\"\r\n\r\nimport { ComponentPickerOption } from \"@/components/editor/plugins/picker/component-picker-option\"\r\nimport { IconSize } from \"@/components/ui/typography\"\r\n\r\nexport function HeadingPickerPlugin({ n }: { n: 1 | 2 | 3 }) {\r\n return new ComponentPickerOption(`Heading ${n}`, {\r\n icon: <HeadingIcons n={n} />,\r\n keywords: [\"heading\", \"header\", `h${n}`],\r\n onSelect: (_, editor) =>\r\n editor.update(() => {\r\n const selection = $getSelection()\r\n if ($isRangeSelection(selection)) {\r\n $setBlocksType(selection, () => $createHeadingNode(`h${n}`))\r\n }\r\n }),\r\n })\r\n}\r\n\r\nfunction HeadingIcons({ n }: { n: number }) {\r\n switch (n) {\r\n case 1:\r\n return <IconSize size=\"sm\"><Heading1Icon /></IconSize>\r\n case 2:\r\n return <IconSize size=\"sm\"><Heading2Icon /></IconSize>\r\n case 3:\r\n return <IconSize size=\"sm\"><Heading3Icon /></IconSize>\r\n }\r\n}\r\n","import { ImageIcon } from \"lucide-react\"\r\n\r\nimport { InsertImageDialog } from \"@/components/editor/plugins/images-plugin\"\r\nimport { ComponentPickerOption } from \"@/components/editor/plugins/picker/component-picker-option\"\r\nimport { IconSize } from \"@/components/ui/typography\"\r\n\r\nexport function ImagePickerPlugin() {\r\n return new ComponentPickerOption(\"Image\", {\r\n icon: <IconSize size=\"sm\"><ImageIcon /></IconSize>,\r\n keywords: [\"image\", \"photo\", \"picture\", \"file\"],\r\n onSelect: (_, editor, showModal) =>\r\n showModal(\"Insert Image\", (onClose) => (\r\n <InsertImageDialog activeEditor={editor} onClose={onClose} />\r\n )),\r\n })\r\n}\r\n","import { INSERT_ORDERED_LIST_COMMAND } from \"@lexical/list\"\r\nimport { ListOrderedIcon } from \"lucide-react\"\r\n\r\nimport { ComponentPickerOption } from \"@/components/editor/plugins/picker/component-picker-option\"\r\nimport { IconSize } from \"@/components/ui/typography\"\r\n\r\nexport function NumberedListPickerPlugin() {\r\n return new ComponentPickerOption(\"Numbered List\", {\r\n icon: <IconSize size=\"sm\"><ListOrderedIcon /></IconSize>,\r\n keywords: [\"numbered list\", \"ordered list\", \"ol\"],\r\n onSelect: (_, editor) =>\r\n editor.dispatchCommand(INSERT_ORDERED_LIST_COMMAND, undefined),\r\n })\r\n}\r\n","import { $setBlocksType } from \"@lexical/selection\"\r\nimport { $createParagraphNode, $getSelection, $isRangeSelection } from \"lexical\"\r\nimport { TextIcon } from \"lucide-react\"\r\n\r\nimport { ComponentPickerOption } from \"@/components/editor/plugins/picker/component-picker-option\"\r\nimport { IconSize } from \"@/components/ui/typography\"\r\n\r\nexport function ParagraphPickerPlugin() {\r\n return new ComponentPickerOption(\"Paragraph\", {\r\n icon: <IconSize size=\"sm\"><TextIcon /></IconSize>,\r\n keywords: [\"normal\", \"paragraph\", \"p\", \"text\"],\r\n onSelect: (_, editor) =>\r\n editor.update(() => {\r\n const selection = $getSelection()\r\n if ($isRangeSelection(selection)) {\r\n $setBlocksType(selection, () => $createParagraphNode())\r\n }\r\n }),\r\n })\r\n}\r\n","import { $createQuoteNode } from \"@lexical/rich-text\"\r\nimport { $setBlocksType } from \"@lexical/selection\"\r\nimport { $getSelection, $isRangeSelection } from \"lexical\"\r\nimport { QuoteIcon } from \"lucide-react\"\r\n\r\nimport { ComponentPickerOption } from \"@/components/editor/plugins/picker/component-picker-option\"\r\nimport { IconSize } from \"@/components/ui/typography\"\r\n\r\nexport function QuotePickerPlugin() {\r\n return new ComponentPickerOption(\"Quote\", {\r\n icon: <IconSize size=\"sm\"><QuoteIcon /></IconSize>,\r\n keywords: [\"block quote\"],\r\n onSelect: (_, editor) =>\r\n editor.update(() => {\r\n const selection = $getSelection()\r\n if ($isRangeSelection(selection)) {\r\n $setBlocksType(selection, () => $createQuoteNode())\r\n }\r\n }),\r\n })\r\n}\r\n","import { INSERT_TABLE_COMMAND } from \"@lexical/table\"\r\nimport { TableIcon } from \"lucide-react\"\r\n\r\nimport { ComponentPickerOption } from \"@/components/editor/plugins/picker/component-picker-option\"\r\nimport { InsertTableDialog } from \"@/components/editor/plugins/table-plugin\"\r\nimport { IconSize } from \"@/components/ui/typography\"\r\n\r\nexport function TablePickerPlugin() {\r\n return new ComponentPickerOption(\"Table\", {\r\n icon: <IconSize size=\"sm\"><TableIcon /></IconSize>,\r\n keywords: [\"table\", \"grid\", \"spreadsheet\", \"rows\", \"columns\"],\r\n onSelect: (_, editor, showModal) =>\r\n showModal(\"Insert Table\", (onClose) => (\r\n <InsertTableDialog activeEditor={editor} onClose={onClose} />\r\n )),\r\n })\r\n}\r\n\r\nexport function DynamicTablePickerPlugin({\r\n queryString,\r\n}: {\r\n queryString: string\r\n}) {\r\n const options: Array<ComponentPickerOption> = []\r\n\r\n if (queryString == null) {\r\n return options\r\n }\r\n\r\n const tableMatch = queryString.match(/^([1-9]\\d?)(?:x([1-9]\\d?)?)?$/)\r\n\r\n if (tableMatch !== null) {\r\n const rows = tableMatch[1]\r\n const colOptions = tableMatch[2]\r\n ? [tableMatch[2]]\r\n : [1, 2, 3, 4, 5, 6, 7, 8, 9, 10].map(String)\r\n\r\n options.push(\r\n ...colOptions.map(\r\n (columns) =>\r\n new ComponentPickerOption(`${rows}x${columns} Table`, {\r\n icon: <i className=\"icon table\" />,\r\n keywords: [\"table\"],\r\n onSelect: (_, editor) =>\r\n editor.dispatchCommand(INSERT_TABLE_COMMAND, { columns, rows }),\r\n })\r\n )\r\n )\r\n }\r\n\r\n return options\r\n}\r\n","\"use client\"\r\n\r\n/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\nimport {\r\n createContext,\r\n JSX,\r\n useContext,\r\n useEffect,\r\n useMemo,\r\n useState,\r\n} from \"react\"\r\nimport * as React from \"react\"\r\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\"\r\nimport {\r\n $createTableNodeWithDimensions,\r\n TableNode,\r\n} from \"@lexical/table\"\r\nimport {\r\n $insertNodes,\r\n $getSelection,\r\n $getRoot,\r\n $isRangeSelection,\r\n COMMAND_PRIORITY_EDITOR,\r\n createCommand,\r\n EditorThemeClasses,\r\n Klass,\r\n LexicalCommand,\r\n LexicalEditor,\r\n LexicalNode,\r\n} from \"lexical\"\r\n\r\nimport { invariant } from \"@/components/editor/shared/invariant\"\r\nimport { Button } from \"@/components/ui/button\"\r\nimport { DialogFooter } from \"@/components/ui/dialog\"\r\nimport { Input } from \"@/components/ui/input\"\r\nimport { Label } from \"@/components/ui/label\"\r\n\r\nexport type InsertTableCommandPayload = Readonly<{\r\n columns: string\r\n rows: string\r\n includeHeaders?: boolean\r\n}>\r\n\r\nexport type CellContextShape = {\r\n cellEditorConfig: null | CellEditorConfig\r\n cellEditorPlugins: null | JSX.Element | Array<JSX.Element>\r\n set: (\r\n cellEditorConfig: null | CellEditorConfig,\r\n cellEditorPlugins: null | JSX.Element | Array<JSX.Element>\r\n ) => void\r\n}\r\n\r\nexport type CellEditorConfig = Readonly<{\r\n namespace: string\r\n nodes?: ReadonlyArray<Klass<LexicalNode>>\r\n onError: (error: Error, editor: LexicalEditor) => void\r\n readOnly?: boolean\r\n theme?: EditorThemeClasses\r\n}>\r\n\r\nexport const INSERT_NEW_TABLE_COMMAND: LexicalCommand<InsertTableCommandPayload> =\r\n createCommand(\"INSERT_NEW_TABLE_COMMAND\")\r\n\r\n/** Chèn bảng vào editor (dùng trong dialog hoặc command handler) */\r\nfunction insertTableIntoEditor(\r\n editor: LexicalEditor,\r\n payload: InsertTableCommandPayload\r\n): void {\r\n const rows = Number(payload.rows) || 3\r\n const cols = Number(payload.columns) || 3\r\n const includeHeaders = payload.includeHeaders ?? false\r\n editor.update(\r\n () => {\r\n const root = $getRoot()\r\n const tableNode = $createTableNodeWithDimensions(rows, cols, includeHeaders)\r\n try {\r\n const selection = $getSelection()\r\n let targetBlock: ReturnType<typeof root.getFirstChild> = null\r\n if (selection !== null && $isRangeSelection(selection)) {\r\n try {\r\n targetBlock = selection.anchor.getNode().getTopLevelElementOrThrow()\r\n } catch {\r\n targetBlock = root.getLastChild()\r\n }\r\n } else {\r\n targetBlock = root.getLastChild()\r\n }\r\n if (targetBlock) {\r\n targetBlock.insertAfter(tableNode)\r\n } else {\r\n root.append(tableNode)\r\n }\r\n } catch {\r\n root.selectEnd()\r\n $insertNodes([tableNode])\r\n }\r\n },\r\n { tag: \"insert-table\" }\r\n )\r\n}\r\n\r\nexport const CellContext = createContext<CellContextShape>({\r\n cellEditorConfig: null,\r\n cellEditorPlugins: null,\r\n set: () => {\r\n // Empty\r\n },\r\n})\r\n\r\nexport function TableContext({ children }: { children: JSX.Element }) {\r\n const [contextValue, setContextValue] = useState<{\r\n cellEditorConfig: null | CellEditorConfig\r\n cellEditorPlugins: null | JSX.Element | Array<JSX.Element>\r\n }>({\r\n cellEditorConfig: null,\r\n cellEditorPlugins: null,\r\n })\r\n return (\r\n <CellContext.Provider\r\n value={useMemo(\r\n () => ({\r\n cellEditorConfig: contextValue.cellEditorConfig,\r\n cellEditorPlugins: contextValue.cellEditorPlugins,\r\n set: (cellEditorConfig, cellEditorPlugins) => {\r\n setContextValue({ cellEditorConfig, cellEditorPlugins })\r\n },\r\n }),\r\n [contextValue.cellEditorConfig, contextValue.cellEditorPlugins]\r\n )}\r\n >\r\n {children}\r\n </CellContext.Provider>\r\n )\r\n}\r\n\r\nexport function InsertTableDialog({\r\n activeEditor,\r\n onClose,\r\n}: {\r\n activeEditor: LexicalEditor\r\n onClose: () => void\r\n}): JSX.Element {\r\n const [rows, setRows] = useState(\"5\")\r\n const [columns, setColumns] = useState(\"5\")\r\n const [includeHeaders, setIncludeHeaders] = useState(true)\r\n\r\n // Cho phép tùy chỉnh số cột/dòng; giới hạn 1–100 cột, 1–500 dòng\r\n const isDisabled = useMemo(() => {\r\n const row = Number(rows)\r\n const column = Number(columns)\r\n return !(row && row > 0 && row <= 500 && column && column > 0 && column <= 100)\r\n }, [rows, columns])\r\n\r\n const onClick = () => {\r\n const payload = { columns, rows, includeHeaders }\r\n onClose()\r\n const rootEl = activeEditor.getRootElement()\r\n rootEl?.focus({ preventScroll: false })\r\n // Chèn bảng trực tiếp bằng editor.update (không qua command) để luôn hoạt động\r\n setTimeout(() => {\r\n insertTableIntoEditor(activeEditor, payload)\r\n }, 150)\r\n }\r\n\r\n return (\r\n <>\r\n <div className=\"grid gap-4\">\r\n <div className=\"grid gap-2\">\r\n <Label htmlFor=\"rows\">Số dòng (1–500)</Label>\r\n <Input\r\n id=\"rows\"\r\n placeholder=\"Ví dụ: 5\"\r\n onChange={(e) => setRows(e.target.value)}\r\n value={rows}\r\n data-test-id=\"table-modal-rows\"\r\n type=\"number\"\r\n min={1}\r\n max={500}\r\n />\r\n </div>\r\n <div className=\"grid gap-2\">\r\n <Label htmlFor=\"columns\">Số cột (1–100)</Label>\r\n <Input\r\n id=\"columns\"\r\n placeholder=\"Ví dụ: 5 — thêm cột không ảnh hưởng cột khác\"\r\n onChange={(e) => setColumns(e.target.value)}\r\n value={columns}\r\n data-test-id=\"table-modal-columns\"\r\n type=\"number\"\r\n min={1}\r\n max={100}\r\n />\r\n </div>\r\n <div className=\"flex items-center gap-2\">\r\n <input\r\n id=\"include-headers\"\r\n type=\"checkbox\"\r\n checked={includeHeaders}\r\n onChange={(e) => setIncludeHeaders(e.target.checked)}\r\n className=\"h-4 w-4 rounded border-input\"\r\n />\r\n <Label htmlFor=\"include-headers\" className=\"cursor-pointer font-normal\">\r\n Dòng đầu làm hàng tiêu đề\r\n </Label>\r\n </div>\r\n <p className=\"text-muted-foreground text-xs\">\r\n Sau khi chèn, có thể gộp ô (chuột phải trong bảng) để tạo tiêu đề nhiều cột / nhiều dòng như bảng quy đổi ngoại ngữ.\r\n </p>\r\n </div>\r\n <DialogFooter data-test-id=\"table-model-confirm-insert\">\r\n <Button disabled={isDisabled} onClick={onClick}>\r\n Chèn bảng\r\n </Button>\r\n </DialogFooter>\r\n </>\r\n )\r\n}\r\n\r\nexport function TablePlugin({\r\n cellEditorConfig,\r\n children,\r\n}: {\r\n cellEditorConfig: CellEditorConfig\r\n children: JSX.Element | Array<JSX.Element>\r\n}): JSX.Element | null {\r\n const [editor] = useLexicalComposerContext()\r\n const cellContext = useContext(CellContext)\r\n\r\n useEffect(() => {\r\n if (!editor.hasNodes([TableNode])) {\r\n invariant(false, \"TablePlugin: TableNode is not registered on editor\")\r\n }\r\n\r\n cellContext.set(cellEditorConfig, children)\r\n\r\n return editor.registerCommand<InsertTableCommandPayload>(\r\n INSERT_NEW_TABLE_COMMAND,\r\n ({ columns, rows, includeHeaders }) => {\r\n const tableNode = $createTableNodeWithDimensions(\r\n Number(rows),\r\n Number(columns),\r\n includeHeaders\r\n )\r\n $insertNodes([tableNode])\r\n return true\r\n },\r\n COMMAND_PRIORITY_EDITOR\r\n )\r\n }, [cellContext, cellEditorConfig, children, editor])\r\n\r\n return null\r\n}\r\n\r\n/**\r\n * Plugin chỉ đăng ký INSERT_NEW_TABLE_COMMAND để Insert Table tạo đúng node bảng.\r\n * Dùng thay cho TablePlugin đầy đủ khi không cần cellEditorConfig.\r\n */\r\nexport function InsertTableCommandPlugin(): JSX.Element | null {\r\n const [editor] = useLexicalComposerContext()\r\n\r\n useEffect(() => {\r\n if (!editor.hasNodes([TableNode])) return\r\n\r\n return editor.registerCommand<InsertTableCommandPayload>(\r\n INSERT_NEW_TABLE_COMMAND,\r\n (payload) => {\r\n insertTableIntoEditor(editor, payload)\r\n return true\r\n },\r\n COMMAND_PRIORITY_EDITOR\r\n )\r\n }, [editor])\r\n\r\n return null\r\n}\r\n","\"use client\"\r\n\r\n/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\nimport { useEffect } from \"react\"\r\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\"\r\nimport {\r\n $getSelection,\r\n $isRangeSelection,\r\n $setSelection,\r\n FOCUS_COMMAND,\r\n} from \"lexical\"\r\n\r\nconst COMMAND_PRIORITY_LOW = 1\r\nconst TAB_TO_FOCUS_INTERVAL = 100\r\n\r\nlet lastTabKeyDownTimestamp = 0\r\nlet hasRegisteredKeyDownListener = false\r\n\r\nfunction registerKeyTimeStampTracker() {\r\n window.addEventListener(\r\n \"keydown\",\r\n (event: KeyboardEvent) => {\r\n // Tab\r\n if (event.key === \"Tab\") {\r\n lastTabKeyDownTimestamp = event.timeStamp\r\n }\r\n },\r\n true\r\n )\r\n}\r\n\r\nexport function TabFocusPlugin(): null {\r\n const [editor] = useLexicalComposerContext()\r\n\r\n useEffect(() => {\r\n if (!hasRegisteredKeyDownListener) {\r\n registerKeyTimeStampTracker()\r\n hasRegisteredKeyDownListener = true\r\n }\r\n\r\n return editor.registerCommand(\r\n FOCUS_COMMAND,\r\n (event: FocusEvent) => {\r\n const selection = $getSelection()\r\n if ($isRangeSelection(selection)) {\r\n if (\r\n lastTabKeyDownTimestamp + TAB_TO_FOCUS_INTERVAL >\r\n event.timeStamp\r\n ) {\r\n $setSelection(selection.clone())\r\n }\r\n }\r\n return false\r\n },\r\n COMMAND_PRIORITY_LOW\r\n )\r\n }, [editor])\r\n\r\n return null\r\n}\r\n","\"use client\"\r\n\r\nimport { useEffect, useRef } from \"react\"\r\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\"\r\nimport { useLexicalEditable } from \"@lexical/react/useLexicalEditable\"\r\nimport {\r\n $computeTableMapSkipCellCheck,\r\n $getTableNodeFromLexicalNodeOrThrow,\r\n $isTableCellNode,\r\n TableNode,\r\n} from \"@lexical/table\"\r\nimport { $getNearestNodeFromDOMNode, $getNodeByKey, type NodeKey } from \"lexical\"\r\n\r\ntype ResizeEdge = \"left\" | \"right\"\r\n\r\ntype DragState = {\r\n tableKey: NodeKey\r\n columnIndex: number\r\n startX: number\r\n startWidth: number\r\n}\r\n\r\nconst EDGE_HITBOX_PX = 8\r\n/** Độ rộng tối thiểu khi kéo cột (px) — nhỏ hơn để có thể thu hẹp cột như \"TT\" */\r\nconst MIN_COLUMN_WIDTH_PX = 32\r\n\r\nfunction getCellTarget(target: EventTarget | null): HTMLTableCellElement | null {\r\n if (!(target instanceof HTMLElement)) return null\r\n const cell = target.closest(\"th, td\")\r\n return cell instanceof HTMLTableCellElement ? cell : null\r\n}\r\n\r\nfunction getResizeEdge(clientX: number, rect: DOMRect): ResizeEdge | null {\r\n const nearLeft = Math.abs(clientX - rect.left) <= EDGE_HITBOX_PX\r\n const nearRight = Math.abs(clientX - rect.right) <= EDGE_HITBOX_PX\r\n\r\n if (!nearLeft && !nearRight) return null\r\n if (nearLeft && nearRight) return \"right\"\r\n return nearLeft ? \"left\" : \"right\"\r\n}\r\n\r\nfunction getColumnIndexFromTableMap(\r\n tableNode: TableNode,\r\n tableCellNode: ReturnType<typeof $getNearestNodeFromDOMNode>\r\n): number | null {\r\n if (!$isTableCellNode(tableCellNode)) return null\r\n const [tableMap] = $computeTableMapSkipCellCheck(tableNode, null, null)\r\n\r\n for (let row = 0; row < tableMap.length; row++) {\r\n for (let column = 0; column < tableMap[row].length; column++) {\r\n if (tableMap[row][column].cell === tableCellNode) {\r\n return column\r\n }\r\n }\r\n }\r\n\r\n return null\r\n}\r\n\r\nexport function TableColumnResizerPlugin() {\r\n const [editor] = useLexicalComposerContext()\r\n const isEditable = useLexicalEditable()\r\n const dragRef = useRef<DragState | null>(null)\r\n\r\n useEffect(() => {\r\n if (!isEditable) return\r\n\r\n const rootElement = editor.getRootElement()\r\n if (!rootElement) return\r\n\r\n const setCursor = (cursor: string) => {\r\n rootElement.style.cursor = cursor\r\n }\r\n\r\n const clearCursor = () => {\r\n setCursor(\"\")\r\n }\r\n\r\n const onPointerMove = (event: PointerEvent) => {\r\n if (dragRef.current) return\r\n\r\n const cell = getCellTarget(event.target)\r\n if (!cell) {\r\n clearCursor()\r\n return\r\n }\r\n\r\n const edge = getResizeEdge(event.clientX, cell.getBoundingClientRect())\r\n setCursor(edge ? \"col-resize\" : \"\")\r\n }\r\n\r\n const onPointerDown = (event: PointerEvent) => {\r\n if (event.button !== 0) return\r\n\r\n const cell = getCellTarget(event.target)\r\n if (!cell) return\r\n\r\n const edge = getResizeEdge(event.clientX, cell.getBoundingClientRect())\r\n if (!edge) return\r\n\r\n let nextDragState: DragState | null = null\r\n\r\n editor.read(() => {\r\n const tableCellNode = $getNearestNodeFromDOMNode(cell)\r\n if (!$isTableCellNode(tableCellNode)) return\r\n\r\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode)\r\n const columnIndexFromMap = getColumnIndexFromTableMap(tableNode, tableCellNode)\r\n if (columnIndexFromMap == null) return\r\n\r\n const resizeColumnIndex =\r\n edge === \"left\" ? Math.max(0, columnIndexFromMap - 1) : columnIndexFromMap\r\n\r\n const currentWidths =\r\n tableNode.getColWidths() ??\r\n Array(tableNode.getColumnCount()).fill(MIN_COLUMN_WIDTH_PX)\r\n const startWidth =\r\n currentWidths[resizeColumnIndex] ??\r\n Math.max(Math.round(cell.getBoundingClientRect().width), MIN_COLUMN_WIDTH_PX)\r\n\r\n nextDragState = {\r\n tableKey: tableNode.getKey(),\r\n columnIndex: resizeColumnIndex,\r\n startX: event.clientX,\r\n startWidth,\r\n }\r\n })\r\n\r\n if (!nextDragState) return\r\n\r\n event.preventDefault()\r\n event.stopPropagation()\r\n dragRef.current = nextDragState\r\n setCursor(\"col-resize\")\r\n }\r\n\r\n const onPointerMoveDocument = (event: PointerEvent) => {\r\n const drag = dragRef.current\r\n if (!drag) return\r\n\r\n const deltaX = event.clientX - drag.startX\r\n const newWidth = Math.max(MIN_COLUMN_WIDTH_PX, Math.round(drag.startWidth + deltaX))\r\n\r\n editor.update(() => {\r\n const tableNode = $getNodeByKey(drag.tableKey)\r\n if (!(tableNode instanceof TableNode)) return\r\n\r\n const columnCount = tableNode.getColumnCount()\r\n const colWidths =\r\n tableNode.getColWidths() ?? Array(columnCount).fill(MIN_COLUMN_WIDTH_PX)\r\n if (drag.columnIndex >= colWidths.length) return\r\n if (colWidths[drag.columnIndex] === newWidth) return\r\n\r\n const nextColWidths = [...colWidths]\r\n nextColWidths[drag.columnIndex] = newWidth\r\n tableNode.setColWidths(nextColWidths)\r\n })\r\n }\r\n\r\n const onPointerUpDocument = () => {\r\n if (!dragRef.current) return\r\n dragRef.current = null\r\n clearCursor()\r\n }\r\n\r\n rootElement.addEventListener(\"pointermove\", onPointerMove)\r\n rootElement.addEventListener(\"pointerdown\", onPointerDown)\r\n document.addEventListener(\"pointermove\", onPointerMoveDocument)\r\n document.addEventListener(\"pointerup\", onPointerUpDocument)\r\n\r\n return () => {\r\n rootElement.removeEventListener(\"pointermove\", onPointerMove)\r\n rootElement.removeEventListener(\"pointerdown\", onPointerDown)\r\n document.removeEventListener(\"pointermove\", onPointerMoveDocument)\r\n document.removeEventListener(\"pointerup\", onPointerUpDocument)\r\n clearCursor()\r\n dragRef.current = null\r\n }\r\n }, [editor, isEditable])\r\n\r\n return null\r\n}\r\n","\"use client\"\r\n\r\nimport { $isListNode, ListNode } from \"@lexical/list\"\r\nimport { $isHeadingNode } from \"@lexical/rich-text\"\r\nimport { $findMatchingParent, $getNearestNodeOfType } from \"@lexical/utils\"\r\nimport {\r\n $isRangeSelection,\r\n $isRootOrShadowRoot,\r\n BaseSelection,\r\n} from \"lexical\"\r\nimport { useCallback } from \"react\"\r\n\r\nimport { useToolbarContext } from \"@/components/editor/context/toolbar-context\"\r\nimport { useUpdateToolbarHandler } from \"@/components/editor/editor-hooks/use-update-toolbar\"\r\nimport { blockTypeToBlockName } from \"@/components/editor/plugins/toolbar/block-format/block-format-data\"\r\nimport {\r\n Select,\r\n SelectContent,\r\n SelectGroup,\r\n SelectTrigger,\r\n} from \"@/components/ui/select\"\r\n\r\nexport function BlockFormatDropDown({\r\n children,\r\n}: {\r\n children: React.ReactNode\r\n}) {\r\n const { activeEditor, blockType, setBlockType } = useToolbarContext()\r\n const currentBlockType = blockTypeToBlockName[blockType]\r\n ? blockType\r\n : \"paragraph\"\r\n const currentBlockMeta = blockTypeToBlockName[currentBlockType]\r\n\r\n /**\r\n * Updates the toolbar state based on the current selection.\r\n * Identifies if the cursor is in a List, Heading, or other block type.\r\n */\r\n const $updateToolbar = useCallback(\r\n (selection: BaseSelection) => {\r\n if (!$isRangeSelection(selection)) return\r\n\r\n const anchorNode = selection.anchor.getNode()\r\n \r\n // Find the top-level element or the nearest parent that is a root/shadow root\r\n let element =\r\n anchorNode.getKey() === \"root\"\r\n ? anchorNode\r\n : $findMatchingParent(anchorNode, (e) => {\r\n const parent = e.getParent()\r\n return parent !== null && $isRootOrShadowRoot(parent)\r\n })\r\n\r\n if (element === null) {\r\n element = anchorNode.getTopLevelElementOrThrow()\r\n }\r\n\r\n const elementKey = element.getKey()\r\n const elementDOM = activeEditor.getElementByKey(elementKey)\r\n\r\n if (elementDOM !== null) {\r\n if ($isListNode(element)) {\r\n const parentList = $getNearestNodeOfType<ListNode>(\r\n anchorNode,\r\n ListNode\r\n )\r\n const type = parentList\r\n ? parentList.getListType()\r\n : element.getListType()\r\n setBlockType(type)\r\n } else {\r\n const type = $isHeadingNode(element)\r\n ? element.getTag()\r\n : element.getType()\r\n if (type in blockTypeToBlockName) {\r\n setBlockType(type as keyof typeof blockTypeToBlockName)\r\n }\r\n }\r\n }\r\n },\r\n [activeEditor, setBlockType]\r\n )\r\n\r\n useUpdateToolbarHandler($updateToolbar)\r\n\r\n return (\r\n <Select\r\n modal={false}\r\n value={currentBlockType}\r\n onValueChange={(value) => {\r\n if (value in blockTypeToBlockName) {\r\n setBlockType(value as keyof typeof blockTypeToBlockName)\r\n }\r\n }}\r\n >\r\n <SelectTrigger className=\"min-h-11 w-min gap-1\">\r\n {currentBlockMeta.icon}\r\n <span>{currentBlockMeta.label}</span>\r\n </SelectTrigger>\r\n <SelectContent>\r\n <SelectGroup>{children}</SelectGroup>\r\n </SelectContent>\r\n </Select>\r\n )\r\n}\r\n","\"use client\"\r\n\r\nimport { createContext, JSX, useContext } from \"react\"\r\nimport { LexicalEditor } from \"lexical\"\r\n\r\nconst Context = createContext<{\r\n activeEditor: LexicalEditor\r\n $updateToolbar: () => void\r\n blockType: string\r\n setBlockType: (blockType: string) => void\r\n showModal: (\r\n title: string,\r\n showModal: (onClose: () => void) => JSX.Element\r\n ) => void\r\n}>({\r\n activeEditor: {} as LexicalEditor,\r\n $updateToolbar: () => {},\r\n blockType: \"paragraph\",\r\n setBlockType: () => {},\r\n showModal: () => {},\r\n})\r\n\r\nexport function ToolbarContext({\r\n activeEditor,\r\n $updateToolbar,\r\n blockType,\r\n setBlockType,\r\n showModal,\r\n children,\r\n}: {\r\n activeEditor: LexicalEditor\r\n $updateToolbar: () => void\r\n blockType: string\r\n setBlockType: (blockType: string) => void\r\n showModal: (\r\n title: string,\r\n showModal: (onClose: () => void) => JSX.Element\r\n ) => void\r\n children: React.ReactNode\r\n}) {\r\n return (\r\n <Context.Provider\r\n value={{\r\n activeEditor,\r\n $updateToolbar,\r\n blockType,\r\n setBlockType,\r\n showModal,\r\n }}\r\n >\r\n {children}\r\n </Context.Provider>\r\n )\r\n}\r\n\r\nexport function useToolbarContext() {\r\n return useContext(Context)\r\n}\r\n","import { useEffect } from \"react\"\r\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\"\r\nimport {\r\n $getSelection,\r\n BaseSelection,\r\n COMMAND_PRIORITY_CRITICAL,\r\n SELECTION_CHANGE_COMMAND,\r\n} from \"lexical\"\r\n\r\nimport { useToolbarContext } from \"@/components/editor/context/toolbar-context\"\r\n\r\nexport function useUpdateToolbarHandler(\r\n callback: (selection: BaseSelection) => void\r\n) {\r\n const [editor] = useLexicalComposerContext()\r\n const { activeEditor } = useToolbarContext()\r\n\r\n useEffect(() => {\r\n return activeEditor.registerCommand(\r\n SELECTION_CHANGE_COMMAND,\r\n () => {\r\n const selection = $getSelection()\r\n if (selection) {\r\n callback(selection)\r\n }\r\n return false\r\n },\r\n COMMAND_PRIORITY_CRITICAL\r\n )\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [editor, callback])\r\n\r\n useEffect(() => {\r\n activeEditor.getEditorState().read(() => {\r\n const selection = $getSelection()\r\n if (selection) {\r\n callback(selection)\r\n }\r\n })\r\n }, [activeEditor, callback])\r\n}\r\n","import {\r\n CodeIcon,\r\n Heading1Icon,\r\n Heading2Icon,\r\n Heading3Icon,\r\n ListIcon,\r\n ListOrderedIcon,\r\n ListTodoIcon,\r\n QuoteIcon,\r\n TextIcon,\r\n} from \"lucide-react\"\r\nimport { IconSize } from \"@/components/ui/typography\"\r\n\r\nexport const blockTypeToBlockName: Record<\r\n string,\r\n { label: string; icon: React.ReactNode }\r\n> = {\r\n paragraph: {\r\n label: \"Paragraph\",\r\n icon: <IconSize size=\"sm\"><TextIcon /></IconSize>,\r\n },\r\n h1: {\r\n label: \"Heading 1\",\r\n icon: <IconSize size=\"sm\"><Heading1Icon /></IconSize>,\r\n },\r\n h2: {\r\n label: \"Heading 2\",\r\n icon: <IconSize size=\"sm\"><Heading2Icon /></IconSize>,\r\n },\r\n h3: {\r\n label: \"Heading 3\",\r\n icon: <IconSize size=\"sm\"><Heading3Icon /></IconSize>,\r\n },\r\n number: {\r\n label: \"Numbered List\",\r\n icon: <IconSize size=\"sm\"><ListOrderedIcon /></IconSize>,\r\n },\r\n bullet: {\r\n label: \"Bulleted List\",\r\n icon: <IconSize size=\"sm\"><ListIcon /></IconSize>,\r\n },\r\n check: {\r\n label: \"Check List\",\r\n icon: <IconSize size=\"sm\"><ListTodoIcon /></IconSize>,\r\n },\r\n code: {\r\n label: \"Code Block\",\r\n icon: <IconSize size=\"sm\"><CodeIcon /></IconSize>,\r\n },\r\n quote: {\r\n label: \"Quote\",\r\n icon: <IconSize size=\"sm\"><QuoteIcon /></IconSize>,\r\n },\r\n}\r\n","import { INSERT_UNORDERED_LIST_COMMAND } from \"@lexical/list\"\r\nimport { $setBlocksType } from \"@lexical/selection\"\r\nimport { $createParagraphNode, $getSelection, $isRangeSelection } from \"lexical\"\r\n\r\nimport { useToolbarContext } from \"@/components/editor/context/toolbar-context\"\r\nimport { blockTypeToBlockName } from \"@/components/editor/plugins/toolbar/block-format/block-format-data\"\r\nimport { SelectItem } from \"@/components/ui/select\"\r\nimport { Flex } from \"@/components/ui/flex\"\r\n\r\nconst BLOCK_FORMAT_VALUE = \"bullet\"\r\n\r\nexport function FormatBulletedList() {\r\n const { activeEditor, blockType } = useToolbarContext()\r\n\r\n const formatParagraph = () => {\r\n activeEditor.update(() => {\r\n const selection = $getSelection()\r\n if ($isRangeSelection(selection)) {\r\n $setBlocksType(selection, () => $createParagraphNode())\r\n }\r\n })\r\n }\r\n\r\n const formatBulletedList = () => {\r\n if (blockType !== \"bullet\") {\r\n activeEditor.dispatchCommand(INSERT_UNORDERED_LIST_COMMAND, undefined)\r\n } else {\r\n formatParagraph()\r\n }\r\n }\r\n\r\n return (\r\n <SelectItem value={BLOCK_FORMAT_VALUE} onPointerDown={formatBulletedList}>\r\n <Flex align=\"center\" gap={1}>\r\n {blockTypeToBlockName[BLOCK_FORMAT_VALUE].icon}\r\n {blockTypeToBlockName[BLOCK_FORMAT_VALUE].label}\r\n </Flex>\r\n </SelectItem>\r\n )\r\n}\r\n","import { INSERT_CHECK_LIST_COMMAND } from \"@lexical/list\"\r\nimport { $setBlocksType } from \"@lexical/selection\"\r\nimport { $createParagraphNode, $getSelection, $isRangeSelection } from \"lexical\"\r\n\r\nimport { useToolbarContext } from \"@/components/editor/context/toolbar-context\"\r\nimport { blockTypeToBlockName } from \"@/components/editor/plugins/toolbar/block-format/block-format-data\"\r\nimport { SelectItem } from \"@/components/ui/select\"\r\nimport { Flex } from \"@/components/ui/flex\"\r\n\r\nconst BLOCK_FORMAT_VALUE = \"check\"\r\n\r\nexport function FormatCheckList() {\r\n const { activeEditor, blockType } = useToolbarContext()\r\n\r\n const formatParagraph = () => {\r\n activeEditor.update(() => {\r\n const selection = $getSelection()\r\n if ($isRangeSelection(selection)) {\r\n $setBlocksType(selection, () => $createParagraphNode())\r\n }\r\n })\r\n }\r\n\r\n const formatCheckList = () => {\r\n if (blockType !== \"check\") {\r\n activeEditor.dispatchCommand(INSERT_CHECK_LIST_COMMAND, undefined)\r\n } else {\r\n formatParagraph()\r\n }\r\n }\r\n\r\n return (\r\n <SelectItem value={BLOCK_FORMAT_VALUE} onPointerDown={formatCheckList}>\r\n <Flex align=\"center\" gap={1}>\r\n {blockTypeToBlockName[BLOCK_FORMAT_VALUE].icon}\r\n {blockTypeToBlockName[BLOCK_FORMAT_VALUE].label}\r\n </Flex>\r\n </SelectItem>\r\n )\r\n}\r\n","import { $createCodeNode } from \"@lexical/code\"\r\nimport { $setBlocksType } from \"@lexical/selection\"\r\nimport { $getSelection, $isRangeSelection } from \"lexical\"\r\n\r\nimport { useToolbarContext } from \"@/components/editor/context/toolbar-context\"\r\nimport { blockTypeToBlockName } from \"@/components/editor/plugins/toolbar/block-format/block-format-data\"\r\nimport { SelectItem } from \"@/components/ui/select\"\r\nimport { Flex } from \"@/components/ui/flex\"\r\n\r\nconst BLOCK_FORMAT_VALUE = \"code\"\r\n\r\nexport function FormatCodeBlock() {\r\n const { activeEditor, blockType } = useToolbarContext()\r\n\r\n const formatCode = () => {\r\n if (blockType !== \"code\") {\r\n activeEditor.update(() => {\r\n let selection = $getSelection()\r\n\r\n if (selection !== null) {\r\n if (selection.isCollapsed()) {\r\n $setBlocksType(selection, () => $createCodeNode())\r\n } else {\r\n const textContent = selection.getTextContent()\r\n const codeNode = $createCodeNode()\r\n selection.insertNodes([codeNode])\r\n selection = $getSelection()\r\n if ($isRangeSelection(selection)) {\r\n selection.insertRawText(textContent)\r\n }\r\n }\r\n }\r\n })\r\n }\r\n }\r\n\r\n return (\r\n <SelectItem value=\"code\" onPointerDown={formatCode}>\r\n <Flex align=\"center\" gap={1}>\r\n {blockTypeToBlockName[BLOCK_FORMAT_VALUE].icon}\r\n {blockTypeToBlockName[BLOCK_FORMAT_VALUE].label}\r\n </Flex>\r\n </SelectItem>\r\n )\r\n}\r\n","import { $createHeadingNode, HeadingTagType } from \"@lexical/rich-text\"\r\nimport { $setBlocksType } from \"@lexical/selection\"\r\nimport { $getSelection } from \"lexical\"\r\n\r\nimport { useToolbarContext } from \"@/components/editor/context/toolbar-context\"\r\nimport { blockTypeToBlockName } from \"@/components/editor/plugins/toolbar/block-format/block-format-data\"\r\nimport { SelectItem } from \"@/components/ui/select\"\r\nimport { Flex } from \"@/components/ui/flex\"\r\n\r\nexport function FormatHeading({ levels = [] }: { levels: HeadingTagType[] }) {\r\n const { activeEditor, blockType } = useToolbarContext()\r\n\r\n const formatHeading = (headingSize: HeadingTagType) => {\r\n if (blockType !== headingSize) {\r\n activeEditor.update(() => {\r\n const selection = $getSelection()\r\n $setBlocksType(selection, () => $createHeadingNode(headingSize))\r\n })\r\n }\r\n }\r\n\r\n return levels.map((level) => (\r\n <SelectItem\r\n key={level}\r\n value={level}\r\n onPointerDown={() => formatHeading(level)}\r\n >\r\n <Flex align=\"center\" gap={1}>\r\n {blockTypeToBlockName[level].icon}\r\n {blockTypeToBlockName[level].label}\r\n </Flex>\r\n </SelectItem>\r\n ))\r\n}\r\n","import { INSERT_ORDERED_LIST_COMMAND } from \"@lexical/list\"\r\nimport { $setBlocksType } from \"@lexical/selection\"\r\nimport { $createParagraphNode, $getSelection, $isRangeSelection } from \"lexical\"\r\n\r\nimport { useToolbarContext } from \"@/components/editor/context/toolbar-context\"\r\nimport { blockTypeToBlockName } from \"@/components/editor/plugins/toolbar/block-format/block-format-data\"\r\nimport { SelectItem } from \"@/components/ui/select\"\r\nimport { Flex } from \"@/components/ui/flex\"\r\n\r\nconst BLOCK_FORMAT_VALUE = \"number\"\r\n\r\nexport function FormatNumberedList() {\r\n const { activeEditor, blockType } = useToolbarContext()\r\n\r\n const formatParagraph = () => {\r\n activeEditor.update(() => {\r\n const selection = $getSelection()\r\n if ($isRangeSelection(selection)) {\r\n $setBlocksType(selection, () => $createParagraphNode())\r\n }\r\n })\r\n }\r\n\r\n const formatNumberedList = () => {\r\n if (blockType !== \"number\") {\r\n activeEditor.dispatchCommand(INSERT_ORDERED_LIST_COMMAND, undefined)\r\n } else {\r\n formatParagraph()\r\n }\r\n }\r\n\r\n return (\r\n <SelectItem value={BLOCK_FORMAT_VALUE} onPointerDown={formatNumberedList}>\r\n <Flex align=\"center\" gap={1}>\r\n {blockTypeToBlockName[BLOCK_FORMAT_VALUE].icon}\r\n {blockTypeToBlockName[BLOCK_FORMAT_VALUE].label}\r\n </Flex>\r\n </SelectItem>\r\n )\r\n}\r\n","import { $setBlocksType } from \"@lexical/selection\"\r\nimport { $createParagraphNode, $getSelection, $isRangeSelection } from \"lexical\"\r\n\r\nimport { useToolbarContext } from \"@/components/editor/context/toolbar-context\"\r\nimport { blockTypeToBlockName } from \"@/components/editor/plugins/toolbar/block-format/block-format-data\"\r\nimport { SelectItem } from \"@/components/ui/select\"\r\nimport { Flex } from \"@/components/ui/flex\"\r\n\r\nconst BLOCK_FORMAT_VALUE = \"paragraph\"\r\n\r\nexport function FormatParagraph() {\r\n const { activeEditor } = useToolbarContext()\r\n\r\n const formatParagraph = () => {\r\n activeEditor.update(() => {\r\n const selection = $getSelection()\r\n if ($isRangeSelection(selection)) {\r\n $setBlocksType(selection, () => $createParagraphNode())\r\n }\r\n })\r\n }\r\n\r\n return (\r\n <SelectItem value={BLOCK_FORMAT_VALUE} onPointerDown={formatParagraph}>\r\n <Flex align=\"center\" gap={1}>\r\n {blockTypeToBlockName[BLOCK_FORMAT_VALUE].icon}\r\n {blockTypeToBlockName[BLOCK_FORMAT_VALUE].label}\r\n </Flex>\r\n </SelectItem>\r\n )\r\n}\r\n","import { $createQuoteNode } from \"@lexical/rich-text\"\r\nimport { $setBlocksType } from \"@lexical/selection\"\r\nimport { $getSelection } from \"lexical\"\r\n\r\nimport { useToolbarContext } from \"@/components/editor/context/toolbar-context\"\r\nimport { blockTypeToBlockName } from \"@/components/editor/plugins/toolbar/block-format/block-format-data\"\r\nimport { SelectItem } from \"@/components/ui/select\"\r\nimport { Flex } from \"@/components/ui/flex\"\r\n\r\nconst BLOCK_FORMAT_VALUE = \"quote\"\r\n\r\nexport function FormatQuote() {\r\n const { activeEditor, blockType } = useToolbarContext()\r\n\r\n const formatQuote = () => {\r\n if (blockType !== \"quote\") {\r\n activeEditor.update(() => {\r\n const selection = $getSelection()\r\n $setBlocksType(selection, () => $createQuoteNode())\r\n })\r\n }\r\n }\r\n\r\n return (\r\n <SelectItem value=\"quote\" onPointerDown={formatQuote}>\r\n <Flex align=\"center\" gap={1}>\r\n {blockTypeToBlockName[BLOCK_FORMAT_VALUE].icon}\r\n {blockTypeToBlockName[BLOCK_FORMAT_VALUE].label}\r\n </Flex>\r\n </SelectItem>\r\n )\r\n}\r\n","\"use client\"\r\n\r\nimport { PlusIcon } from \"lucide-react\"\r\n\r\nimport {\r\n Select,\r\n SelectContent,\r\n SelectGroup,\r\n SelectTrigger,\r\n} from \"@/components/ui/select\"\r\nimport { IconSize } from \"@/components/ui/typography\"\r\n\r\nexport function BlockInsertPlugin({ children }: { children: React.ReactNode }) {\r\n return (\r\n <Select\r\n modal={false}\r\n value={\"\"}\r\n >\r\n <SelectTrigger className=\"min-h-11 w-min gap-1\">\r\n <IconSize size=\"sm\">\r\n <PlusIcon />\r\n </IconSize>\r\n <span>Insert</span>\r\n </SelectTrigger>\r\n <SelectContent>\r\n <SelectGroup>{children}</SelectGroup>\r\n </SelectContent>\r\n </Select>\r\n )\r\n}\r\n","\"use client\"\r\n\r\nimport { Columns3Icon } from \"lucide-react\"\r\n\r\nimport { useToolbarContext } from \"@/components/editor/context/toolbar-context\"\r\nimport { InsertLayoutDialog } from \"@/components/editor/plugins/layout-plugin\"\r\nimport { SelectItem } from \"@/components/ui/select\"\r\nimport { Flex } from \"@/components/ui/flex\"\r\nimport { IconSize } from \"@/components/ui/typography\"\r\n\r\nexport function InsertColumnsLayout() {\r\n const { activeEditor, showModal } = useToolbarContext()\r\n\r\n return (\r\n <SelectItem\r\n value=\"columns\"\r\n onPointerUp={() =>\r\n showModal(\"Insert Columns Layout\", (onClose) => (\r\n <InsertLayoutDialog activeEditor={activeEditor} onClose={onClose} />\r\n ))\r\n }\r\n className=\"\"\r\n >\r\n <Flex align=\"center\" gap={1}>\r\n <IconSize size=\"sm\">\r\n <Columns3Icon />\r\n </IconSize>\r\n <span>Columns Layout</span>\r\n </Flex>\r\n </SelectItem>\r\n )\r\n}\r\n","\"use client\"\r\n\r\nimport { useToolbarContext } from \"@/components/editor/context/toolbar-context\"\r\nimport { AutoEmbedDialogStandalone, EmbedConfigs } from \"@/components/editor/plugins/embeds/auto-embed-plugin\"\r\nimport { SelectItem } from \"@/components/ui/select\"\r\nimport { Flex } from \"@/components/ui/flex\"\r\n\r\nexport function InsertEmbeds() {\r\n const { activeEditor, showModal } = useToolbarContext()\r\n return EmbedConfigs.map((embedConfig) => (\r\n <SelectItem\r\n key={embedConfig.type}\r\n value={embedConfig.type}\r\n onPointerUp={() => {\r\n showModal(`Embed ${embedConfig.contentName}`, (onClose) => (\r\n <AutoEmbedDialogStandalone \r\n embedConfig={embedConfig} \r\n onClose={onClose} \r\n editor={activeEditor}\r\n />\r\n ))\r\n }}\r\n className=\"\"\r\n >\r\n <Flex align=\"center\" gap={1}>\r\n {embedConfig.icon}\r\n <span>{embedConfig.contentName}</span>\r\n </Flex>\r\n </SelectItem>\r\n ))\r\n}\r\n","\"use client\"\r\n\r\nimport { INSERT_HORIZONTAL_RULE_COMMAND } from \"@lexical/react/LexicalHorizontalRuleNode\"\r\nimport { ScissorsIcon } from \"lucide-react\"\r\n\r\nimport { useToolbarContext } from \"@/components/editor/context/toolbar-context\"\r\nimport { SelectItem } from \"@/components/ui/select\"\r\nimport { Flex } from \"@/components/ui/flex\"\r\nimport { IconSize } from \"@/components/ui/typography\"\r\n\r\nexport function InsertHorizontalRule() {\r\n const { activeEditor } = useToolbarContext()\r\n\r\n return (\r\n <SelectItem\r\n value=\"horizontal-rule\"\r\n onPointerUp={() =>\r\n activeEditor.dispatchCommand(INSERT_HORIZONTAL_RULE_COMMAND, undefined)\r\n }\r\n className=\"\"\r\n >\r\n <Flex align=\"center\" gap={1}>\r\n <IconSize size=\"sm\">\r\n <ScissorsIcon />\r\n </IconSize>\r\n <span>Horizontal Rule</span>\r\n </Flex>\r\n </SelectItem>\r\n )\r\n}\r\n","\"use client\"\r\n\r\nimport { ImageIcon } from \"lucide-react\"\r\n\r\nimport { useToolbarContext } from \"@/components/editor/context/toolbar-context\"\r\nimport { InsertImageDialog } from \"@/components/editor/plugins/images-plugin\"\r\nimport { SelectItem } from \"@/components/ui/select\"\r\nimport { Flex } from \"@/components/ui/flex\"\r\nimport { IconSize } from \"@/components/ui/typography\"\r\n\r\nexport function InsertImage() {\r\n const { activeEditor, showModal } = useToolbarContext()\r\n\r\n return (\r\n <SelectItem\r\n value=\"image\"\r\n onPointerUp={() => {\r\n showModal(\"Insert Image\", (onClose) => (\r\n <InsertImageDialog activeEditor={activeEditor} onClose={onClose} />\r\n ))\r\n }}\r\n className=\"\"\r\n >\r\n <Flex align=\"center\" gap={1}>\r\n <IconSize size=\"sm\">\r\n <ImageIcon />\r\n </IconSize>\r\n <span>Image</span>\r\n </Flex>\r\n </SelectItem>\r\n )\r\n}\r\n","\"use client\"\r\n\r\nimport { TableIcon } from \"lucide-react\"\r\n\r\nimport { useToolbarContext } from \"@/components/editor/context/toolbar-context\"\r\nimport { InsertTableDialog } from \"@/components/editor/plugins/table-plugin\"\r\nimport { SelectItem } from \"@/components/ui/select\"\r\nimport { Flex } from \"@/components/ui/flex\"\r\nimport { IconSize } from \"@/components/ui/typography\"\r\n\r\nexport function InsertTable() {\r\n const { activeEditor, showModal } = useToolbarContext()\r\n\r\n return (\r\n <SelectItem\r\n value=\"table\"\r\n onPointerUp={() =>\r\n showModal(\"Insert Table\", (onClose) => (\r\n <InsertTableDialog activeEditor={activeEditor} onClose={onClose} />\r\n ))\r\n }\r\n className=\"\"\r\n >\r\n <Flex align=\"center\" gap={1}>\r\n <IconSize size=\"sm\">\r\n <TableIcon />\r\n </IconSize>\r\n <span>Table</span>\r\n </Flex>\r\n </SelectItem>\r\n )\r\n}\r\n","\"use client\"\r\n\r\nimport { useCallback } from \"react\"\r\nimport { $isDecoratorBlockNode } from \"@lexical/react/LexicalDecoratorBlockNode\"\r\nimport { $isHeadingNode, $isQuoteNode } from \"@lexical/rich-text\"\r\nimport { $isTableSelection } from \"@lexical/table\"\r\nimport { $getNearestBlockElementAncestorOrThrow } from \"@lexical/utils\"\r\nimport {\r\n $createParagraphNode,\r\n $getSelection,\r\n $isRangeSelection,\r\n $isTextNode,\r\n} from \"lexical\"\r\nimport { EraserIcon } from \"lucide-react\"\r\n\r\nimport { useToolbarContext } from \"@/components/editor/context/toolbar-context\"\r\nimport { Button } from \"@/components/ui/button\"\r\nimport { IconSize } from \"@/components/ui/typography\"\r\n\r\nexport function ClearFormattingToolbarPlugin() {\r\n const { activeEditor } = useToolbarContext()\r\n\r\n const clearFormatting = useCallback(() => {\r\n activeEditor.update(() => {\r\n const selection = $getSelection()\r\n if ($isRangeSelection(selection) || $isTableSelection(selection)) {\r\n const anchor = selection.anchor\r\n const focus = selection.focus\r\n const nodes = selection.getNodes()\r\n const extractedNodes = selection.extract()\r\n\r\n if (anchor.key === focus.key && anchor.offset === focus.offset) {\r\n return\r\n }\r\n\r\n nodes.forEach((node, idx) => {\r\n // We split the first and last node by the selection\r\n // So that we don't format unselected text inside those nodes\r\n if ($isTextNode(node)) {\r\n // Use a separate variable to ensure TS does not lose the refinement\r\n let textNode = node\r\n if (idx === 0 && anchor.offset !== 0) {\r\n textNode = textNode.splitText(anchor.offset)[1] || textNode\r\n }\r\n if (idx === nodes.length - 1) {\r\n textNode = textNode.splitText(focus.offset)[0] || textNode\r\n }\r\n /**\r\n * If the selected text has one format applied\r\n * selecting a portion of the text, could\r\n * clear the format to the wrong portion of the text.\r\n *\r\n * The cleared text is based on the length of the selected text.\r\n */\r\n // We need this in case the selected text only has one format\r\n const extractedTextNode = extractedNodes[0]\r\n if (nodes.length === 1 && $isTextNode(extractedTextNode)) {\r\n textNode = extractedTextNode\r\n }\r\n\r\n if (textNode.__style !== \"\") {\r\n textNode.setStyle(\"\")\r\n }\r\n if (textNode.__format !== 0) {\r\n textNode.setFormat(0)\r\n $getNearestBlockElementAncestorOrThrow(textNode).setFormat(\"\")\r\n }\r\n node = textNode\r\n } else if ($isHeadingNode(node) || $isQuoteNode(node)) {\r\n node.replace($createParagraphNode(), true)\r\n } else if ($isDecoratorBlockNode(node)) {\r\n node.setFormat(\"\")\r\n }\r\n })\r\n }\r\n })\r\n }, [activeEditor])\r\n\r\n return (\r\n <Button\r\n className=\"min-h-11 min-w-11\"\r\n aria-label=\"Clear formatting\"\r\n variant={\"outline\"}\r\n size={\"icon\"}\r\n onClick={clearFormatting}\r\n >\r\n <IconSize size=\"sm\">\r\n <EraserIcon />\r\n </IconSize>\r\n </Button>\r\n )\r\n}\r\n","\"use client\"\r\n\r\nimport { useCallback, useState } from \"react\"\r\nimport {\r\n $isCodeNode,\r\n CODE_LANGUAGE_FRIENDLY_NAME_MAP,\r\n CODE_LANGUAGE_MAP,\r\n getLanguageFriendlyName,\r\n} from \"@lexical/code\"\r\nimport { $isListNode } from \"@lexical/list\"\r\nimport { $findMatchingParent } from \"@lexical/utils\"\r\nimport {\r\n $getNodeByKey,\r\n $isRangeSelection,\r\n $isRootOrShadowRoot,\r\n BaseSelection,\r\n} from \"lexical\"\r\n\r\nimport { useToolbarContext } from \"@/components/editor/context/toolbar-context\"\r\nimport { useUpdateToolbarHandler } from \"@/components/editor/editor-hooks/use-update-toolbar\"\r\nimport {\r\n Select,\r\n SelectContent,\r\n SelectItem,\r\n SelectTrigger,\r\n} from \"@/components/ui/select\"\r\n\r\nfunction getCodeLanguageOptions(): [string, string][] {\r\n const options: [string, string][] = []\r\n\r\n for (const [lang, friendlyName] of Object.entries(\r\n CODE_LANGUAGE_FRIENDLY_NAME_MAP\r\n )) {\r\n options.push([lang, friendlyName])\r\n }\r\n\r\n return options\r\n}\r\n\r\nconst CODE_LANGUAGE_OPTIONS = getCodeLanguageOptions()\r\n\r\nexport function CodeLanguageToolbarPlugin() {\r\n const { activeEditor } = useToolbarContext()\r\n const [codeLanguage, setCodeLanguage] = useState<string>(\"\")\r\n const [selectedElementKey, setSelectedElementKey] = useState<string | null>(\r\n null\r\n )\r\n\r\n const $updateToolbar = (selection: BaseSelection) => {\r\n if ($isRangeSelection(selection)) {\r\n const anchorNode = selection.anchor.getNode()\r\n let element =\r\n anchorNode.getKey() === \"root\"\r\n ? anchorNode\r\n : $findMatchingParent(anchorNode, (e) => {\r\n const parent = e.getParent()\r\n return parent !== null && $isRootOrShadowRoot(parent)\r\n })\r\n\r\n if (element === null) {\r\n element = anchorNode.getTopLevelElementOrThrow()\r\n }\r\n\r\n const elementKey = element.getKey()\r\n const elementDOM = activeEditor.getElementByKey(elementKey)\r\n\r\n if (elementDOM !== null) {\r\n setSelectedElementKey(elementKey)\r\n\r\n if (!$isListNode(element) && $isCodeNode(element)) {\r\n const language =\r\n element.getLanguage() as keyof typeof CODE_LANGUAGE_MAP\r\n setCodeLanguage(\r\n language ? CODE_LANGUAGE_MAP[language] || language : \"\"\r\n )\r\n return\r\n }\r\n }\r\n }\r\n }\r\n\r\n useUpdateToolbarHandler($updateToolbar)\r\n\r\n const onCodeLanguageSelect = useCallback(\r\n (value: string) => {\r\n activeEditor.update(() => {\r\n if (selectedElementKey !== null) {\r\n const node = $getNodeByKey(selectedElementKey)\r\n if ($isCodeNode(node)) {\r\n node.setLanguage(value)\r\n }\r\n }\r\n })\r\n },\r\n [activeEditor, selectedElementKey]\r\n )\r\n\r\n return (\r\n <Select\r\n modal={false}\r\n value={codeLanguage}\r\n onValueChange={onCodeLanguageSelect}\r\n >\r\n <SelectTrigger className=\"min-h-11 w-min gap-1\">\r\n <span>\r\n {getLanguageFriendlyName(codeLanguage) || \"Select Language\"}\r\n </span>\r\n </SelectTrigger>\r\n <SelectContent>\r\n {CODE_LANGUAGE_OPTIONS.map(([value, label]) => (\r\n <SelectItem\r\n key={value}\r\n value={value}\r\n >\r\n {label}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n )\r\n}\r\n","\"use client\"\r\n\r\nimport { useRef, useState } from \"react\"\r\nimport { $isLinkNode } from \"@lexical/link\"\r\nimport { $findMatchingParent } from \"@lexical/utils\"\r\nimport {\r\n $getNodeByKey,\r\n $getSelection,\r\n $isElementNode,\r\n $isRangeSelection,\r\n BaseSelection,\r\n ElementFormatType,\r\n FORMAT_ELEMENT_COMMAND,\r\n INDENT_CONTENT_COMMAND,\r\n NodeKey,\r\n OUTDENT_CONTENT_COMMAND,\r\n} from \"lexical\"\r\nimport {\r\n AlignCenterIcon,\r\n AlignJustifyIcon,\r\n AlignLeftIcon,\r\n AlignRightIcon,\r\n IndentDecreaseIcon,\r\n IndentIncreaseIcon,\r\n} from \"lucide-react\"\r\n\r\nimport { useToolbarContext } from \"@/components/editor/context/toolbar-context\"\r\nimport { $isLayoutItemNode } from \"@/components/editor/nodes/layout-item-node\"\r\nimport { useUpdateToolbarHandler } from \"@/components/editor/editor-hooks/use-update-toolbar\"\r\nimport { getSelectedNode } from \"@/components/editor/utils/get-selected-node\"\r\nimport { Separator } from \"@/components/ui/separator\"\r\nimport {\r\n ToggleGroup,\r\n ToggleGroupItem,\r\n} from \"@/components/ui/toggle-group\"\r\nimport { IconSize } from \"@/components/ui/typography\"\r\n\r\nconst ELEMENT_FORMAT_OPTIONS: {\r\n [key in Exclude<ElementFormatType, \"start\" | \"end\" | \"\">]: {\r\n icon: React.ReactNode\r\n iconRTL: string\r\n name: string\r\n }\r\n} = {\r\n left: {\r\n icon: <IconSize size=\"sm\"><AlignLeftIcon /></IconSize>,\r\n iconRTL: \"left-align\",\r\n name: \"Left Align\",\r\n },\r\n center: {\r\n icon: <IconSize size=\"sm\"><AlignCenterIcon /></IconSize>,\r\n iconRTL: \"center-align\",\r\n name: \"Center Align\",\r\n },\r\n right: {\r\n icon: <IconSize size=\"sm\"><AlignRightIcon /></IconSize>,\r\n iconRTL: \"right-align\",\r\n name: \"Right Align\",\r\n },\r\n justify: {\r\n icon: <IconSize size=\"sm\"><AlignJustifyIcon /></IconSize>,\r\n iconRTL: \"justify-align\",\r\n name: \"Justify Align\",\r\n },\r\n} as const\r\n\r\nexport function ElementFormatToolbarPlugin({\r\n separator = true,\r\n}: {\r\n separator?: boolean\r\n}) {\r\n const { activeEditor } = useToolbarContext()\r\n const [elementFormat, setElementFormat] = useState<ElementFormatType>(\"left\")\r\n const activeLayoutItemKeyRef = useRef<NodeKey | null>(null)\r\n\r\n const extractPadding = (style: string): number | null => {\r\n const match = style.match(/padding\\s*:\\s*(\\d+)px/i)\r\n if (!match?.[1]) return null\r\n const value = Number.parseInt(match[1], 10)\r\n return Number.isFinite(value) ? value : null\r\n }\r\n\r\n const setPadding = (style: string, nextPadding: number): string => {\r\n if (/padding\\s*:\\s*\\d+px/i.test(style)) {\r\n return style.replace(/padding\\s*:\\s*\\d+px/i, `padding: ${nextPadding}px`)\r\n }\r\n return `${style.trim().replace(/;?$/, \";\")} padding: ${nextPadding}px`.trim()\r\n }\r\n\r\n const $updateToolbar = (selection: BaseSelection) => {\r\n if ($isRangeSelection(selection)) {\r\n const layoutItem = $findMatchingParent(selection.anchor.getNode(), (node) =>\r\n $isLayoutItemNode(node)\r\n )\r\n activeLayoutItemKeyRef.current = $isLayoutItemNode(layoutItem)\r\n ? layoutItem.getKey()\r\n : null\r\n\r\n const node = getSelectedNode(selection)\r\n const parent = node.getParent()\r\n\r\n let matchingParent\r\n if ($isLinkNode(parent)) {\r\n // If node is a link, we need to fetch the parent paragraph node to set format\r\n matchingParent = $findMatchingParent(\r\n node,\r\n (parentNode) => $isElementNode(parentNode) && !parentNode.isInline()\r\n )\r\n }\r\n setElementFormat(\r\n $isElementNode(matchingParent)\r\n ? matchingParent.getFormatType()\r\n : $isElementNode(node)\r\n ? node.getFormatType()\r\n : parent?.getFormatType() || \"left\"\r\n )\r\n }\r\n }\r\n\r\n useUpdateToolbarHandler($updateToolbar)\r\n\r\n const handleValueChange = (value: string) => {\r\n if (!value) return // Prevent unselecting current value\r\n\r\n setElementFormat(value as ElementFormatType)\r\n\r\n if (value === \"indent\") {\r\n activeEditor.update(() => {\r\n const selectedLayoutItemKey = activeLayoutItemKeyRef.current\r\n if (selectedLayoutItemKey) {\r\n const node = $getNodeByKey(selectedLayoutItemKey)\r\n if ($isLayoutItemNode(node)) {\r\n const currentPadding = extractPadding(node.getStyle()) ?? 0\r\n const nextPadding = Math.min(currentPadding + 4, 64)\r\n node.setStyle(setPadding(node.getStyle(), nextPadding))\r\n return\r\n }\r\n }\r\n\r\n const selection = $getSelection()\r\n if (!$isRangeSelection(selection)) {\r\n activeEditor.dispatchCommand(INDENT_CONTENT_COMMAND, undefined)\r\n return\r\n }\r\n const layoutItem = $findMatchingParent(selection.anchor.getNode(), (node) =>\r\n $isLayoutItemNode(node)\r\n )\r\n if ($isLayoutItemNode(layoutItem)) {\r\n const currentPadding = extractPadding(layoutItem.getStyle()) ?? 0\r\n const nextPadding = Math.min(currentPadding + 4, 64)\r\n layoutItem.setStyle(setPadding(layoutItem.getStyle(), nextPadding))\r\n return\r\n }\r\n activeEditor.dispatchCommand(INDENT_CONTENT_COMMAND, undefined)\r\n })\r\n } else if (value === \"outdent\") {\r\n activeEditor.update(() => {\r\n const selectedLayoutItemKey = activeLayoutItemKeyRef.current\r\n if (selectedLayoutItemKey) {\r\n const node = $getNodeByKey(selectedLayoutItemKey)\r\n if ($isLayoutItemNode(node)) {\r\n const currentPadding = extractPadding(node.getStyle()) ?? 0\r\n const nextPadding = Math.max(currentPadding - 4, 0)\r\n node.setStyle(setPadding(node.getStyle(), nextPadding))\r\n return\r\n }\r\n }\r\n\r\n const selection = $getSelection()\r\n if (!$isRangeSelection(selection)) {\r\n activeEditor.dispatchCommand(OUTDENT_CONTENT_COMMAND, undefined)\r\n return\r\n }\r\n const layoutItem = $findMatchingParent(selection.anchor.getNode(), (node) =>\r\n $isLayoutItemNode(node)\r\n )\r\n if ($isLayoutItemNode(layoutItem)) {\r\n const currentPadding = extractPadding(layoutItem.getStyle()) ?? 0\r\n const nextPadding = Math.max(currentPadding - 4, 0)\r\n layoutItem.setStyle(setPadding(layoutItem.getStyle(), nextPadding))\r\n return\r\n }\r\n activeEditor.dispatchCommand(OUTDENT_CONTENT_COMMAND, undefined)\r\n })\r\n } else {\r\n activeEditor.dispatchCommand(\r\n FORMAT_ELEMENT_COMMAND,\r\n value as ElementFormatType\r\n )\r\n }\r\n }\r\n\r\n return (\r\n <>\r\n <ToggleGroup\r\n type=\"single\"\r\n value={elementFormat}\r\n defaultValue={elementFormat}\r\n onValueChange={handleValueChange}\r\n size=\"default\"\r\n variant=\"outline\"\r\n >\r\n {/* Alignment toggles */}\r\n {Object.entries(ELEMENT_FORMAT_OPTIONS).map(([value, option]) => (\r\n <ToggleGroupItem\r\n key={value}\r\n value={value}\r\n variant={\"outline\"}\r\n size=\"default\"\r\n aria-label={option.name}\r\n >\r\n {option.icon}\r\n </ToggleGroupItem>\r\n ))}\r\n </ToggleGroup>\r\n {separator && <Separator orientation=\"vertical\" className=\"h-11\" />}\r\n {/* Indentation toggles */}\r\n <ToggleGroup\r\n type=\"single\"\r\n value={elementFormat}\r\n defaultValue={elementFormat}\r\n onValueChange={handleValueChange}\r\n size=\"default\"\r\n variant=\"outline\"\r\n >\r\n <ToggleGroupItem\r\n value=\"outdent\"\r\n aria-label=\"Outdent\"\r\n variant={\"outline\"}\r\n size=\"default\"\r\n >\r\n <IconSize size=\"sm\">\r\n <IndentDecreaseIcon />\r\n </IconSize>\r\n </ToggleGroupItem>\r\n\r\n <ToggleGroupItem\r\n value=\"indent\"\r\n variant={\"outline\"}\r\n aria-label=\"Indent\"\r\n size=\"default\"\r\n >\r\n <IconSize size=\"sm\">\r\n <IndentIncreaseIcon />\r\n </IconSize>\r\n </ToggleGroupItem>\r\n </ToggleGroup>\r\n </>\r\n )\r\n}\r\n","\"use client\"\r\n\r\nimport { useCallback, useRef, useState } from \"react\"\r\nimport {\r\n $getSelectionStyleValueForProperty,\r\n $patchStyleText,\r\n} from \"@lexical/selection\"\r\nimport { $findMatchingParent } from \"@lexical/utils\"\r\nimport {\r\n $getNodeByKey,\r\n $getSelection,\r\n $isRangeSelection,\r\n BaseSelection,\r\n NodeKey,\r\n} from \"lexical\"\r\nimport { PaintBucketIcon } from \"lucide-react\"\r\n\r\nimport { $isLayoutItemNode } from \"@/components/editor/nodes/layout-item-node\"\r\nimport { useToolbarContext } from \"@/components/editor/context/toolbar-context\"\r\nimport { useUpdateToolbarHandler } from \"@/components/editor/editor-hooks/use-update-toolbar\"\r\nimport {\r\n ColorPicker,\r\n ColorPickerAlphaSlider,\r\n ColorPickerArea,\r\n ColorPickerContent,\r\n ColorPickerEyeDropper,\r\n ColorPickerFormatSelect,\r\n ColorPickerHueSlider,\r\n ColorPickerInput,\r\n ColorPickerPresets,\r\n ColorPickerTrigger,\r\n} from \"@/components/editor/editor-ui/color-picker\"\r\nimport { Button } from \"@/components/ui/button\"\r\nimport { Flex } from \"@/components/ui/flex\"\r\nimport { IconSize } from \"@/components/ui/typography\"\r\n\r\nexport function FontBackgroundToolbarPlugin() {\r\n const { activeEditor } = useToolbarContext()\r\n\r\n const [bgColor, setBgColor] = useState(\"#fff\")\r\n const activeLayoutItemKeyRef = useRef<NodeKey | null>(null)\r\n\r\n const extractStyleValue = (style: string, property: string): string | null => {\r\n const escapedProperty = property.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")\r\n const match = style.match(new RegExp(`${escapedProperty}\\\\s*:\\\\s*([^;]+)`, \"i\"))\r\n return match?.[1]?.trim() ?? null\r\n }\r\n\r\n const setStyleProperty = (\r\n style: string,\r\n property: string,\r\n value: string\r\n ): string => {\r\n const escapedProperty = property.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")\r\n const regex = new RegExp(`${escapedProperty}\\\\s*:\\\\s*[^;]+`, \"i\")\r\n if (regex.test(style)) {\r\n return style.replace(regex, `${property}: ${value}`)\r\n }\r\n return `${style.trim().replace(/;?$/, \";\")} ${property}: ${value}`.trim()\r\n }\r\n\r\n const $updateToolbar = (selection: BaseSelection) => {\r\n if ($isRangeSelection(selection)) {\r\n const layoutItem = $findMatchingParent(selection.anchor.getNode(), (node) =>\r\n $isLayoutItemNode(node)\r\n )\r\n if ($isLayoutItemNode(layoutItem)) {\r\n activeLayoutItemKeyRef.current = layoutItem.getKey()\r\n const layoutStyle = layoutItem.getStyle()\r\n const layoutBg = extractStyleValue(layoutStyle, \"background-color\")\r\n if (layoutBg) {\r\n setBgColor(layoutBg)\r\n return\r\n }\r\n } else {\r\n activeLayoutItemKeyRef.current = null\r\n }\r\n\r\n setBgColor(\r\n $getSelectionStyleValueForProperty(\r\n selection,\r\n \"background-color\",\r\n \"#fff\"\r\n )\r\n )\r\n }\r\n }\r\n\r\n useUpdateToolbarHandler($updateToolbar)\r\n\r\n const applyStyleText = useCallback(\r\n (styles: Record<string, string>, _skipHistoryStack?: boolean) => {\r\n activeEditor.update(\r\n () => {\r\n const selection = $getSelection()\r\n activeEditor.setEditable(false)\r\n if (selection !== null) {\r\n $patchStyleText(selection, styles)\r\n }\r\n },\r\n { tag: \"historic\" }\r\n )\r\n },\r\n [activeEditor]\r\n )\r\n\r\n const onBgColorSelect = useCallback(\r\n (value: string) => {\r\n let shouldApplyTextStyle = true\r\n activeEditor.update(() => {\r\n const selectedLayoutItemKey = activeLayoutItemKeyRef.current\r\n if (selectedLayoutItemKey) {\r\n const node = $getNodeByKey(selectedLayoutItemKey)\r\n if ($isLayoutItemNode(node)) {\r\n node.setStyle(setStyleProperty(node.getStyle(), \"background-color\", value))\r\n shouldApplyTextStyle = false\r\n return\r\n }\r\n }\r\n\r\n const selection = $getSelection()\r\n if (!$isRangeSelection(selection)) return\r\n const layoutItem = $findMatchingParent(selection.anchor.getNode(), (node) =>\r\n $isLayoutItemNode(node)\r\n )\r\n if ($isLayoutItemNode(layoutItem)) {\r\n layoutItem.setStyle(\r\n setStyleProperty(layoutItem.getStyle(), \"background-color\", value)\r\n )\r\n shouldApplyTextStyle = false\r\n return\r\n }\r\n })\r\n if (shouldApplyTextStyle) {\r\n applyStyleText({ \"background-color\": value }, true)\r\n }\r\n },\r\n [activeEditor, applyStyleText]\r\n )\r\n\r\n return (\r\n <ColorPicker\r\n modal\r\n defaultFormat=\"hex\"\r\n defaultValue={bgColor}\r\n onValueChange={onBgColorSelect}\r\n onOpenChange={(open) => {\r\n if (!open) {\r\n activeEditor.setEditable(true)\r\n activeEditor.focus()\r\n }\r\n }}\r\n >\r\n <ColorPickerTrigger asChild>\r\n <Button variant={\"outline\"} size={\"icon\"} className=\"h-11 w-11\">\r\n <IconSize size=\"sm\">\r\n <PaintBucketIcon />\r\n </IconSize>\r\n </Button>\r\n </ColorPickerTrigger>\r\n <ColorPickerContent>\r\n <ColorPickerArea />\r\n <Flex align=\"center\" gap={2}>\r\n <ColorPickerEyeDropper />\r\n <Flex direction=\"col\" gap={2} className=\"flex-1\">\r\n <ColorPickerHueSlider />\r\n <ColorPickerAlphaSlider />\r\n </Flex>\r\n </Flex>\r\n <Flex align=\"center\" gap={2}>\r\n <ColorPickerFormatSelect />\r\n <ColorPickerInput />\r\n </Flex>\r\n <ColorPickerPresets />\r\n </ColorPickerContent>\r\n </ColorPicker>\r\n )\r\n}\r\n","\"use client\"\r\n\r\nimport { useCallback, useState } from \"react\"\r\nimport {\r\n $getSelectionStyleValueForProperty,\r\n $patchStyleText,\r\n} from \"@lexical/selection\"\r\nimport { $getSelection, $isRangeSelection, BaseSelection } from \"lexical\"\r\nimport { BaselineIcon } from \"lucide-react\"\r\n\r\nimport { useToolbarContext } from \"@/components/editor/context/toolbar-context\"\r\nimport { useUpdateToolbarHandler } from \"@/components/editor/editor-hooks/use-update-toolbar\"\r\nimport {\r\n ColorPicker,\r\n ColorPickerAlphaSlider,\r\n ColorPickerArea,\r\n ColorPickerContent,\r\n ColorPickerEyeDropper,\r\n ColorPickerFormatSelect,\r\n ColorPickerHueSlider,\r\n ColorPickerInput,\r\n ColorPickerPresets,\r\n ColorPickerTrigger,\r\n} from \"@/components/editor/editor-ui/color-picker\"\r\nimport { Button } from \"@/components/ui/button\"\r\nimport { Flex } from \"@/components/ui/flex\"\r\nimport { IconSize } from \"@/components/ui/typography\"\r\n\r\nexport function FontColorToolbarPlugin() {\r\n const { activeEditor } = useToolbarContext()\r\n\r\n const [fontColor, setFontColor] = useState(\"#000\")\r\n\r\n const $updateToolbar = (selection: BaseSelection) => {\r\n if ($isRangeSelection(selection)) {\r\n setFontColor(\r\n $getSelectionStyleValueForProperty(selection, \"color\", \"#000\")\r\n )\r\n }\r\n }\r\n\r\n useUpdateToolbarHandler($updateToolbar)\r\n\r\n const applyStyleText = useCallback(\r\n (styles: Record<string, string>) => {\r\n activeEditor.update(() => {\r\n const selection = $getSelection()\r\n activeEditor.setEditable(false)\r\n if (selection !== null) {\r\n $patchStyleText(selection, styles)\r\n }\r\n })\r\n },\r\n [activeEditor]\r\n )\r\n\r\n const onFontColorSelect = useCallback(\r\n (value: string) => {\r\n applyStyleText({ color: value })\r\n },\r\n [applyStyleText]\r\n )\r\n\r\n return (\r\n <ColorPicker\r\n modal\r\n defaultFormat=\"hex\"\r\n defaultValue={fontColor}\r\n onValueChange={onFontColorSelect}\r\n onOpenChange={(open) => {\r\n if (!open) {\r\n activeEditor.setEditable(true)\r\n activeEditor.focus()\r\n }\r\n }}\r\n >\r\n <ColorPickerTrigger asChild>\r\n <Button variant=\"outline\" size=\"icon\" className=\"h-11 w-11\">\r\n <IconSize size=\"sm\">\r\n <BaselineIcon />\r\n </IconSize>\r\n </Button>\r\n </ColorPickerTrigger>\r\n <ColorPickerContent>\r\n <ColorPickerArea />\r\n <Flex align=\"center\" gap={2}>\r\n <ColorPickerEyeDropper />\r\n <Flex direction=\"col\" gap={2} className=\"flex-1\">\r\n <ColorPickerHueSlider />\r\n <ColorPickerAlphaSlider />\r\n </Flex>\r\n </Flex>\r\n <Flex align=\"center\" gap={2}>\r\n <ColorPickerFormatSelect />\r\n <ColorPickerInput />\r\n </Flex>\r\n <ColorPickerPresets />\r\n </ColorPickerContent>\r\n </ColorPicker>\r\n )\r\n}\r\n","\"use client\"\r\n\r\nimport { useCallback, useState } from \"react\"\r\nimport {\r\n $getSelectionStyleValueForProperty,\r\n $patchStyleText,\r\n} from \"@lexical/selection\"\r\nimport { $getSelection, $isRangeSelection, BaseSelection } from \"lexical\"\r\nimport { TypeIcon } from \"lucide-react\"\r\n\r\nimport { useToolbarContext } from \"@/components/editor/context/toolbar-context\"\r\nimport { useUpdateToolbarHandler } from \"@/components/editor/editor-hooks/use-update-toolbar\"\r\nimport {\r\n Select,\r\n SelectContent,\r\n SelectItem,\r\n SelectTrigger,\r\n} from \"@/components/ui/select\"\r\nimport { IconSize } from \"@/components/ui/typography\"\r\n\r\nconst FONT_FAMILY_OPTIONS = [\r\n \"Arial\",\r\n \"Verdana\",\r\n \"Times New Roman\",\r\n \"Georgia\",\r\n \"Courier New\",\r\n \"Trebuchet MS\",\r\n]\r\n\r\nexport function FontFamilyToolbarPlugin() {\r\n const style = \"font-family\"\r\n const [fontFamily, setFontFamily] = useState(\"Arial\")\r\n\r\n const { activeEditor } = useToolbarContext()\r\n\r\n const $updateToolbar = (selection: BaseSelection) => {\r\n if ($isRangeSelection(selection)) {\r\n setFontFamily(\r\n $getSelectionStyleValueForProperty(selection, \"font-family\", \"Arial\")\r\n )\r\n }\r\n }\r\n\r\n useUpdateToolbarHandler($updateToolbar)\r\n\r\n const handleClick = useCallback(\r\n (option: string) => {\r\n activeEditor.update(() => {\r\n const selection = $getSelection()\r\n if (selection !== null) {\r\n $patchStyleText(selection, {\r\n [style]: option,\r\n })\r\n }\r\n })\r\n },\r\n [activeEditor, style]\r\n )\r\n\r\n const buttonAriaLabel = \"Formatting options for font family\"\r\n\r\n return (\r\n <Select\r\n modal={false}\r\n value={fontFamily}\r\n onValueChange={(value) => {\r\n setFontFamily(value)\r\n handleClick(value)\r\n }}\r\n aria-label={buttonAriaLabel}\r\n >\r\n <SelectTrigger className=\"min-h-11 w-min gap-1\">\r\n <IconSize size=\"sm\">\r\n <TypeIcon />\r\n </IconSize>\r\n <span style={{ fontFamily }}>{fontFamily}</span>\r\n </SelectTrigger>\r\n <SelectContent>\r\n {FONT_FAMILY_OPTIONS.map((option) => (\r\n <SelectItem\r\n key={option}\r\n value={option}\r\n style={{ fontFamily: option }}\r\n >\r\n {option}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n )\r\n}\r\n","\"use client\"\r\n\r\nimport { useCallback, useState } from \"react\"\r\nimport { $isTableSelection } from \"@lexical/table\"\r\nimport {\r\n $isRangeSelection,\r\n BaseSelection,\r\n FORMAT_TEXT_COMMAND,\r\n TextFormatType,\r\n} from \"lexical\"\r\nimport {\r\n BoldIcon,\r\n ItalicIcon,\r\n StrikethroughIcon,\r\n UnderlineIcon,\r\n} from \"lucide-react\"\r\n\r\nimport { useToolbarContext } from \"@/components/editor/context/toolbar-context\"\r\nimport { useUpdateToolbarHandler } from \"@/components/editor/editor-hooks/use-update-toolbar\"\r\nimport {\r\n ToggleGroup,\r\n ToggleGroupItem,\r\n} from \"@/components/ui/toggle-group\"\r\nimport { IconSize } from \"@/components/ui/typography\"\r\n\r\nconst FORMATS = [\r\n { format: \"bold\", icon: BoldIcon, label: \"Bold\" },\r\n { format: \"italic\", icon: ItalicIcon, label: \"Italic\" },\r\n { format: \"underline\", icon: UnderlineIcon, label: \"Underline\" },\r\n { format: \"strikethrough\", icon: StrikethroughIcon, label: \"Strikethrough\" },\r\n] as const\r\n\r\nexport function FontFormatToolbarPlugin() {\r\n const { activeEditor } = useToolbarContext()\r\n const [activeFormats, setActiveFormats] = useState<string[]>([])\r\n\r\n const $updateToolbar = useCallback((selection: BaseSelection) => {\r\n if ($isRangeSelection(selection) || $isTableSelection(selection)) {\r\n const formats: string[] = []\r\n FORMATS.forEach(({ format }) => {\r\n if (selection.hasFormat(format as TextFormatType)) {\r\n formats.push(format)\r\n }\r\n })\r\n setActiveFormats((prev) => {\r\n // Only update if formats have changed\r\n if (\r\n prev.length !== formats.length ||\r\n !formats.every((f) => prev.includes(f))\r\n ) {\r\n return formats\r\n }\r\n return prev\r\n })\r\n }\r\n }, [])\r\n\r\n useUpdateToolbarHandler($updateToolbar)\r\n\r\n return (\r\n <ToggleGroup\r\n type=\"multiple\"\r\n value={activeFormats}\r\n onValueChange={setActiveFormats}\r\n variant=\"outline\"\r\n size=\"default\"\r\n >\r\n {FORMATS.map(({ format, icon: Icon, label }) => (\r\n <ToggleGroupItem\r\n key={format}\r\n value={format}\r\n aria-label={label}\r\n onClick={() => {\r\n activeEditor.dispatchCommand(\r\n FORMAT_TEXT_COMMAND,\r\n format as TextFormatType\r\n )\r\n }}\r\n >\r\n <IconSize size=\"sm\">\r\n <Icon />\r\n </IconSize>\r\n </ToggleGroupItem>\r\n ))}\r\n </ToggleGroup>\r\n )\r\n}\r\n","\"use client\"\r\n\r\nimport { useCallback, useState } from \"react\"\r\nimport {\r\n $getSelectionStyleValueForProperty,\r\n $patchStyleText,\r\n} from \"@lexical/selection\"\r\nimport { $getSelection, $isRangeSelection, BaseSelection } from \"lexical\"\r\nimport { Minus, Plus } from \"lucide-react\"\r\n\r\nimport { useToolbarContext } from \"@/components/editor/context/toolbar-context\"\r\nimport { useUpdateToolbarHandler } from \"@/components/editor/editor-hooks/use-update-toolbar\"\r\nimport { Button } from \"@/components/ui/button\"\r\nimport { ButtonGroup } from \"@/components/ui/button-group\"\r\nimport { Input } from \"@/components/ui/input\"\r\nimport { IconSize } from \"@/components/ui/typography\"\r\n\r\nconst DEFAULT_FONT_SIZE = 16\r\nconst MIN_FONT_SIZE = 1\r\nconst MAX_FONT_SIZE = 72\r\n\r\nexport function FontSizeToolbarPlugin() {\r\n const style = \"font-size\"\r\n const [fontSize, setFontSize] = useState(DEFAULT_FONT_SIZE)\r\n\r\n const { activeEditor } = useToolbarContext()\r\n\r\n const $updateToolbar = (selection: BaseSelection) => {\r\n if ($isRangeSelection(selection)) {\r\n const value = $getSelectionStyleValueForProperty(\r\n selection,\r\n \"font-size\",\r\n `${DEFAULT_FONT_SIZE}px`\r\n )\r\n setFontSize(parseInt(value) || DEFAULT_FONT_SIZE)\r\n }\r\n }\r\n\r\n useUpdateToolbarHandler($updateToolbar)\r\n\r\n const updateFontSize = useCallback(\r\n (newSize: number) => {\r\n const size = Math.min(Math.max(newSize, MIN_FONT_SIZE), MAX_FONT_SIZE)\r\n activeEditor.update(() => {\r\n const selection = $getSelection()\r\n if (selection !== null) {\r\n $patchStyleText(selection, {\r\n [style]: `${size}px`,\r\n })\r\n }\r\n })\r\n setFontSize(size)\r\n },\r\n [activeEditor, style]\r\n )\r\n\r\n return (\r\n <ButtonGroup>\r\n <Button\r\n variant=\"outline\"\r\n size=\"icon\"\r\n className=\"h-11 w-11\"\r\n onClick={() => updateFontSize(fontSize - 1)}\r\n disabled={fontSize <= MIN_FONT_SIZE}\r\n >\r\n <IconSize size=\"xs\">\r\n <Minus />\r\n </IconSize>\r\n </Button>\r\n <Input\r\n type=\"number\"\r\n value={fontSize}\r\n onChange={(e) =>\r\n updateFontSize(parseInt(e.target.value) || DEFAULT_FONT_SIZE)\r\n }\r\n className=\"bg-background h-11 w-fit text-center\"\r\n min={MIN_FONT_SIZE}\r\n max={MAX_FONT_SIZE}\r\n onKeyDown={(event) => {\r\n if (event.key === \"Enter\") {\r\n event.preventDefault()\r\n }\r\n event.stopPropagation()\r\n }}\r\n />\r\n <Button\r\n variant=\"outline\"\r\n size=\"icon\"\r\n className=\"h-11 w-11\"\r\n onClick={() => updateFontSize(fontSize + 1)}\r\n disabled={fontSize >= MAX_FONT_SIZE}\r\n >\r\n <IconSize size=\"xs\">\r\n <Plus />\r\n </IconSize>\r\n </Button>\r\n </ButtonGroup>\r\n )\r\n}\r\n","import { Slot } from \"@radix-ui/react-slot\"\r\nimport { cva, type VariantProps } from \"class-variance-authority\"\r\n\r\nimport { cn } from \"@/utils\"\r\nimport { responsiveTextSizes, fontWeights, lineHeights, iconSizes } from \"@/constants\"\r\nimport { Separator } from \"@/components/ui/separator\"\r\n\r\nconst buttonGroupBodySmall = `${responsiveTextSizes.small} ${fontWeights.normal} ${lineHeights.relaxed}`\r\nconst buttonGroupIconSize = iconSizes.sm\r\n\r\nconst buttonGroupVariants = cva(\r\n \"flex w-fit items-stretch [&>*]:focus-visible:z-10 [&>*]:focus-visible:relative [&>[data-slot=select-trigger]:not([class*='w-'])]:w-fit [&>input]:flex-1 has-[select[aria-hidden=true]:last-child]:[&>[data-slot=select-trigger]:last-of-type]:rounded-r-md has-[>[data-slot=button-group]]:gap-2\",\r\n {\r\n variants: {\r\n orientation: {\r\n horizontal:\r\n \"[&>*:not(:first-child)]:rounded-l-none [&>*:not(:first-child)]:border-l-0 [&>*:not(:last-child)]:rounded-r-none\",\r\n vertical:\r\n \"flex-col [&>*:not(:first-child)]:rounded-t-none [&>*:not(:first-child)]:border-t-0 [&>*:not(:last-child)]:rounded-b-none\",\r\n },\r\n },\r\n defaultVariants: {\r\n orientation: \"horizontal\",\r\n },\r\n }\r\n)\r\n\r\nfunction ButtonGroup({\r\n className,\r\n orientation,\r\n ...props\r\n}: React.ComponentProps<\"div\"> & VariantProps<typeof buttonGroupVariants>) {\r\n return (\r\n <div\r\n role=\"group\"\r\n data-slot=\"button-group\"\r\n data-orientation={orientation}\r\n className={cn(buttonGroupVariants({ orientation }), className)}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nfunction ButtonGroupText({\r\n className,\r\n asChild = false,\r\n ...props\r\n}: React.ComponentProps<\"div\"> & {\r\n asChild?: boolean\r\n}) {\r\n const Comp = asChild ? Slot : \"div\"\r\n\r\n return (\r\n <Comp\r\n className={cn(\r\n `bg-muted flex items-center gap-2 rounded-md border px-4 ${buttonGroupBodySmall} font-medium shadow-xs [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:${buttonGroupIconSize}`,\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nfunction ButtonGroupSeparator({\r\n className,\r\n orientation = \"vertical\",\r\n ...props\r\n}: React.ComponentProps<typeof Separator>) {\r\n return (\r\n <Separator\r\n data-slot=\"button-group-separator\"\r\n orientation={orientation}\r\n className={cn(\r\n \"bg-input relative m-0 self-stretch data-[orientation=vertical]:h-auto\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nexport {\r\n ButtonGroup,\r\n ButtonGroupSeparator,\r\n ButtonGroupText,\r\n buttonGroupVariants,\r\n}\r\n\r\n","\"use client\"\r\n\r\nimport { useEffect, useState } from \"react\"\r\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\"\r\nimport { IS_APPLE, mergeRegister } from \"@lexical/utils\"\r\nimport {\r\n CAN_REDO_COMMAND,\r\n CAN_UNDO_COMMAND,\r\n COMMAND_PRIORITY_CRITICAL,\r\n REDO_COMMAND,\r\n UNDO_COMMAND,\r\n} from \"lexical\"\r\nimport { RedoIcon, UndoIcon } from \"lucide-react\"\r\n\r\nimport { useToolbarContext } from \"@/components/editor/context/toolbar-context\"\r\nimport { Button } from \"@/components/ui/button\"\r\nimport { ButtonGroup } from \"@/components/ui/button-group\"\r\nimport { IconSize } from \"@/components/ui/typography\"\r\n\r\nexport function HistoryToolbarPlugin() {\r\n const [editor] = useLexicalComposerContext()\r\n const { activeEditor, $updateToolbar } = useToolbarContext()\r\n const [isEditable, setIsEditable] = useState(editor.isEditable())\r\n const [canUndo, setCanUndo] = useState(false)\r\n const [canRedo, setCanRedo] = useState(false)\r\n\r\n useEffect(() => {\r\n return mergeRegister(\r\n editor.registerEditableListener((editable) => {\r\n setIsEditable(editable)\r\n }),\r\n activeEditor.registerUpdateListener(({ editorState }) => {\r\n editorState.read(() => {\r\n $updateToolbar()\r\n })\r\n }),\r\n activeEditor.registerCommand<boolean>(\r\n CAN_UNDO_COMMAND,\r\n (payload) => {\r\n setCanUndo(payload)\r\n return false\r\n },\r\n COMMAND_PRIORITY_CRITICAL\r\n ),\r\n activeEditor.registerCommand<boolean>(\r\n CAN_REDO_COMMAND,\r\n (payload) => {\r\n setCanRedo(payload)\r\n return false\r\n },\r\n COMMAND_PRIORITY_CRITICAL\r\n )\r\n )\r\n }, [$updateToolbar, activeEditor, editor])\r\n\r\n return (\r\n <ButtonGroup>\r\n <Button\r\n disabled={!canUndo || !isEditable}\r\n onClick={() => {\r\n activeEditor.dispatchCommand(UNDO_COMMAND, undefined)\r\n }}\r\n title={IS_APPLE ? \"Undo (⌘Z)\" : \"Undo (Ctrl+Z)\"}\r\n type=\"button\"\r\n aria-label=\"Undo\"\r\n size=\"icon\"\r\n className=\"h-11 w-11\"\r\n variant={\"outline\"}\r\n >\r\n <IconSize size=\"sm\">\r\n <UndoIcon />\r\n </IconSize>\r\n </Button>\r\n <Button\r\n disabled={!canRedo || !isEditable}\r\n onClick={() => {\r\n activeEditor.dispatchCommand(REDO_COMMAND, undefined)\r\n }}\r\n title={IS_APPLE ? \"Redo (⇧⌘Z)\" : \"Redo (Ctrl+Y)\"}\r\n type=\"button\"\r\n aria-label=\"Redo\"\r\n variant={\"outline\"}\r\n size=\"icon\"\r\n className=\"h-11 w-11\"\r\n >\r\n <IconSize size=\"sm\">\r\n <RedoIcon />\r\n </IconSize>\r\n </Button>\r\n </ButtonGroup>\r\n )\r\n}\r\n","\"use client\"\r\n\r\nimport { useCallback, useEffect, useState } from \"react\"\r\nimport { $isLinkNode, TOGGLE_LINK_COMMAND } from \"@lexical/link\"\r\nimport {\r\n $isRangeSelection,\r\n BaseSelection,\r\n COMMAND_PRIORITY_NORMAL,\r\n KEY_MODIFIER_COMMAND,\r\n} from \"lexical\"\r\nimport { LinkIcon } from \"lucide-react\"\r\n\r\nimport { useToolbarContext } from \"@/components/editor/context/toolbar-context\"\r\nimport { useUpdateToolbarHandler } from \"@/components/editor/editor-hooks/use-update-toolbar\"\r\nimport { getSelectedNode } from \"@/components/editor/utils/get-selected-node\"\r\nimport { sanitizeUrl } from \"@/components/editor/utils/url\"\r\nimport { Toggle } from \"@/components/ui/toggle\"\r\nimport { IconSize } from \"@/components/ui/typography\"\r\n\r\nexport function LinkToolbarPlugin({\r\n setIsLinkEditMode,\r\n}: {\r\n setIsLinkEditMode: (isEditMode: boolean) => void\r\n}) {\r\n const { activeEditor } = useToolbarContext()\r\n const [isLink, setIsLink] = useState(false)\r\n\r\n const $updateToolbar = (selection: BaseSelection) => {\r\n if ($isRangeSelection(selection)) {\r\n const node = getSelectedNode(selection)\r\n const parent = node.getParent()\r\n if ($isLinkNode(parent) || $isLinkNode(node)) {\r\n setIsLink(true)\r\n } else {\r\n setIsLink(false)\r\n }\r\n }\r\n }\r\n\r\n useUpdateToolbarHandler($updateToolbar)\r\n\r\n useEffect(() => {\r\n return activeEditor.registerCommand(\r\n KEY_MODIFIER_COMMAND,\r\n (payload) => {\r\n const event: KeyboardEvent = payload\r\n const { code, ctrlKey, metaKey } = event\r\n\r\n if (code === \"KeyK\" && (ctrlKey || metaKey)) {\r\n event.preventDefault()\r\n let url: string | null\r\n if (!isLink) {\r\n setIsLinkEditMode(true)\r\n url = sanitizeUrl(\"https://\")\r\n } else {\r\n setIsLinkEditMode(false)\r\n url = null\r\n }\r\n return activeEditor.dispatchCommand(TOGGLE_LINK_COMMAND, url)\r\n }\r\n return false\r\n },\r\n COMMAND_PRIORITY_NORMAL\r\n )\r\n }, [activeEditor, isLink, setIsLinkEditMode])\r\n\r\n const insertLink = useCallback(() => {\r\n if (!isLink) {\r\n setIsLinkEditMode(true)\r\n activeEditor.dispatchCommand(TOGGLE_LINK_COMMAND, sanitizeUrl(\"https://\"))\r\n } else {\r\n setIsLinkEditMode(false)\r\n activeEditor.dispatchCommand(TOGGLE_LINK_COMMAND, null)\r\n }\r\n }, [activeEditor, isLink, setIsLinkEditMode])\r\n\r\n return (\r\n <Toggle\r\n variant={\"outline\"}\r\n size=\"sm\"\r\n className=\"min-h-11 min-w-11\"\r\n aria-label=\"Toggle link\"\r\n onClick={insertLink}\r\n >\r\n <IconSize size=\"sm\">\r\n <LinkIcon />\r\n </IconSize>\r\n </Toggle>\r\n )\r\n}\r\n","\"use client\"\r\n\r\nimport { useState } from \"react\"\r\nimport { $isTableSelection } from \"@lexical/table\"\r\nimport { $isRangeSelection, BaseSelection, FORMAT_TEXT_COMMAND } from \"lexical\"\r\nimport { SubscriptIcon, SuperscriptIcon } from \"lucide-react\"\r\n\r\nimport { useToolbarContext } from \"@/components/editor/context/toolbar-context\"\r\nimport { useUpdateToolbarHandler } from \"@/components/editor/editor-hooks/use-update-toolbar\"\r\nimport {\r\n ToggleGroup,\r\n ToggleGroupItem,\r\n} from \"@/components/ui/toggle-group\"\r\nimport { IconSize } from \"@/components/ui/typography\"\r\n\r\nexport function SubSuperToolbarPlugin() {\r\n const { activeEditor } = useToolbarContext()\r\n const [isSubscript, setIsSubscript] = useState(false)\r\n const [isSuperscript, setIsSuperscript] = useState(false)\r\n\r\n const $updateToolbar = (selection: BaseSelection) => {\r\n if ($isRangeSelection(selection) || $isTableSelection(selection)) {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n setIsSubscript((selection as any).hasFormat(\"subscript\"))\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n setIsSuperscript((selection as any).hasFormat(\"superscript\"))\r\n }\r\n }\r\n\r\n useUpdateToolbarHandler($updateToolbar)\r\n\r\n return (\r\n <ToggleGroup\r\n type=\"single\"\r\n defaultValue={\r\n isSubscript ? \"subscript\" : isSuperscript ? \"superscript\" : \"\"\r\n }\r\n size=\"default\"\r\n variant=\"outline\"\r\n >\r\n <ToggleGroupItem\r\n value=\"subscript\"\r\n size=\"default\"\r\n aria-label=\"Toggle subscript\"\r\n onClick={() => {\r\n activeEditor.dispatchCommand(FORMAT_TEXT_COMMAND, \"subscript\")\r\n }}\r\n variant={\"outline\"}\r\n >\r\n <IconSize size=\"sm\">\r\n <SubscriptIcon />\r\n </IconSize>\r\n </ToggleGroupItem>\r\n <ToggleGroupItem\r\n value=\"superscript\"\r\n size=\"default\"\r\n aria-label=\"Toggle superscript\"\r\n onClick={() => {\r\n activeEditor.dispatchCommand(FORMAT_TEXT_COMMAND, \"superscript\")\r\n }}\r\n variant={\"outline\"}\r\n >\r\n <IconSize size=\"sm\">\r\n <SuperscriptIcon />\r\n </IconSize>\r\n </ToggleGroupItem>\r\n </ToggleGroup>\r\n )\r\n}\r\n","\"use client\"\r\n\r\nimport { type CSSProperties, type ReactNode, useEffect, useState } from \"react\"\r\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\"\r\nimport { COMMAND_PRIORITY_CRITICAL, SELECTION_CHANGE_COMMAND } from \"lexical\"\r\n\r\nimport { ToolbarContext } from \"@/components/editor/context/toolbar-context\"\r\nimport { useEditorModal } from \"@/components/editor/editor-hooks/use-modal\"\r\nimport { useHeaderHeight } from \"@/hooks\"\r\nimport { cn } from \"@/utils\"\r\n\r\nexport function ToolbarPlugin({\r\n children,\r\n className,\r\n style,\r\n}: {\r\n children: (props: { blockType: string }) => ReactNode\r\n className?: string\r\n style?: CSSProperties\r\n}) {\r\n const [editor] = useLexicalComposerContext()\r\n const { headerHeight } = useHeaderHeight()\r\n\r\n const [activeEditor, setActiveEditor] = useState(editor)\r\n const [blockType, setBlockType] = useState<string>(\"paragraph\")\r\n\r\n const [modal, showModal] = useEditorModal()\r\n\r\n const $updateToolbar = () => {}\r\n\r\n useEffect(() => {\r\n return activeEditor.registerCommand(\r\n SELECTION_CHANGE_COMMAND,\r\n (_payload, newEditor) => {\r\n setActiveEditor(newEditor)\r\n return false\r\n },\r\n COMMAND_PRIORITY_CRITICAL\r\n )\r\n }, [activeEditor, editor])\r\n\r\n return (\r\n <ToolbarContext\r\n activeEditor={activeEditor}\r\n $updateToolbar={$updateToolbar}\r\n blockType={blockType}\r\n setBlockType={setBlockType}\r\n showModal={showModal}\r\n >\r\n {modal}\r\n\r\n <div\r\n className={cn(\r\n \"sticky z-20 flex flex-wrap items-start gap-2 border-b bg-background/95 p-1 shadow-sm supports-[backdrop-filter]:bg-background/60 supports-[backdrop-filter]:backdrop-blur-sm w-full\",\r\n className\r\n )}\r\n style={{\r\n ...style,\r\n top: Math.round(headerHeight),\r\n }}\r\n >\r\n {children({ blockType })}\r\n </div>\r\n </ToolbarContext>\r\n )\r\n}\r\n","\"use client\"\r\n\r\nimport {\r\n useCallback,\r\n useEffect,\r\n useLayoutEffect,\r\n useState,\r\n} from \"react\"\r\n\r\nconst useIsomorphicLayoutEffect =\r\n typeof window !== \"undefined\" ? useLayoutEffect : useEffect\r\n\r\ntype Size = {\r\n width: number\r\n height: number\r\n}\r\n\r\n/**\r\n * Observe an element size via ResizeObserver and expose width/height.\r\n * Returns a stable callback ref that should be attached to the target node.\r\n */\r\nexport const useElementSize = <T extends HTMLElement>() => {\r\n const [node, setNode] = useState<T | null>(null)\r\n const [size, setSize] = useState<Size>({ width: 0, height: 0 })\r\n\r\n const ref = useCallback((nextNode: T | null) => {\r\n setNode(nextNode)\r\n }, [])\r\n\r\n useIsomorphicLayoutEffect(() => {\r\n if (!node) {\r\n return\r\n }\r\n\r\n const updateSize = () => {\r\n const { width, height } = node.getBoundingClientRect()\r\n setSize((prev) =>\r\n prev.width === width && prev.height === height\r\n ? prev\r\n : { width, height }\r\n )\r\n }\r\n\r\n updateSize()\r\n\r\n if (typeof ResizeObserver === \"undefined\") {\r\n window.addEventListener(\"resize\", updateSize)\r\n return () => {\r\n window.removeEventListener(\"resize\", updateSize)\r\n }\r\n }\r\n\r\n const observer = new ResizeObserver((entries) => {\r\n const entry = entries[0]\r\n if (!entry) {\r\n return\r\n }\r\n const { width, height } = entry.contentRect\r\n setSize((prev) =>\r\n prev.width === width && prev.height === height\r\n ? prev\r\n : { width, height }\r\n )\r\n })\r\n\r\n observer.observe(node)\r\n return () => {\r\n observer.disconnect()\r\n }\r\n }, [node])\r\n\r\n return {\r\n ref,\r\n width: size.width,\r\n height: size.height,\r\n }\r\n}\r\n","\"use client\"\r\n\r\nimport { useEffect, useState, useCallback } from \"react\"\r\nimport { useElementSize } from \"../shared/use-element-size\"\r\n\r\nconst PUBLIC_HEADER_SELECTOR = 'header[data-public-header=\"true\"]'\r\nconst ADMIN_HEADER_SELECTOR = 'header[data-admin-header=\"true\"]'\r\n\r\n/**\r\n * Hook để đo chiều cao của public header động\r\n * Sử dụng ResizeObserver để tự động cập nhật khi header thay đổi kích thước\r\n */\r\nexport function useHeaderHeight() {\r\n const headerSize = useElementSize<HTMLElement>()\r\n const [headerHeight, setHeaderHeight] = useState(56) // Default: h-14 = 56px\r\n\r\n const findAndSetHeader = useCallback(() => {\r\n if (typeof document === \"undefined\") {\r\n return null\r\n }\r\n\r\n // Ưu tiên tìm header với data-admin-header=\"true\" hoặc data-public-header=\"true\"\r\n let header = document.querySelector<HTMLElement>(ADMIN_HEADER_SELECTOR) || \r\n document.querySelector<HTMLElement>(PUBLIC_HEADER_SELECTOR)\r\n \r\n // Fallback: đo header bằng cách tìm element header đầu tiên\r\n if (!header) {\r\n header = document.querySelector<HTMLElement>(\"header\")\r\n }\r\n\r\n if (header) {\r\n headerSize.ref(header)\r\n return header\r\n }\r\n\r\n return null\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [headerSize.ref])\r\n\r\n useEffect(() => {\r\n if (typeof document === \"undefined\") {\r\n return\r\n }\r\n\r\n // Tìm header ngay lập tức\r\n findAndSetHeader()\r\n\r\n // Retry tìm header nếu chưa tìm thấy (có thể do SSR hoặc component chưa mount)\r\n let retryCount = 0\r\n const maxRetries = 20 // Tăng số lần retry\r\n const retryInterval = 50 // Giảm interval để tìm nhanh hơn\r\n\r\n const retryTimer = setInterval(() => {\r\n const header = findAndSetHeader()\r\n if (header || retryCount >= maxRetries) {\r\n clearInterval(retryTimer)\r\n }\r\n retryCount++\r\n }, retryInterval)\r\n\r\n // Sử dụng MutationObserver để theo dõi khi header được thêm vào DOM\r\n const observer = new MutationObserver(() => {\r\n findAndSetHeader()\r\n })\r\n\r\n observer.observe(document.body, {\r\n childList: true,\r\n subtree: true,\r\n })\r\n\r\n // Thêm event listener để đo lại khi window resize\r\n const handleResize = () => {\r\n findAndSetHeader()\r\n }\r\n window.addEventListener(\"resize\", handleResize)\r\n\r\n return () => {\r\n clearInterval(retryTimer)\r\n observer.disconnect()\r\n window.removeEventListener(\"resize\", handleResize)\r\n headerSize.ref(null)\r\n }\r\n }, [findAndSetHeader, headerSize])\r\n\r\n useEffect(() => {\r\n // Cập nhật headerHeight khi headerSize.height thay đổi\r\n if (headerSize.height > 0) {\r\n setHeaderHeight(headerSize.height)\r\n } else {\r\n // Nếu chưa có height, thử đo lại bằng getBoundingClientRect\r\n const header = document.querySelector<HTMLElement>(ADMIN_HEADER_SELECTOR) ||\r\n document.querySelector<HTMLElement>(PUBLIC_HEADER_SELECTOR) || \r\n document.querySelector<HTMLElement>(\"header\")\r\n if (header) {\r\n const rect = header.getBoundingClientRect()\r\n if (rect.height > 0) {\r\n setHeaderHeight(rect.height)\r\n }\r\n }\r\n }\r\n }, [headerSize.height])\r\n\r\n return {\r\n headerHeight,\r\n headerRef: headerSize.ref,\r\n }\r\n}\r\n","\"use client\"\r\n\r\n/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\nimport { JSX, useEffect } from \"react\"\r\n\r\nimport { useReport } from \"@/components/editor/editor-hooks/use-report\"\r\n\r\nconst validInputTypes = new Set([\r\n \"insertText\",\r\n \"insertCompositionText\",\r\n \"insertFromComposition\",\r\n \"insertLineBreak\",\r\n \"insertParagraph\",\r\n \"deleteCompositionText\",\r\n \"deleteContentBackward\",\r\n \"deleteByComposition\",\r\n \"deleteContent\",\r\n \"deleteContentForward\",\r\n \"deleteWordBackward\",\r\n \"deleteWordForward\",\r\n \"deleteHardLineBackward\",\r\n \"deleteSoftLineBackward\",\r\n \"deleteHardLineForward\",\r\n \"deleteSoftLineForward\",\r\n])\r\n\r\nexport function TypingPerfPlugin(): JSX.Element | null {\r\n const report = useReport()\r\n useEffect(() => {\r\n let start = 0\r\n let timerId: ReturnType<typeof setTimeout> | null\r\n let keyPressTimerId: ReturnType<typeof setTimeout> | null\r\n let log: Array<DOMHighResTimeStamp> = []\r\n let invalidatingEvent = false\r\n\r\n const measureEventEnd = function logKeyPress() {\r\n if (keyPressTimerId != null) {\r\n if (invalidatingEvent) {\r\n invalidatingEvent = false\r\n } else {\r\n log.push(performance.now() - start)\r\n }\r\n\r\n clearTimeout(keyPressTimerId)\r\n keyPressTimerId = null\r\n }\r\n }\r\n\r\n const measureEventStart = function measureEvent() {\r\n if (timerId != null) {\r\n clearTimeout(timerId)\r\n timerId = null\r\n }\r\n\r\n // We use a setTimeout(0) instead of requestAnimationFrame, due to\r\n // inconsistencies between the sequencing of rAF in different browsers.\r\n keyPressTimerId = setTimeout(measureEventEnd, 0)\r\n // Schedule a timer to report the results.\r\n timerId = setTimeout(() => {\r\n const total = log.reduce((a, b) => a + b, 0)\r\n const reportedText =\r\n \"Typing Perf: \" + Math.round((total / log.length) * 100) / 100 + \"ms\"\r\n report(reportedText)\r\n log = []\r\n }, 2000)\r\n // Make the time after we do the previous logic, so we don't measure the overhead\r\n // for it all.\r\n start = performance.now()\r\n }\r\n\r\n const beforeInputHandler = function beforeInputHandler(event: InputEvent) {\r\n if (!validInputTypes.has(event.inputType) || invalidatingEvent) {\r\n invalidatingEvent = false\r\n return\r\n }\r\n\r\n measureEventStart()\r\n }\r\n\r\n const keyDownHandler = function keyDownHandler(event: KeyboardEvent) {\r\n const key = event.key\r\n\r\n if (key === \"Backspace\" || key === \"Enter\") {\r\n measureEventStart()\r\n }\r\n }\r\n\r\n const pasteHandler = function pasteHandler() {\r\n invalidatingEvent = true\r\n }\r\n\r\n const cutHandler = function cutHandler() {\r\n invalidatingEvent = true\r\n }\r\n\r\n window.addEventListener(\"keydown\", keyDownHandler, true)\r\n window.addEventListener(\"selectionchange\", measureEventEnd, true)\r\n window.addEventListener(\"beforeinput\", beforeInputHandler, true)\r\n window.addEventListener(\"paste\", pasteHandler, true)\r\n window.addEventListener(\"cut\", cutHandler, true)\r\n\r\n return () => {\r\n window.removeEventListener(\"keydown\", keyDownHandler, true)\r\n window.removeEventListener(\"selectionchange\", measureEventEnd, true)\r\n window.removeEventListener(\"beforeinput\", beforeInputHandler, true)\r\n window.removeEventListener(\"paste\", pasteHandler, true)\r\n window.removeEventListener(\"cut\", cutHandler, true)\r\n }\r\n }, [report])\r\n\r\n return null\r\n}\r\n","import { TextMatchTransformer } from \"@lexical/markdown\"\r\nimport { $createTextNode } from \"lexical\"\r\n\r\nimport emojiList from \"@/components/editor/utils/emoji-list\"\r\n\r\nexport const EMOJI: TextMatchTransformer = {\r\n dependencies: [],\r\n export: () => null,\r\n importRegExp: /:([a-z0-9_]+):/,\r\n regExp: /:([a-z0-9_]+):/,\r\n replace: (textNode, [, name]) => {\r\n const emoji = emojiList.find((e) => e.aliases.includes(name))?.emoji\r\n if (emoji) {\r\n textNode.replace($createTextNode(emoji))\r\n }\r\n },\r\n trigger: \":\",\r\n type: \"text-match\",\r\n}\r\n","import { ElementTransformer } from \"@lexical/markdown\"\r\nimport {\r\n $createHorizontalRuleNode,\r\n $isHorizontalRuleNode,\r\n HorizontalRuleNode,\r\n} from \"@lexical/react/LexicalHorizontalRuleNode\"\r\nimport { LexicalNode } from \"lexical\"\r\n\r\nexport const HR: ElementTransformer = {\r\n dependencies: [HorizontalRuleNode],\r\n export: (node: LexicalNode) => {\r\n return $isHorizontalRuleNode(node) ? \"***\" : null\r\n },\r\n regExp: /^(---|\\*\\*\\*|___)\\s?$/,\r\n replace: (parentNode, _1, _2, isImport) => {\r\n const line = $createHorizontalRuleNode()\r\n\r\n // TODO: Get rid of isImport flag\r\n if (isImport || parentNode.getNextSibling() != null) {\r\n parentNode.replace(line)\r\n } else {\r\n parentNode.insertBefore(line)\r\n }\r\n\r\n line.selectNext()\r\n },\r\n type: \"element\",\r\n}\r\n","import { TextMatchTransformer } from \"@lexical/markdown\"\r\n\r\nimport {\r\n $createImageNode,\r\n $isImageNode,\r\n ImageNode,\r\n} from \"@/components/editor/nodes/image-node\"\r\n\r\nexport const IMAGE: TextMatchTransformer = {\r\n dependencies: [ImageNode],\r\n export: (node) => {\r\n if (!$isImageNode(node)) {\r\n return null\r\n }\r\n\r\n return `![${node.getAltText()}](${node.getSrc()})`\r\n },\r\n importRegExp: /!(?:\\[([^[]*)\\])(?:\\(([^(]+)\\))/,\r\n regExp: /!(?:\\[([^[]*)\\])(?:\\(([^(]+)\\))$/,\r\n replace: (textNode, match) => {\r\n const [, altText, src] = match\r\n const imageNode = $createImageNode({\r\n altText,\r\n maxWidth: 800,\r\n src,\r\n })\r\n textNode.replace(imageNode)\r\n },\r\n trigger: \")\",\r\n type: \"text-match\",\r\n}\r\n","import {\r\n $convertFromMarkdownString,\r\n $convertToMarkdownString,\r\n CHECK_LIST,\r\n ELEMENT_TRANSFORMERS,\r\n ElementTransformer,\r\n MULTILINE_ELEMENT_TRANSFORMERS,\r\n TEXT_FORMAT_TRANSFORMERS,\r\n TEXT_MATCH_TRANSFORMERS,\r\n} from \"@lexical/markdown\"\r\nimport {\r\n $createTableCellNode,\r\n $createTableNode,\r\n $createTableRowNode,\r\n $isTableCellNode,\r\n $isTableNode,\r\n $isTableRowNode,\r\n TableCellHeaderStates,\r\n TableCellNode,\r\n TableNode,\r\n TableRowNode,\r\n} from \"@lexical/table\"\r\nimport { $isParagraphNode, $isTextNode, LexicalNode } from \"lexical\"\r\n\r\nimport { HR } from \"@/components/editor/transformers/markdown-hr-transformer\"\r\nimport { IMAGE } from \"@/components/editor/transformers/markdown-image-transformer\"\r\n\r\n// Very primitive table setup\r\nconst TABLE_ROW_REG_EXP = /^(?:\\|)(.+)(?:\\|)\\s?$/\r\nconst TABLE_ROW_DIVIDER_REG_EXP = /^(\\| ?:?-*:? ?)+\\|\\s?$/\r\n\r\nconst OTHER_MARKDOWN_TRANSFORMERS = [\r\n HR,\r\n IMAGE,\r\n // EMOJI,\r\n // TWEET,\r\n CHECK_LIST,\r\n ...ELEMENT_TRANSFORMERS,\r\n ...MULTILINE_ELEMENT_TRANSFORMERS,\r\n ...TEXT_FORMAT_TRANSFORMERS,\r\n ...TEXT_MATCH_TRANSFORMERS,\r\n]\r\n\r\nexport const TABLE: ElementTransformer = {\r\n dependencies: [TableNode, TableRowNode, TableCellNode],\r\n export: (node: LexicalNode) => {\r\n if (!$isTableNode(node)) {\r\n return null\r\n }\r\n\r\n const output: string[] = []\r\n\r\n for (const row of node.getChildren()) {\r\n const rowOutput = []\r\n if (!$isTableRowNode(row)) {\r\n continue\r\n }\r\n\r\n let isHeaderRow = false\r\n for (const cell of row.getChildren()) {\r\n // It's TableCellNode so it's just to make flow happy\r\n if ($isTableCellNode(cell)) {\r\n rowOutput.push(\r\n $convertToMarkdownString(OTHER_MARKDOWN_TRANSFORMERS, cell).replace(\r\n /\\n/g,\r\n \"\\\\n\"\r\n )\r\n )\r\n if (cell.__headerState === TableCellHeaderStates.ROW) {\r\n isHeaderRow = true\r\n }\r\n }\r\n }\r\n\r\n output.push(`| ${rowOutput.join(\" | \")} |`)\r\n if (isHeaderRow) {\r\n output.push(`| ${rowOutput.map((_) => \"---\").join(\" | \")} |`)\r\n }\r\n }\r\n\r\n return output.join(\"\\n\")\r\n },\r\n regExp: TABLE_ROW_REG_EXP,\r\n replace: (parentNode, _1, match) => {\r\n // Header row\r\n if (TABLE_ROW_DIVIDER_REG_EXP.test(match[0])) {\r\n const table = parentNode.getPreviousSibling()\r\n if (!table || !$isTableNode(table)) {\r\n return\r\n }\r\n\r\n const rows = table.getChildren()\r\n const lastRow = rows[rows.length - 1]\r\n if (!lastRow || !$isTableRowNode(lastRow)) {\r\n return\r\n }\r\n\r\n // Add header state to row cells\r\n lastRow.getChildren().forEach((cell) => {\r\n if (!$isTableCellNode(cell)) {\r\n return\r\n }\r\n cell.setHeaderStyles(\r\n TableCellHeaderStates.ROW,\r\n TableCellHeaderStates.ROW\r\n )\r\n })\r\n\r\n // Remove line\r\n parentNode.remove()\r\n return\r\n }\r\n\r\n const matchCells = mapToTableCells(match[0])\r\n\r\n if (matchCells == null) {\r\n return\r\n }\r\n\r\n const rows = [matchCells]\r\n let sibling = parentNode.getPreviousSibling()\r\n let maxCells = matchCells.length\r\n\r\n while (sibling) {\r\n if (!$isParagraphNode(sibling)) {\r\n break\r\n }\r\n\r\n if (sibling.getChildrenSize() !== 1) {\r\n break\r\n }\r\n\r\n const firstChild = sibling.getFirstChild()\r\n\r\n if (!$isTextNode(firstChild)) {\r\n break\r\n }\r\n\r\n const cells = mapToTableCells(firstChild.getTextContent())\r\n\r\n if (cells == null) {\r\n break\r\n }\r\n\r\n maxCells = Math.max(maxCells, cells.length)\r\n rows.unshift(cells)\r\n const previousSibling = sibling.getPreviousSibling()\r\n sibling.remove()\r\n sibling = previousSibling\r\n }\r\n\r\n const table = $createTableNode()\r\n\r\n for (const cells of rows) {\r\n const tableRow = $createTableRowNode()\r\n table.append(tableRow)\r\n\r\n for (let i = 0; i < maxCells; i++) {\r\n tableRow.append(i < cells.length ? cells[i] : $createTableCell(\"\"))\r\n }\r\n }\r\n\r\n const previousSibling = parentNode.getPreviousSibling()\r\n if (\r\n $isTableNode(previousSibling) &&\r\n getTableColumnsSize(previousSibling) === maxCells\r\n ) {\r\n previousSibling.append(...table.getChildren())\r\n parentNode.remove()\r\n } else {\r\n parentNode.replace(table)\r\n }\r\n\r\n table.selectEnd()\r\n },\r\n type: \"element\",\r\n}\r\n\r\nfunction getTableColumnsSize(table: TableNode) {\r\n const row = table.getFirstChild()\r\n return $isTableRowNode(row) ? row.getChildrenSize() : 0\r\n}\r\n\r\nconst $createTableCell = (textContent: string): TableCellNode => {\r\n textContent = textContent.replace(/\\\\n/g, \"\\n\")\r\n const cell = $createTableCellNode(TableCellHeaderStates.NO_STATUS)\r\n $convertFromMarkdownString(textContent, OTHER_MARKDOWN_TRANSFORMERS, cell)\r\n return cell\r\n}\r\n\r\nconst mapToTableCells = (textContent: string): Array<TableCellNode> | null => {\r\n const match = textContent.match(TABLE_ROW_REG_EXP)\r\n if (!match || !match[1]) {\r\n return null\r\n }\r\n return match[1].split(\"|\").map((text) => $createTableCell(text))\r\n}\r\n","import { ElementTransformer } from \"@lexical/markdown\"\r\n\r\nimport {\r\n $createTweetNode,\r\n $isTweetNode,\r\n TweetNode,\r\n} from \"@/components/editor/nodes/embeds/tweet-node\"\r\n\r\nexport const TWEET: ElementTransformer = {\r\n dependencies: [TweetNode],\r\n export: (node) => {\r\n if (!$isTweetNode(node)) {\r\n return null\r\n }\r\n\r\n return `<tweet id=\"${node.getId()}\" />`\r\n },\r\n regExp: /<tweet id=\"([^\"]+?)\"\\s?\\/>\\s?$/,\r\n replace: (textNode, _1, match) => {\r\n const [, id] = match\r\n const tweetNode = $createTweetNode(id)\r\n textNode.replace(tweetNode)\r\n },\r\n type: \"element\",\r\n}\r\n"],"mappings":"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ACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,E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EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,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","names":["import_jsx_runtime","import_react","import_jsx_runtime","React","import_jsx_runtime","init_typography","React","import_react","import_utils","import_jsx_runtime","init_typography","import_lucide_react","import_jsx_runtime","React","import_class_variance_authority","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","CollapsibleTrigger","CollapsibleContent","import_class_variance_authority","import_jsx_runtime","CollapsibleTrigger","CollapsibleContent","Image","nodes","import_react","React","import_LexicalComposerContext","import_utils","import_lexical","import_lucide_react","import_jsx_runtime","init_typography","import_react","import_react","Image","import_react","import_image","import_jsx_runtime","Image","import_image","import_jsx_runtime","import_jsx_runtime","placeholder","LexicalContentEditable","import_jsx_runtime","import_jsx_runtime","import_react","import_lexical","import_react","import_lexical","import_useLexicalNodeSelection","import_utils","import_react","import_LexicalComposerContext","import_useLexicalEditable","import_lexical","import_lucide_react","import_jsx_runtime","React","import_react","import_lexical","import_jsx_runtime","ImageComponent","import_list","import_lexical","import_lexical","import_utils","uuid","import_react","import_jsx_runtime","React","import_LexicalBlockWithAlignableContents","import_utils","import_LexicalDecoratorBlockNode","import_lexical","import_jsx_runtime","import_lexical","import_lexical","import_utils","import_lexical","import_utils","import_lexical","import_lexical","import_lexical","Klass","import_react","import_markdown","import_LexicalErrorBoundary","import_LexicalHistoryPlugin","import_LexicalRichTextPlugin","import_LexicalComposerContext","import_lexical","import_lucide_react","init_typography","import_jsx_runtime","import_react","import_LexicalComposerContext","init_typography","React","import_class_variance_authority","import_jsx_runtime","React","import_class_variance_authority","import_jsx_runtime","import_jsx_runtime","import_react","import_LexicalComposerContext","import_lucide_react","init_typography","import_jsx_runtime","import_LexicalComposerContext","import_lucide_react","init_typography","import_jsx_runtime","import_react","import_code","import_LexicalComposerContext","import_lexical","import_lucide_react","init_typography","import_jsx_runtime","import_react","import_file","import_LexicalComposerContext","import_lexical","import_lucide_react","init_typography","import_jsx_runtime","import_react","import_LexicalComposerContext","import_lexical","import_lucide_react","import_react","init_typography","import_jsx_runtime","import_LexicalComposerContext","import_lucide_react","import_class_variance_authority","import_jsx_runtime","init_typography","import_jsx_runtime","import_jsx_runtime","LexicalAutoLinkPlugin","import_react","import_code","import_LexicalComposerContext","import_lexical","import_react","debounce","import_react","import_code","import_lexical","import_lucide_react","init_typography","import_jsx_runtime","import_jsx_runtime","import_react","import_code","import_LexicalComposerContext","import_react","import_LexicalComposerContext","import_react_dom","import_react","import_jsx_runtime","import_lucide_react","import_jsx_runtime","CommandPrimitive","CommandPrimitive","CommandPrimitive","CommandPrimitive","import_jsx_runtime","dynamic","editor","import_react","import_link","import_LexicalComposerContext","import_table","import_list","import_utils","import_lexical","import_react","import_LexicalComposerContext","import_utils","import_lexical","React","import_lucide_react","import_jsx_runtime","React","import_react_slot","import_class_variance_authority","import_lucide_react","import_jsx_runtime","import_jsx_runtime","ColorPickerRoot","format","import_jsx_runtime","React","import_LexicalComposerContext","import_utils","import_lexical","import_list","import_jsx_runtime","import_lucide_react","init_typography","import_jsx_runtime","nodes","import_react","import_LexicalComposerContext","import_rich_text","import_utils","import_lexical","import_react","import_lucide_react","init_typography","import_jsx_runtime","import_react","import_LexicalComposerContext","import_lucide_react","import_react","import_LexicalComposerContext","import_utils","import_lexical","import_react","import_LexicalComposerContext","import_utils","import_lexical","init_typography","import_jsx_runtime","debounce","import_react","import_dynamic","import_LexicalComposerContext","import_LexicalTypeaheadMenuPlugin","import_lexical","import_react_dom","import_jsx_runtime","LexicalTypeaheadMenuPlugin","dynamic","emojis","import_react","import_LexicalComposerContext","import_lexical","import_react","import_link","import_LexicalComposerContext","import_utils","import_lexical","import_lucide_react","import_react_dom","import_selection","init_typography","import_jsx_runtime","nodes","import_react","import_code","import_link","import_selection","import_LexicalComposerContext","import_utils","import_lexical","import_lucide_react","import_react_dom","VERTICAL_GAP","HORIZONTAL_OFFSET","React","import_class_variance_authority","import_jsx_runtime","import_jsx_runtime","init_typography","import_jsx_runtime","import_react","import_LexicalComposerContext","import_jsx_runtime","LexicalLinkPlugin","import_react","import_list","import_LexicalComposerContext","import_lexical","import_react","import_dynamic","import_LexicalComposerContext","import_LexicalTypeaheadMenuPlugin","import_lucide_react","import_react_dom","init_typography","import_jsx_runtime","LexicalTypeaheadMenuPlugin","dynamic","import_lexical","import_lucide_react","import_LexicalTypeaheadMenuPlugin","init_typography","import_jsx_runtime","import_list","import_lucide_react","init_typography","import_jsx_runtime","import_list","import_lucide_react","init_typography","import_jsx_runtime","import_code","import_selection","import_lexical","import_lucide_react","init_typography","import_jsx_runtime","import_lucide_react","init_typography","import_jsx_runtime","import_LexicalHorizontalRuleNode","import_lucide_react","init_typography","import_jsx_runtime","import_LexicalAutoEmbedPlugin","import_rich_text","import_selection","import_lexical","import_lucide_react","init_typography","import_jsx_runtime","import_lucide_react","init_typography","import_jsx_runtime","import_list","import_lucide_react","init_typography","import_jsx_runtime","import_selection","import_lexical","import_lucide_react","init_typography","import_jsx_runtime","import_rich_text","import_selection","import_lexical","import_lucide_react","init_typography","import_jsx_runtime","import_table","import_lucide_react","import_react","import_LexicalComposerContext","import_table","import_lexical","import_jsx_runtime","init_typography","import_jsx_runtime","import_react","import_LexicalComposerContext","import_lexical","COMMAND_PRIORITY_LOW","import_react","import_LexicalComposerContext","import_useLexicalEditable","import_table","import_lexical","import_list","import_rich_text","import_utils","import_lexical","import_react","import_react","import_jsx_runtime","import_react","import_LexicalComposerContext","import_lexical","import_lucide_react","init_typography","import_jsx_runtime","import_jsx_runtime","import_list","import_selection","import_lexical","import_jsx_runtime","import_list","import_selection","import_lexical","import_jsx_runtime","BLOCK_FORMAT_VALUE","import_code","import_selection","import_lexical","import_jsx_runtime","BLOCK_FORMAT_VALUE","import_rich_text","import_selection","import_lexical","import_jsx_runtime","import_list","import_selection","import_lexical","import_jsx_runtime","BLOCK_FORMAT_VALUE","import_selection","import_lexical","import_jsx_runtime","BLOCK_FORMAT_VALUE","import_rich_text","import_selection","import_lexical","import_jsx_runtime","BLOCK_FORMAT_VALUE","import_lucide_react","init_typography","import_jsx_runtime","import_lucide_react","init_typography","import_jsx_runtime","import_jsx_runtime","import_LexicalHorizontalRuleNode","import_lucide_react","init_typography","import_jsx_runtime","import_lucide_react","init_typography","import_jsx_runtime","import_lucide_react","init_typography","import_jsx_runtime","import_react","import_LexicalDecoratorBlockNode","import_rich_text","import_table","import_utils","import_lexical","import_lucide_react","init_typography","import_jsx_runtime","nodes","import_react","import_code","import_list","import_utils","import_lexical","import_jsx_runtime","import_react","import_link","import_utils","import_lexical","import_lucide_react","init_typography","import_jsx_runtime","node","import_react","import_selection","import_utils","import_lexical","import_lucide_react","init_typography","import_jsx_runtime","import_react","import_selection","import_lexical","import_lucide_react","init_typography","import_jsx_runtime","import_react","import_selection","import_lexical","import_lucide_react","init_typography","import_jsx_runtime","import_react","import_table","import_lexical","import_lucide_react","init_typography","import_jsx_runtime","Icon","import_react","import_selection","import_lexical","import_lucide_react","import_react_slot","import_class_variance_authority","import_jsx_runtime","init_typography","import_jsx_runtime","import_react","import_LexicalComposerContext","import_utils","import_lexical","import_lucide_react","init_typography","import_jsx_runtime","import_react","import_link","import_lexical","import_lucide_react","init_typography","import_jsx_runtime","import_react","import_table","import_lexical","import_lucide_react","init_typography","import_jsx_runtime","import_react","import_LexicalComposerContext","import_lexical","import_react","import_react","import_jsx_runtime","import_react","beforeInputHandler","keyDownHandler","pasteHandler","cutHandler","import_lexical","import_LexicalHorizontalRuleNode","import_markdown","import_table","import_lexical","table","rows","previousSibling","import_jsx_runtime","import_jsx_runtime","editorState"]}