@liveblocks/react-ui 2.7.2 → 2.8.0-beta2

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 (126) hide show
  1. package/dist/_private/index.d.mts +5 -3
  2. package/dist/_private/index.d.ts +5 -3
  3. package/dist/_private/index.js +4 -2
  4. package/dist/_private/index.js.map +1 -1
  5. package/dist/_private/index.mjs +2 -1
  6. package/dist/_private/index.mjs.map +1 -1
  7. package/dist/components/Comment.js +106 -3
  8. package/dist/components/Comment.js.map +1 -1
  9. package/dist/components/Comment.mjs +107 -5
  10. package/dist/components/Comment.mjs.map +1 -1
  11. package/dist/components/Composer.js +216 -103
  12. package/dist/components/Composer.js.map +1 -1
  13. package/dist/components/Composer.mjs +220 -107
  14. package/dist/components/Composer.mjs.map +1 -1
  15. package/dist/components/HistoryVersionSummary.js +5 -0
  16. package/dist/components/HistoryVersionSummary.js.map +1 -1
  17. package/dist/components/HistoryVersionSummary.mjs +5 -0
  18. package/dist/components/HistoryVersionSummary.mjs.map +1 -1
  19. package/dist/components/InboxNotification.js +20 -4
  20. package/dist/components/InboxNotification.js.map +1 -1
  21. package/dist/components/InboxNotification.mjs +20 -4
  22. package/dist/components/InboxNotification.mjs.map +1 -1
  23. package/dist/components/Thread.js +5 -0
  24. package/dist/components/Thread.js.map +1 -1
  25. package/dist/components/Thread.mjs +5 -0
  26. package/dist/components/Thread.mjs.map +1 -1
  27. package/dist/components/internal/Attachment.js +314 -0
  28. package/dist/components/internal/Attachment.js.map +1 -0
  29. package/dist/components/internal/Attachment.mjs +310 -0
  30. package/dist/components/internal/Attachment.mjs.map +1 -0
  31. package/dist/components/internal/InboxNotificationThread.js +12 -2
  32. package/dist/components/internal/InboxNotificationThread.js.map +1 -1
  33. package/dist/components/internal/InboxNotificationThread.mjs +13 -3
  34. package/dist/components/internal/InboxNotificationThread.mjs.map +1 -1
  35. package/dist/icons/Attachment.js +15 -0
  36. package/dist/icons/Attachment.js.map +1 -0
  37. package/dist/icons/Attachment.mjs +13 -0
  38. package/dist/icons/Attachment.mjs.map +1 -0
  39. package/dist/icons/Spinner.js +3 -9
  40. package/dist/icons/Spinner.js.map +1 -1
  41. package/dist/icons/Spinner.mjs +4 -10
  42. package/dist/icons/Spinner.mjs.map +1 -1
  43. package/dist/icons/{Missing.js → Warning.js} +3 -3
  44. package/dist/icons/{Missing.js.map → Warning.js.map} +1 -1
  45. package/dist/icons/{Missing.mjs → Warning.mjs} +3 -3
  46. package/dist/icons/{Missing.mjs.map → Warning.mjs.map} +1 -1
  47. package/dist/index.d.mts +73 -4
  48. package/dist/index.d.ts +73 -4
  49. package/dist/index.js.map +1 -1
  50. package/dist/index.mjs.map +1 -1
  51. package/dist/overrides.js +5 -0
  52. package/dist/overrides.js.map +1 -1
  53. package/dist/overrides.mjs +5 -0
  54. package/dist/overrides.mjs.map +1 -1
  55. package/dist/primitives/Composer/contexts.js +17 -3
  56. package/dist/primitives/Composer/contexts.js.map +1 -1
  57. package/dist/primitives/Composer/contexts.mjs +15 -4
  58. package/dist/primitives/Composer/contexts.mjs.map +1 -1
  59. package/dist/primitives/Composer/index.js +207 -30
  60. package/dist/primitives/Composer/index.js.map +1 -1
  61. package/dist/primitives/Composer/index.mjs +210 -35
  62. package/dist/primitives/Composer/index.mjs.map +1 -1
  63. package/dist/primitives/Composer/utils.js +231 -0
  64. package/dist/primitives/Composer/utils.js.map +1 -1
  65. package/dist/primitives/Composer/utils.mjs +229 -1
  66. package/dist/primitives/Composer/utils.mjs.map +1 -1
  67. package/dist/primitives/EmojiPicker/utils.js +2 -2
  68. package/dist/primitives/EmojiPicker/utils.js.map +1 -1
  69. package/dist/primitives/EmojiPicker/utils.mjs +1 -1
  70. package/dist/primitives/EmojiPicker/utils.mjs.map +1 -1
  71. package/dist/primitives/FileSize.js +33 -0
  72. package/dist/primitives/FileSize.js.map +1 -0
  73. package/dist/primitives/FileSize.mjs +31 -0
  74. package/dist/primitives/FileSize.mjs.map +1 -0
  75. package/dist/primitives/index.d.mts +87 -3
  76. package/dist/primitives/index.d.ts +87 -3
  77. package/dist/primitives/index.js +4 -0
  78. package/dist/primitives/index.js.map +1 -1
  79. package/dist/primitives/index.mjs +2 -0
  80. package/dist/primitives/index.mjs.map +1 -1
  81. package/dist/slate/plugins/{paste-html.js → paste.js} +16 -5
  82. package/dist/slate/plugins/paste.js.map +1 -0
  83. package/dist/slate/plugins/{paste-html.mjs → paste.mjs} +16 -5
  84. package/dist/slate/plugins/paste.mjs.map +1 -0
  85. package/dist/utils/data-transfer.js +20 -0
  86. package/dist/utils/data-transfer.js.map +1 -0
  87. package/dist/utils/data-transfer.mjs +18 -0
  88. package/dist/utils/data-transfer.mjs.map +1 -0
  89. package/dist/utils/download.js +14 -0
  90. package/dist/utils/download.js.map +1 -0
  91. package/dist/utils/download.mjs +12 -0
  92. package/dist/utils/download.mjs.map +1 -0
  93. package/dist/utils/format-file-size.js +45 -0
  94. package/dist/utils/format-file-size.js.map +1 -0
  95. package/dist/utils/format-file-size.mjs +43 -0
  96. package/dist/utils/format-file-size.mjs.map +1 -0
  97. package/dist/utils/intl.js +6 -0
  98. package/dist/utils/intl.js.map +1 -1
  99. package/dist/utils/intl.mjs +6 -1
  100. package/dist/utils/intl.mjs.map +1 -1
  101. package/dist/utils/use-initial.js +2 -1
  102. package/dist/utils/use-initial.js.map +1 -1
  103. package/dist/utils/use-initial.mjs +3 -2
  104. package/dist/utils/use-initial.mjs.map +1 -1
  105. package/dist/utils/use-latest.js.map +1 -1
  106. package/dist/utils/use-latest.mjs.map +1 -1
  107. package/dist/version.js +1 -1
  108. package/dist/version.js.map +1 -1
  109. package/dist/version.mjs +1 -1
  110. package/dist/version.mjs.map +1 -1
  111. package/package.json +4 -4
  112. package/src/styles/dark/index.css +1 -0
  113. package/src/styles/index.css +343 -62
  114. package/src/styles/utils.css +44 -0
  115. package/styles/dark/attributes.css +1 -1
  116. package/styles/dark/attributes.css.map +1 -1
  117. package/styles/dark/media-query.css +1 -1
  118. package/styles/dark/media-query.css.map +1 -1
  119. package/styles.css +1 -1
  120. package/styles.css.map +1 -1
  121. package/dist/slate/plugins/paste-html.js.map +0 -1
  122. package/dist/slate/plugins/paste-html.mjs.map +0 -1
  123. package/dist/utils/chunk.js +0 -12
  124. package/dist/utils/chunk.js.map +0 -1
  125. package/dist/utils/chunk.mjs +0 -10
  126. package/dist/utils/chunk.mjs.map +0 -1
@@ -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 } from '@liveblocks/core';
3
+ import { CommentBody as CommentBody$1, CommentAttachment, CommentMixedAttachment } from '@liveblocks/core';
4
4
 
5
5
  declare type Direction = "ltr" | "rtl";
6
6
  declare type SlotProp = {
@@ -173,13 +173,33 @@ 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
+ /**
185
+ * Whether to create attachments when pasting files into the editor.
186
+ */
187
+ pasteFilesAsAttachments?: boolean;
176
188
  }
177
189
  declare type ComposerSubmitProps = ComponentPropsWithSlot<"button">;
190
+ declare type ComposerAttachFilesProps = ComponentPropsWithSlot<"button">;
191
+ interface ComposerAttachmentsDropAreaProps extends ComponentPropsWithSlot<"div"> {
192
+ disabled?: boolean;
193
+ }
178
194
  interface ComposerSubmitComment {
179
195
  /**
180
196
  * The submitted comment's body.
181
197
  */
182
198
  body: CommentBody$1;
199
+ /**
200
+ * The submitted comment's uploaded attachments.
201
+ */
202
+ attachments: CommentAttachment[];
183
203
  }
