@bettercms-ai/kit 2.0.0 → 2.0.2

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 (120) hide show
  1. package/dist/adapters/lossy.d.ts +14 -6
  2. package/dist/adapters/lossy.js +23 -11
  3. package/dist/adapters/lossy.js.map +1 -1
  4. package/dist/adapters/prod-types.d.ts +46 -14
  5. package/dist/adapters/prod-types.js +37 -35
  6. package/dist/adapters/prod-types.js.map +1 -1
  7. package/dist/adapters/schema.d.ts +39 -0
  8. package/dist/adapters/schema.js +281 -82
  9. package/dist/adapters/schema.js.map +1 -1
  10. package/dist/context.d.ts +39 -0
  11. package/dist/context.js +40 -1
  12. package/dist/context.js.map +1 -1
  13. package/dist/controls/form-picker-register.d.ts +7 -1
  14. package/dist/controls/form-picker-register.js +1 -5
  15. package/dist/controls/form-picker-register.js.map +1 -1
  16. package/dist/controls/icon.d.ts +1 -1
  17. package/dist/controls/icon.js +1 -1
  18. package/dist/controls/icon.js.map +1 -1
  19. package/dist/controls/link.d.ts +11 -4
  20. package/dist/controls/link.js +120 -202
  21. package/dist/controls/link.js.map +1 -1
  22. package/dist/controls/location.js +3 -8
  23. package/dist/controls/location.js.map +1 -1
  24. package/dist/controls/media.d.ts +0 -14
  25. package/dist/controls/media.js +52 -95
  26. package/dist/controls/media.js.map +1 -1
  27. package/dist/controls/reference-services.d.ts +23 -2
  28. package/dist/controls/reference.d.ts +2 -2
  29. package/dist/controls/reference.js +79 -28
  30. package/dist/controls/reference.js.map +1 -1
  31. package/dist/controls/rich-text/article-shell.d.ts +145 -0
  32. package/dist/controls/rich-text/article-shell.js +514 -0
  33. package/dist/controls/rich-text/article-shell.js.map +1 -0
  34. package/dist/controls/rich-text/author.d.ts +25 -0
  35. package/dist/controls/rich-text/author.js +107 -0
  36. package/dist/controls/rich-text/author.js.map +1 -0
  37. package/dist/controls/rich-text/blocks.d.ts +19 -2
  38. package/dist/controls/rich-text/blocks.js +275 -638
  39. package/dist/controls/rich-text/blocks.js.map +1 -1
  40. package/dist/controls/rich-text/button.d.ts +23 -0
  41. package/dist/controls/rich-text/button.js +81 -0
  42. package/dist/controls/rich-text/button.js.map +1 -0
  43. package/dist/controls/rich-text/catalog.d.ts +2 -5
  44. package/dist/controls/rich-text/catalog.js +121 -7
  45. package/dist/controls/rich-text/catalog.js.map +1 -1
  46. package/dist/controls/rich-text/checklist.d.ts +24 -0
  47. package/dist/controls/rich-text/checklist.js +115 -0
  48. package/dist/controls/rich-text/checklist.js.map +1 -0
  49. package/dist/controls/rich-text/codec.d.ts +15 -1
  50. package/dist/controls/rich-text/codec.js +11 -1
  51. package/dist/controls/rich-text/codec.js.map +1 -1
  52. package/dist/controls/rich-text/columns.d.ts +41 -0
  53. package/dist/controls/rich-text/columns.js +181 -0
  54. package/dist/controls/rich-text/columns.js.map +1 -0
  55. package/dist/controls/rich-text/control.js +1 -0
  56. package/dist/controls/rich-text/control.js.map +1 -1
  57. package/dist/controls/rich-text/dom.d.ts +84 -4
  58. package/dist/controls/rich-text/dom.js +171 -10
  59. package/dist/controls/rich-text/dom.js.map +1 -1
  60. package/dist/controls/rich-text/editor.d.ts +4 -2
  61. package/dist/controls/rich-text/editor.js +199 -26
  62. package/dist/controls/rich-text/editor.js.map +1 -1
  63. package/dist/controls/rich-text/embed.d.ts +28 -0
  64. package/dist/controls/rich-text/embed.js +210 -0
  65. package/dist/controls/rich-text/embed.js.map +1 -0
  66. package/dist/controls/rich-text/footnote.d.ts +41 -0
  67. package/dist/controls/rich-text/footnote.js +185 -0
  68. package/dist/controls/rich-text/footnote.js.map +1 -0
  69. package/dist/controls/rich-text/gallery.d.ts +28 -0
  70. package/dist/controls/rich-text/gallery.js +167 -0
  71. package/dist/controls/rich-text/gallery.js.map +1 -0
  72. package/dist/controls/rich-text/link-form.d.ts +13 -1
  73. package/dist/controls/rich-text/link-form.js +41 -7
  74. package/dist/controls/rich-text/link-form.js.map +1 -1
  75. package/dist/controls/rich-text/ops.js +6 -0
  76. package/dist/controls/rich-text/ops.js.map +1 -1
  77. package/dist/controls/rich-text/related.d.ts +49 -0
  78. package/dist/controls/rich-text/related.js +233 -0
  79. package/dist/controls/rich-text/related.js.map +1 -0
  80. package/dist/controls/rich-text/toc.d.ts +47 -0
  81. package/dist/controls/rich-text/toc.js +160 -0
  82. package/dist/controls/rich-text/toc.js.map +1 -0
  83. package/dist/controls/slot-register.d.ts +6 -1
  84. package/dist/controls/slot-register.js +1 -4
  85. package/dist/controls/slot-register.js.map +1 -1
  86. package/dist/core/core.d.ts +11 -3
  87. package/dist/core/core.js +24 -6
  88. package/dist/core/core.js.map +1 -1
  89. package/dist/core/facets.d.ts +16 -0
  90. package/dist/core/facets.js +17 -1
  91. package/dist/core/facets.js.map +1 -1
  92. package/dist/core/index.js +2 -2
  93. package/dist/index.js +16 -5
  94. package/dist/index.js.map +1 -1
  95. package/dist/ledgers/exclusions.v1.js +141 -0
  96. package/dist/ledgers/exclusions.v1.js.map +1 -0
  97. package/dist/library/coverage.d.ts +13 -1
  98. package/dist/library/coverage.js +12 -1
  99. package/dist/library/coverage.js.map +1 -1
  100. package/dist/library/kit-catalog.json +158 -154
  101. package/dist/schema/types.d.ts +17 -0
  102. package/dist/schema/types.js.map +1 -1
  103. package/dist/styles.css +1 -1
  104. package/dist/testing/coverage-extras.d.ts +8 -0
  105. package/dist/testing/coverage-extras.js +44 -0
  106. package/dist/testing/coverage-extras.js.map +1 -0
  107. package/dist/testing/exclusions.d.ts +30 -0
  108. package/dist/testing/exclusions.js +13 -0
  109. package/dist/testing/exclusions.js.map +1 -0
  110. package/dist/ui/autocomplete.d.ts +29 -1
  111. package/dist/ui/autocomplete.js +102 -47
  112. package/dist/ui/autocomplete.js.map +1 -1
  113. package/dist/ui/button.js +3 -5
  114. package/dist/ui/button.js.map +1 -1
  115. package/dist/ui/index.js +2 -2
  116. package/dist/ui/overlay.d.ts +4 -1
  117. package/dist/ui/overlay.js +2 -1
  118. package/dist/ui/overlay.js.map +1 -1
  119. package/dist/ui/toast.js +1 -1
  120. package/package.json +8 -2
