@questpie/admin 3.2.3 → 3.2.4

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 (61) hide show
  1. package/dist/client/blocks/block-renderer.d.mts +2 -2
  2. package/dist/client/components/admin-link.d.mts +2 -2
  3. package/dist/client/components/blocks/block-library-sidebar.mjs +126 -113
  4. package/dist/client/components/fields/json-field.mjs +114 -118
  5. package/dist/client/components/fields/rich-text-editor/bubble-menu.mjs +38 -40
  6. package/dist/client/components/fields/rich-text-editor/image-popover.mjs +6 -17
  7. package/dist/client/components/fields/rich-text-editor/index.mjs +71 -87
  8. package/dist/client/components/history-sidebar.mjs +25 -10
  9. package/dist/client/components/media/media-picker-dialog.mjs +237 -254
  10. package/dist/client/components/preview/live-preview-mode.mjs +230 -203
  11. package/dist/client/components/primitives/asset-preview.mjs +1 -1
  12. package/dist/client/contexts/focus-context.d.mts +4 -0
  13. package/dist/client/contexts/focus-context.mjs +106 -86
  14. package/dist/client/preview/block-scope-context.d.mts +2 -2
  15. package/dist/client/preview/diff.mjs +110 -0
  16. package/dist/client/preview/preview-banner.d.mts +2 -2
  17. package/dist/client/preview/preview-field.d.mts +4 -4
  18. package/dist/client/preview/preview-field.mjs +125 -187
  19. package/dist/client/preview/use-collection-preview.mjs +49 -21
  20. package/dist/client/views/auth/accept-invite-form.d.mts +2 -2
  21. package/dist/client/views/auth/auth-layout.d.mts +3 -3
  22. package/dist/client/views/auth/forgot-password-form.d.mts +2 -2
  23. package/dist/client/views/auth/login-form.d.mts +2 -2
  24. package/dist/client/views/auth/reset-password-form.d.mts +2 -2
  25. package/dist/client/views/auth/setup-form.d.mts +2 -2
  26. package/dist/client/views/collection/bulk-action-toolbar.mjs +135 -156
  27. package/dist/client/views/collection/field-renderer.mjs +162 -51
  28. package/dist/client/views/collection/form-view.mjs +43 -81
  29. package/dist/client/views/collection/table-view.mjs +12 -10
  30. package/dist/client/views/common/global-search.mjs +199 -182
  31. package/dist/client/views/globals/global-form-view.mjs +625 -621
  32. package/dist/client/views/layout/admin-router.mjs +84 -100
  33. package/dist/client/views/pages/accept-invite-page.d.mts +2 -2
  34. package/dist/client/views/pages/dashboard-page.d.mts +2 -2
  35. package/dist/client/views/pages/forgot-password-page.d.mts +2 -2
  36. package/dist/client/views/pages/invite-page.d.mts +2 -2
  37. package/dist/client/views/pages/reset-password-page.d.mts +2 -2
  38. package/dist/client/views/pages/setup-page.d.mts +2 -2
  39. package/dist/server/modules/admin/collections/account.d.mts +50 -50
  40. package/dist/server/modules/admin/collections/admin-locks.d.mts +54 -54
  41. package/dist/server/modules/admin/collections/admin-preferences.d.mts +39 -39
  42. package/dist/server/modules/admin/collections/admin-saved-views.d.mts +47 -47
  43. package/dist/server/modules/admin/collections/apikey.d.mts +68 -68
  44. package/dist/server/modules/admin/collections/assets.d.mts +39 -39
  45. package/dist/server/modules/admin/collections/session.d.mts +42 -42
  46. package/dist/server/modules/admin/collections/user.d.mts +63 -63
  47. package/dist/server/modules/admin/collections/verification.d.mts +32 -32
  48. package/dist/server/modules/admin/index.d.mts +1 -1
  49. package/dist/server/modules/admin/routes/admin-config.d.mts +2 -2
  50. package/dist/server/modules/admin/routes/execute-action.d.mts +9 -9
  51. package/dist/server/modules/admin/routes/locales.d.mts +2 -2
  52. package/dist/server/modules/admin/routes/preview.d.mts +11 -11
  53. package/dist/server/modules/admin/routes/reactive.d.mts +9 -9
  54. package/dist/server/modules/admin/routes/setup.d.mts +7 -7
  55. package/dist/server/modules/admin/routes/translations.d.mts +4 -4
  56. package/dist/server/modules/admin/routes/widget-data.d.mts +5 -5
  57. package/dist/server/modules/admin-preferences/collections/saved-views.d.mts +41 -41
  58. package/dist/server/modules/audit/.generated/module.d.mts +6 -6
  59. package/dist/server/modules/audit/collections/audit-log.d.mts +78 -78
  60. package/dist/server/modules/audit/jobs/audit-cleanup.d.mts +2 -2
  61. package/package.json +3 -3