184
204
 
185
205
  /**
@@ -246,9 +266,27 @@ declare const ComposerForm: React__default.ForwardRefExoticComponent<ComposerFor
246
266
  * <Composer.Submit>Send</Composer.Submit>
247
267
  */
248
268
  declare const ComposerSubmit: React__default.ForwardRefExoticComponent<Omit<React__default.DetailedHTMLProps<React__default.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "ref"> & SlotProp & React__default.RefAttributes<HTMLButtonElement>>;
269
+ /**
270
+ * A button which opens a file picker to create attachments.
271
+ *
272
+ * @example
273
+ * <Composer.AttachFiles>Attach files</Composer.AttachFiles>
274
+ */
275
+ declare const ComposerAttachFiles: React__default.ForwardRefExoticComponent<Omit<React__default.DetailedHTMLProps<React__default.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "ref"> & SlotProp & React__default.RefAttributes<HTMLButtonElement>>;
276
+ /**
277
+ * A drop area which accepts files to create attachments.
278
+ *
279
+ * @example
280
+ * <Composer.AttachmentsDropArea>
281
+ * Drop files here
282
+ * </Composer.AttachmentsDropArea>
283
+ */
284
+ declare const ComposerAttachmentsDropArea: React__default.ForwardRefExoticComponent<ComposerAttachmentsDropAreaProps & React__default.RefAttributes<HTMLDivElement>>;
249
285
 
