@liveblocks/react-ui 2.7.0-beta2 → 2.7.0-versions

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (142) hide show
  1. package/_private/README.md +5 -0
  2. package/_private/package.json +4 -0
  3. package/dist/_private/index.d.mts +72 -0
  4. package/dist/_private/index.d.ts +72 -0
  5. package/dist/_private/index.js +46 -0
  6. package/dist/_private/index.js.map +1 -0
  7. package/dist/_private/index.mjs +21 -0
  8. package/dist/_private/index.mjs.map +1 -0
  9. package/dist/components/Comment.js +7 -65
  10. package/dist/components/Comment.js.map +1 -1
  11. package/dist/components/Comment.mjs +9 -66
  12. package/dist/components/Comment.mjs.map +1 -1
  13. package/dist/components/Composer.js +101 -217
  14. package/dist/components/Composer.js.map +1 -1
  15. package/dist/components/Composer.mjs +104 -220
  16. package/dist/components/Composer.mjs.map +1 -1
  17. package/dist/components/HistoryVersionSummary.js +42 -0
  18. package/dist/components/HistoryVersionSummary.js.map +1 -0
  19. package/dist/components/HistoryVersionSummary.mjs +40 -0
  20. package/dist/components/HistoryVersionSummary.mjs.map +1 -0
  21. package/dist/components/HistoryVersionSummaryList.js +22 -0
  22. package/dist/components/HistoryVersionSummaryList.js.map +1 -0
  23. package/dist/components/HistoryVersionSummaryList.mjs +20 -0
  24. package/dist/components/HistoryVersionSummaryList.mjs.map +1 -0
  25. package/dist/components/InboxNotification.js +10 -28
  26. package/dist/components/InboxNotification.js.map +1 -1
  27. package/dist/components/InboxNotification.mjs +10 -28
  28. package/dist/components/InboxNotification.mjs.map +1 -1
  29. package/dist/components/Thread.js +0 -2
  30. package/dist/components/Thread.js.map +1 -1
  31. package/dist/components/Thread.mjs +0 -2
  32. package/dist/components/Thread.mjs.map +1 -1
  33. package/dist/components/internal/Button.js +8 -1
  34. package/dist/components/internal/Button.js.map +1 -1
  35. package/dist/components/internal/Button.mjs +8 -1
  36. package/dist/components/internal/Button.mjs.map +1 -1
  37. package/dist/components/internal/EmojiPicker.js +3 -3
  38. package/dist/components/internal/EmojiPicker.js.map +1 -1
  39. package/dist/components/internal/EmojiPicker.mjs +3 -3
  40. package/dist/components/internal/EmojiPicker.mjs.map +1 -1
  41. package/dist/components/internal/InboxNotificationThread.js +2 -10
  42. package/dist/components/internal/InboxNotificationThread.js.map +1 -1
  43. package/dist/components/internal/InboxNotificationThread.mjs +3 -11
  44. package/dist/components/internal/InboxNotificationThread.mjs.map +1 -1
  45. package/dist/components/internal/User.js +3 -19
  46. package/dist/components/internal/User.js.map +1 -1
  47. package/dist/components/internal/User.mjs +3 -19
  48. package/dist/components/internal/User.mjs.map +1 -1
  49. package/dist/icons/ArrowUp.js +15 -0
  50. package/dist/icons/ArrowUp.js.map +1 -0
  51. package/dist/icons/ArrowUp.mjs +13 -0
  52. package/dist/icons/ArrowUp.mjs.map +1 -0
  53. package/dist/icons/{Warning.js → Missing.js} +3 -3
  54. package/dist/icons/{Warning.js.map → Missing.js.map} +1 -1
  55. package/dist/icons/{Warning.mjs → Missing.mjs} +3 -3
  56. package/dist/icons/{Warning.mjs.map → Missing.mjs.map} +1 -1
  57. package/dist/icons/Restore.js +17 -0
  58. package/dist/icons/Restore.js.map +1 -0
  59. package/dist/icons/Restore.mjs +15 -0
  60. package/dist/icons/Restore.mjs.map +1 -0
  61. package/dist/icons/Spinner.js +9 -3
  62. package/dist/icons/Spinner.js.map +1 -1
  63. package/dist/icons/Spinner.mjs +10 -4
  64. package/dist/icons/Spinner.mjs.map +1 -1
  65. package/dist/index.d.mts +74 -70
  66. package/dist/index.d.ts +74 -70
  67. package/dist/index.js +6 -0
  68. package/dist/index.js.map +1 -1
  69. package/dist/index.mjs +3 -0
  70. package/dist/index.mjs.map +1 -1
  71. package/dist/overrides.js +5 -6
  72. package/dist/overrides.js.map +1 -1
  73. package/dist/overrides.mjs +5 -6
  74. package/dist/overrides.mjs.map +1 -1
  75. package/dist/primitives/Composer/contexts.js +3 -17
  76. package/dist/primitives/Composer/contexts.js.map +1 -1
  77. package/dist/primitives/Composer/contexts.mjs +4 -15
  78. package/dist/primitives/Composer/contexts.mjs.map +1 -1
  79. package/dist/primitives/Composer/index.js +26 -185
  80. package/dist/primitives/Composer/index.js.map +1 -1
  81. package/dist/primitives/Composer/index.mjs +31 -188
  82. package/dist/primitives/Composer/index.mjs.map +1 -1
  83. package/dist/primitives/Composer/utils.js +0 -224
  84. package/dist/primitives/Composer/utils.js.map +1 -1
  85. package/dist/primitives/Composer/utils.mjs +1 -222
  86. package/dist/primitives/Composer/utils.mjs.map +1 -1
  87. package/dist/primitives/EmojiPicker/utils.js +2 -2
  88. package/dist/primitives/EmojiPicker/utils.js.map +1 -1
  89. package/dist/primitives/EmojiPicker/utils.mjs +1 -1
  90. package/dist/primitives/EmojiPicker/utils.mjs.map +1 -1
  91. package/dist/primitives/index.d.mts +3 -83
  92. package/dist/primitives/index.d.ts +3 -83
  93. package/dist/primitives/index.js +0 -4
  94. package/dist/primitives/index.js.map +1 -1
  95. package/dist/primitives/index.mjs +0 -2
  96. package/dist/primitives/index.mjs.map +1 -1
  97. package/dist/utils/chunk.js +12 -0
  98. package/dist/utils/chunk.js.map +1 -0
  99. package/dist/utils/chunk.mjs +10 -0
  100. package/dist/utils/chunk.mjs.map +1 -0
  101. package/dist/utils/intl.js +0 -6
  102. package/dist/utils/intl.js.map +1 -1
  103. package/dist/utils/intl.mjs +1 -6
  104. package/dist/utils/intl.mjs.map +1 -1
  105. package/dist/utils/use-initial.js +1 -2
  106. package/dist/utils/use-initial.js.map +1 -1
  107. package/dist/utils/use-initial.mjs +2 -3
  108. package/dist/utils/use-initial.mjs.map +1 -1
  109. package/dist/version.js +1 -1
  110. package/dist/version.js.map +1 -1
  111. package/dist/version.mjs +1 -1
  112. package/dist/version.mjs.map +1 -1
  113. package/package.json +16 -4
  114. package/src/styles/dark/index.css +0 -1
  115. package/src/styles/index.css +219 -325
  116. package/src/styles/utils.css +6 -44
  117. package/styles/dark/attributes.css +1 -1
  118. package/styles/dark/attributes.css.map +1 -1
  119. package/styles/dark/media-query.css +1 -1
  120. package/styles/dark/media-query.css.map +1 -1
  121. package/styles.css +1 -1
  122. package/styles.css.map +1 -1
  123. package/dist/components/internal/Attachment.js +0 -207
  124. package/dist/components/internal/Attachment.js.map +0 -1
  125. package/dist/components/internal/Attachment.mjs +0 -205
  126. package/dist/components/internal/Attachment.mjs.map +0 -1
  127. package/dist/icons/Attachment.js +0 -15
  128. package/dist/icons/Attachment.js.map +0 -1
  129. package/dist/icons/Attachment.mjs +0 -13
  130. package/dist/icons/Attachment.mjs.map +0 -1
  131. package/dist/primitives/FileSize.js +0 -33
  132. package/dist/primitives/FileSize.js.map +0 -1
  133. package/dist/primitives/FileSize.mjs +0 -31
  134. package/dist/primitives/FileSize.mjs.map +0 -1
  135. package/dist/utils/download.js +0 -14
  136. package/dist/utils/download.js.map +0 -1
  137. package/dist/utils/download.mjs +0 -12
  138. package/dist/utils/download.mjs.map +0 -1
  139. package/dist/utils/format-file-size.js +0 -45
  140. package/dist/utils/format-file-size.js.map +0 -1
  141. package/dist/utils/format-file-size.mjs +0 -43
  142. package/dist/utils/format-file-size.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sources":["../../../src/primitives/EmojiPicker/utils.ts"],"sourcesContent":["import { chunk } from \"@liveblocks/core\";\nimport type {\n Emoji as EmojibaseEmoji,\n Locale as EmojibaseLocale,\n MessagesDataset as EmojibaseMessagesDataset,\n} from \"emojibase\";\n\nimport { EMOJI_FONT_FAMILY } from \"../../constants\";\nimport { capitalize } from \"../../utils/capitalize\";\nimport type {\n Emoji,\n EmojiCategory,\n EmojiData,\n EmojiPickerData,\n EmojiPickerRow,\n} from \"./types\";\n\nconst EMOJIBASE_VERSION = \"15.3.0\";\nconst EMOJIBASE_CDN_URL = `https://cdn.jsdelivr.net/npm/emojibase-data@${EMOJIBASE_VERSION}`;\nconst EMOJIBASE_EMOJIS_URL = (locale: EmojibaseLocale) =>\n `${EMOJIBASE_CDN_URL}/${locale}/data.json`;\nconst EMOJIBASE_MESSAGES_URL = (locale: EmojibaseLocale) =>\n `${EMOJIBASE_CDN_URL}/${locale}/messages.json`;\nconst EMOJIBASE_LOCALES: EmojibaseLocale[] = [\n \"bn\",\n \"da\",\n \"de\",\n \"en\",\n \"en-gb\",\n \"es\",\n \"es-mx\",\n \"et\",\n \"fi\",\n \"fr\",\n \"hi\",\n \"hu\",\n \"it\",\n \"ja\",\n \"ko\",\n \"lt\",\n \"ms\",\n \"nb\",\n \"nl\",\n \"pl\",\n \"pt\",\n \"ru\",\n \"sv\",\n \"th\",\n \"uk\",\n \"zh\",\n \"zh-hant\",\n];\nconst EMOJIBASE_DEFAULT_LOCALE: EmojibaseLocale = \"en\";\n\nconst CACHE_EMOJI_DATA_KEY = (locale: string) => `lb-emoji-data-${locale}`;\nconst CACHE_EMOJI_METADATA_KEY = (locale: string) =>\n `lb-emoji-metadata-${locale}`;\nconst CACHE_EMOJI_SESSION_METADATA_KEY = \"lb-emoji-metadata\";\n\nconst EMOJI_DETECTION_CANVAS_WIDTH = 20;\nconst EMOJI_DETECTION_CANVAS_HEIGHT = 25;\nconst EMOJI_DETECTION_COUNTRY_FLAG = \"🇫🇷\";\n\ntype EmojiMetadata = {\n emojisEtag: string | null;\n messagesEtag: string | null;\n};\n\ntype EmojiSessionMetadata = {\n emojiVersion: number;\n countryFlags: boolean;\n};\n\nfunction generateRangeIndices(start: number, end: number) {\n const range: number[] = [];\n\n for (let i = start; i <= end; i++) {\n range.push(i);\n }\n\n return range;\n}\n\nfunction getStorageItem<T>(storage: Storage, key: string) {\n const item = storage.getItem(key);\n\n return item ? (JSON.parse(item) as T) : null;\n}\n\nfunction setStorageItem<T>(storage: Storage, key: string, value: T) {\n storage.setItem(key, JSON.stringify(value));\n}\n\nasync function fetchEtag(url: string) {\n try {\n const response = await fetch(url, { method: \"HEAD\" });\n\n return response.headers.get(\"etag\");\n } catch (error) {\n return null;\n }\n}\n\nfunction getEmojibaseSupportedLocale(locale: string): EmojibaseLocale {\n return EMOJIBASE_LOCALES.includes(locale as EmojibaseLocale)\n ? (locale as EmojibaseLocale)\n : EMOJIBASE_DEFAULT_LOCALE;\n}\n\nasync function fetchEmojibaseData(locale: EmojibaseLocale) {\n const [{ emojis, emojisEtag }, { messages, messagesEtag }] =\n await Promise.all([\n fetch(EMOJIBASE_EMOJIS_URL(locale)).then(async (response) => {\n return {\n emojis: (await response.json()) as EmojibaseEmoji[],\n emojisEtag: response.headers.get(\"etag\"),\n };\n }),\n fetch(EMOJIBASE_MESSAGES_URL(locale)).then(async (response) => {\n return {\n messages: (await response.json()) as EmojibaseMessagesDataset,\n messagesEtag: response.headers.get(\"etag\"),\n };\n }),\n ]);\n\n return {\n emojis,\n messages,\n emojisEtag,\n messagesEtag,\n };\n}\n\nasync function fetchEmojibaseEtags(locale: EmojibaseLocale) {\n const [emojisEtag, messagesEtag] = await Promise.all([\n fetchEtag(EMOJIBASE_EMOJIS_URL(locale)),\n fetchEtag(EMOJIBASE_MESSAGES_URL(locale)),\n ]);\n\n return {\n emojisEtag,\n messagesEtag,\n };\n}\n\nasync function fetchEmojiData(locale: EmojibaseLocale): Promise<EmojiData> {\n const { emojis, emojisEtag, messages, messagesEtag } =\n await fetchEmojibaseData(locale);\n const countryFlagsSubgroup = messages.subgroups.find(\n (subgroup) => subgroup.key === \"subdivision-flag\"\n );\n\n // Filter out component/modifier category and emojis\n const filteredGroups = messages.groups.filter(\n (group) => group.key !== \"component\"\n );\n const filteredEmojis = emojis.filter((emoji) => {\n return \"group\" in emoji;\n });\n\n // Pick and compact the data\n const categories = filteredGroups.map((group) => ({\n key: group.order,\n name: capitalize(group.message),\n }));\n const skinTones = messages.skinTones.map((skinTone) => ({\n key: skinTone.key,\n name: capitalize(skinTone.message),\n }));\n const compactEmojis = filteredEmojis.map((emoji) => {\n const compactEmoji: Emoji = {\n emoji: emoji.emoji,\n category: emoji.group!,\n version: emoji.version,\n name: capitalize(emoji.label),\n tags: emoji.tags,\n };\n\n if (countryFlagsSubgroup && emoji.subgroup === countryFlagsSubgroup.order) {\n compactEmoji.countryFlag = true;\n }\n\n return compactEmoji;\n });\n\n const emojiData = {\n emojis: compactEmojis,\n categories,\n skinTones,\n };\n\n // Cache the data and metadata\n setStorageItem<EmojiData>(\n localStorage,\n CACHE_EMOJI_DATA_KEY(locale),\n emojiData\n );\n setStorageItem<EmojiMetadata>(\n localStorage,\n CACHE_EMOJI_METADATA_KEY(locale),\n {\n emojisEtag,\n messagesEtag,\n }\n );\n\n return emojiData;\n}\n\n// Adapted from https://github.com/koala-interactive/is-emoji-supported/tree/master\nfunction detectEmojiSupport(\n canvasContext: CanvasRenderingContext2D,\n emoji: string\n): boolean {\n canvasContext.clearRect(\n 0,\n 0,\n EMOJI_DETECTION_CANVAS_WIDTH * 2,\n EMOJI_DETECTION_CANVAS_HEIGHT\n );\n\n // Draw in red on the left\n canvasContext.fillStyle = \"#f00\";\n canvasContext.fillText(emoji, 0, 22);\n\n // Draw in blue on right\n canvasContext.fillStyle = \"#00f\";\n canvasContext.fillText(emoji, EMOJI_DETECTION_CANVAS_WIDTH, 22);\n\n const pixels = canvasContext.getImageData(\n 0,\n 0,\n EMOJI_DETECTION_CANVAS_WIDTH,\n EMOJI_DETECTION_CANVAS_HEIGHT\n ).data;\n const pixelCount = pixels.length;\n let i = 0;\n\n // Search for the first visible pixel\n for (; i < pixelCount && !pixels[i + 3]; i += 4);\n\n // No visible pixel\n if (i >= pixelCount) {\n return false;\n }\n\n // Emojis have an immutable color, so we check the color of the emoji in two\n // different colors, the result should be the same\n const x =\n EMOJI_DETECTION_CANVAS_WIDTH + ((i / 4) % EMOJI_DETECTION_CANVAS_WIDTH);\n const y = Math.floor(i / 4 / EMOJI_DETECTION_CANVAS_WIDTH);\n const pixel = canvasContext.getImageData(x, y, 1, 1).data;\n\n if (pixels[i] !== pixel[0] || pixels[i + 2] !== pixel[2]) {\n return false;\n }\n\n // Unsupported ZWJ sequence emojis show up as separate emojis\n if (canvasContext.measureText(emoji).width >= EMOJI_DETECTION_CANVAS_WIDTH) {\n return false;\n }\n\n return true;\n}\n\nfunction getEmojiFontFamily() {\n try {\n const element = document.createElement(\"span\");\n element.style.display = \"none\";\n element.dataset.emoji = \"\";\n\n document.body.appendChild(element);\n\n const computedFontFamily = window.getComputedStyle(element).fontFamily;\n\n document.body.removeChild(element);\n\n return computedFontFamily;\n } catch {\n return EMOJI_FONT_FAMILY;\n }\n}\n\nfunction getEmojiSessionMetadata(emojis: Emoji[]): EmojiSessionMetadata {\n const versions = new Map<number, string>();\n\n for (const emoji of emojis) {\n if (!versions.has(emoji.version)) {\n versions.set(emoji.version, emoji.emoji);\n }\n }\n\n const descendingVersions = [...versions.keys()].sort((a, b) => b - a);\n\n const canvasContext = document\n .createElement(\"canvas\")\n .getContext(\"2d\", { willReadFrequently: true });\n\n if (!canvasContext) {\n return { emojiVersion: descendingVersions[0], countryFlags: true };\n }\n\n canvasContext.font = `${Math.floor(\n EMOJI_DETECTION_CANVAS_HEIGHT / 2\n )}px ${getEmojiFontFamily()}`;\n canvasContext.textBaseline = \"top\";\n canvasContext.canvas.width = EMOJI_DETECTION_CANVAS_WIDTH * 2;\n canvasContext.canvas.height = EMOJI_DETECTION_CANVAS_HEIGHT;\n\n const supportsCountryFlags = detectEmojiSupport(\n canvasContext,\n EMOJI_DETECTION_COUNTRY_FLAG\n );\n\n for (const version of descendingVersions) {\n const emoji = versions.get(version)!;\n const isSupported = detectEmojiSupport(canvasContext, emoji);\n\n if (isSupported) {\n return {\n emojiVersion: version,\n countryFlags: supportsCountryFlags,\n };\n }\n }\n\n return {\n emojiVersion: descendingVersions[0],\n countryFlags: supportsCountryFlags,\n };\n}\n\nexport async function getEmojiData(locale: string): Promise<EmojiData> {\n const emojibaseLocale = getEmojibaseSupportedLocale(locale);\n\n const sessionMetadata = getStorageItem<EmojiSessionMetadata>(\n sessionStorage,\n CACHE_EMOJI_SESSION_METADATA_KEY\n );\n const cachedData = getStorageItem<EmojiData>(\n localStorage,\n CACHE_EMOJI_DATA_KEY(emojibaseLocale)\n );\n let data: EmojiData;\n\n // If there is data already cached, check if the ETags are the same.\n // If they are, return the cached data, otherwise fetch it again.\n if (cachedData) {\n // ETags only need to be checked once per session\n if (sessionMetadata) {\n data = cachedData;\n } else {\n const { emojisEtag, messagesEtag } =\n await fetchEmojibaseEtags(emojibaseLocale);\n const cachedMetadata = getStorageItem<EmojiMetadata>(\n localStorage,\n CACHE_EMOJI_METADATA_KEY(emojibaseLocale)\n );\n\n if (\n cachedMetadata &&\n emojisEtag === cachedMetadata.emojisEtag &&\n messagesEtag === cachedMetadata.messagesEtag\n ) {\n data = cachedData;\n } else {\n data = await fetchEmojiData(emojibaseLocale);\n }\n }\n } else {\n data = await fetchEmojiData(emojibaseLocale);\n }\n\n const newSessionMetadata =\n sessionMetadata ?? getEmojiSessionMetadata(data.emojis);\n setStorageItem(\n sessionStorage,\n CACHE_EMOJI_SESSION_METADATA_KEY,\n newSessionMetadata\n );\n\n // Filter out unsupported emojis\n const filteredEmojis = data.emojis.filter((emoji) => {\n const isSupportedVersion = emoji.version <= newSessionMetadata.emojiVersion;\n\n return emoji.countryFlag\n ? isSupportedVersion && newSessionMetadata.countryFlags\n : isSupportedVersion;\n });\n\n return {\n emojis: filteredEmojis,\n categories: data.categories,\n skinTones: data.skinTones,\n };\n}\n\nexport function filterEmojis(emojis: Emoji[], search?: string) {\n if (!search) {\n return emojis;\n }\n\n const searchText = search.toLowerCase().trim();\n\n return emojis.filter(\n (emoji) =>\n emoji.name.toLowerCase().includes(searchText) ||\n emoji.tags?.some((tag) => tag.toLowerCase().includes(searchText))\n );\n}\n\nexport function generateEmojiPickerData(\n emojis: Emoji[],\n categories: EmojiCategory[],\n columns: number\n): EmojiPickerData {\n let currentIndex = 0;\n const rows: EmojiPickerRow[] = [];\n const indexedEmojis = emojis.map((emoji, index) => ({ ...emoji, index }));\n const categoriesRowCounts: number[] = [];\n const categoriesRowIndices: number[][] = [];\n const categoriesNames: string[] = [];\n const categorizedEmojis = categories\n .map((category) => ({\n ...category,\n emojis: indexedEmojis.filter((emoji) => emoji.category === category.key),\n }))\n .filter((category) => category.emojis.length > 0);\n\n for (const category of categorizedEmojis) {\n const categoryRows = chunk(category.emojis, columns);\n const nextIndex = currentIndex + categoryRows.length;\n\n rows.push(...categoryRows);\n categoriesNames.push(category.name);\n categoriesRowCounts.push(categoryRows.length);\n categoriesRowIndices.push(\n generateRangeIndices(currentIndex, nextIndex - 1)\n );\n currentIndex = nextIndex;\n }\n\n return {\n count: emojis.length,\n rows,\n categories: categoriesNames,\n categoriesRowCounts,\n categoriesRowIndices,\n };\n}\n"],"names":["capitalize","EMOJI_FONT_FAMILY","chunk"],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","sources":["../../../src/primitives/EmojiPicker/utils.ts"],"sourcesContent":["import type {\n Emoji as EmojibaseEmoji,\n Locale as EmojibaseLocale,\n MessagesDataset as EmojibaseMessagesDataset,\n} from \"emojibase\";\n\nimport { EMOJI_FONT_FAMILY } from \"../../constants\";\nimport { capitalize } from \"../../utils/capitalize\";\nimport { chunk } from \"../../utils/chunk\";\nimport type {\n Emoji,\n EmojiCategory,\n EmojiData,\n EmojiPickerData,\n EmojiPickerRow,\n} from \"./types\";\n\nconst EMOJIBASE_VERSION = \"15.3.0\";\nconst EMOJIBASE_CDN_URL = `https://cdn.jsdelivr.net/npm/emojibase-data@${EMOJIBASE_VERSION}`;\nconst EMOJIBASE_EMOJIS_URL = (locale: EmojibaseLocale) =>\n `${EMOJIBASE_CDN_URL}/${locale}/data.json`;\nconst EMOJIBASE_MESSAGES_URL = (locale: EmojibaseLocale) =>\n `${EMOJIBASE_CDN_URL}/${locale}/messages.json`;\nconst EMOJIBASE_LOCALES: EmojibaseLocale[] = [\n \"bn\",\n \"da\",\n \"de\",\n \"en\",\n \"en-gb\",\n \"es\",\n \"es-mx\",\n \"et\",\n \"fi\",\n \"fr\",\n \"hi\",\n \"hu\",\n \"it\",\n \"ja\",\n \"ko\",\n \"lt\",\n \"ms\",\n \"nb\",\n \"nl\",\n \"pl\",\n \"pt\",\n \"ru\",\n \"sv\",\n \"th\",\n \"uk\",\n \"zh\",\n \"zh-hant\",\n];\nconst EMOJIBASE_DEFAULT_LOCALE: EmojibaseLocale = \"en\";\n\nconst CACHE_EMOJI_DATA_KEY = (locale: string) => `lb-emoji-data-${locale}`;\nconst CACHE_EMOJI_METADATA_KEY = (locale: string) =>\n `lb-emoji-metadata-${locale}`;\nconst CACHE_EMOJI_SESSION_METADATA_KEY = \"lb-emoji-metadata\";\n\nconst EMOJI_DETECTION_CANVAS_WIDTH = 20;\nconst EMOJI_DETECTION_CANVAS_HEIGHT = 25;\nconst EMOJI_DETECTION_COUNTRY_FLAG = \"🇫🇷\";\n\ntype EmojiMetadata = {\n emojisEtag: string | null;\n messagesEtag: string | null;\n};\n\ntype EmojiSessionMetadata = {\n emojiVersion: number;\n countryFlags: boolean;\n};\n\nfunction generateRangeIndices(start: number, end: number) {\n const range: number[] = [];\n\n for (let i = start; i <= end; i++) {\n range.push(i);\n }\n\n return range;\n}\n\nfunction getStorageItem<T>(storage: Storage, key: string) {\n const item = storage.getItem(key);\n\n return item ? (JSON.parse(item) as T) : null;\n}\n\nfunction setStorageItem<T>(storage: Storage, key: string, value: T) {\n storage.setItem(key, JSON.stringify(value));\n}\n\nasync function fetchEtag(url: string) {\n try {\n const response = await fetch(url, { method: \"HEAD\" });\n\n return response.headers.get(\"etag\");\n } catch (error) {\n return null;\n }\n}\n\nfunction getEmojibaseSupportedLocale(locale: string): EmojibaseLocale {\n return EMOJIBASE_LOCALES.includes(locale as EmojibaseLocale)\n ? (locale as EmojibaseLocale)\n : EMOJIBASE_DEFAULT_LOCALE;\n}\n\nasync function fetchEmojibaseData(locale: EmojibaseLocale) {\n const [{ emojis, emojisEtag }, { messages, messagesEtag }] =\n await Promise.all([\n fetch(EMOJIBASE_EMOJIS_URL(locale)).then(async (response) => {\n return {\n emojis: (await response.json()) as EmojibaseEmoji[],\n emojisEtag: response.headers.get(\"etag\"),\n };\n }),\n fetch(EMOJIBASE_MESSAGES_URL(locale)).then(async (response) => {\n return {\n messages: (await response.json()) as EmojibaseMessagesDataset,\n messagesEtag: response.headers.get(\"etag\"),\n };\n }),\n ]);\n\n return {\n emojis,\n messages,\n emojisEtag,\n messagesEtag,\n };\n}\n\nasync function fetchEmojibaseEtags(locale: EmojibaseLocale) {\n const [emojisEtag, messagesEtag] = await Promise.all([\n fetchEtag(EMOJIBASE_EMOJIS_URL(locale)),\n fetchEtag(EMOJIBASE_MESSAGES_URL(locale)),\n ]);\n\n return {\n emojisEtag,\n messagesEtag,\n };\n}\n\nasync function fetchEmojiData(locale: EmojibaseLocale): Promise<EmojiData> {\n const { emojis, emojisEtag, messages, messagesEtag } =\n await fetchEmojibaseData(locale);\n const countryFlagsSubgroup = messages.subgroups.find(\n (subgroup) => subgroup.key === \"subdivision-flag\"\n );\n\n // Filter out component/modifier category and emojis\n const filteredGroups = messages.groups.filter(\n (group) => group.key !== \"component\"\n );\n const filteredEmojis = emojis.filter((emoji) => {\n return \"group\" in emoji;\n });\n\n // Pick and compact the data\n const categories = filteredGroups.map((group) => ({\n key: group.order,\n name: capitalize(group.message),\n }));\n const skinTones = messages.skinTones.map((skinTone) => ({\n key: skinTone.key,\n name: capitalize(skinTone.message),\n }));\n const compactEmojis = filteredEmojis.map((emoji) => {\n const compactEmoji: Emoji = {\n emoji: emoji.emoji,\n category: emoji.group!,\n version: emoji.version,\n name: capitalize(emoji.label),\n tags: emoji.tags,\n };\n\n if (countryFlagsSubgroup && emoji.subgroup === countryFlagsSubgroup.order) {\n compactEmoji.countryFlag = true;\n }\n\n return compactEmoji;\n });\n\n const emojiData = {\n emojis: compactEmojis,\n categories,\n skinTones,\n };\n\n // Cache the data and metadata\n setStorageItem<EmojiData>(\n localStorage,\n CACHE_EMOJI_DATA_KEY(locale),\n emojiData\n );\n setStorageItem<EmojiMetadata>(\n localStorage,\n CACHE_EMOJI_METADATA_KEY(locale),\n {\n emojisEtag,\n messagesEtag,\n }\n );\n\n return emojiData;\n}\n\n// Adapted from https://github.com/koala-interactive/is-emoji-supported/tree/master\nfunction detectEmojiSupport(\n canvasContext: CanvasRenderingContext2D,\n emoji: string\n): boolean {\n canvasContext.clearRect(\n 0,\n 0,\n EMOJI_DETECTION_CANVAS_WIDTH * 2,\n EMOJI_DETECTION_CANVAS_HEIGHT\n );\n\n // Draw in red on the left\n canvasContext.fillStyle = \"#f00\";\n canvasContext.fillText(emoji, 0, 22);\n\n // Draw in blue on right\n canvasContext.fillStyle = \"#00f\";\n canvasContext.fillText(emoji, EMOJI_DETECTION_CANVAS_WIDTH, 22);\n\n const pixels = canvasContext.getImageData(\n 0,\n 0,\n EMOJI_DETECTION_CANVAS_WIDTH,\n EMOJI_DETECTION_CANVAS_HEIGHT\n ).data;\n const pixelCount = pixels.length;\n let i = 0;\n\n // Search for the first visible pixel\n for (; i < pixelCount && !pixels[i + 3]; i += 4);\n\n // No visible pixel\n if (i >= pixelCount) {\n return false;\n }\n\n // Emojis have an immutable color, so we check the color of the emoji in two\n // different colors, the result should be the same\n const x =\n EMOJI_DETECTION_CANVAS_WIDTH + ((i / 4) % EMOJI_DETECTION_CANVAS_WIDTH);\n const y = Math.floor(i / 4 / EMOJI_DETECTION_CANVAS_WIDTH);\n const pixel = canvasContext.getImageData(x, y, 1, 1).data;\n\n if (pixels[i] !== pixel[0] || pixels[i + 2] !== pixel[2]) {\n return false;\n }\n\n // Unsupported ZWJ sequence emojis show up as separate emojis\n if (canvasContext.measureText(emoji).width >= EMOJI_DETECTION_CANVAS_WIDTH) {\n return false;\n }\n\n return true;\n}\n\nfunction getEmojiFontFamily() {\n try {\n const element = document.createElement(\"span\");\n element.style.display = \"none\";\n element.dataset.emoji = \"\";\n\n document.body.appendChild(element);\n\n const computedFontFamily = window.getComputedStyle(element).fontFamily;\n\n document.body.removeChild(element);\n\n return computedFontFamily;\n } catch {\n return EMOJI_FONT_FAMILY;\n }\n}\n\nfunction getEmojiSessionMetadata(emojis: Emoji[]): EmojiSessionMetadata {\n const versions = new Map<number, string>();\n\n for (const emoji of emojis) {\n if (!versions.has(emoji.version)) {\n versions.set(emoji.version, emoji.emoji);\n }\n }\n\n const descendingVersions = [...versions.keys()].sort((a, b) => b - a);\n\n const canvasContext = document\n .createElement(\"canvas\")\n .getContext(\"2d\", { willReadFrequently: true });\n\n if (!canvasContext) {\n return { emojiVersion: descendingVersions[0], countryFlags: true };\n }\n\n canvasContext.font = `${Math.floor(\n EMOJI_DETECTION_CANVAS_HEIGHT / 2\n )}px ${getEmojiFontFamily()}`;\n canvasContext.textBaseline = \"top\";\n canvasContext.canvas.width = EMOJI_DETECTION_CANVAS_WIDTH * 2;\n canvasContext.canvas.height = EMOJI_DETECTION_CANVAS_HEIGHT;\n\n const supportsCountryFlags = detectEmojiSupport(\n canvasContext,\n EMOJI_DETECTION_COUNTRY_FLAG\n );\n\n for (const version of descendingVersions) {\n const emoji = versions.get(version)!;\n const isSupported = detectEmojiSupport(canvasContext, emoji);\n\n if (isSupported) {\n return {\n emojiVersion: version,\n countryFlags: supportsCountryFlags,\n };\n }\n }\n\n return {\n emojiVersion: descendingVersions[0],\n countryFlags: supportsCountryFlags,\n };\n}\n\nexport async function getEmojiData(locale: string): Promise<EmojiData> {\n const emojibaseLocale = getEmojibaseSupportedLocale(locale);\n\n const sessionMetadata = getStorageItem<EmojiSessionMetadata>(\n sessionStorage,\n CACHE_EMOJI_SESSION_METADATA_KEY\n );\n const cachedData = getStorageItem<EmojiData>(\n localStorage,\n CACHE_EMOJI_DATA_KEY(emojibaseLocale)\n );\n let data: EmojiData;\n\n // If there is data already cached, check if the ETags are the same.\n // If they are, return the cached data, otherwise fetch it again.\n if (cachedData) {\n // ETags only need to be checked once per session\n if (sessionMetadata) {\n data = cachedData;\n } else {\n const { emojisEtag, messagesEtag } =\n await fetchEmojibaseEtags(emojibaseLocale);\n const cachedMetadata = getStorageItem<EmojiMetadata>(\n localStorage,\n CACHE_EMOJI_METADATA_KEY(emojibaseLocale)\n );\n\n if (\n cachedMetadata &&\n emojisEtag === cachedMetadata.emojisEtag &&\n messagesEtag === cachedMetadata.messagesEtag\n ) {\n data = cachedData;\n } else {\n data = await fetchEmojiData(emojibaseLocale);\n }\n }\n } else {\n data = await fetchEmojiData(emojibaseLocale);\n }\n\n const newSessionMetadata =\n sessionMetadata ?? getEmojiSessionMetadata(data.emojis);\n setStorageItem(\n sessionStorage,\n CACHE_EMOJI_SESSION_METADATA_KEY,\n newSessionMetadata\n );\n\n // Filter out unsupported emojis\n const filteredEmojis = data.emojis.filter((emoji) => {\n const isSupportedVersion = emoji.version <= newSessionMetadata.emojiVersion;\n\n return emoji.countryFlag\n ? isSupportedVersion && newSessionMetadata.countryFlags\n : isSupportedVersion;\n });\n\n return {\n emojis: filteredEmojis,\n categories: data.categories,\n skinTones: data.skinTones,\n };\n}\n\nexport function filterEmojis(emojis: Emoji[], search?: string) {\n if (!search) {\n return emojis;\n }\n\n const searchText = search.toLowerCase().trim();\n\n return emojis.filter(\n (emoji) =>\n emoji.name.toLowerCase().includes(searchText) ||\n emoji.tags?.some((tag) => tag.toLowerCase().includes(searchText))\n );\n}\n\nexport function generateEmojiPickerData(\n emojis: Emoji[],\n categories: EmojiCategory[],\n columns: number\n): EmojiPickerData {\n let currentIndex = 0;\n const rows: EmojiPickerRow[] = [];\n const indexedEmojis = emojis.map((emoji, index) => ({ ...emoji, index }));\n const categoriesRowCounts: number[] = [];\n const categoriesRowIndices: number[][] = [];\n const categoriesNames: string[] = [];\n const categorizedEmojis = categories\n .map((category) => ({\n ...category,\n emojis: indexedEmojis.filter((emoji) => emoji.category === category.key),\n }))\n .filter((category) => category.emojis.length > 0);\n\n for (const category of categorizedEmojis) {\n const categoryRows = chunk(category.emojis, columns);\n const nextIndex = currentIndex + categoryRows.length;\n\n rows.push(...categoryRows);\n categoriesNames.push(category.name);\n categoriesRowCounts.push(categoryRows.length);\n categoriesRowIndices.push(\n generateRangeIndices(currentIndex, nextIndex - 1)\n );\n currentIndex = nextIndex;\n }\n\n return {\n count: emojis.length,\n rows,\n categories: categoriesNames,\n categoriesRowCounts,\n categoriesRowIndices,\n };\n}\n"],"names":["capitalize","EMOJI_FONT_FAMILY","chunk"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
- import { chunk } from '@liveblocks/core';
2
1
  import { EMOJI_FONT_FAMILY } from '../../constants.mjs';
3
2
  import { capitalize } from '../../utils/capitalize.mjs';
3
+ import { chunk } from '../../utils/chunk.mjs';
4
4
 
5
5
  const EMOJIBASE_VERSION = "15.3.0";
6
6
  const EMOJIBASE_CDN_URL = `https://cdn.jsdelivr.net/npm/emojibase-data@${EMOJIBASE_VERSION}`;
@@ -1 +1 @@
1
- {"version":3,"file":"utils.mjs","sources":["../../../src/primitives/EmojiPicker/utils.ts"],"sourcesContent":["import { chunk } from \"@liveblocks/core\";\nimport type {\n Emoji as EmojibaseEmoji,\n Locale as EmojibaseLocale,\n MessagesDataset as EmojibaseMessagesDataset,\n} from \"emojibase\";\n\nimport { EMOJI_FONT_FAMILY } from \"../../constants\";\nimport { capitalize } from \"../../utils/capitalize\";\nimport type {\n Emoji,\n EmojiCategory,\n EmojiData,\n EmojiPickerData,\n EmojiPickerRow,\n} from \"./types\";\n\nconst EMOJIBASE_VERSION = \"15.3.0\";\nconst EMOJIBASE_CDN_URL = `https://cdn.jsdelivr.net/npm/emojibase-data@${EMOJIBASE_VERSION}`;\nconst EMOJIBASE_EMOJIS_URL = (locale: EmojibaseLocale) =>\n `${EMOJIBASE_CDN_URL}/${locale}/data.json`;\nconst EMOJIBASE_MESSAGES_URL = (locale: EmojibaseLocale) =>\n `${EMOJIBASE_CDN_URL}/${locale}/messages.json`;\nconst EMOJIBASE_LOCALES: EmojibaseLocale[] = [\n \"bn\",\n \"da\",\n \"de\",\n \"en\",\n \"en-gb\",\n \"es\",\n \"es-mx\",\n \"et\",\n \"fi\",\n \"fr\",\n \"hi\",\n \"hu\",\n \"it\",\n \"ja\",\n \"ko\",\n \"lt\",\n \"ms\",\n \"nb\",\n \"nl\",\n \"pl\",\n \"pt\",\n \"ru\",\n \"sv\",\n \"th\",\n \"uk\",\n \"zh\",\n \"zh-hant\",\n];\nconst EMOJIBASE_DEFAULT_LOCALE: EmojibaseLocale = \"en\";\n\nconst CACHE_EMOJI_DATA_KEY = (locale: string) => `lb-emoji-data-${locale}`;\nconst CACHE_EMOJI_METADATA_KEY = (locale: string) =>\n `lb-emoji-metadata-${locale}`;\nconst CACHE_EMOJI_SESSION_METADATA_KEY = \"lb-emoji-metadata\";\n\nconst EMOJI_DETECTION_CANVAS_WIDTH = 20;\nconst EMOJI_DETECTION_CANVAS_HEIGHT = 25;\nconst EMOJI_DETECTION_COUNTRY_FLAG = \"🇫🇷\";\n\ntype EmojiMetadata = {\n emojisEtag: string | null;\n messagesEtag: string | null;\n};\n\ntype EmojiSessionMetadata = {\n emojiVersion: number;\n countryFlags: boolean;\n};\n\nfunction generateRangeIndices(start: number, end: number) {\n const range: number[] = [];\n\n for (let i = start; i <= end; i++) {\n range.push(i);\n }\n\n return range;\n}\n\nfunction getStorageItem<T>(storage: Storage, key: string) {\n const item = storage.getItem(key);\n\n return item ? (JSON.parse(item) as T) : null;\n}\n\nfunction setStorageItem<T>(storage: Storage, key: string, value: T) {\n storage.setItem(key, JSON.stringify(value));\n}\n\nasync function fetchEtag(url: string) {\n try {\n const response = await fetch(url, { method: \"HEAD\" });\n\n return response.headers.get(\"etag\");\n } catch (error) {\n return null;\n }\n}\n\nfunction getEmojibaseSupportedLocale(locale: string): EmojibaseLocale {\n return EMOJIBASE_LOCALES.includes(locale as EmojibaseLocale)\n ? (locale as EmojibaseLocale)\n : EMOJIBASE_DEFAULT_LOCALE;\n}\n\nasync function fetchEmojibaseData(locale: EmojibaseLocale) {\n const [{ emojis, emojisEtag }, { messages, messagesEtag }] =\n await Promise.all([\n fetch(EMOJIBASE_EMOJIS_URL(locale)).then(async (response) => {\n return {\n emojis: (await response.json()) as EmojibaseEmoji[],\n emojisEtag: response.headers.get(\"etag\"),\n };\n }),\n fetch(EMOJIBASE_MESSAGES_URL(locale)).then(async (response) => {\n return {\n messages: (await response.json()) as EmojibaseMessagesDataset,\n messagesEtag: response.headers.get(\"etag\"),\n };\n }),\n ]);\n\n return {\n emojis,\n messages,\n emojisEtag,\n messagesEtag,\n };\n}\n\nasync function fetchEmojibaseEtags(locale: EmojibaseLocale) {\n const [emojisEtag, messagesEtag] = await Promise.all([\n fetchEtag(EMOJIBASE_EMOJIS_URL(locale)),\n fetchEtag(EMOJIBASE_MESSAGES_URL(locale)),\n ]);\n\n return {\n emojisEtag,\n messagesEtag,\n };\n}\n\nasync function fetchEmojiData(locale: EmojibaseLocale): Promise<EmojiData> {\n const { emojis, emojisEtag, messages, messagesEtag } =\n await fetchEmojibaseData(locale);\n const countryFlagsSubgroup = messages.subgroups.find(\n (subgroup) => subgroup.key === \"subdivision-flag\"\n );\n\n // Filter out component/modifier category and emojis\n const filteredGroups = messages.groups.filter(\n (group) => group.key !== \"component\"\n );\n const filteredEmojis = emojis.filter((emoji) => {\n return \"group\" in emoji;\n });\n\n // Pick and compact the data\n const categories = filteredGroups.map((group) => ({\n key: group.order,\n name: capitalize(group.message),\n }));\n const skinTones = messages.skinTones.map((skinTone) => ({\n key: skinTone.key,\n name: capitalize(skinTone.message),\n }));\n const compactEmojis = filteredEmojis.map((emoji) => {\n const compactEmoji: Emoji = {\n emoji: emoji.emoji,\n category: emoji.group!,\n version: emoji.version,\n name: capitalize(emoji.label),\n tags: emoji.tags,\n };\n\n if (countryFlagsSubgroup && emoji.subgroup === countryFlagsSubgroup.order) {\n compactEmoji.countryFlag = true;\n }\n\n return compactEmoji;\n });\n\n const emojiData = {\n emojis: compactEmojis,\n categories,\n skinTones,\n };\n\n // Cache the data and metadata\n setStorageItem<EmojiData>(\n localStorage,\n CACHE_EMOJI_DATA_KEY(locale),\n emojiData\n );\n setStorageItem<EmojiMetadata>(\n localStorage,\n CACHE_EMOJI_METADATA_KEY(locale),\n {\n emojisEtag,\n messagesEtag,\n }\n );\n\n return emojiData;\n}\n\n// Adapted from https://github.com/koala-interactive/is-emoji-supported/tree/master\nfunction detectEmojiSupport(\n canvasContext: CanvasRenderingContext2D,\n emoji: string\n): boolean {\n canvasContext.clearRect(\n 0,\n 0,\n EMOJI_DETECTION_CANVAS_WIDTH * 2,\n EMOJI_DETECTION_CANVAS_HEIGHT\n );\n\n // Draw in red on the left\n canvasContext.fillStyle = \"#f00\";\n canvasContext.fillText(emoji, 0, 22);\n\n // Draw in blue on right\n canvasContext.fillStyle = \"#00f\";\n canvasContext.fillText(emoji, EMOJI_DETECTION_CANVAS_WIDTH, 22);\n\n const pixels = canvasContext.getImageData(\n 0,\n 0,\n EMOJI_DETECTION_CANVAS_WIDTH,\n EMOJI_DETECTION_CANVAS_HEIGHT\n ).data;\n const pixelCount = pixels.length;\n let i = 0;\n\n // Search for the first visible pixel\n for (; i < pixelCount && !pixels[i + 3]; i += 4);\n\n // No visible pixel\n if (i >= pixelCount) {\n return false;\n }\n\n // Emojis have an immutable color, so we check the color of the emoji in two\n // different colors, the result should be the same\n const x =\n EMOJI_DETECTION_CANVAS_WIDTH + ((i / 4) % EMOJI_DETECTION_CANVAS_WIDTH);\n const y = Math.floor(i / 4 / EMOJI_DETECTION_CANVAS_WIDTH);\n const pixel = canvasContext.getImageData(x, y, 1, 1).data;\n\n if (pixels[i] !== pixel[0] || pixels[i + 2] !== pixel[2]) {\n return false;\n }\n\n // Unsupported ZWJ sequence emojis show up as separate emojis\n if (canvasContext.measureText(emoji).width >= EMOJI_DETECTION_CANVAS_WIDTH) {\n return false;\n }\n\n return true;\n}\n\nfunction getEmojiFontFamily() {\n try {\n const element = document.createElement(\"span\");\n element.style.display = \"none\";\n element.dataset.emoji = \"\";\n\n document.body.appendChild(element);\n\n const computedFontFamily = window.getComputedStyle(element).fontFamily;\n\n document.body.removeChild(element);\n\n return computedFontFamily;\n } catch {\n return EMOJI_FONT_FAMILY;\n }\n}\n\nfunction getEmojiSessionMetadata(emojis: Emoji[]): EmojiSessionMetadata {\n const versions = new Map<number, string>();\n\n for (const emoji of emojis) {\n if (!versions.has(emoji.version)) {\n versions.set(emoji.version, emoji.emoji);\n }\n }\n\n const descendingVersions = [...versions.keys()].sort((a, b) => b - a);\n\n const canvasContext = document\n .createElement(\"canvas\")\n .getContext(\"2d\", { willReadFrequently: true });\n\n if (!canvasContext) {\n return { emojiVersion: descendingVersions[0], countryFlags: true };\n }\n\n canvasContext.font = `${Math.floor(\n EMOJI_DETECTION_CANVAS_HEIGHT / 2\n )}px ${getEmojiFontFamily()}`;\n canvasContext.textBaseline = \"top\";\n canvasContext.canvas.width = EMOJI_DETECTION_CANVAS_WIDTH * 2;\n canvasContext.canvas.height = EMOJI_DETECTION_CANVAS_HEIGHT;\n\n const supportsCountryFlags = detectEmojiSupport(\n canvasContext,\n EMOJI_DETECTION_COUNTRY_FLAG\n );\n\n for (const version of descendingVersions) {\n const emoji = versions.get(version)!;\n const isSupported = detectEmojiSupport(canvasContext, emoji);\n\n if (isSupported) {\n return {\n emojiVersion: version,\n countryFlags: supportsCountryFlags,\n };\n }\n }\n\n return {\n emojiVersion: descendingVersions[0],\n countryFlags: supportsCountryFlags,\n };\n}\n\nexport async function getEmojiData(locale: string): Promise<EmojiData> {\n const emojibaseLocale = getEmojibaseSupportedLocale(locale);\n\n const sessionMetadata = getStorageItem<EmojiSessionMetadata>(\n sessionStorage,\n CACHE_EMOJI_SESSION_METADATA_KEY\n );\n const cachedData = getStorageItem<EmojiData>(\n localStorage,\n CACHE_EMOJI_DATA_KEY(emojibaseLocale)\n );\n let data: EmojiData;\n\n // If there is data already cached, check if the ETags are the same.\n // If they are, return the cached data, otherwise fetch it again.\n if (cachedData) {\n // ETags only need to be checked once per session\n if (sessionMetadata) {\n data = cachedData;\n } else {\n const { emojisEtag, messagesEtag } =\n await fetchEmojibaseEtags(emojibaseLocale);\n const cachedMetadata = getStorageItem<EmojiMetadata>(\n localStorage,\n CACHE_EMOJI_METADATA_KEY(emojibaseLocale)\n );\n\n if (\n cachedMetadata &&\n emojisEtag === cachedMetadata.emojisEtag &&\n messagesEtag === cachedMetadata.messagesEtag\n ) {\n data = cachedData;\n } else {\n data = await fetchEmojiData(emojibaseLocale);\n }\n }\n } else {\n data = await fetchEmojiData(emojibaseLocale);\n }\n\n const newSessionMetadata =\n sessionMetadata ?? getEmojiSessionMetadata(data.emojis);\n setStorageItem(\n sessionStorage,\n CACHE_EMOJI_SESSION_METADATA_KEY,\n newSessionMetadata\n );\n\n // Filter out unsupported emojis\n const filteredEmojis = data.emojis.filter((emoji) => {\n const isSupportedVersion = emoji.version <= newSessionMetadata.emojiVersion;\n\n return emoji.countryFlag\n ? isSupportedVersion && newSessionMetadata.countryFlags\n : isSupportedVersion;\n });\n\n return {\n emojis: filteredEmojis,\n categories: data.categories,\n skinTones: data.skinTones,\n };\n}\n\nexport function filterEmojis(emojis: Emoji[], search?: string) {\n if (!search) {\n return emojis;\n }\n\n const searchText = search.toLowerCase().trim();\n\n return emojis.filter(\n (emoji) =>\n emoji.name.toLowerCase().includes(searchText) ||\n emoji.tags?.some((tag) => tag.toLowerCase().includes(searchText))\n );\n}\n\nexport function generateEmojiPickerData(\n emojis: Emoji[],\n categories: EmojiCategory[],\n columns: number\n): EmojiPickerData {\n let currentIndex = 0;\n const rows: EmojiPickerRow[] = [];\n const indexedEmojis = emojis.map((emoji, index) => ({ ...emoji, index }));\n const categoriesRowCounts: number[] = [];\n const categoriesRowIndices: number[][] = [];\n const categoriesNames: string[] = [];\n const categorizedEmojis = categories\n .map((category) => ({\n ...category,\n emojis: indexedEmojis.filter((emoji) => emoji.category === category.key),\n }))\n .filter((category) => category.emojis.length > 0);\n\n for (const category of categorizedEmojis) {\n const categoryRows = chunk(category.emojis, columns);\n const nextIndex = currentIndex + categoryRows.length;\n\n rows.push(...categoryRows);\n categoriesNames.push(category.name);\n categoriesRowCounts.push(categoryRows.length);\n categoriesRowIndices.push(\n generateRangeIndices(currentIndex, nextIndex - 1)\n );\n currentIndex = nextIndex;\n }\n\n return {\n count: emojis.length,\n rows,\n categories: categoriesNames,\n categoriesRowCounts,\n categoriesRowIndices,\n };\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"utils.mjs","sources":["../../../src/primitives/EmojiPicker/utils.ts"],"sourcesContent":["import type {\n Emoji as EmojibaseEmoji,\n Locale as EmojibaseLocale,\n MessagesDataset as EmojibaseMessagesDataset,\n} from \"emojibase\";\n\nimport { EMOJI_FONT_FAMILY } from \"../../constants\";\nimport { capitalize } from \"../../utils/capitalize\";\nimport { chunk } from \"../../utils/chunk\";\nimport type {\n Emoji,\n EmojiCategory,\n EmojiData,\n EmojiPickerData,\n EmojiPickerRow,\n} from \"./types\";\n\nconst EMOJIBASE_VERSION = \"15.3.0\";\nconst EMOJIBASE_CDN_URL = `https://cdn.jsdelivr.net/npm/emojibase-data@${EMOJIBASE_VERSION}`;\nconst EMOJIBASE_EMOJIS_URL = (locale: EmojibaseLocale) =>\n `${EMOJIBASE_CDN_URL}/${locale}/data.json`;\nconst EMOJIBASE_MESSAGES_URL = (locale: EmojibaseLocale) =>\n `${EMOJIBASE_CDN_URL}/${locale}/messages.json`;\nconst EMOJIBASE_LOCALES: EmojibaseLocale[] = [\n \"bn\",\n \"da\",\n \"de\",\n \"en\",\n \"en-gb\",\n \"es\",\n \"es-mx\",\n \"et\",\n \"fi\",\n \"fr\",\n \"hi\",\n \"hu\",\n \"it\",\n \"ja\",\n \"ko\",\n \"lt\",\n \"ms\",\n \"nb\",\n \"nl\",\n \"pl\",\n \"pt\",\n \"ru\",\n \"sv\",\n \"th\",\n \"uk\",\n \"zh\",\n \"zh-hant\",\n];\nconst EMOJIBASE_DEFAULT_LOCALE: EmojibaseLocale = \"en\";\n\nconst CACHE_EMOJI_DATA_KEY = (locale: string) => `lb-emoji-data-${locale}`;\nconst CACHE_EMOJI_METADATA_KEY = (locale: string) =>\n `lb-emoji-metadata-${locale}`;\nconst CACHE_EMOJI_SESSION_METADATA_KEY = \"lb-emoji-metadata\";\n\nconst EMOJI_DETECTION_CANVAS_WIDTH = 20;\nconst EMOJI_DETECTION_CANVAS_HEIGHT = 25;\nconst EMOJI_DETECTION_COUNTRY_FLAG = \"🇫🇷\";\n\ntype EmojiMetadata = {\n emojisEtag: string | null;\n messagesEtag: string | null;\n};\n\ntype EmojiSessionMetadata = {\n emojiVersion: number;\n countryFlags: boolean;\n};\n\nfunction generateRangeIndices(start: number, end: number) {\n const range: number[] = [];\n\n for (let i = start; i <= end; i++) {\n range.push(i);\n }\n\n return range;\n}\n\nfunction getStorageItem<T>(storage: Storage, key: string) {\n const item = storage.getItem(key);\n\n return item ? (JSON.parse(item) as T) : null;\n}\n\nfunction setStorageItem<T>(storage: Storage, key: string, value: T) {\n storage.setItem(key, JSON.stringify(value));\n}\n\nasync function fetchEtag(url: string) {\n try {\n const response = await fetch(url, { method: \"HEAD\" });\n\n return response.headers.get(\"etag\");\n } catch (error) {\n return null;\n }\n}\n\nfunction getEmojibaseSupportedLocale(locale: string): EmojibaseLocale {\n return EMOJIBASE_LOCALES.includes(locale as EmojibaseLocale)\n ? (locale as EmojibaseLocale)\n : EMOJIBASE_DEFAULT_LOCALE;\n}\n\nasync function fetchEmojibaseData(locale: EmojibaseLocale) {\n const [{ emojis, emojisEtag }, { messages, messagesEtag }] =\n await Promise.all([\n fetch(EMOJIBASE_EMOJIS_URL(locale)).then(async (response) => {\n return {\n emojis: (await response.json()) as EmojibaseEmoji[],\n emojisEtag: response.headers.get(\"etag\"),\n };\n }),\n fetch(EMOJIBASE_MESSAGES_URL(locale)).then(async (response) => {\n return {\n messages: (await response.json()) as EmojibaseMessagesDataset,\n messagesEtag: response.headers.get(\"etag\"),\n };\n }),\n ]);\n\n return {\n emojis,\n messages,\n emojisEtag,\n messagesEtag,\n };\n}\n\nasync function fetchEmojibaseEtags(locale: EmojibaseLocale) {\n const [emojisEtag, messagesEtag] = await Promise.all([\n fetchEtag(EMOJIBASE_EMOJIS_URL(locale)),\n fetchEtag(EMOJIBASE_MESSAGES_URL(locale)),\n ]);\n\n return {\n emojisEtag,\n messagesEtag,\n };\n}\n\nasync function fetchEmojiData(locale: EmojibaseLocale): Promise<EmojiData> {\n const { emojis, emojisEtag, messages, messagesEtag } =\n await fetchEmojibaseData(locale);\n const countryFlagsSubgroup = messages.subgroups.find(\n (subgroup) => subgroup.key === \"subdivision-flag\"\n );\n\n // Filter out component/modifier category and emojis\n const filteredGroups = messages.groups.filter(\n (group) => group.key !== \"component\"\n );\n const filteredEmojis = emojis.filter((emoji) => {\n return \"group\" in emoji;\n });\n\n // Pick and compact the data\n const categories = filteredGroups.map((group) => ({\n key: group.order,\n name: capitalize(group.message),\n }));\n const skinTones = messages.skinTones.map((skinTone) => ({\n key: skinTone.key,\n name: capitalize(skinTone.message),\n }));\n const compactEmojis = filteredEmojis.map((emoji) => {\n const compactEmoji: Emoji = {\n emoji: emoji.emoji,\n category: emoji.group!,\n version: emoji.version,\n name: capitalize(emoji.label),\n tags: emoji.tags,\n };\n\n if (countryFlagsSubgroup && emoji.subgroup === countryFlagsSubgroup.order) {\n compactEmoji.countryFlag = true;\n }\n\n return compactEmoji;\n });\n\n const emojiData = {\n emojis: compactEmojis,\n categories,\n skinTones,\n };\n\n // Cache the data and metadata\n setStorageItem<EmojiData>(\n localStorage,\n CACHE_EMOJI_DATA_KEY(locale),\n emojiData\n );\n setStorageItem<EmojiMetadata>(\n localStorage,\n CACHE_EMOJI_METADATA_KEY(locale),\n {\n emojisEtag,\n messagesEtag,\n }\n );\n\n return emojiData;\n}\n\n// Adapted from https://github.com/koala-interactive/is-emoji-supported/tree/master\nfunction detectEmojiSupport(\n canvasContext: CanvasRenderingContext2D,\n emoji: string\n): boolean {\n canvasContext.clearRect(\n 0,\n 0,\n EMOJI_DETECTION_CANVAS_WIDTH * 2,\n EMOJI_DETECTION_CANVAS_HEIGHT\n );\n\n // Draw in red on the left\n canvasContext.fillStyle = \"#f00\";\n canvasContext.fillText(emoji, 0, 22);\n\n // Draw in blue on right\n canvasContext.fillStyle = \"#00f\";\n canvasContext.fillText(emoji, EMOJI_DETECTION_CANVAS_WIDTH, 22);\n\n const pixels = canvasContext.getImageData(\n 0,\n 0,\n EMOJI_DETECTION_CANVAS_WIDTH,\n EMOJI_DETECTION_CANVAS_HEIGHT\n ).data;\n const pixelCount = pixels.length;\n let i = 0;\n\n // Search for the first visible pixel\n for (; i < pixelCount && !pixels[i + 3]; i += 4);\n\n // No visible pixel\n if (i >= pixelCount) {\n return false;\n }\n\n // Emojis have an immutable color, so we check the color of the emoji in two\n // different colors, the result should be the same\n const x =\n EMOJI_DETECTION_CANVAS_WIDTH + ((i / 4) % EMOJI_DETECTION_CANVAS_WIDTH);\n const y = Math.floor(i / 4 / EMOJI_DETECTION_CANVAS_WIDTH);\n const pixel = canvasContext.getImageData(x, y, 1, 1).data;\n\n if (pixels[i] !== pixel[0] || pixels[i + 2] !== pixel[2]) {\n return false;\n }\n\n // Unsupported ZWJ sequence emojis show up as separate emojis\n if (canvasContext.measureText(emoji).width >= EMOJI_DETECTION_CANVAS_WIDTH) {\n return false;\n }\n\n return true;\n}\n\nfunction getEmojiFontFamily() {\n try {\n const element = document.createElement(\"span\");\n element.style.display = \"none\";\n element.dataset.emoji = \"\";\n\n document.body.appendChild(element);\n\n const computedFontFamily = window.getComputedStyle(element).fontFamily;\n\n document.body.removeChild(element);\n\n return computedFontFamily;\n } catch {\n return EMOJI_FONT_FAMILY;\n }\n}\n\nfunction getEmojiSessionMetadata(emojis: Emoji[]): EmojiSessionMetadata {\n const versions = new Map<number, string>();\n\n for (const emoji of emojis) {\n if (!versions.has(emoji.version)) {\n versions.set(emoji.version, emoji.emoji);\n }\n }\n\n const descendingVersions = [...versions.keys()].sort((a, b) => b - a);\n\n const canvasContext = document\n .createElement(\"canvas\")\n .getContext(\"2d\", { willReadFrequently: true });\n\n if (!canvasContext) {\n return { emojiVersion: descendingVersions[0], countryFlags: true };\n }\n\n canvasContext.font = `${Math.floor(\n EMOJI_DETECTION_CANVAS_HEIGHT / 2\n )}px ${getEmojiFontFamily()}`;\n canvasContext.textBaseline = \"top\";\n canvasContext.canvas.width = EMOJI_DETECTION_CANVAS_WIDTH * 2;\n canvasContext.canvas.height = EMOJI_DETECTION_CANVAS_HEIGHT;\n\n const supportsCountryFlags = detectEmojiSupport(\n canvasContext,\n EMOJI_DETECTION_COUNTRY_FLAG\n );\n\n for (const version of descendingVersions) {\n const emoji = versions.get(version)!;\n const isSupported = detectEmojiSupport(canvasContext, emoji);\n\n if (isSupported) {\n return {\n emojiVersion: version,\n countryFlags: supportsCountryFlags,\n };\n }\n }\n\n return {\n emojiVersion: descendingVersions[0],\n countryFlags: supportsCountryFlags,\n };\n}\n\nexport async function getEmojiData(locale: string): Promise<EmojiData> {\n const emojibaseLocale = getEmojibaseSupportedLocale(locale);\n\n const sessionMetadata = getStorageItem<EmojiSessionMetadata>(\n sessionStorage,\n CACHE_EMOJI_SESSION_METADATA_KEY\n );\n const cachedData = getStorageItem<EmojiData>(\n localStorage,\n CACHE_EMOJI_DATA_KEY(emojibaseLocale)\n );\n let data: EmojiData;\n\n // If there is data already cached, check if the ETags are the same.\n // If they are, return the cached data, otherwise fetch it again.\n if (cachedData) {\n // ETags only need to be checked once per session\n if (sessionMetadata) {\n data = cachedData;\n } else {\n const { emojisEtag, messagesEtag } =\n await fetchEmojibaseEtags(emojibaseLocale);\n const cachedMetadata = getStorageItem<EmojiMetadata>(\n localStorage,\n CACHE_EMOJI_METADATA_KEY(emojibaseLocale)\n );\n\n if (\n cachedMetadata &&\n emojisEtag === cachedMetadata.emojisEtag &&\n messagesEtag === cachedMetadata.messagesEtag\n ) {\n data = cachedData;\n } else {\n data = await fetchEmojiData(emojibaseLocale);\n }\n }\n } else {\n data = await fetchEmojiData(emojibaseLocale);\n }\n\n const newSessionMetadata =\n sessionMetadata ?? getEmojiSessionMetadata(data.emojis);\n setStorageItem(\n sessionStorage,\n CACHE_EMOJI_SESSION_METADATA_KEY,\n newSessionMetadata\n );\n\n // Filter out unsupported emojis\n const filteredEmojis = data.emojis.filter((emoji) => {\n const isSupportedVersion = emoji.version <= newSessionMetadata.emojiVersion;\n\n return emoji.countryFlag\n ? isSupportedVersion && newSessionMetadata.countryFlags\n : isSupportedVersion;\n });\n\n return {\n emojis: filteredEmojis,\n categories: data.categories,\n skinTones: data.skinTones,\n };\n}\n\nexport function filterEmojis(emojis: Emoji[], search?: string) {\n if (!search) {\n return emojis;\n }\n\n const searchText = search.toLowerCase().trim();\n\n return emojis.filter(\n (emoji) =>\n emoji.name.toLowerCase().includes(searchText) ||\n emoji.tags?.some((tag) => tag.toLowerCase().includes(searchText))\n );\n}\n\nexport function generateEmojiPickerData(\n emojis: Emoji[],\n categories: EmojiCategory[],\n columns: number\n): EmojiPickerData {\n let currentIndex = 0;\n const rows: EmojiPickerRow[] = [];\n const indexedEmojis = emojis.map((emoji, index) => ({ ...emoji, index }));\n const categoriesRowCounts: number[] = [];\n const categoriesRowIndices: number[][] = [];\n const categoriesNames: string[] = [];\n const categorizedEmojis = categories\n .map((category) => ({\n ...category,\n emojis: indexedEmojis.filter((emoji) => emoji.category === category.key),\n }))\n .filter((category) => category.emojis.length > 0);\n\n for (const category of categorizedEmojis) {\n const categoryRows = chunk(category.emojis, columns);\n const nextIndex = currentIndex + categoryRows.length;\n\n rows.push(...categoryRows);\n categoriesNames.push(category.name);\n categoriesRowCounts.push(categoryRows.length);\n categoriesRowIndices.push(\n generateRangeIndices(currentIndex, nextIndex - 1)\n );\n currentIndex = nextIndex;\n }\n\n return {\n count: emojis.length,\n rows,\n categories: categoriesNames,\n categoriesRowCounts,\n categoriesRowIndices,\n };\n}\n"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import * as React from 'react';
2
2
  import React__default, { ElementType, ComponentPropsWithoutRef, ReactNode, ComponentType, FormEvent, PropsWithChildren } from 'react';
3
- import { CommentBody as CommentBody$1, CommentAttachment, CommentMixedAttachment } from '@liveblocks/core';
3
+ import { CommentBody as CommentBody$1 } from '@liveblocks/core';
4
4
 
5
5
  declare type Direction = "ltr" | "rtl";
6
6
  declare type SlotProp = {
@@ -173,29 +173,13 @@ interface ComposerFormProps extends ComponentPropsWithSlot<"form"> {
173
173
  * The event handler called when the form is submitted.
174
174
  */
175
175
  onComposerSubmit?: (comment: ComposerSubmitComment, event: FormEvent<HTMLFormElement>) => Promise<void> | void;
176
- /**
177
- * Whether the composer is disabled.
178
- */
179
- disabled?: boolean;
180
- /**
181
- * The composer's initial attachments.
182
- */
183
- defaultAttachments?: CommentAttachment[];
184
176
  }
185
177
  declare type ComposerSubmitProps = ComponentPropsWithSlot<"button">;
186
- declare type ComposerAttachFilesProps = ComponentPropsWithSlot<"button">;
187
- interface ComposerAttachmentsDropAreaProps extends ComponentPropsWithSlot<"div"> {
188
- disabled?: boolean;
189
- }
190
178
  interface ComposerSubmitComment {
191
179
  /**
192
180
  * The submitted comment's body.
193
181
  */
194
182
  body: CommentBody$1;
195
- /**
196
- * The submitted comment's uploaded attachments.
197
- */
198
- attachments: CommentAttachment[];
199
183
  }
200
184
 
201
185
  /**
@@ -262,27 +246,9 @@ declare const ComposerForm: React__default.ForwardRefExoticComponent<ComposerFor
262
246
  * <Composer.Submit>Send</Composer.Submit>
263
247
  */
264
248
  declare const ComposerSubmit: React__default.ForwardRefExoticComponent<Omit<React__default.DetailedHTMLProps<React__default.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "ref"> & SlotProp & React__default.RefAttributes<HTMLButtonElement>>;
265
- /**
266
- * A button which opens a file picker to create attachments.
267
- *
268
- * @example
269
- * <Composer.AttachFiles>Attach files</Composer.AttachFiles>
270
- */
271
- declare const ComposerAttachFiles: React__default.ForwardRefExoticComponent<Omit<React__default.DetailedHTMLProps<React__default.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "ref"> & SlotProp & React__default.RefAttributes<HTMLButtonElement>>;
272
- /**
273
- * A drop area which accepts files to create attachments.
274
- *
275
- * @example
276
- * <Composer.AttachmentsDropArea>
277
- * Drop files here
278
- * </Composer.AttachmentsDropArea>
279
- */
280
- declare const ComposerAttachmentsDropArea: React__default.ForwardRefExoticComponent<ComposerAttachmentsDropAreaProps & React__default.RefAttributes<HTMLDivElement>>;
281
249
 
282
250
  declare namespace index$1 {
283
251
  export {
284
- ComposerAttachFiles as AttachFiles,
285
- ComposerAttachmentsDropArea as AttachmentsDropArea,
286
252
  ComposerEditor as Editor,
287
253
  ComposerForm as Form,
288
254
  ComposerLink as Link,
@@ -295,14 +261,6 @@ declare namespace index$1 {
295
261
  }
296
262
 
297
263
  declare type ComposerContext = {
298
- /**
299
- * Whether the composer is currently disabled.
300
- */
301
- isDisabled: boolean;
302
- /**
303
- * Whether the composer can currently be submitted.
304
- */
305
- canSubmit: boolean;
306
264
  /**
307
265
  * Whether the editor is currently focused.
308
266
  */
@@ -316,7 +274,7 @@ declare type ComposerContext = {
316
274
  */
317
275
  submit: () => void;
318
276
  /**
319
- * Clear the composer programmatically.
277
+ * Clear the editor programmatically.
320
278
  */
321
279
  clear: () => void;
322
280
  /**
@@ -339,26 +297,10 @@ declare type ComposerContext = {
339
297
  * Insert text at the current selection.
340
298
  */
341
299
  insertText: (text: string) => void;
342
- /**
343
- * Open a file picker programmatically to create attachments.
344
- */
345
- attachFiles: () => void;
346
- /**
347
- * The composer's current attachments.
348
- */
349
- attachments: CommentMixedAttachment[];
350
- /**
351
- * Remove an attachment by its ID.
352
- */
353
- removeAttachment: (attachmentId: string) => void;
354
300
  };
355
301
  declare const ComposerContext: React.Context<ComposerContext | null>;
356
302
  declare function useComposer(): ComposerContext;
357
303
 
358
- declare class AttachmentTooLargeError extends Error {
359
- name: string;
360
- }
361
-
362
304
  declare type EmojiPickerContentLoadingProps = ComponentPropsWithoutRef<"div">;
363
305
  declare type EmojiPickerContentEmptyProps = ComponentPropsWithoutRef<"div">;
364
306
  declare type EmojiPickerContentGridProps = ComponentPropsWithoutRef<"div">;
@@ -519,28 +461,6 @@ declare namespace index {
519
461
  };
520
462
  }
521
463
 
522
- interface FileSizeProps extends Omit<ComponentPropsWithSlot<"span">, "children"> {
523
- /**
524
- * The file size to display.
525
- */
526
- size: number;
527
- /**
528
- * A function to format the displayed file size.
529
- */
530
- children?: (size: number, locale?: string) => ReactNode;
531
- /**
532
- * The locale used when formatting the file size.
533
- */
534
- locale?: string;
535
- }
536
- /**
537
- * Displays a formatted file size.
538
- *
539
- * @example
540
- * <FileSize size={100000} />
541
- */
542
- declare const FileSize: React__default.ForwardRefExoticComponent<FileSizeProps & React__default.RefAttributes<HTMLSpanElement>>;
543
-
544
464
  interface TimestampProps extends Omit<ComponentPropsWithSlot<"time">, "children" | "title"> {
545
465
  /**
546
466
  * The date to display.
@@ -579,4 +499,4 @@ interface TimestampProps extends Omit<ComponentPropsWithSlot<"time">, "children"
579
499
  */
580
500
  declare const Timestamp: React__default.ForwardRefExoticComponent<TimestampProps & React__default.RefAttributes<HTMLTimeElement>>;
581
501
 
582
- export { AttachmentTooLargeError, index$2 as Comment, CommentBodyComponents, CommentBodyLinkProps, CommentBodyMentionProps, CommentBodyProps, CommentLinkProps, CommentMentionProps, index$1 as Composer, ComposerAttachFilesProps, ComposerAttachmentsDropAreaProps, ComposerContext, ComposerEditorComponents, ComposerEditorLinkProps, ComposerEditorMentionProps, ComposerEditorMentionSuggestionsProps, ComposerEditorProps, ComposerFormProps, ComposerLinkProps, ComposerMentionProps, ComposerSubmitComment, ComposerSubmitProps, ComposerSuggestionsListItemProps, ComposerSuggestionsListProps, index as EmojiPicker, EmojiPickerContentCategoryHeaderProps, EmojiPickerContentComponents, EmojiPickerContentEmojiProps, EmojiPickerContentEmptyProps, EmojiPickerContentErrorProps, EmojiPickerContentGridProps, EmojiPickerContentLoadingProps, EmojiPickerContentProps, EmojiPickerContentRowProps, EmojiPickerRootProps, EmojiPickerSearchProps, FileSize, FileSizeProps, Timestamp, TimestampProps, useComposer };
502
+ export { index$2 as Comment, CommentBodyComponents, CommentBodyLinkProps, CommentBodyMentionProps, CommentBodyProps, CommentLinkProps, CommentMentionProps, index$1 as Composer, ComposerContext, ComposerEditorComponents, ComposerEditorLinkProps, ComposerEditorMentionProps, ComposerEditorMentionSuggestionsProps, ComposerEditorProps, ComposerFormProps, ComposerLinkProps, ComposerMentionProps, ComposerSubmitComment, ComposerSubmitProps, ComposerSuggestionsListItemProps, ComposerSuggestionsListProps, index as EmojiPicker, EmojiPickerContentCategoryHeaderProps, EmojiPickerContentComponents, EmojiPickerContentEmojiProps, EmojiPickerContentEmptyProps, EmojiPickerContentErrorProps, EmojiPickerContentGridProps, EmojiPickerContentLoadingProps, EmojiPickerContentProps, EmojiPickerContentRowProps, EmojiPickerRootProps, EmojiPickerSearchProps, Timestamp, TimestampProps, useComposer };
@@ -1,6 +1,6 @@
1
1
  import * as React from 'react';
2
2
  import React__default, { ElementType, ComponentPropsWithoutRef, ReactNode, ComponentType, FormEvent, PropsWithChildren } from 'react';
3
- import { CommentBody as CommentBody$1, CommentAttachment, CommentMixedAttachment } from '@liveblocks/core';
3
+ import { CommentBody as CommentBody$1 } from '@liveblocks/core';
4
4
 
5
5
  declare type Direction = "ltr" | "rtl";
6
6
  declare type SlotProp = {
@@ -173,29 +173,13 @@ interface ComposerFormProps extends ComponentPropsWithSlot<"form"> {
173
173
  * The event handler called when the form is submitted.
174
174
  */
175
175
  onComposerSubmit?: (comment: ComposerSubmitComment, event: FormEvent<HTMLFormElement>) => Promise<void> | void;
176
- /**
177
- * Whether the composer is disabled.
178
- */
179
- disabled?: boolean;
180
- /**
181
- * The composer's initial attachments.
182
- */
183
- defaultAttachments?: CommentAttachment[];
184
176
  }
185
177
  declare type ComposerSubmitProps = ComponentPropsWithSlot<"button">;
186
- declare type ComposerAttachFilesProps = ComponentPropsWithSlot<"button">;
187
- interface ComposerAttachmentsDropAreaProps extends ComponentPropsWithSlot<"div"> {
188
- disabled?: boolean;
189
- }
190
178
  interface ComposerSubmitComment {
191
179
  /**
192
180
  * The submitted comment's body.
193
181
  */
194
182
  body: CommentBody$1;
195
- /**
196
- * The submitted comment's uploaded attachments.
197
- */
198
- attachments: CommentAttachment[];
199
183
  }
200
184
 
201
185
  /**
@@ -262,27 +246,9 @@ declare const ComposerForm: React__default.ForwardRefExoticComponent<ComposerFor
262
246
  * <Composer.Submit>Send</Composer.Submit>
263
247
  */
264
248
  declare const ComposerSubmit: React__default.ForwardRefExoticComponent<Omit<React__default.DetailedHTMLProps<React__default.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "ref"> & SlotProp & React__default.RefAttributes<HTMLButtonElement>>;
265
- /**
266
- * A button which opens a file picker to create attachments.
267
- *
268
- * @example
269
- * <Composer.AttachFiles>Attach files</Composer.AttachFiles>
270
- */
271
- declare const ComposerAttachFiles: React__default.ForwardRefExoticComponent<Omit<React__default.DetailedHTMLProps<React__default.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "ref"> & SlotProp & React__default.RefAttributes<HTMLButtonElement>>;
272
- /**
273
- * A drop area which accepts files to create attachments.
274
- *
275
- * @example
276
- * <Composer.AttachmentsDropArea>
277
- * Drop files here
278
- * </Composer.AttachmentsDropArea>
279
- */
280
- declare const ComposerAttachmentsDropArea: React__default.ForwardRefExoticComponent<ComposerAttachmentsDropAreaProps & React__default.RefAttributes<HTMLDivElement>>;
281
249
 
282
250
  declare namespace index$1 {
283
251
  export {
284
- ComposerAttachFiles as AttachFiles,
285
- ComposerAttachmentsDropArea as AttachmentsDropArea,
286
252
  ComposerEditor as Editor,
287
253
  ComposerForm as Form,
288
254
  ComposerLink as Link,
@@ -295,14 +261,6 @@ declare namespace index$1 {
295
261
  }
296
262
 
297
263
  declare type ComposerContext = {
298
- /**
299
- * Whether the composer is currently disabled.
300
- */
301
- isDisabled: boolean;
302
- /**
303
- * Whether the composer can currently be submitted.
304
- */
305
- canSubmit: boolean;
306
264
  /**
307
265
  * Whether the editor is currently focused.
308
266
  */
@@ -316,7 +274,7 @@ declare type ComposerContext = {
316
274
  */
317
275
  submit: () => void;
318
276
  /**
319
- * Clear the composer programmatically.
277
+ * Clear the editor programmatically.
320
278
  */
321
279
  clear: () => void;
322
280
  /**
@@ -339,26 +297,10 @@ declare type ComposerContext = {
339
297
  * Insert text at the current selection.
340
298
  */
341
299
  insertText: (text: string) => void;
342
- /**
343
- * Open a file picker programmatically to create attachments.
344
- */
345
- attachFiles: () => void;
346
- /**
347
- * The composer's current attachments.
348
- */
349
- attachments: CommentMixedAttachment[];
350
- /**
351
- * Remove an attachment by its ID.
352
- */
353
- removeAttachment: (attachmentId: string) => void;
354
300
  };
355
301
  declare const ComposerContext: React.Context<ComposerContext | null>;
356
302
  declare function useComposer(): ComposerContext;
357
303
 
358
- declare class AttachmentTooLargeError extends Error {
359
- name: string;
360
- }
361
-
362
304
  declare type EmojiPickerContentLoadingProps = ComponentPropsWithoutRef<"div">;
363
305
  declare type EmojiPickerContentEmptyProps = ComponentPropsWithoutRef<"div">;
364
306
  declare type EmojiPickerContentGridProps = ComponentPropsWithoutRef<"div">;
@@ -519,28 +461,6 @@ declare namespace index {
519
461
  };
520
462
  }
521
463
 
522
- interface FileSizeProps extends Omit<ComponentPropsWithSlot<"span">, "children"> {
523
- /**
524
- * The file size to display.
525
- */
526
- size: number;
527
- /**
528
- * A function to format the displayed file size.
529
- */
530
- children?: (size: number, locale?: string) => ReactNode;
531
- /**
532
- * The locale used when formatting the file size.
533
- */
534
- locale?: string;
535
- }
536
- /**
537
- * Displays a formatted file size.
538
- *
539
- * @example
540
- * <FileSize size={100000} />
541
- */
542
- declare const FileSize: React__default.ForwardRefExoticComponent<FileSizeProps & React__default.RefAttributes<HTMLSpanElement>>;
543
-
544
464
  interface TimestampProps extends Omit<ComponentPropsWithSlot<"time">, "children" | "title"> {
545
465
  /**
546
466
  * The date to display.
@@ -579,4 +499,4 @@ interface TimestampProps extends Omit<ComponentPropsWithSlot<"time">, "children"
579
499
  */
580
500
  declare const Timestamp: React__default.ForwardRefExoticComponent<TimestampProps & React__default.RefAttributes<HTMLTimeElement>>;
581
501
 
582
- export { AttachmentTooLargeError, index$2 as Comment, CommentBodyComponents, CommentBodyLinkProps, CommentBodyMentionProps, CommentBodyProps, CommentLinkProps, CommentMentionProps, index$1 as Composer, ComposerAttachFilesProps, ComposerAttachmentsDropAreaProps, ComposerContext, ComposerEditorComponents, ComposerEditorLinkProps, ComposerEditorMentionProps, ComposerEditorMentionSuggestionsProps, ComposerEditorProps, ComposerFormProps, ComposerLinkProps, ComposerMentionProps, ComposerSubmitComment, ComposerSubmitProps, ComposerSuggestionsListItemProps, ComposerSuggestionsListProps, index as EmojiPicker, EmojiPickerContentCategoryHeaderProps, EmojiPickerContentComponents, EmojiPickerContentEmojiProps, EmojiPickerContentEmptyProps, EmojiPickerContentErrorProps, EmojiPickerContentGridProps, EmojiPickerContentLoadingProps, EmojiPickerContentProps, EmojiPickerContentRowProps, EmojiPickerRootProps, EmojiPickerSearchProps, FileSize, FileSizeProps, Timestamp, TimestampProps, useComposer };
502
+ export { index$2 as Comment, CommentBodyComponents, CommentBodyLinkProps, CommentBodyMentionProps, CommentBodyProps, CommentLinkProps, CommentMentionProps, index$1 as Composer, ComposerContext, ComposerEditorComponents, ComposerEditorLinkProps, ComposerEditorMentionProps, ComposerEditorMentionSuggestionsProps, ComposerEditorProps, ComposerFormProps, ComposerLinkProps, ComposerMentionProps, ComposerSubmitComment, ComposerSubmitProps, ComposerSuggestionsListItemProps, ComposerSuggestionsListProps, index as EmojiPicker, EmojiPickerContentCategoryHeaderProps, EmojiPickerContentComponents, EmojiPickerContentEmojiProps, EmojiPickerContentEmptyProps, EmojiPickerContentErrorProps, EmojiPickerContentGridProps, EmojiPickerContentLoadingProps, EmojiPickerContentProps, EmojiPickerContentRowProps, EmojiPickerRootProps, EmojiPickerSearchProps, Timestamp, TimestampProps, useComposer };
@@ -3,9 +3,7 @@
3
3
  var index = require('./Comment/index.js');
4
4
  var index$1 = require('./Composer/index.js');
5
5
  var contexts = require('./Composer/contexts.js');
6
- var utils = require('./Composer/utils.js');
7
6
  var index$2 = require('./EmojiPicker/index.js');
8
- var FileSize = require('./FileSize.js');
9
7
  var Timestamp = require('./Timestamp.js');
10
8
 
11
9
 
@@ -13,8 +11,6 @@ var Timestamp = require('./Timestamp.js');
13
11
  exports.Comment = index;
14
12
  exports.Composer = index$1;
15
13
  exports.useComposer = contexts.useComposer;
16
- exports.AttachmentTooLargeError = utils.AttachmentTooLargeError;
17
14
  exports.EmojiPicker = index$2;
18
- exports.FileSize = FileSize.FileSize;
19
15
  exports.Timestamp = Timestamp.Timestamp;
20
16
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;"}
@@ -3,9 +3,7 @@ export { index as Comment };
3
3
  import * as index$1 from './Composer/index.mjs';
4
4
  export { index$1 as Composer };
5
5
  export { useComposer } from './Composer/contexts.mjs';
6
- export { AttachmentTooLargeError } from './Composer/utils.mjs';
7
6
  import * as index$2 from './EmojiPicker/index.mjs';
8
7
  export { index$2 as EmojiPicker };
9
- export { FileSize } from './FileSize.mjs';
10
8
  export { Timestamp } from './Timestamp.mjs';
11
9
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;"}
1
+ {"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;"}
@@ -0,0 +1,12 @@
1
+ 'use strict';
2
+
3
+ function chunk(array, size) {
4
+ const chunks = [];
5
+ for (let i = 0, j = array.length; i < j; i += size) {
6
+ chunks.push(array.slice(i, i + size));
7
+ }
8
+ return chunks;
9
+ }
10
+
11
+ exports.chunk = chunk;
12
+ //# sourceMappingURL=chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk.js","sources":["../../src/utils/chunk.ts"],"sourcesContent":["export function chunk<T>(array: T[], size: number): T[][] {\n const chunks: T[][] = [];\n\n for (let i = 0, j = array.length; i < j; i += size) {\n chunks.push(array.slice(i, i + size));\n }\n\n return chunks;\n}\n"],"names":[],"mappings":";;AAAgB,SAAA,KAAA,CAAS,OAAY,IAAqB,EAAA;AACxD,EAAA,MAAM,SAAgB,EAAC,CAAA;AAEvB,EAAS,KAAA,IAAA,CAAA,GAAI,GAAG,CAAI,GAAA,KAAA,CAAM,QAAQ,CAAI,GAAA,CAAA,EAAG,KAAK,IAAM,EAAA;AAClD,IAAA,MAAA,CAAO,KAAK,KAAM,CAAA,KAAA,CAAM,CAAG,EAAA,CAAA,GAAI,IAAI,CAAC,CAAA,CAAA;AAAA,GACtC;AAEA,EAAO,OAAA,MAAA,CAAA;AACT;;;;"}
@@ -0,0 +1,10 @@
1
+ function chunk(array, size) {
2
+ const chunks = [];
3
+ for (let i = 0, j = array.length; i < j; i += size) {
4
+ chunks.push(array.slice(i, i + size));
5
+ }
6
+ return chunks;
7
+ }
8
+
9
+ export { chunk };
10
+ //# sourceMappingURL=chunk.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk.mjs","sources":["../../src/utils/chunk.ts"],"sourcesContent":["export function chunk<T>(array: T[], size: number): T[][] {\n const chunks: T[][] = [];\n\n for (let i = 0, j = array.length; i < j; i += size) {\n chunks.push(array.slice(i, i + size));\n }\n\n return chunks;\n}\n"],"names":[],"mappings":"AAAgB,SAAA,KAAA,CAAS,OAAY,IAAqB,EAAA;AACxD,EAAA,MAAM,SAAgB,EAAC,CAAA;AAEvB,EAAS,KAAA,IAAA,CAAA,GAAI,GAAG,CAAI,GAAA,KAAA,CAAM,QAAQ,CAAI,GAAA,CAAA,EAAG,KAAK,IAAM,EAAA;AAClD,IAAA,MAAA,CAAO,KAAK,KAAM,CAAA,KAAA,CAAM,CAAG,EAAA,CAAA,GAAI,IAAI,CAAC,CAAA,CAAA;AAAA,GACtC;AAEA,EAAO,OAAA,MAAA,CAAA;AACT;;;;"}
@@ -17,14 +17,8 @@ const listFormat = memoize.memoize(
17
17
  return new Intl.ListFormat(...args);
18
18
  }
19
19
  );
20
- const numberFormat = memoize.memoize(
21
- (...args) => {
22
- return new Intl.NumberFormat(...args);
23
- }
24
- );
25
20
 
26
21
  exports.dateTimeFormat = dateTimeFormat;
27
22
  exports.listFormat = listFormat;
28
- exports.numberFormat = numberFormat;
29
23
  exports.relativeTimeFormat = relativeTimeFormat;
30
24
  //# sourceMappingURL=intl.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"intl.js","sources":["../../src/utils/intl.ts"],"sourcesContent":["import { memoize } from \"./memoize\";\n\n// Avoid creating Intl formatters on every invocation.\n\nexport const dateTimeFormat = memoize(\n (...args: ConstructorParameters<(typeof Intl)[\"DateTimeFormat\"]>) => {\n return new Intl.DateTimeFormat(...args);\n }\n);\n\nexport const relativeTimeFormat = memoize(\n (...args: ConstructorParameters<(typeof Intl)[\"RelativeTimeFormat\"]>) => {\n return new Intl.RelativeTimeFormat(...args);\n }\n);\n\nexport const listFormat = memoize(\n (...args: ConstructorParameters<(typeof Intl)[\"ListFormat\"]>) => {\n return new Intl.ListFormat(...args);\n }\n);\n\nexport const numberFormat = memoize(\n (...args: ConstructorParameters<(typeof Intl)[\"NumberFormat\"]>) => {\n return new Intl.NumberFormat(...args);\n }\n);\n"],"names":["memoize"],"mappings":";;;;AAIO,MAAM,cAAiB,GAAAA,eAAA;AAAA,EAC5B,IAAI,IAAiE,KAAA;AACnE,IAAA,OAAO,IAAI,IAAA,CAAK,cAAe,CAAA,GAAG,IAAI,CAAA,CAAA;AAAA,GACxC;AACF,EAAA;AAEO,MAAM,kBAAqB,GAAAA,eAAA;AAAA,EAChC,IAAI,IAAqE,KAAA;AACvE,IAAA,OAAO,IAAI,IAAA,CAAK,kBAAmB,CAAA,GAAG,IAAI,CAAA,CAAA;AAAA,GAC5C;AACF,EAAA;AAEO,MAAM,UAAa,GAAAA,eAAA;AAAA,EACxB,IAAI,IAA6D,KAAA;AAC/D,IAAA,OAAO,IAAI,IAAA,CAAK,UAAW,CAAA,GAAG,IAAI,CAAA,CAAA;AAAA,GACpC;AACF,EAAA;AAEO,MAAM,YAAe,GAAAA,eAAA;AAAA,EAC1B,IAAI,IAA+D,KAAA;AACjE,IAAA,OAAO,IAAI,IAAA,CAAK,YAAa,CAAA,GAAG,IAAI,CAAA,CAAA;AAAA,GACtC;AACF;;;;;;;"}
1
+ {"version":3,"file":"intl.js","sources":["../../src/utils/intl.ts"],"sourcesContent":["import { memoize } from \"./memoize\";\n\n// Avoid creating Intl formatters on every invocation.\n\nexport const dateTimeFormat = memoize(\n (...args: ConstructorParameters<(typeof Intl)[\"DateTimeFormat\"]>) => {\n return new Intl.DateTimeFormat(...args);\n }\n);\n\nexport const relativeTimeFormat = memoize(\n (...args: ConstructorParameters<(typeof Intl)[\"RelativeTimeFormat\"]>) => {\n return new Intl.RelativeTimeFormat(...args);\n }\n);\n\nexport const listFormat = memoize(\n (...args: ConstructorParameters<(typeof Intl)[\"ListFormat\"]>) => {\n return new Intl.ListFormat(...args);\n }\n);\n"],"names":["memoize"],"mappings":";;;;AAIO,MAAM,cAAiB,GAAAA,eAAA;AAAA,EAC5B,IAAI,IAAiE,KAAA;AACnE,IAAA,OAAO,IAAI,IAAA,CAAK,cAAe,CAAA,GAAG,IAAI,CAAA,CAAA;AAAA,GACxC;AACF,EAAA;AAEO,MAAM,kBAAqB,GAAAA,eAAA;AAAA,EAChC,IAAI,IAAqE,KAAA;AACvE,IAAA,OAAO,IAAI,IAAA,CAAK,kBAAmB,CAAA,GAAG,IAAI,CAAA,CAAA;AAAA,GAC5C;AACF,EAAA;AAEO,MAAM,UAAa,GAAAA,eAAA;AAAA,EACxB,IAAI,IAA6D,KAAA;AAC/D,IAAA,OAAO,IAAI,IAAA,CAAK,UAAW,CAAA,GAAG,IAAI,CAAA,CAAA;AAAA,GACpC;AACF;;;;;;"}