@@ -88,7 +88,7 @@ function setCurrentBlockValue(editor, value) {
88
88
  * Bubble menu that appears on text selection
89
89
  */
90
90
  function RichTextBubbleMenu(t0) {
91
- const $ = c(45);
91
+ const $ = c(44);
92
92
  const { editor, features, disabled, linkOpen, onImageClick, onLinkOpenChange, showFormatting: t1 } = t0;
93
93
  const showFormatting = t1 === void 0 ? true : t1;
94
94
  const { t } = useTranslation();
@@ -189,33 +189,31 @@ function RichTextBubbleMenu(t0) {
189
189
  const removeLink = t7;
190
190
  let t8;
191
191
  let t9;
192
- if ($[21] !== editor || $[22] !== linkOpen) {
192
+ if ($[21] !== linkOpen) {
193
193
  t8 = () => {
194
194
  if (!linkOpen) return;
195
- const currentLink_0 = editor.getAttributes("link").href;
196
- setLinkUrl(currentLink_0 || "");
197
- window.requestAnimationFrame(() => {
195
+ const frame = window.requestAnimationFrame(() => {
198
196
  linkInputRef.current?.focus();
199
197
  linkInputRef.current?.select();
200
198
  });
199
+ return () => window.cancelAnimationFrame(frame);
201
200
  };
202
- t9 = [editor, linkOpen];
203
- $[21] = editor;
204
- $[22] = linkOpen;
205
- $[23] = t8;
206
- $[24] = t9;
201
+ t9 = [linkOpen];
202
+ $[21] = linkOpen;
203
+ $[22] = t8;
204
+ $[23] = t9;
207
205
  } else {
208
- t8 = $[23];
209
- t9 = $[24];
206
+ t8 = $[22];
207
+ t9 = $[23];
210
208
  }
211
209
  React.useEffect(t8, t9);
212
210
  let t10;
213
- if ($[25] === Symbol.for("react.memo_cache_sentinel")) {
211
+ if ($[24] === Symbol.for("react.memo_cache_sentinel")) {
214
212
  t10 = [120, 90];
215
- $[25] = t10;
216
- } else t10 = $[25];
213
+ $[24] = t10;
214
+ } else t10 = $[24];
217
215
  let t11;
218
- if ($[26] === Symbol.for("react.memo_cache_sentinel")) {
216
+ if ($[25] === Symbol.for("react.memo_cache_sentinel")) {
219
217
  t11 = {
220
218
  duration: t10,
221
219
  interactive: true,
@@ -223,10 +221,10 @@ function RichTextBubbleMenu(t0) {
223
221
  offset: [0, 8],
224
222
  placement: "top"
225
223
  };
226
- $[26] = t11;
227
- } else t11 = $[26];
224
+ $[25] = t11;
225
+ } else t11 = $[25];
228
226
  let t12;
229
- if ($[27] !== applyLink || $[28] !== closeLinkMode || $[29] !== currentBlockLabel || $[30] !== currentBlockValue || $[31] !== editor || $[32] !== features || $[33] !== isEditable || $[34] !== linkOpen || $[35] !== linkUrl || $[36] !== onImageClick || $[37] !== openLinkMode || $[38] !== removeLink || $[39] !== t) {
227
+ if ($[26] !== applyLink || $[27] !== closeLinkMode || $[28] !== currentBlockLabel || $[29] !== currentBlockValue || $[30] !== editor || $[31] !== features || $[32] !== isEditable || $[33] !== linkOpen || $[34] !== linkUrl || $[35] !== onImageClick || $[36] !== openLinkMode || $[37] !== removeLink || $[38] !== t) {
230
228
  t12 = linkOpen ? /* @__PURE__ */ jsxs("form", {
231
229
  className: "qp-rich-text-editor__link-form",
232
230
  onSubmit: (event) => {
@@ -373,23 +371,23 @@ function RichTextBubbleMenu(t0) {
373
371
  onClick: onImageClick
374
372
  })
375
373
  ] });
376
- $[27] = applyLink;
377
- $[28] = closeLinkMode;
378
- $[29] = currentBlockLabel;
379
- $[30] = currentBlockValue;
380
- $[31] = editor;
381
- $[32] = features;
382
- $[33] = isEditable;
383
- $[34] = linkOpen;
384
- $[35] = linkUrl;
385
- $[36] = onImageClick;
386
- $[37] = openLinkMode;
387
- $[38] = removeLink;
388
- $[39] = t;
389
- $[40] = t12;
390
- } else t12 = $[40];
374
+ $[26] = applyLink;
375
+ $[27] = closeLinkMode;
376
+ $[28] = currentBlockLabel;
377
+ $[29] = currentBlockValue;
378
+ $[30] = editor;
379
+ $[31] = features;
380
+ $[32] = isEditable;
381
+ $[33] = linkOpen;
382
+ $[34] = linkUrl;
383
+ $[35] = onImageClick;
384
+ $[36] = openLinkMode;
385
+ $[37] = removeLink;
386
+ $[38] = t;
387
+ $[39] = t12;
388
+ } else t12 = $[39];
391
389
  let t13;
392
- if ($[41] !== editor || $[42] !== shouldShow || $[43] !== t12) {
390
+ if ($[40] !== editor || $[41] !== shouldShow || $[42] !== t12) {
393
391
  t13 = /* @__PURE__ */ jsx(BubbleMenu, {
394
392
  editor,
395
393
  shouldShow,
@@ -397,11 +395,11 @@ function RichTextBubbleMenu(t0) {
397
395
  className: "qp-rich-text-editor__bubble floating-surface text-popover-foreground",
398
396
  children: t12
399
397
  });
400
- $[41] = editor;
401
- $[42] = shouldShow;
402
- $[43] = t12;
403
- $[44] = t13;
404
- } else t13 = $[44];
398
+ $[40] = editor;
399
+ $[41] = shouldShow;
400
+ $[42] = t12;
401
+ $[43] = t13;
402
+ } else t13 = $[43];
405
403
  return t13;
406
404
  }
407
405
  function _temp2(option_2) {
@@ -2,7 +2,6 @@ import { useTranslation } from "../../../i18n/hooks.mjs";
2
2
  import { Button } from "../../ui/button.mjs";
3
3
  import { Input } from "../../ui/input.mjs";
4
4
  import { Popover, PopoverContent, PopoverHeader, PopoverTitle, PopoverTrigger } from "../../ui/popover.mjs";
5
- import { useCollectionItem } from "../../../hooks/use-collection.mjs";
6
5
  import { MediaPickerDialog } from "../../media/media-picker-dialog.mjs";
7
6
  import { useRichTextImageUpload } from "./image-upload.mjs";
8
7
  import * as React from "react";
@@ -21,13 +20,11 @@ function ImagePopover({ editor, open, onOpenChange, disabled, onImageUpload, ima
21
20
  const [uploadingImage, setUploadingImage] = React.useState(false);
22
21
  const fileInputRef = React.useRef(null);
23
22
  const [isPickerOpen, setIsPickerOpen] = React.useState(false);
24
- const [selectedAssetId, setSelectedAssetId] = React.useState(null);
25
23
  const { collection, uploadImageFile } = useRichTextImageUpload({
26
24
  imageCollection,
27
25
  onImageUpload
28
26
  });
29
27
  const showMediaLibrary = enableMediaLibrary ?? true;
30
- const { data: selectedAsset } = useCollectionItem(collection || "", selectedAssetId || "", void 0, { enabled: !!collection && !!selectedAssetId });
31
28
  const handleInsertImageUrl = React.useCallback(() => {
32
29
  if (!editor || !imageUrl) return;
33
30
  editor.chain().focus().setImage({
@@ -73,34 +70,26 @@ function ImagePopover({ editor, open, onOpenChange, disabled, onImageUpload, ima
73
70
  t,
74
71
  uploadImageFile
75
72
  ]);
76
- React.useEffect(() => {
77
- if (!selectedAssetId || !selectedAsset || !editor) return;
78
- const assetUrl = selectedAsset?.url;
79
- if (!assetUrl) {
73
+ const insertAssetImage = React.useCallback((asset) => {
74
+ if (!editor || !asset?.url) {
80
75
  toast.error(t("upload.error"));
81
- setSelectedAssetId(null);
82
76
  return;
83
77
  }
84
78
  editor.chain().focus().setImage({
85
- src: assetUrl,
86
- alt: imageAlt || selectedAsset?.alt || void 0
79
+ src: asset.url,
80
+ alt: imageAlt || asset.alt || void 0
87
81
  }).run();
88
82
  setImageUrl("");
89
83
  setImageAlt("");
90
- setSelectedAssetId(null);
91
84
  onOpenChange(false);
92
85
  }, [
93
86
  editor,
94
87
  imageAlt,
95
88
  onOpenChange,
96
- selectedAsset,
97
- selectedAssetId,
98
89
  t
99
90
  ]);
100
- const handlePickerSelect = (ids) => {
101
- const selectedId = Array.isArray(ids) ? ids[0] : ids;
102
- if (!selectedId) return;
103
- setSelectedAssetId(selectedId);
91
+ const handlePickerSelect = (_ids, selectedAssets) => {
92
+ insertAssetImage(Array.isArray(selectedAssets) ? selectedAssets[0] : selectedAssets);
104
93
  setIsPickerOpen(false);
105
94
  };
106
95
  return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsxs(Popover, {
@@ -168,7 +168,7 @@ function RichTextEditorLoadingSkeleton(t0) {
168
168
  * "Schema is missing its top node type" error.
169
169
  */
170
170
  function RichTextEditor(t0) {
171
- const $ = c(119);
171
+ const $ = c(114);
172
172
  const { name, value, onChange, disabled, readOnly, label, description, placeholder, required, error, localized, locale, extensions, preset, features, showCharacterCount, maxCharacters, enableImages, onImageUpload, imageCollection, enableMediaLibrary } = t0;
173
173
  const { t } = useTranslation();
174
174
  const resolveText = useResolveText();
@@ -376,16 +376,13 @@ function RichTextEditor(t0) {
376
376
  const extensionLabels = t23;
377
377
  let t24;
378
378
  if ($[68] !== extensionLabels || $[69] !== extensions || $[70] !== maxCharacters || $[71] !== placeholder || $[72] !== resolvedFeatures || $[73] !== t) {
379
- t24 = () => {
380
- const result = buildExtensions({
381
- features: resolvedFeatures,
382
- labels: extensionLabels,
383
- placeholder: placeholder || t("editor.startWriting"),
384
- maxCharacters,
385
- customExtensions: extensions
386
- });
387
- return result instanceof Promise ? void 0 : result;
388
- };
379
+ t24 = buildExtensions({
380
+ features: resolvedFeatures,
381
+ labels: extensionLabels,
382
+ placeholder: placeholder || t("editor.startWriting"),
383
+ maxCharacters,
384
+ customExtensions: extensions
385
+ });
389
386
  $[68] = extensionLabels;
390
387
  $[69] = extensions;
391
388
  $[70] = maxCharacters;
@@ -394,51 +391,38 @@ function RichTextEditor(t0) {
394
391
  $[73] = t;
395
392
  $[74] = t24;
396
393
  } else t24 = $[74];
397
- const [resolvedExtensions, setResolvedExtensions] = React.useState(t24);
394
+ const extensionBuild = t24;
395
+ const syncExtensions = extensionBuild instanceof Promise ? void 0 : extensionBuild;
396
+ const [asyncExtensionState, setAsyncExtensionState] = React.useState(null);
398
397
  let t25;
399
398
  let t26;
400
- if ($[75] !== extensionLabels || $[76] !== extensions || $[77] !== maxCharacters || $[78] !== placeholder || $[79] !== resolvedFeatures || $[80] !== t) {
399
+ if ($[75] !== extensionBuild) {
401
400
  t25 = () => {
401
+ if (!(extensionBuild instanceof Promise)) return;
402
402
  let mounted = true;
403
- const result_0 = buildExtensions({
404
- features: resolvedFeatures,
405
- labels: extensionLabels,
406
- placeholder: placeholder || t("editor.startWriting"),
407
- maxCharacters,
408
- customExtensions: extensions
409
- });
410
- if (result_0 instanceof Promise) result_0.then((exts) => {
411
- if (mounted) setResolvedExtensions(exts);
403
+ extensionBuild.then((exts) => {
404
+ if (mounted) setAsyncExtensionState({
405
+ source: extensionBuild,
406
+ extensions: exts
407
+ });
412
408
  });
413
- else setResolvedExtensions(result_0);
414
409
  return () => {
415
410
  mounted = false;
416
411
  };
417
412
  };
418
- t26 = [
419
- resolvedFeatures,
420
- extensionLabels,
421
- placeholder,
422
- maxCharacters,
423
- extensions,
424
- t
425
- ];
426
- $[75] = extensionLabels;
427
- $[76] = extensions;
428
- $[77] = maxCharacters;
429
- $[78] = placeholder;
430
- $[79] = resolvedFeatures;
431
- $[80] = t;
432
- $[81] = t25;
433
- $[82] = t26;
413
+ t26 = [extensionBuild];
414
+ $[75] = extensionBuild;
415
+ $[76] = t25;
416
+ $[77] = t26;
434
417
  } else {
435
- t25 = $[81];
436
- t26 = $[82];
418
+ t25 = $[76];
419
+ t26 = $[77];
437
420
  }
438
421
  React.useEffect(t25, t26);
422
+ const resolvedExtensions = syncExtensions ?? (asyncExtensionState?.source === extensionBuild ? asyncExtensionState.extensions : void 0);
439
423
  const t27 = disabled || readOnly;
440
424
  let t28;
441
- if ($[83] !== locale || $[84] !== localized || $[85] !== name || $[86] !== required || $[87] !== resolvedLabel) {
425
+ if ($[78] !== locale || $[79] !== localized || $[80] !== name || $[81] !== required || $[82] !== resolvedLabel) {
442
426
  t28 = resolvedLabel && /* @__PURE__ */ jsxs("div", {
443
427
  className: "flex items-center gap-2",
444
428
  children: [/* @__PURE__ */ jsxs(Label, {
@@ -449,15 +433,15 @@ function RichTextEditor(t0) {
449
433
  })]
450
434
  }), localized && /* @__PURE__ */ jsx(LocaleBadge, { locale: locale || "i18n" })]
451
435
  });
452
- $[83] = locale;
453
- $[84] = localized;
454
- $[85] = name;
455
- $[86] = required;
456
- $[87] = resolvedLabel;
457
- $[88] = t28;
458
- } else t28 = $[88];
436
+ $[78] = locale;
437
+ $[79] = localized;
438
+ $[80] = name;
439
+ $[81] = required;
440
+ $[82] = resolvedLabel;
441
+ $[83] = t28;
442
+ } else t28 = $[83];
459
443
  let t29;
460
- if ($[89] !== describedBy || $[90] !== disabled || $[91] !== enableImages || $[92] !== enableMediaLibrary || $[93] !== error || $[94] !== imageCollection || $[95] !== locale || $[96] !== maxCharacters || $[97] !== name || $[98] !== onChange || $[99] !== onImageUpload || $[100] !== readOnly || $[101] !== resolvedExtensions || $[102] !== resolvedFeatures || $[103] !== resolvedLabel || $[104] !== showCharacterCount || $[105] !== value) {
444
+ if ($[84] !== describedBy || $[85] !== disabled || $[86] !== enableImages || $[87] !== enableMediaLibrary || $[88] !== error || $[89] !== imageCollection || $[90] !== locale || $[91] !== maxCharacters || $[92] !== name || $[93] !== onChange || $[94] !== onImageUpload || $[95] !== readOnly || $[96] !== resolvedExtensions || $[97] !== resolvedFeatures || $[98] !== resolvedLabel || $[99] !== showCharacterCount || $[100] !== value) {
461
445
  t29 = resolvedExtensions ? /* @__PURE__ */ jsx(RichTextEditorCore, {
462
446
  name,
463
447
  ariaLabel: resolvedLabel ?? name,
@@ -482,49 +466,49 @@ function RichTextEditor(t0) {
482
466
  error,
483
467
  showToolbar: resolvedFeatures.toolbar
484
468
  });
485
- $[89] = describedBy;
486
- $[90] = disabled;
487
- $[91] = enableImages;
488
- $[92] = enableMediaLibrary;
489
- $[93] = error;
490
- $[94] = imageCollection;
491
- $[95] = locale;
492
- $[96] = maxCharacters;
493
- $[97] = name;
494
- $[98] = onChange;
495
- $[99] = onImageUpload;
496
- $[100] = readOnly;
497
- $[101] = resolvedExtensions;
498
- $[102] = resolvedFeatures;
499
- $[103] = resolvedLabel;
500
- $[104] = showCharacterCount;
501
- $[105] = value;
502
- $[106] = t29;
503
- } else t29 = $[106];
469
+ $[84] = describedBy;
470
+ $[85] = disabled;
471
+ $[86] = enableImages;
472
+ $[87] = enableMediaLibrary;
473
+ $[88] = error;
474
+ $[89] = imageCollection;
475
+ $[90] = locale;
476
+ $[91] = maxCharacters;
477
+ $[92] = name;
478
+ $[93] = onChange;
479
+ $[94] = onImageUpload;
480
+ $[95] = readOnly;
481
+ $[96] = resolvedExtensions;
482
+ $[97] = resolvedFeatures;
483
+ $[98] = resolvedLabel;
484
+ $[99] = showCharacterCount;
485
+ $[100] = value;
486
+ $[101] = t29;
487
+ } else t29 = $[101];
504
488
  let t30;
505
- if ($[107] !== descriptionId || $[108] !== resolvedDescription) {
489
+ if ($[102] !== descriptionId || $[103] !== resolvedDescription) {
506
490
  t30 = resolvedDescription && /* @__PURE__ */ jsx("p", {
507
491
  id: descriptionId,
508
492
  className: "text-muted-foreground text-xs",
509
493
  children: resolvedDescription
510
494
  });
511
- $[107] = descriptionId;
512
- $[108] = resolvedDescription;
513
- $[109] = t30;
514
- } else t30 = $[109];
495
+ $[102] = descriptionId;
496
+ $[103] = resolvedDescription;
497
+ $[104] = t30;
498
+ } else t30 = $[104];
515
499
  let t31;
516
- if ($[110] !== error || $[111] !== errorId) {
500
+ if ($[105] !== error || $[106] !== errorId) {
517
501
  t31 = error && /* @__PURE__ */ jsx("p", {
518
502
  id: errorId,
519
503
  className: "text-destructive text-xs",
520
504
  children: error
521
505
  });
522
- $[110] = error;
523
- $[111] = errorId;
524
- $[112] = t31;
525
- } else t31 = $[112];
506
+ $[105] = error;
507
+ $[106] = errorId;
508
+ $[107] = t31;
509
+ } else t31 = $[107];
526
510
  let t32;
527
- if ($[113] !== t27 || $[114] !== t28 || $[115] !== t29 || $[116] !== t30 || $[117] !== t31) {
511
+ if ($[108] !== t27 || $[109] !== t28 || $[110] !== t29 || $[111] !== t30 || $[112] !== t31) {
528
512
  t32 = /* @__PURE__ */ jsxs("div", {
529
513
  className: "space-y-2",
530
514
  "data-disabled": t27,
@@ -535,13 +519,13 @@ function RichTextEditor(t0) {
535
519
  t31
536
520
  ]
537
521
  });
538
- $[113] = t27;
539
- $[114] = t28;
540
- $[115] = t29;
541
- $[116] = t30;
542
- $[117] = t31;
543
- $[118] = t32;
544
- } else t32 = $[118];
522
+ $[108] = t27;
523
+ $[109] = t28;
524
+ $[110] = t29;
525
+ $[111] = t30;
526
+ $[112] = t31;
527
+ $[113] = t32;
528
+ } else t32 = $[113];
545
529
  return t32;
546
530
  }
547
531
  /**
@@ -26,13 +26,22 @@ const VERSION_META_KEYS = new Set([
26
26
  "versionCreatedAt"
27
27
  ]);
28
28
  const EMPTY_AUDIT_ENTRIES = [];
29
+ const RELATIVE_TIME_FORMATTERS = /* @__PURE__ */ new Map();
30
+ function getRelativeTimeFormatter(locale) {
31
+ let formatter = RELATIVE_TIME_FORMATTERS.get(locale);
32
+ if (!formatter) {
33
+ formatter = new Intl.RelativeTimeFormat(locale, { numeric: "auto" });
34
+ RELATIVE_TIME_FORMATTERS.set(locale, formatter);
35
+ }
36
+ return formatter;
37
+ }
29
38
  function formatRelativeTime(date, locale) {
30
39
  const diff = (/* @__PURE__ */ new Date()).getTime() - date.getTime();
31
40
  const absSeconds = Math.max(0, Math.floor(Math.abs(diff) / 1e3));
32
41
  const minutes = Math.floor(absSeconds / 60);
33
42
  const hours = Math.floor(minutes / 60);
34
43
  const days = Math.floor(hours / 24);
35
- const formatter = new Intl.RelativeTimeFormat(locale, { numeric: "auto" });
44
+ const formatter = getRelativeTimeFormatter(locale);
36
45
  if (days > 0) return formatter.format(-days, "day");
37
46
  if (hours > 0) return formatter.format(-hours, "hour");
38
47
  if (minutes > 0) return formatter.format(-minutes, "minute");
@@ -136,16 +145,22 @@ function extractRichText(value) {
136
145
  return summary ? truncate(summary, 180) : null;
137
146
  }
138
147
  function summarizeObjectArray(value) {
139
- const labels = value.map((item) => isObjectRecord(item) ? summarizeObject(item) : null).filter((item) => !!item);
148
+ const labels = [];
149
+ for (const item of value) {
150
+ if (!isObjectRecord(item)) continue;
151
+ const label = summarizeObject(item);
152
+ if (label) labels.push(label);
153
+ }
140
154
  if (labels.length === 0) return null;
141
155
  return labels.length === value.length ? truncate(labels.join(", "), 180) : null;
142
156
  }
143
157
  function summarizeBlocks(value) {
144
- const blockNames = value.map((item) => {
145
- if (!isObjectRecord(item)) return null;
158
+ const blockNames = [];
159
+ for (const item of value) {
160
+ if (!isObjectRecord(item)) continue;
146
161
  const type = item.blockType ?? item.block ?? item.type ?? item._type ?? item.name;
147
- return typeof type === "string" ? formatLabel(type) : null;
148
- }).filter((item) => !!item);
162
+ if (typeof type === "string") blockNames.push(formatLabel(type));
163
+ }
149
164
  if (blockNames.length === 0) return null;
150
165
  return truncate([...new Set(blockNames)].join(", "), 180);
151
166
  }
@@ -597,15 +612,15 @@ function VersionsList(t0) {
597
612
  const resolveText = useResolveText();
598
613
  let t1;
599
614
  if ($[0] !== versions) {
600
- t1 = [...versions].sort(_temp2);
615
+ t1 = versions.slice().sort(_temp2);
601
616
  $[0] = versions;
602
617
  $[1] = t1;
603
618
  } else t1 = $[1];
604
619
  const sortedAscVersions = t1;
605
620
  let t2;
606
- if ($[2] !== sortedAscVersions) {
607
- t2 = [...sortedAscVersions].sort(_temp3);
608
- $[2] = sortedAscVersions;
621
+ if ($[2] !== versions) {
622
+ t2 = versions.slice().sort(_temp3);
623
+ $[2] = versions;
609
624
  $[3] = t2;
610
625
  } else t2 = $[3];
611
626
  const sortedVersions = t2;