@@ -297,35 +297,6 @@ var NO_LIBRARY = "No media library is connected to this editor, so nothing can b
297
297
  var NO_UPLOAD = "No upload is connected to this editor, so files can't be uploaded here.";
298
298
  /** Transparency checker on the kit tokens (white in light, dimmed in dark), as the media grid draws it. */
299
299
  var CHECKER = "bg-kit-checker-a [background-image:conic-gradient(var(--kit-checker-b)_25%,var(--kit-checker-a)_0_50%,var(--kit-checker-b)_0_75%,var(--kit-checker-a)_0)] [background-size:12px_12px]";
300
- /** The preview frame's shape bounds: a tall or panoramic picture never makes the dock tall or a sliver. */
301
- var FRAME_MIN = 1;
302
- var FRAME_MAX = 2;
303
- /**
304
- * How a preview frames a picture of any shape: the frame follows the picture's ratio between square and 2:1, and the
305
- * picture fits inside it WHOLE, filling the frame's width or height (a portrait is boxed at the sides, a panorama above
306
- * and below, on the checker). With no known size (still loading, or an SVG with no intrinsic size) the frame is 16:9
307
- * and the picture is contained. Before 2026-10-16 every picture was cropped to a fixed 16:9 (`object-cover`).
308
- */
309
- function frameFit(size) {
310
- if (!size || !(size.w > 0) || !(size.h > 0)) return {
311
- frame: 16 / 9,
312
- image: null,
313
- fill: "contain"
314
- };
315
- const image = size.w / size.h;
316
- const frame = Math.min(FRAME_MAX, Math.max(FRAME_MIN, image));
317
- return {
318
- frame,
319
- image,
320
- fill: image < frame ? "height" : "width"
321
- };
322
- }
323
- /** The picture's classes for a fit: it keeps its own ratio and the frame's width or height, never cut. */
324
- var FIT_CLASS = {
325
- width: "h-auto max-h-full w-full object-contain",
326
- height: "h-full w-auto max-w-full object-contain",
327
- contain: "size-full object-contain"
328
- };
329
300
  /** V2's five crops (kit media.tsx CROPS, D46). */