250
286
  declare namespace index$1 {
251
287
  export {
288
+ ComposerAttachFiles as AttachFiles,
289
+ ComposerAttachmentsDropArea as AttachmentsDropArea,
252
290
  ComposerEditor as Editor,
253
291
  ComposerForm as Form,
254
292
  ComposerLink as Link,
@@ -261,6 +299,14 @@ declare namespace index$1 {
261
299
  }
262
300
 
263
301
  declare type ComposerContext = {
302
+ /**
303
+ * Whether the composer is currently disabled.
304
+ */
305
+ isDisabled: boolean;
306
+ /**
307
+ * Whether the composer can currently be submitted.
308
+ */
309
+ canSubmit: boolean;
264
310
  /**
265
311
  * Whether the editor is currently focused.
266
312
  */
@@ -274,7 +320,7 @@ declare type ComposerContext = {
274
320
  */
275
321
  submit: () => void;
276
322
  /**
277
- * Clear the editor programmatically.
323
+ * Clear the composer programmatically.
278
324
  */
279
325
  clear: () => void;
280
326
  /**
@@ -297,10 +343,26 @@ declare type ComposerContext = {
297
343
  * Insert text at the current selection.
298
344
  */
299
345
  insertText: (text: string) => void;
346
+ /**
347
+ * Open a file picker programmatically to create attachments.
348
+ */
349
+ attachFiles: () => void;
350
+ /**
351
+ * The composer's current attachments.
352
+ */
353
+ attachments: CommentMixedAttachment[];
354
+ /**
355
+ * Remove an attachment by its ID.
356
+ */
357
+ removeAttachment: (attachmentId: string) => void;
300
358
  };
301
359
  declare const ComposerContext: React.Context<ComposerContext | null>;
302
360
  declare function useComposer(): ComposerContext;
303
361
 
362
+ declare class AttachmentTooLargeError extends Error {
363
+ name: string;
364
+ }
365
+
304
366
  declare type EmojiPickerContentLoadingProps = ComponentPropsWithoutRef<"div">;
305
367
  declare type EmojiPickerContentEmptyProps = ComponentPropsWithoutRef<"div">;
306
368
  declare type EmojiPickerContentGridProps = ComponentPropsWithoutRef<"div">;
@@ -461,6 +523,28 @@ declare namespace index {
461
523
  };
462
524
  }
463
525
 
526
+ interface FileSizeProps extends Omit<ComponentPropsWithSlot<"span">, "children"> {
527
+ /**
528
+ * The file size to display.
529
+ */
530
+ size: number;
531
+ /**
532
+ * A function to format the displayed file size.
533
+ */
534
+ children?: (size: number, locale?: string) => ReactNode;
535
+ /**
536
+ * The locale used when formatting the file size.
537
+ */
538
+ locale?: string;
539
+ }
540
+ /**
541
+ * Displays a formatted file size.
542
+ *
543
+ * @example
544
+ * <FileSize size={100000} />
545
+ */
546
+ declare const FileSize: React__default.ForwardRefExoticComponent<FileSizeProps & React__default.RefAttributes<HTMLSpanElement>>;
547
+
464
548
  interface TimestampProps extends Omit<ComponentPropsWithSlot<"time">, "children" | "title"> {
465
549
  /**
466
550
  * The date to display.
@@ -499,4 +583,4 @@ interface TimestampProps extends Omit<ComponentPropsWithSlot<"time">, "children"
499
583
  */
500
584
  declare const Timestamp: React__default.ForwardRefExoticComponent<TimestampProps & React__default.RefAttributes<HTMLTimeElement>>;
501
585
 
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 };
586
+ 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 };
@@ -3,7 +3,9 @@
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');
6
7
  var index$2 = require('./EmojiPicker/index.js');
8
+ var FileSize = require('./FileSize.js');
7
9
  var Timestamp = require('./Timestamp.js');
8
10
 
9
11
 
@@ -11,6 +13,8 @@ var Timestamp = require('./Timestamp.js');
11
13
  exports.Comment = index;
12
14
  exports.Composer = index$1;
13
15
  exports.useComposer = contexts.useComposer;
16
+ exports.AttachmentTooLargeError = utils.AttachmentTooLargeError;
14
17
  exports.EmojiPicker = index$2;
18
+ exports.FileSize = FileSize.FileSize;
15
19
  exports.Timestamp = Timestamp.Timestamp;
16
20
  //# 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,7 +3,9 @@ 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';
6
7
  import * as index$2 from './EmojiPicker/index.mjs';
7
8
  export { index$2 as EmojiPicker };
9
+ export { FileSize } from './FileSize.mjs';
8
10
  export { Timestamp } from './Timestamp.mjs';
9
11
  //# 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":";;;;;;;;;"}
@@ -2,6 +2,7 @@
2
2
 
3
3
  var slate = require('slate');
4
4
  var slateHyperscript = require('slate-hyperscript');
5
+ var dataTransfer = require('../../utils/data-transfer.js');
5
6
 
6
7
  function areUrlsEqual(a, b) {
7
8
  try {
@@ -84,11 +85,21 @@ function deserialize(node) {
84
85
  }
85
86
  return children;
86
87
  }
87
- function withPasteHtml(editor) {
88
+ function withPaste(editor, {
89
+ createAttachments,
90
+ pasteFilesAsAttachments
91
+ }) {
88
92
  const { insertData } = editor;
89
93
  editor.insertData = (data) => {
90
- const html = data.getData("text/html");
91
- if (html) {
94
+ if (data.types.includes("Files") && pasteFilesAsAttachments) {
95
+ const files = dataTransfer.getFiles(data);
96
+ if (files.length > 0) {
97
+ createAttachments(files);
98
+ return;
99
+ }
100
+ }
101
+ if (data.types.includes("text/html")) {
102
+ const html = data.getData("text/html");
92
103
  const parsed = new DOMParser().parseFromString(html, "text/html");
93
104
  const fragment = deserialize(parsed.body);
94
105
  if (fragment !== null && Array.isArray(fragment)) {
@@ -101,5 +112,5 @@ function withPasteHtml(editor) {
101
112
  return editor;
102
113
  }
103
114
 
104
- exports.withPasteHtml = withPasteHtml;
105
- //# sourceMappingURL=paste-html.js.map
115
+ exports.withPaste = withPaste;
116
+ //# sourceMappingURL=paste.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paste.js","sources":["../../../src/slate/plugins/paste.ts"],"sourcesContent":["import type { Descendant, Editor, Element, Node as SlateNode } from \"slate\";\nimport { Transforms } from \"slate\";\nimport { jsx } from \"slate-hyperscript\";\n\nimport type {\n ComposerBodyAutoLink,\n ComposerBodyBlockElement,\n ComposerBodyCustomLink,\n ComposerBodyInlineElement,\n ComposerBodyParagraph,\n ComposerBodyText,\n} from \"../../types\";\nimport { getFiles } from \"../../utils/data-transfer\";\n\n// Based on: https://github.com/ianstormtaylor/slate/blob/main/site/examples/paste-html.tsx\n\ntype OmitTextChildren<T> = Omit<T, \"text\" | \"children\">;\n\ntype ComposerBodyElementTag = OmitTextChildren<\n ComposerBodyBlockElement | ComposerBodyInlineElement\n>;\ntype ComposerBodyTextTag = OmitTextChildren<ComposerBodyText>;\n\ntype DeserializedNode =\n | string\n | null\n | Element\n | Descendant[]\n | ComposerBodyText[]\n | DeserializedNode[];\n\nfunction areUrlsEqual(a: string, b: string) {\n try {\n const urlA = new URL(a);\n const urlB = new URL(b);\n\n return urlA.origin === urlB.origin && urlA.pathname === urlB.pathname;\n } catch {\n return false;\n }\n}\n\nconst createParagraphElement = (): OmitTextChildren<ComposerBodyParagraph> => ({\n type: \"paragraph\",\n});\n\nconst ELEMENT_TAGS = {\n A: (\n element\n ): OmitTextChildren<ComposerBodyCustomLink | ComposerBodyAutoLink> => {\n const href = element.getAttribute(\"href\");\n const innerText = element.innerText;\n\n return {\n type: href && areUrlsEqual(href, innerText) ? \"auto-link\" : \"custom-link\",\n url: href ?? \"\",\n };\n },\n P: createParagraphElement,\n // Falling back to paragraphs for unsupported elements\n BLOCKQUOTE: createParagraphElement,\n H1: createParagraphElement,\n H2: createParagraphElement,\n H3: createParagraphElement,\n H4: createParagraphElement,\n H5: createParagraphElement,\n H6: createParagraphElement,\n LI: createParagraphElement,\n} as Record<string, (node: HTMLElement) => ComposerBodyElementTag>;\n\nconst TEXT_TAGS = {\n CODE: (): ComposerBodyTextTag => ({ code: true }),\n DEL: (): ComposerBodyTextTag => ({ strikethrough: true }),\n EM: (): ComposerBodyTextTag => ({ italic: true }),\n I: (): ComposerBodyTextTag => ({ italic: true }),\n S: (): ComposerBodyTextTag => ({ strikethrough: true }),\n STRONG: (): ComposerBodyTextTag => ({ bold: true }),\n // `B` is omitted because Google Docs uses `<b>` in weird ways\n // B: (): ComposerBodyTextTag => ({ bold: true }),\n} as Record<string, (node: HTMLElement) => ComposerBodyTextTag>;\n\nfunction flattenListItems(node: HTMLElement): HTMLElement[] {\n const listItems: HTMLElement[] = [];\n\n if (node.nodeName === \"LI\") {\n listItems.push(node);\n }\n\n node.childNodes.forEach((child) => {\n if (child.nodeType === 1) {\n listItems.push(...flattenListItems(child as HTMLElement));\n }\n });\n\n return listItems;\n}\n\nfunction deserialize(node: Node): DeserializedNode {\n if (node.nodeType === 3) {\n return node.textContent;\n } else if (node.nodeType !== 1) {\n return null;\n } else if (node.nodeName === \"BR\") {\n return \"\\n\";\n }\n\n const childNodes = Array.from(node.childNodes);\n let children = childNodes.map(deserialize).flat();\n\n // Lists aren't supported (yet), so we flatten them into paragraphs\n if (node.nodeName === \"UL\" || node.nodeName === \"OL\") {\n const listItems = flattenListItems(node as HTMLElement);\n\n children = listItems.map((li) => deserialize(li)).flat();\n }\n\n if (children.length === 0) {\n children = [{ text: \"\" }];\n }\n\n if (node.nodeName === \"BODY\") {\n return jsx(\"fragment\", {}, children);\n }\n\n if (ELEMENT_TAGS[node.nodeName]) {\n const attrs = ELEMENT_TAGS[node.nodeName](node as HTMLElement);\n\n return jsx(\"element\", attrs, children);\n }\n\n if (TEXT_TAGS[node.nodeName]) {\n const attrs = TEXT_TAGS[node.nodeName](node as HTMLElement);\n\n return children.map((child) => jsx(\"text\", attrs, child));\n }\n\n return children as DeserializedNode;\n}\n\nexport function withPaste(\n editor: Editor,\n {\n createAttachments,\n pasteFilesAsAttachments,\n }: {\n createAttachments: (files: File[]) => void;\n pasteFilesAsAttachments?: boolean;\n }\n) {\n const { insertData } = editor;\n\n editor.insertData = (data) => {\n // Create attachments from files when pasting\n if (data.types.includes(\"Files\") && pasteFilesAsAttachments) {\n const files = getFiles(data);\n\n if (files.length > 0) {\n createAttachments(files);\n\n return;\n }\n }\n\n // Deserialize rich text from HTML when pasting\n if (data.types.includes(\"text/html\")) {\n const html = data.getData(\"text/html\");\n const parsed = new DOMParser().parseFromString(html, \"text/html\");\n const fragment = deserialize(parsed.body);\n\n if (fragment !== null && Array.isArray(fragment)) {\n Transforms.insertFragment(editor, fragment as SlateNode[]);\n\n return;\n }\n }\n\n insertData(data);\n };\n\n return editor;\n}\n"],"names":["jsx","getFiles","Transforms"],"mappings":";;;;;;AA+BA,SAAS,YAAA,CAAa,GAAW,CAAW,EAAA;AAC1C,EAAI,IAAA;AACF,IAAM,MAAA,IAAA,GAAO,IAAI,GAAA,CAAI,CAAC,CAAA,CAAA;AACtB,IAAM,MAAA,IAAA,GAAO,IAAI,GAAA,CAAI,CAAC,CAAA,CAAA;AAEtB,IAAA,OAAO,KAAK,MAAW,KAAA,IAAA,CAAK,MAAU,IAAA,IAAA,CAAK,aAAa,IAAK,CAAA,QAAA,CAAA;AAAA,GAC7D,CAAA,MAAA;AACA,IAAO,OAAA,KAAA,CAAA;AAAA,GACT;AACF,CAAA;AAEA,MAAM,yBAAyB,OAAgD;AAAA,EAC7E,IAAM,EAAA,WAAA;AACR,CAAA,CAAA,CAAA;AAEA,MAAM,YAAe,GAAA;AAAA,EACnB,CAAA,EAAG,CACD,OACoE,KAAA;AACpE,IAAM,MAAA,IAAA,GAAO,OAAQ,CAAA,YAAA,CAAa,MAAM,CAAA,CAAA;AACxC,IAAA,MAAM,YAAY,OAAQ,CAAA,SAAA,CAAA;AAE1B,IAAO,OAAA;AAAA,MACL,MAAM,IAAQ,IAAA,YAAA,CAAa,IAAM,EAAA,SAAS,IAAI,WAAc,GAAA,aAAA;AAAA,MAC5D,KAAK,IAAQ,IAAA,EAAA;AAAA,KACf,CAAA;AAAA,GACF;AAAA,EACA,CAAG,EAAA,sBAAA;AAAA,EAEH,UAAY,EAAA,sBAAA;AAAA,EACZ,EAAI,EAAA,sBAAA;AAAA,EACJ,EAAI,EAAA,sBAAA;AAAA,EACJ,EAAI,EAAA,sBAAA;AAAA,EACJ,EAAI,EAAA,sBAAA;AAAA,EACJ,EAAI,EAAA,sBAAA;AAAA,EACJ,EAAI,EAAA,sBAAA;AAAA,EACJ,EAAI,EAAA,sBAAA;AACN,CAAA,CAAA;AAEA,MAAM,SAAY,GAAA;AAAA,EAChB,IAAM,EAAA,OAA4B,EAAE,IAAA,EAAM,IAAK,EAAA,CAAA;AAAA,EAC/C,GAAK,EAAA,OAA4B,EAAE,aAAA,EAAe,IAAK,EAAA,CAAA;AAAA,EACvD,EAAI,EAAA,OAA4B,EAAE,MAAA,EAAQ,IAAK,EAAA,CAAA;AAAA,EAC/C,CAAG,EAAA,OAA4B,EAAE,MAAA,EAAQ,IAAK,EAAA,CAAA;AAAA,EAC9C,CAAG,EAAA,OAA4B,EAAE,aAAA,EAAe,IAAK,EAAA,CAAA;AAAA,EACrD,MAAQ,EAAA,OAA4B,EAAE,IAAA,EAAM,IAAK,EAAA,CAAA;AAGnD,CAAA,CAAA;AAEA,SAAS,iBAAiB,IAAkC,EAAA;AAC1D,EAAA,MAAM,YAA2B,EAAC,CAAA;AAElC,EAAI,IAAA,IAAA,CAAK,aAAa,IAAM,EAAA;AAC1B,IAAA,SAAA,CAAU,KAAK,IAAI,CAAA,CAAA;AAAA,GACrB;AAEA,EAAK,IAAA,CAAA,UAAA,CAAW,OAAQ,CAAA,CAAC,KAAU,KAAA;AACjC,IAAI,IAAA,KAAA,CAAM,aAAa,CAAG,EAAA;AACxB,MAAA,SAAA,CAAU,IAAK,CAAA,GAAG,gBAAiB,CAAA,KAAoB,CAAC,CAAA,CAAA;AAAA,KAC1D;AAAA,GACD,CAAA,CAAA;AAED,EAAO,OAAA,SAAA,CAAA;AACT,CAAA;AAEA,SAAS,YAAY,IAA8B,EAAA;AACjD,EAAI,IAAA,IAAA,CAAK,aAAa,CAAG,EAAA;AACvB,IAAA,OAAO,IAAK,CAAA,WAAA,CAAA;AAAA,GACd,MAAA,IAAW,IAAK,CAAA,QAAA,KAAa,CAAG,EAAA;AAC9B,IAAO,OAAA,IAAA,CAAA;AAAA,GACT,MAAA,IAAW,IAAK,CAAA,QAAA,KAAa,IAAM,EAAA;AACjC,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AAEA,EAAA,MAAM,UAAa,GAAA,KAAA,CAAM,IAAK,CAAA,IAAA,CAAK,UAAU,CAAA,CAAA;AAC7C,EAAA,IAAI,QAAW,GAAA,UAAA,CAAW,GAAI,CAAA,WAAW,EAAE,IAAK,EAAA,CAAA;AAGhD,EAAA,IAAI,IAAK,CAAA,QAAA,KAAa,IAAQ,IAAA,IAAA,CAAK,aAAa,IAAM,EAAA;AACpD,IAAM,MAAA,SAAA,GAAY,iBAAiB,IAAmB,CAAA,CAAA;AAEtD,IAAW,QAAA,GAAA,SAAA,CAAU,IAAI,CAAC,EAAA,KAAO,YAAY,EAAE,CAAC,EAAE,IAAK,EAAA,CAAA;AAAA,GACzD;AAEA,EAAI,IAAA,QAAA,CAAS,WAAW,CAAG,EAAA;AACzB,IAAA,QAAA,GAAW,CAAC,EAAE,IAAM,EAAA,EAAA,EAAI,CAAA,CAAA;AAAA,GAC1B;AAEA,EAAI,IAAA,IAAA,CAAK,aAAa,MAAQ,EAAA;AAC5B,IAAA,OAAOA,oBAAI,CAAA,UAAA,EAAY,EAAC,EAAG,QAAQ,CAAA,CAAA;AAAA,GACrC;AAEA,EAAI,IAAA,YAAA,CAAa,KAAK,QAAW,CAAA,EAAA;AAC/B,IAAA,MAAM,KAAQ,GAAA,YAAA,CAAa,IAAK,CAAA,QAAA,CAAA,CAAU,IAAmB,CAAA,CAAA;AAE7D,IAAO,OAAAA,oBAAA,CAAI,SAAW,EAAA,KAAA,EAAO,QAAQ,CAAA,CAAA;AAAA,GACvC;AAEA,EAAI,IAAA,SAAA,CAAU,KAAK,QAAW,CAAA,EAAA;AAC5B,IAAA,MAAM,KAAQ,GAAA,SAAA,CAAU,IAAK,CAAA,QAAA,CAAA,CAAU,IAAmB,CAAA,CAAA;AAE1D,IAAO,OAAA,QAAA,CAAS,IAAI,CAAC,KAAA,KAAUA,qBAAI,MAAQ,EAAA,KAAA,EAAO,KAAK,CAAC,CAAA,CAAA;AAAA,GAC1D;AAEA,EAAO,OAAA,QAAA,CAAA;AACT,CAAA;AAEO,SAAS,UACd,MACA,EAAA;AAAA,EACE,iBAAA;AAAA,EACA,uBAAA;AACF,CAIA,EAAA;AACA,EAAM,MAAA,EAAE,YAAe,GAAA,MAAA,CAAA;AAEvB,EAAO,MAAA,CAAA,UAAA,GAAa,CAAC,IAAS,KAAA;AAE5B,IAAA,IAAI,IAAK,CAAA,KAAA,CAAM,QAAS,CAAA,OAAO,KAAK,uBAAyB,EAAA;AAC3D,MAAM,MAAA,KAAA,GAAQC,sBAAS,IAAI,CAAA,CAAA;AAE3B,MAAI,IAAA,KAAA,CAAM,SAAS,CAAG,EAAA;AACpB,QAAA,iBAAA,CAAkB,KAAK,CAAA,CAAA;AAEvB,QAAA,OAAA;AAAA,OACF;AAAA,KACF;AAGA,IAAA,IAAI,IAAK,CAAA,KAAA,CAAM,QAAS,CAAA,WAAW,CAAG,EAAA;AACpC,MAAM,MAAA,IAAA,GAAO,IAAK,CAAA,OAAA,CAAQ,WAAW,CAAA,CAAA;AACrC,MAAA,MAAM,SAAS,IAAI,SAAA,EAAY,CAAA,eAAA,CAAgB,MAAM,WAAW,CAAA,CAAA;AAChE,MAAM,MAAA,QAAA,GAAW,WAAY,CAAA,MAAA,CAAO,IAAI,CAAA,CAAA;AAExC,MAAA,IAAI,QAAa,KAAA,IAAA,IAAQ,KAAM,CAAA,OAAA,CAAQ,QAAQ,CAAG,EAAA;AAChD,QAAWC,gBAAA,CAAA,cAAA,CAAe,QAAQ,QAAuB,CAAA,CAAA;AAEzD,QAAA,OAAA;AAAA,OACF;AAAA,KACF;AAEA,IAAA,UAAA,CAAW,IAAI,CAAA,CAAA;AAAA,GACjB,CAAA;AAEA,EAAO,OAAA,MAAA,CAAA;AACT;;;;"}
@@ -1,5 +1,6 @@
1
1
  import { Transforms } from 'slate';
2
2
  import { jsx } from 'slate-hyperscript';
3
+ import { getFiles } from '../../utils/data-transfer.mjs';
3
4
 
4
5
  function areUrlsEqual(a, b) {
5
6
  try {
@@ -82,11 +83,21 @@ function deserialize(node) {
82
83
  }
83
84
  return children;
84
85
  }
85
- function withPasteHtml(editor) {
86
+ function withPaste(editor, {
87
+ createAttachments,
88
+ pasteFilesAsAttachments
89
+ }) {
86
90
  const { insertData } = editor;
87
91
  editor.insertData = (data) => {
88
- const html = data.getData("text/html");
89
- if (html) {
92
+ if (data.types.includes("Files") && pasteFilesAsAttachments) {
93
+ const files = getFiles(data);
94
+ if (files.length > 0) {
95
+ createAttachments(files);
96
+ return;
97
+ }
98
+ }
99
+ if (data.types.includes("text/html")) {
100
+ const html = data.getData("text/html");
90
101
  const parsed = new DOMParser().parseFromString(html, "text/html");
91
102
  const fragment = deserialize(parsed.body);
92
103
  if (fragment !== null && Array.isArray(fragment)) {
@@ -99,5 +110,5 @@ function withPasteHtml(editor) {
99
110
  return editor;
100
111
  }
101
112
 
102
- export { withPasteHtml };
103
- //# sourceMappingURL=paste-html.mjs.map
113
+ export { withPaste };
114
+ //# sourceMappingURL=paste.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paste.mjs","sources":["../../../src/slate/plugins/paste.ts"],"sourcesContent":["import type { Descendant, Editor, Element, Node as SlateNode } from \"slate\";\nimport { Transforms } from \"slate\";\nimport { jsx } from \"slate-hyperscript\";\n\nimport type {\n ComposerBodyAutoLink,\n ComposerBodyBlockElement,\n ComposerBodyCustomLink,\n ComposerBodyInlineElement,\n ComposerBodyParagraph,\n ComposerBodyText,\n} from \"../../types\";\nimport { getFiles } from \"../../utils/data-transfer\";\n\n// Based on: https://github.com/ianstormtaylor/slate/blob/main/site/examples/paste-html.tsx\n\ntype OmitTextChildren<T> = Omit<T, \"text\" | \"children\">;\n\ntype ComposerBodyElementTag = OmitTextChildren<\n ComposerBodyBlockElement | ComposerBodyInlineElement\n>;\ntype ComposerBodyTextTag = OmitTextChildren<ComposerBodyText>;\n\ntype DeserializedNode =\n | string\n | null\n | Element\n | Descendant[]\n | ComposerBodyText[]\n | DeserializedNode[];\n\nfunction areUrlsEqual(a: string, b: string) {\n try {\n const urlA = new URL(a);\n const urlB = new URL(b);\n\n return urlA.origin === urlB.origin && urlA.pathname === urlB.pathname;\n } catch {\n return false;\n }\n}\n\nconst createParagraphElement = (): OmitTextChildren<ComposerBodyParagraph> => ({\n type: \"paragraph\",\n});\n\nconst ELEMENT_TAGS = {\n A: (\n element\n ): OmitTextChildren<ComposerBodyCustomLink | ComposerBodyAutoLink> => {\n const href = element.getAttribute(\"href\");\n const innerText = element.innerText;\n\n return {\n type: href && areUrlsEqual(href, innerText) ? \"auto-link\" : \"custom-link\",\n url: href ?? \"\",\n };\n },\n P: createParagraphElement,\n // Falling back to paragraphs for unsupported elements\n BLOCKQUOTE: createParagraphElement,\n H1: createParagraphElement,\n H2: createParagraphElement,\n H3: createParagraphElement,\n H4: createParagraphElement,\n H5: createParagraphElement,\n H6: createParagraphElement,\n LI: createParagraphElement,\n} as Record<string, (node: HTMLElement) => ComposerBodyElementTag>;\n\nconst TEXT_TAGS = {\n CODE: (): ComposerBodyTextTag => ({ code: true }),\n DEL: (): ComposerBodyTextTag => ({ strikethrough: true }),\n EM: (): ComposerBodyTextTag => ({ italic: true }),\n I: (): ComposerBodyTextTag => ({ italic: true }),\n S: (): ComposerBodyTextTag => ({ strikethrough: true }),\n STRONG: (): ComposerBodyTextTag => ({ bold: true }),\n // `B` is omitted because Google Docs uses `<b>` in weird ways\n // B: (): ComposerBodyTextTag => ({ bold: true }),\n} as Record<string, (node: HTMLElement) => ComposerBodyTextTag>;\n\nfunction flattenListItems(node: HTMLElement): HTMLElement[] {\n const listItems: HTMLElement[] = [];\n\n if (node.nodeName === \"LI\") {\n listItems.push(node);\n }\n\n node.childNodes.forEach((child) => {\n if (child.nodeType === 1) {\n listItems.push(...flattenListItems(child as HTMLElement));\n }\n });\n\n return listItems;\n}\n\nfunction deserialize(node: Node): DeserializedNode {\n if (node.nodeType === 3) {\n return node.textContent;\n } else if (node.nodeType !== 1) {\n return null;\n } else if (node.nodeName === \"BR\") {\n return \"\\n\";\n }\n\n const childNodes = Array.from(node.childNodes);\n let children = childNodes.map(deserialize).flat();\n\n // Lists aren't supported (yet), so we flatten them into paragraphs\n if (node.nodeName === \"UL\" || node.nodeName === \"OL\") {\n const listItems = flattenListItems(node as HTMLElement);\n\n children = listItems.map((li) => deserialize(li)).flat();\n }\n\n if (children.length === 0) {\n children = [{ text: \"\" }];\n }\n\n if (node.nodeName === \"BODY\") {\n return jsx(\"fragment\", {}, children);\n }\n\n if (ELEMENT_TAGS[node.nodeName]) {\n const attrs = ELEMENT_TAGS[node.nodeName](node as HTMLElement);\n\n return jsx(\"element\", attrs, children);\n }\n\n if (TEXT_TAGS[node.nodeName]) {\n const attrs = TEXT_TAGS[node.nodeName](node as HTMLElement);\n\n return children.map((child) => jsx(\"text\", attrs, child));\n }\n\n return children as DeserializedNode;\n}\n\nexport function withPaste(\n editor: Editor,\n {\n createAttachments,\n pasteFilesAsAttachments,\n }: {\n createAttachments: (files: File[]) => void;\n pasteFilesAsAttachments?: boolean;\n }\n) {\n const { insertData } = editor;\n\n editor.insertData = (data) => {\n // Create attachments from files when pasting\n if (data.types.includes(\"Files\") && pasteFilesAsAttachments) {\n const files = getFiles(data);\n\n if (files.length > 0) {\n createAttachments(files);\n\n return;\n }\n }\n\n // Deserialize rich text from HTML when pasting\n if (data.types.includes(\"text/html\")) {\n const html = data.getData(\"text/html\");\n const parsed = new DOMParser().parseFromString(html, \"text/html\");\n const fragment = deserialize(parsed.body);\n\n if (fragment !== null && Array.isArray(fragment)) {\n Transforms.insertFragment(editor, fragment as SlateNode[]);\n\n return;\n }\n }\n\n insertData(data);\n };\n\n return editor;\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ 'use strict';
2
+
3
+ var exists = require('./exists.js');
4
+
5
+ function getFiles(dataTransfer) {
6
+ if (!dataTransfer.types.includes("Files")) {
7
+ return [];
8
+ }
9
+ let files = Array.from(dataTransfer.items).map((item) => {
10
+ const entry = item.webkitGetAsEntry();
11
+ return entry && entry.isFile ? item.getAsFile() : null;
12
+ }).filter(exists.exists);
13
+ if (!files.length) {
14
+ files = Array.from(dataTransfer.files).filter((file) => file.type !== "");
15
+ }
16
+ return files;
17
+ }
18
+
19
+ exports.getFiles = getFiles;
20
+ //# sourceMappingURL=data-transfer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-transfer.js","sources":["../../src/utils/data-transfer.ts"],"sourcesContent":["import { exists } from \"./exists\";\n\nexport function getFiles(dataTransfer: DataTransfer) {\n if (!dataTransfer.types.includes(\"Files\")) {\n return [];\n }\n\n // We start by attempting to get files with `webkitGetAsEntry` as\n // it allows us to filter out directories.\n //\n // Example: Copying a local file\n let files = Array.from(dataTransfer.items)\n .map((item) => {\n const entry = item.webkitGetAsEntry();\n\n return entry && entry.isFile ? item.getAsFile() : null;\n })\n .filter(exists);\n\n // Then, since `dataTransfer.types` specifies that there are files\n // but we couldn't get any with `webkitGetAsEntry`, we try to get\n // them with `files`\n //\n // Example: Copying an image from a website\n if (!files.length) {\n files = Array.from(dataTransfer.files).filter((file) => file.type !== \"\");\n }\n\n return files;\n}\n"],"names":["exists"],"mappings":";;;;AAEO,SAAS,SAAS,YAA4B,EAAA;AACnD,EAAA,IAAI,CAAC,YAAA,CAAa,KAAM,CAAA,QAAA,CAAS,OAAO,CAAG,EAAA;AACzC,IAAA,OAAO,EAAC,CAAA;AAAA,GACV;AAMA,EAAI,IAAA,KAAA,GAAQ,MAAM,IAAK,CAAA,YAAA,CAAa,KAAK,CACtC,CAAA,GAAA,CAAI,CAAC,IAAS,KAAA;AACb,IAAM,MAAA,KAAA,GAAQ,KAAK,gBAAiB,EAAA,CAAA;AAEpC,IAAA,OAAO,KAAS,IAAA,KAAA,CAAM,MAAS,GAAA,IAAA,CAAK,WAAc,GAAA,IAAA,CAAA;AAAA,GACnD,CACA,CAAA,MAAA,CAAOA,aAAM,CAAA,CAAA;AAOhB,EAAI,IAAA,CAAC,MAAM,MAAQ,EAAA;AACjB,IAAQ,KAAA,GAAA,KAAA,CAAM,IAAK,CAAA,YAAA,CAAa,KAAK,CAAA,CAAE,OAAO,CAAC,IAAA,KAAS,IAAK,CAAA,IAAA,KAAS,EAAE,CAAA,CAAA;AAAA,GAC1E;AAEA,EAAO,OAAA,KAAA,CAAA;AACT;;;;"}
@@ -0,0 +1,18 @@
1
+ import { exists } from './exists.mjs';
2
+
3
+ function getFiles(dataTransfer) {
4
+ if (!dataTransfer.types.includes("Files")) {
5
+ return [];
6
+ }
7
+ let files = Array.from(dataTransfer.items).map((item) => {
8
+ const entry = item.webkitGetAsEntry();
9
+ return entry && entry.isFile ? item.getAsFile() : null;
10
+ }).filter(exists);
11
+ if (!files.length) {
12
+ files = Array.from(dataTransfer.files).filter((file) => file.type !== "");
13
+ }
14
+ return files;
15
+ }
16
+
17
+ export { getFiles };
18
+ //# sourceMappingURL=data-transfer.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-transfer.mjs","sources":["../../src/utils/data-transfer.ts"],"sourcesContent":["import { exists } from \"./exists\";\n\nexport function getFiles(dataTransfer: DataTransfer) {\n if (!dataTransfer.types.includes(\"Files\")) {\n return [];\n }\n\n // We start by attempting to get files with `webkitGetAsEntry` as\n // it allows us to filter out directories.\n //\n // Example: Copying a local file\n let files = Array.from(dataTransfer.items)\n .map((item) => {\n const entry = item.webkitGetAsEntry();\n\n return entry && entry.isFile ? item.getAsFile() : null;\n })\n .filter(exists);\n\n // Then, since `dataTransfer.types` specifies that there are files\n // but we couldn't get any with `webkitGetAsEntry`, we try to get\n // them with `files`\n //\n // Example: Copying an image from a website\n if (!files.length) {\n files = Array.from(dataTransfer.files).filter((file) => file.type !== \"\");\n }\n\n return files;\n}\n"],"names":[],"mappings":";;AAEO,SAAS,SAAS,YAA4B,EAAA;AACnD,EAAA,IAAI,CAAC,YAAA,CAAa,KAAM,CAAA,QAAA,CAAS,OAAO,CAAG,EAAA;AACzC,IAAA,OAAO,EAAC,CAAA;AAAA,GACV;AAMA,EAAI,IAAA,KAAA,GAAQ,MAAM,IAAK,CAAA,YAAA,CAAa,KAAK,CACtC,CAAA,GAAA,CAAI,CAAC,IAAS,KAAA;AACb,IAAM,MAAA,KAAA,GAAQ,KAAK,gBAAiB,EAAA,CAAA;AAEpC,IAAA,OAAO,KAAS,IAAA,KAAA,CAAM,MAAS,GAAA,IAAA,CAAK,WAAc,GAAA,IAAA,CAAA;AAAA,GACnD,CACA,CAAA,MAAA,CAAO,MAAM,CAAA,CAAA;AAOhB,EAAI,IAAA,CAAC,MAAM,MAAQ,EAAA;AACjB,IAAQ,KAAA,GAAA,KAAA,CAAM,IAAK,CAAA,YAAA,CAAa,KAAK,CAAA,CAAE,OAAO,CAAC,IAAA,KAAS,IAAK,CAAA,IAAA,KAAS,EAAE,CAAA,CAAA;AAAA,GAC1E;AAEA,EAAO,OAAA,KAAA,CAAA;AACT;;;;"}
@@ -0,0 +1,14 @@
1
+ 'use strict';
2
+
3
+ function download(url, name) {
4
+ const a = document.createElement("a");
5
+ a.href = url;
6
+ a.download = name;
7
+ a.style.display = "none";
8
+ document.body.appendChild(a);
9
+ a.click();
10
+ document.body.removeChild(a);
11
+ }
12
+
13
+ exports.download = download;
14
+ //# sourceMappingURL=download.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"download.js","sources":["../../src/utils/download.ts"],"sourcesContent":["export function download(url: string, name: string) {\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = name;\n a.style.display = \"none\";\n\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n}\n"],"names":[],"mappings":";;AAAgB,SAAA,QAAA,CAAS,KAAa,IAAc,EAAA;AAClD,EAAM,MAAA,CAAA,GAAI,QAAS,CAAA,aAAA,CAAc,GAAG,CAAA,CAAA;AACpC,EAAA,CAAA,CAAE,IAAO,GAAA,GAAA,CAAA;AACT,EAAA,CAAA,CAAE,QAAW,GAAA,IAAA,CAAA;AACb,EAAA,CAAA,CAAE,MAAM,OAAU,GAAA,MAAA,CAAA;AAElB,EAAS,QAAA,CAAA,IAAA,CAAK,YAAY,CAAC,CAAA,CAAA;AAC3B,EAAA,CAAA,CAAE,KAAM,EAAA,CAAA;AACR,EAAS,QAAA,CAAA,IAAA,CAAK,YAAY,CAAC,CAAA,CAAA;AAC7B;;;;"}
@@ -0,0 +1,12 @@
1
+ function download(url, name) {
2
+ const a = document.createElement("a");
3
+ a.href = url;
4
+ a.download = name;
5
+ a.style.display = "none";
6
+ document.body.appendChild(a);
7
+ a.click();
8
+ document.body.removeChild(a);
9
+ }
10
+
11
+ export { download };
12
+ //# sourceMappingURL=download.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"download.mjs","sources":["../../src/utils/download.ts"],"sourcesContent":["export function download(url: string, name: string) {\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = name;\n a.style.display = \"none\";\n\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n}\n"],"names":[],"mappings":"AAAgB,SAAA,QAAA,CAAS,KAAa,IAAc,EAAA;AAClD,EAAM,MAAA,CAAA,GAAI,QAAS,CAAA,aAAA,CAAc,GAAG,CAAA,CAAA;AACpC,EAAA,CAAA,CAAE,IAAO,GAAA,GAAA,CAAA;AACT,EAAA,CAAA,CAAE,QAAW,GAAA,IAAA,CAAA;AACb,EAAA,CAAA,CAAE,MAAM,OAAU,GAAA,MAAA,CAAA;AAElB,EAAS,QAAA,CAAA,IAAA,CAAK,YAAY,CAAC,CAAA,CAAA;AAC3B,EAAA,CAAA,CAAE,KAAM,EAAA,CAAA;AACR,EAAS,QAAA,CAAA,IAAA,CAAK,YAAY,CAAC,CAAA,CAAA;AAC7B;;;;"}
@@ -0,0 +1,45 @@
1
+ 'use strict';
2
+
3
+ var intl = require('./intl.js');
4
+
5
+ const BASE = 1e3;
6
+ const UNITS = ["B", "KB", "MB", "GB"];
7
+ function formatFileSize(bytes, locale) {
8
+ if (bytes === 0) {
9
+ return `0 ${UNITS[1]}`;
10
+ }
11
+ let unit;
12
+ if (bytes === 0) {
13
+ unit = 1;
14
+ } else {
15
+ unit = Math.max(
16
+ 1,
17
+ Math.min(
18
+ Math.floor(Math.log(Math.abs(bytes)) / Math.log(BASE)),
19
+ UNITS.length - 1
20
+ )
21
+ );
22
+ }
23
+ let value = bytes / BASE ** unit;
24
+ let maximumDecimals = 1;
25
+ if (unit === 1) {
26
+ if (value >= 10) {
27
+ maximumDecimals = 0;
28
+ }
29
+ if (value < 0.1 && value > 0) {
30
+ maximumDecimals = 2;
31
+ }
32
+ if (value < 0.01) {
33
+ value = 0.01;
34
+ }
35
+ }
36
+ const formattedUnit = UNITS[unit];
37
+ const formattedValue = intl.numberFormat(locale, {
38
+ minimumFractionDigits: 0,
39
+ maximumFractionDigits: maximumDecimals
40
+ }).format(value);
41
+ return `${formattedValue} ${formattedUnit}`;
42
+ }
43
+
44
+ exports.formatFileSize = formatFileSize;
45
+ //# sourceMappingURL=format-file-size.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format-file-size.js","sources":["../../src/utils/format-file-size.ts"],"sourcesContent":["import { numberFormat } from \"./intl\";\n\nconst BASE = 1000;\nconst UNITS = [\"B\", \"KB\", \"MB\", \"GB\"] as const;\n\nexport function formatFileSize(bytes: number, locale?: string) {\n if (bytes === 0) {\n return `0 ${UNITS[1]}`;\n }\n\n let unit: number;\n\n if (bytes === 0) {\n unit = 1;\n } else {\n unit = Math.max(\n 1,\n Math.min(\n Math.floor(Math.log(Math.abs(bytes)) / Math.log(BASE)),\n UNITS.length - 1\n )\n );\n }\n\n let value = bytes / BASE ** unit;\n let maximumDecimals = 1;\n\n if (unit === 1) {\n // Hide decimals for KB values above 10\n if (value >= 10) {\n maximumDecimals = 0;\n }\n\n // Allow 2 decimals instead of 1 for KB values below 0.1\n if (value < 0.1 && value > 0) {\n maximumDecimals = 2;\n }\n\n // Display tiny KB values as 0.01 KB instead of 0 KB\n if (value < 0.01) {\n value = 0.01;\n }\n }\n\n const formattedUnit = UNITS[unit];\n const formattedValue = numberFormat(locale, {\n minimumFractionDigits: 0,\n maximumFractionDigits: maximumDecimals,\n }).format(value);\n\n return `${formattedValue} ${formattedUnit}`;\n}\n"],"names":["numberFormat"],"mappings":";;;;AAEA,MAAM,IAAO,GAAA,GAAA,CAAA;AACb,MAAM,KAAQ,GAAA,CAAC,GAAK,EAAA,IAAA,EAAM,MAAM,IAAI,CAAA,CAAA;AAEpB,SAAA,cAAA,CAAe,OAAe,MAAiB,EAAA;AAC7D,EAAA,IAAI,UAAU,CAAG,EAAA;AACf,IAAA,OAAO,KAAK,KAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,GACpB;AAEA,EAAI,IAAA,IAAA,CAAA;AAEJ,EAAA,IAAI,UAAU,CAAG,EAAA;AACf,IAAO,IAAA,GAAA,CAAA,CAAA;AAAA,GACF,MAAA;AACL,IAAA,IAAA,GAAO,IAAK,CAAA,GAAA;AAAA,MACV,CAAA;AAAA,MACA,IAAK,CAAA,GAAA;AAAA,QACH,IAAK,CAAA,KAAA,CAAM,IAAK,CAAA,GAAA,CAAI,IAAK,CAAA,GAAA,CAAI,KAAK,CAAC,CAAI,GAAA,IAAA,CAAK,GAAI,CAAA,IAAI,CAAC,CAAA;AAAA,QACrD,MAAM,MAAS,GAAA,CAAA;AAAA,OACjB;AAAA,KACF,CAAA;AAAA,GACF;AAEA,EAAI,IAAA,KAAA,GAAQ,QAAQ,IAAQ,IAAA,IAAA,CAAA;AAC5B,EAAA,IAAI,eAAkB,GAAA,CAAA,CAAA;AAEtB,EAAA,IAAI,SAAS,CAAG,EAAA;AAEd,IAAA,IAAI,SAAS,EAAI,EAAA;AACf,MAAkB,eAAA,GAAA,CAAA,CAAA;AAAA,KACpB;AAGA,IAAI,IAAA,KAAA,GAAQ,GAAO,IAAA,KAAA,GAAQ,CAAG,EAAA;AAC5B,MAAkB,eAAA,GAAA,CAAA,CAAA;AAAA,KACpB;AAGA,IAAA,IAAI,QAAQ,IAAM,EAAA;AAChB,MAAQ,KAAA,GAAA,IAAA,CAAA;AAAA,KACV;AAAA,GACF;AAEA,EAAA,MAAM,gBAAgB,KAAM,CAAA,IAAA,CAAA,CAAA;AAC5B,EAAM,MAAA,cAAA,GAAiBA,kBAAa,MAAQ,EAAA;AAAA,IAC1C,qBAAuB,EAAA,CAAA;AAAA,IACvB,qBAAuB,EAAA,eAAA;AAAA,GACxB,CAAE,CAAA,MAAA,CAAO,KAAK,CAAA,CAAA;AAEf,EAAA,OAAO,GAAG,cAAkB,CAAA,CAAA,EAAA,aAAA,CAAA,CAAA,CAAA;AAC9B;;;;"}
@@ -0,0 +1,43 @@
1
+ import { numberFormat } from './intl.mjs';
2
+
3
+ const BASE = 1e3;
4
+ const UNITS = ["B", "KB", "MB", "GB"];
5
+ function formatFileSize(bytes, locale) {
6
+ if (bytes === 0) {
7
+ return `0 ${UNITS[1]}`;
8
+ }
9
+ let unit;
10
+ if (bytes === 0) {
11
+ unit = 1;
12
+ } else {
13
+ unit = Math.max(
14
+ 1,
15
+ Math.min(
16
+ Math.floor(Math.log(Math.abs(bytes)) / Math.log(BASE)),
17
+ UNITS.length - 1
18
+ )
19
+ );
20
+ }
21
+ let value = bytes / BASE ** unit;
22
+ let maximumDecimals = 1;
23
+ if (unit === 1) {
24
+ if (value >= 10) {
25
+ maximumDecimals = 0;
26
+ }
27
+ if (value < 0.1 && value > 0) {
28
+ maximumDecimals = 2;
29
+ }
30
+ if (value < 0.01) {
31
+ value = 0.01;
32
+ }
33
+ }
34
+ const formattedUnit = UNITS[unit];
35
+ const formattedValue = numberFormat(locale, {
36
+ minimumFractionDigits: 0,
37
+ maximumFractionDigits: maximumDecimals
38
+ }).format(value);
39
+ return `${formattedValue} ${formattedUnit}`;
40
+ }
41
+
42
+ export { formatFileSize };
43
+ //# sourceMappingURL=format-file-size.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format-file-size.mjs","sources":["../../src/utils/format-file-size.ts"],"sourcesContent":["import { numberFormat } from \"./intl\";\n\nconst BASE = 1000;\nconst UNITS = [\"B\", \"KB\", \"MB\", \"GB\"] as const;\n\nexport function formatFileSize(bytes: number, locale?: string) {\n if (bytes === 0) {\n return `0 ${UNITS[1]}`;\n }\n\n let unit: number;\n\n if (bytes === 0) {\n unit = 1;\n } else {\n unit = Math.max(\n 1,\n Math.min(\n Math.floor(Math.log(Math.abs(bytes)) / Math.log(BASE)),\n UNITS.length - 1\n )\n );\n }\n\n let value = bytes / BASE ** unit;\n let maximumDecimals = 1;\n\n if (unit === 1) {\n // Hide decimals for KB values above 10\n if (value >= 10) {\n maximumDecimals = 0;\n }\n\n // Allow 2 decimals instead of 1 for KB values below 0.1\n if (value < 0.1 && value > 0) {\n maximumDecimals = 2;\n }\n\n // Display tiny KB values as 0.01 KB instead of 0 KB\n if (value < 0.01) {\n value = 0.01;\n }\n }\n\n const formattedUnit = UNITS[unit];\n const formattedValue = numberFormat(locale, {\n minimumFractionDigits: 0,\n maximumFractionDigits: maximumDecimals,\n }).format(value);\n\n return `${formattedValue} ${formattedUnit}`;\n}\n"],"names":[],"mappings":";;AAEA,MAAM,IAAO,GAAA,GAAA,CAAA;AACb,MAAM,KAAQ,GAAA,CAAC,GAAK,EAAA,IAAA,EAAM,MAAM,IAAI,CAAA,CAAA;AAEpB,SAAA,cAAA,CAAe,OAAe,MAAiB,EAAA;AAC7D,EAAA,IAAI,UAAU,CAAG,EAAA;AACf,IAAA,OAAO,KAAK,KAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,GACpB;AAEA,EAAI,IAAA,IAAA,CAAA;AAEJ,EAAA,IAAI,UAAU,CAAG,EAAA;AACf,IAAO,IAAA,GAAA,CAAA,CAAA;AAAA,GACF,MAAA;AACL,IAAA,IAAA,GAAO,IAAK,CAAA,GAAA;AAAA,MACV,CAAA;AAAA,MACA,IAAK,CAAA,GAAA;AAAA,QACH,IAAK,CAAA,KAAA,CAAM,IAAK,CAAA,GAAA,CAAI,IAAK,CAAA,GAAA,CAAI,KAAK,CAAC,CAAI,GAAA,IAAA,CAAK,GAAI,CAAA,IAAI,CAAC,CAAA;AAAA,QACrD,MAAM,MAAS,GAAA,CAAA;AAAA,OACjB;AAAA,KACF,CAAA;AAAA,GACF;AAEA,EAAI,IAAA,KAAA,GAAQ,QAAQ,IAAQ,IAAA,IAAA,CAAA;AAC5B,EAAA,IAAI,eAAkB,GAAA,CAAA,CAAA;AAEtB,EAAA,IAAI,SAAS,CAAG,EAAA;AAEd,IAAA,IAAI,SAAS,EAAI,EAAA;AACf,MAAkB,eAAA,GAAA,CAAA,CAAA;AAAA,KACpB;AAGA,IAAI,IAAA,KAAA,GAAQ,GAAO,IAAA,KAAA,GAAQ,CAAG,EAAA;AAC5B,MAAkB,eAAA,GAAA,CAAA,CAAA;AAAA,KACpB;AAGA,IAAA,IAAI,QAAQ,IAAM,EAAA;AAChB,MAAQ,KAAA,GAAA,IAAA,CAAA;AAAA,KACV;AAAA,GACF;AAEA,EAAA,MAAM,gBAAgB,KAAM,CAAA,IAAA,CAAA,CAAA;AAC5B,EAAM,MAAA,cAAA,GAAiB,aAAa,MAAQ,EAAA;AAAA,IAC1C,qBAAuB,EAAA,CAAA;AAAA,IACvB,qBAAuB,EAAA,eAAA;AAAA,GACxB,CAAE,CAAA,MAAA,CAAO,KAAK,CAAA,CAAA;AAEf,EAAA,OAAO,GAAG,cAAkB,CAAA,CAAA,EAAA,aAAA,CAAA,CAAA,CAAA;AAC9B;;;;"}
@@ -17,8 +17,14 @@ 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
+ );
20
25
 
21
26
  exports.dateTimeFormat = dateTimeFormat;
22
27
  exports.listFormat = listFormat;
28
+ exports.numberFormat = numberFormat;
23
29
  exports.relativeTimeFormat = relativeTimeFormat;
24
30
  //# 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"],"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;;;;;;"}
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;;;;;;;"}
@@ -15,6 +15,11 @@ const listFormat = memoize(
15
15
  return new Intl.ListFormat(...args);
16
16
  }
17
17
  );
18
+ const numberFormat = memoize(
19
+ (...args) => {
20
+ return new Intl.NumberFormat(...args);
21
+ }
22
+ );
18
23
 
19
- export { dateTimeFormat, listFormat, relativeTimeFormat };
24
+ export { dateTimeFormat, listFormat, numberFormat, relativeTimeFormat };
20
25
  //# sourceMappingURL=intl.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"intl.mjs","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":[],"mappings":";;AAIO,MAAM,cAAiB,GAAA,OAAA;AAAA,EAC5B,IAAI,IAAiE,KAAA;AACnE,IAAA,OAAO,IAAI,IAAA,CAAK,cAAe,CAAA,GAAG,IAAI,CAAA,CAAA;AAAA,GACxC;AACF,EAAA;AAEO,MAAM,kBAAqB,GAAA,OAAA;AAAA,EAChC,IAAI,IAAqE,KAAA;AACvE,IAAA,OAAO,IAAI,IAAA,CAAK,kBAAmB,CAAA,GAAG,IAAI,CAAA,CAAA;AAAA,GAC5C;AACF,EAAA;AAEO,MAAM,UAAa,GAAA,OAAA;AAAA,EACxB,IAAI,IAA6D,KAAA;AAC/D,IAAA,OAAO,IAAI,IAAA,CAAK,UAAW,CAAA,GAAG,IAAI,CAAA,CAAA;AAAA,GACpC;AACF;;;;"}
1
+ {"version":3,"file":"intl.mjs","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":[],"mappings":";;AAIO,MAAM,cAAiB,GAAA,OAAA;AAAA,EAC5B,IAAI,IAAiE,KAAA;AACnE,IAAA,OAAO,IAAI,IAAA,CAAK,cAAe,CAAA,GAAG,IAAI,CAAA,CAAA;AAAA,GACxC;AACF,EAAA;AAEO,MAAM,kBAAqB,GAAA,OAAA;AAAA,EAChC,IAAI,IAAqE,KAAA;AACvE,IAAA,OAAO,IAAI,IAAA,CAAK,kBAAmB,CAAA,GAAG,IAAI,CAAA,CAAA;AAAA,GAC5C;AACF,EAAA;AAEO,MAAM,UAAa,GAAA,OAAA;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,GAAA,OAAA;AAAA,EAC1B,IAAI,IAA+D,KAAA;AACjE,IAAA,OAAO,IAAI,IAAA,CAAK,YAAa,CAAA,GAAG,IAAI,CAAA,CAAA;AAAA,GACtC;AACF;;;;"}
@@ -3,7 +3,8 @@
3
3
  var React = require('react');
4
4
 
5
5
  function useInitial(value) {
6
- return React.useRef(value instanceof Function ? value() : value).current;
6
+ const [initialValue] = React.useState(value);
7
+ return initialValue;
7
8
  }
8
9
 
9
10
  exports.useInitial = useInitial;
@@ -1 +1 @@
1
- {"version":3,"file":"use-initial.js","sources":["../../src/utils/use-initial.ts"],"sourcesContent":["import { useRef } from \"react\";\n\n/**\n * \"Freezes\" a given value, so that it will return the same value/instance on\n * each subsequent render. This can be used to freeze \"initial\" values for\n * custom hooks, much like how `useState(initialState)` or\n * `useRef(initialValue)` works.\n */\nexport function useInitial<T>(value: T | (() => T)): T {\n return useRef(value instanceof Function ? value() : value).current;\n}\n"],"names":["useRef"],"mappings":";;;;AAQO,SAAS,WAAc,KAAyB,EAAA;AACrD,EAAA,OAAOA,aAAO,KAAiB,YAAA,QAAA,GAAW,KAAM,EAAA,GAAI,KAAK,CAAE,CAAA,OAAA,CAAA;AAC7D;;;;"}
1
+ {"version":3,"file":"use-initial.js","sources":["../../src/utils/use-initial.ts"],"sourcesContent":["import { useState } from \"react\";\n\n/**\n * \"Freezes\" a given value, so that it will return the same value/instance on\n * each subsequent render. This can be used to freeze \"initial\" values for\n * custom hooks, much like how `useState(initialState)` or\n * `useRef(initialValue)` works.\n */\nexport function useInitial<T>(value: T | (() => T)): T {\n const [initialValue] = useState(value);\n\n return initialValue;\n}\n"],"names":["useState"],"mappings":";;;;AAQO,SAAS,WAAc,KAAyB,EAAA;AACrD,EAAA,MAAM,CAAC,YAAY,CAAI,GAAAA,cAAA,CAAS,KAAK,CAAA,CAAA;AAErC,EAAO,OAAA,YAAA,CAAA;AACT;;;;"}
@@ -1,7 +1,8 @@
1
- import { useRef } from 'react';
1
+ import { useState } from 'react';
2
2
 
3
3
  function useInitial(value) {
4
- return useRef(value instanceof Function ? value() : value).current;
4
+ const [initialValue] = useState(value);
5
+ return initialValue;
5
6
  }
6
7
 
7
8
  export { useInitial };
@@ -1 +1 @@
1
- {"version":3,"file":"use-initial.mjs","sources":["../../src/utils/use-initial.ts"],"sourcesContent":["import { useRef } from \"react\";\n\n/**\n * \"Freezes\" a given value, so that it will return the same value/instance on\n * each subsequent render. This can be used to freeze \"initial\" values for\n * custom hooks, much like how `useState(initialState)` or\n * `useRef(initialValue)` works.\n */\nexport function useInitial<T>(value: T | (() => T)): T {\n return useRef(value instanceof Function ? value() : value).current;\n}\n"],"names":[],"mappings":";;AAQO,SAAS,WAAc,KAAyB,EAAA;AACrD,EAAA,OAAO,OAAO,KAAiB,YAAA,QAAA,GAAW,KAAM,EAAA,GAAI,KAAK,CAAE,CAAA,OAAA,CAAA;AAC7D;;;;"}
1
+ {"version":3,"file":"use-initial.mjs","sources":["../../src/utils/use-initial.ts"],"sourcesContent":["import { useState } from \"react\";\n\n/**\n * \"Freezes\" a given value, so that it will return the same value/instance on\n * each subsequent render. This can be used to freeze \"initial\" values for\n * custom hooks, much like how `useState(initialState)` or\n * `useRef(initialValue)` works.\n */\nexport function useInitial<T>(value: T | (() => T)): T {\n const [initialValue] = useState(value);\n\n return initialValue;\n}\n"],"names":[],"mappings":";;AAQO,SAAS,WAAc,KAAyB,EAAA;AACrD,EAAA,MAAM,CAAC,YAAY,CAAI,GAAA,QAAA,CAAS,KAAK,CAAA,CAAA;AAErC,EAAO,OAAA,YAAA,CAAA;AACT;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-latest.js","sources":["../../src/utils/use-latest.ts"],"sourcesContent":["import type { MutableRefObject } from \"react\";\nimport { useEffect, useRef } from \"react\";\n\nexport function useLatest<T>(value: T) {\n const ref: MutableRefObject<T> = useRef(value);\n\n useEffect(() => {\n ref.current = value;\n }, [value]);\n\n return ref;\n}\n"],"names":["useRef","useEffect"],"mappings":";;;;AAGO,SAAS,UAAa,KAAU,EAAA;AACrC,EAAM,MAAA,GAAA,GAA2BA,aAAO,KAAK,CAAA,CAAA;AAE7C,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,GAAA,CAAI,OAAU,GAAA,KAAA,CAAA;AAAA,GAChB,EAAG,CAAC,KAAK,CAAC,CAAA,CAAA;AAEV,EAAO,OAAA,GAAA,CAAA;AACT;;;;"}
1
+ {"version":3,"file":"use-latest.js","sources":["../../src/utils/use-latest.ts"],"sourcesContent":["import type { MutableRefObject } from \"react\";\nimport { useEffect, useRef } from \"react\";\n\n/**\n * Keeps a ref in sync with a given value that may or may not change on\n * every render.\n *\n * The purpose of this hook is to return a stable ref that can be passed\n * to a callback function so the callback can be registered but still can\n * access the latest value at a later point in time.\n */\nexport function useLatest<T>(value: T): MutableRefObject<T> {\n const ref = useRef(value);\n useEffect(() => {\n ref.current = value;\n }, [value]);\n return ref;\n}\n"],"names":["useRef","useEffect"],"mappings":";;;;AAWO,SAAS,UAAa,KAA+B,EAAA;AAC1D,EAAM,MAAA,GAAA,GAAMA,aAAO,KAAK,CAAA,CAAA;AACxB,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,GAAA,CAAI,OAAU,GAAA,KAAA,CAAA;AAAA,GAChB,EAAG,CAAC,KAAK,CAAC,CAAA,CAAA;AACV,EAAO,OAAA,GAAA,CAAA;AACT;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-latest.mjs","sources":["../../src/utils/use-latest.ts"],"sourcesContent":["import type { MutableRefObject } from \"react\";\nimport { useEffect, useRef } from \"react\";\n\nexport function useLatest<T>(value: T) {\n const ref: MutableRefObject<T> = useRef(value);\n\n useEffect(() => {\n ref.current = value;\n }, [value]);\n\n return ref;\n}\n"],"names":[],"mappings":";;AAGO,SAAS,UAAa,KAAU,EAAA;AACrC,EAAM,MAAA,GAAA,GAA2B,OAAO,KAAK,CAAA,CAAA;AAE7C,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,GAAA,CAAI,OAAU,GAAA,KAAA,CAAA;AAAA,GAChB,EAAG,CAAC,KAAK,CAAC,CAAA,CAAA;AAEV,EAAO,OAAA,GAAA,CAAA;AACT;;;;"}
1
+ {"version":3,"file":"use-latest.mjs","sources":["../../src/utils/use-latest.ts"],"sourcesContent":["import type { MutableRefObject } from \"react\";\nimport { useEffect, useRef } from \"react\";\n\n/**\n * Keeps a ref in sync with a given value that may or may not change on\n * every render.\n *\n * The purpose of this hook is to return a stable ref that can be passed\n * to a callback function so the callback can be registered but still can\n * access the latest value at a later point in time.\n */\nexport function useLatest<T>(value: T): MutableRefObject<T> {\n const ref = useRef(value);\n useEffect(() => {\n ref.current = value;\n }, [value]);\n return ref;\n}\n"],"names":[],"mappings":";;AAWO,SAAS,UAAa,KAA+B,EAAA;AAC1D,EAAM,MAAA,GAAA,GAAM,OAAO,KAAK,CAAA,CAAA;AACxB,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,GAAA,CAAI,OAAU,GAAA,KAAA,CAAA;AAAA,GAChB,EAAG,CAAC,KAAK,CAAC,CAAA,CAAA;AACV,EAAO,OAAA,GAAA,CAAA;AACT;;;;"}
package/dist/version.js CHANGED
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  const PKG_NAME = "@liveblocks/react-ui";
4
- const PKG_VERSION = "2.7.2";
4
+ const PKG_VERSION = "2.8.0-beta2";
5
5
  const PKG_FORMAT = "cjs";
6
6
 
7
7
  exports.PKG_FORMAT = PKG_FORMAT;