330
301
  var CROPS = [
331
302
  {
@@ -390,9 +361,7 @@ function ImageDetails({ v, onChange, readOnly, label, urlOnly, altOnly = false,
390
361
  };
391
362
  const choice = cropChoice(v.crop, size);
392
363
  const crop = CROPS.find((c) => c.value === choice);
393
- const own = choice === "original" && size ? frameFit(size) : null;
394
- const pad = own?.image ? own : null;
395
- const padRatio = crop && crop.ratio !== "auto" ? crop.ratio : pad ? String(pad.image) : customRatio(v.crop, size) ?? "3/2";
364
+ const padRatio = crop && crop.ratio !== "auto" ? crop.ratio : customRatio(v.crop, size) ?? "3/2";
396
365
  const setFocal = (x, y) => {
397
366
  const next = {
398
367
  ...v,
@@ -510,49 +479,45 @@ function ImageDetails({ v, onChange, readOnly, label, urlOnly, altOnly = false,
510
479
  className: "text-kit-2xs text-kit-fg-3",
511
480
  children: "The crop is cut from the picture's size, which is still loading."
512
481
  }) : null,
513
- /* @__PURE__ */ jsx("div", {
514
- className: cn(pad ? "mt-1 flex items-center justify-center overflow-hidden rounded-kit-md border border-kit-line" : "contents", pad && CHECKER),
515
- style: pad ? { aspectRatio: pad.frame } : void 0,
516
- children: /* @__PURE__ */ jsxs("div", {
517
- role: "slider",
518
- "aria-label": "Focal point. Click the subject.",
519
- "aria-valuetext": `${focal.x}% across, ${focal.y}% down`,
520
- "aria-valuenow": focal.x,
521
- "aria-valuemin": 0,
522
- "aria-valuemax": 100,
523
- "aria-readonly": readOnly || void 0,
524
- tabIndex: 0,
525
- onPointerDown: (e) => !readOnly && fromPointer(e),
526
- onKeyDown: (e) => {
527
- const d = e.shiftKey ? 10 : 2;
528
- const step = {
529
- ArrowLeft: [-d, 0],
530
- ArrowRight: [d, 0],
531
- ArrowUp: [0, -d],
532
- ArrowDown: [0, d]
533
- }[e.key];
534
- if (!step || readOnly) return;
535
- e.preventDefault();
536
- setFocal(focal.x + step[0], focal.y + step[1]);
537
- },
538
- "data-pad-ratio": padRatio,
539
- className: pad ? cn("relative cursor-crosshair overflow-hidden", pad.fill === "height" ? "h-full" : "w-full") : "relative mt-1 cursor-crosshair overflow-hidden rounded-kit-md border border-kit-line bg-kit-muted",
540
- style: { aspectRatio: padRatio },
541
- children: [/* @__PURE__ */ jsx("img", {
542
- src: src(v.url),
543
- alt: "",
544
- draggable: false,
545
- className: "pointer-events-none size-full select-none object-cover transition-[object-position] duration-200",
546
- style: { objectPosition: `${focal.x}% ${focal.y}%` }
547
- }), /* @__PURE__ */ jsx("span", {
548
- "aria-hidden": true,
549
- className: "pointer-events-none absolute size-5 -translate-x-1/2 -translate-y-1/2 rounded-full border-2 border-kit-media-handle bg-kit-media-handle-ring shadow-kit-md transition-[left,top] duration-150",
550
- style: {
551
- left: `${focal.x}%`,
552
- top: `${focal.y}%`
553
- }
554
- })]
555
- })
482
+ /* @__PURE__ */ jsxs("div", {
483
+ role: "slider",
484
+ "aria-label": "Focal point. Click the subject.",
485
+ "aria-valuetext": `${focal.x}% across, ${focal.y}% down`,
486
+ "aria-valuenow": focal.x,
487
+ "aria-valuemin": 0,
488
+ "aria-valuemax": 100,
489
+ "aria-readonly": readOnly || void 0,
490
+ tabIndex: 0,
491
+ onPointerDown: (e) => !readOnly && fromPointer(e),
492
+ onKeyDown: (e) => {
493
+ const d = e.shiftKey ? 10 : 2;
494
+ const step = {
495
+ ArrowLeft: [-d, 0],
496
+ ArrowRight: [d, 0],
497
+ ArrowUp: [0, -d],
498
+ ArrowDown: [0, d]
499
+ }[e.key];
500
+ if (!step || readOnly) return;
501
+ e.preventDefault();
502
+ setFocal(focal.x + step[0], focal.y + step[1]);
503
+ },
504
+ "data-pad-ratio": padRatio,
505
+ className: "relative mt-1 cursor-crosshair overflow-hidden rounded-kit-md border border-kit-line bg-kit-muted",
506
+ style: { aspectRatio: padRatio },
507
+ children: [/* @__PURE__ */ jsx("img", {
508
+ src: src(v.url),
509
+ alt: "",
510
+ draggable: false,
511
+ className: "pointer-events-none size-full select-none object-cover transition-[object-position] duration-200",
512
+ style: { objectPosition: `${focal.x}% ${focal.y}%` }
513
+ }), /* @__PURE__ */ jsx("span", {
514
+ "aria-hidden": true,
515
+ className: "pointer-events-none absolute size-5 -translate-x-1/2 -translate-y-1/2 rounded-full border-2 border-kit-media-handle bg-kit-media-handle-ring shadow-kit-md transition-[left,top] duration-150",
516
+ style: {
517
+ left: `${focal.x}%`,
518
+ top: `${focal.y}%`
519
+ }
520
+ })]
556
521
  }),
557
522
  /* @__PURE__ */ jsx("span", {
558
523
  className: "text-kit-2xs text-kit-fg-3",
@@ -799,9 +764,11 @@ function ImageControl({ field, value, onChange: write, readOnly, id, path }) {
799
764
  })
800
765
  ]
801
766
  });
802
- const fit = frameFit(size);
803
- const vector = asset?.kind === "svg" || !!field.svgOnly || /\.svg(?:$|[?#])/i.test(v.url);
804
- const cap = fit.image && size && !vector ? size : void 0;
767
+ const frameRatio = CROPS.find((c) => c.value === cropChoice(v.crop, size))?.ratio;
768
+ const focal = v.focal ?? {
769
+ x: 50,
770
+ y: 50
771
+ };
805
772
  const alt = urlOnly ? asset?.alt : v.alt;
806
773
  const name = asset?.name ?? v.name ?? fileNameFromUrl(v.url);
807
774
  const replace = (a) => {
@@ -827,9 +794,8 @@ function ImageControl({ field, value, onChange: write, readOnly, id, path }) {
827
794
  children: [
828
795
  /* @__PURE__ */ jsxs("div", {
829
796
  "data-slot": "kit-image-frame",
830
- "data-frame-ratio": String(fit.frame),
831
- className: cn("group/img relative overflow-hidden rounded-kit-lg border border-kit-line", CHECKER),
832
- style: { aspectRatio: fit.frame },
797
+ className: "group/img relative overflow-hidden rounded-kit-lg border border-kit-line bg-kit-muted",
798
+ style: { aspectRatio: frameRatio && frameRatio !== "auto" ? frameRatio : "16/9" },
833
799
  children: [
834
800
  /* @__PURE__ */ jsx("button", {
835
801
  id,
@@ -843,17 +809,8 @@ function ImageControl({ field, value, onChange: write, readOnly, id, path }) {
843
809
  alt: alt ?? "",
844
810
  ref: readNatural,
845
811
  onLoad: (e) => readNatural(e.currentTarget),
846
- "data-fill": fit.fill,
847
- "data-image-ratio": fit.image ?? void 0,
848
- "data-cap": cap ? `${cap.w}x${cap.h}` : void 0,
849
- className: FIT_CLASS[fit.fill],
850
- style: fit.image ? {
851
- aspectRatio: fit.image,
852
- ...cap ? {
853
- maxWidth: `min(100%, ${cap.w}px)`,
854
- maxHeight: `min(100%, ${cap.h}px)`
855
- } : {}
856
- } : void 0
812
+ className: "size-full object-cover",
813
+ style: { objectPosition: `${focal.x}% ${focal.y}%` }
857
814
  })
858
815
  }),
859
816
  readOnly ? null : /* @__PURE__ */ jsxs("div", {
@@ -994,7 +951,7 @@ function Thumb({ item, label, readOnly, sort, onRemove, onOpen }) {
994
951
  ref: sort.register(item.key),
995
952
  role: "listitem",
996
953
  style: sort.style(item.key),
997
- className: cn("group/thumb relative aspect-square cursor-grab touch-none overflow-hidden rounded-kit-md border border-kit-line active:cursor-grabbing", CHECKER, sort.active === item.key && "z-10 opacity-90 shadow-kit-lg ring-2 ring-kit-line-strong"),
954
+ className: cn("group/thumb relative aspect-square cursor-grab touch-none overflow-hidden rounded-kit-md border border-kit-line bg-kit-muted active:cursor-grabbing", sort.active === item.key && "z-10 opacity-90 shadow-kit-lg ring-2 ring-kit-line-strong"),
998
955
  children: [
999
956
  /* @__PURE__ */ jsx("div", {
1000
957
  ...readOnly ? {} : handle,
@@ -1020,7 +977,7 @@ function Thumb({ item, label, readOnly, sort, onRemove, onOpen }) {
1020
977
  src: src(item.v.url),
1021
978
  alt: item.v.alt ?? "",
1022
979
  "data-slot": "kit-gallery-thumb",
1023
- className: "pointer-events-none size-full select-none object-contain",
980
+ className: "pointer-events-none size-full select-none object-cover",
1024
981
  draggable: false
1025
982
  })
1026
983
  }),
@@ -1391,6 +1348,6 @@ function VideoControl({ field, value, onChange, readOnly, id, onBlur }) {
1391
1348
  });
1392
1349
  }
1393
1350
  //#endregion
1394
- export { FileControl, GalleryControl, ImageControl, MediaPicker, VideoControl, VideoPreview, acceptsFile, cropChoice, fileNameFromUrl, formatBytes, frameFit, fromAsset, isVideoUrl, normImage, useUpload, videoProvider, withCrop, youTubeId };
1351
+ export { FileControl, GalleryControl, ImageControl, MediaPicker, VideoControl, VideoPreview, acceptsFile, cropChoice, fileNameFromUrl, formatBytes, fromAsset, isVideoUrl, normImage, useUpload, videoProvider, withCrop, youTubeId };
1395
1352
 
1396
1353
  //# sourceMappingURL=media.js.map