kuinetic 0.2.3 → 0.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.
package/dist/kuinetic.css CHANGED
@@ -1600,6 +1600,12 @@
1600
1600
  html[data-kui-cloak] :is([data-kui~=bounce-in-up], [data-kui~="bounce-in-up,"], [data-kui~=",bounce-in-up"], [data-kui~=",bounce-in-up,"]):not([data-kui-state]),
1601
1601
  html[data-kui-cloak] :is([data-kui~=card-flip-x], [data-kui~="card-flip-x,"], [data-kui~=",card-flip-x"], [data-kui~=",card-flip-x,"]):not([data-kui-state]),
1602
1602
  html[data-kui-cloak] :is([data-kui~=card-flip-y], [data-kui~="card-flip-y,"], [data-kui~=",card-flip-y"], [data-kui~=",card-flip-y,"]):not([data-kui-state]),
1603
+ html[data-kui-cloak] :is([data-kui~=carousel-3d], [data-kui~="carousel-3d,"], [data-kui~=",carousel-3d"], [data-kui~=",carousel-3d,"]):not([data-kui-state]),
1604
+ html[data-kui-cloak] :is([data-kui~=carousel-3d-high], [data-kui~="carousel-3d-high,"], [data-kui~=",carousel-3d-high"], [data-kui~=",carousel-3d-high,"]):not([data-kui-state]),
1605
+ html[data-kui-cloak] :is([data-kui~=carousel-3d-inside], [data-kui~="carousel-3d-inside,"], [data-kui~=",carousel-3d-inside"], [data-kui~=",carousel-3d-inside,"]):not([data-kui-state]),
1606
+ html[data-kui-cloak] :is([data-kui~=carousel-3d-low], [data-kui~="carousel-3d-low,"], [data-kui~=",carousel-3d-low"], [data-kui~=",carousel-3d-low,"]):not([data-kui-state]),
1607
+ html[data-kui-cloak] :is([data-kui~=carousel-orbit], [data-kui~="carousel-orbit,"], [data-kui~=",carousel-orbit"], [data-kui~=",carousel-orbit,"]):not([data-kui-state]),
1608
+ html[data-kui-cloak] :is([data-kui~=carousel-stack], [data-kui~="carousel-stack,"], [data-kui~=",carousel-stack"], [data-kui~=",carousel-stack,"]):not([data-kui-state]),
1603
1609
  html[data-kui-cloak] :is([data-kui~=chart-bar-grow], [data-kui~="chart-bar-grow,"], [data-kui~=",chart-bar-grow"], [data-kui~=",chart-bar-grow,"]):not([data-kui-state]),
1604
1610
  html[data-kui-cloak] :is([data-kui~=curtain-reveal], [data-kui~="curtain-reveal,"], [data-kui~=",curtain-reveal"], [data-kui~=",curtain-reveal,"]):not([data-kui-state]),
1605
1611
  html[data-kui-cloak] :is([data-kui~=fade-blur-in], [data-kui~="fade-blur-in,"], [data-kui~=",fade-blur-in"], [data-kui~=",fade-blur-in,"]):not([data-kui-state]),
@@ -1663,6 +1669,12 @@
1663
1669
  html[data-kui-cloak] :is([data-kui~=bounce-in-up], [data-kui~="bounce-in-up,"], [data-kui~=",bounce-in-up"], [data-kui~=",bounce-in-up,"]):not([data-kui-state]),
1664
1670
  html[data-kui-cloak] :is([data-kui~=card-flip-x], [data-kui~="card-flip-x,"], [data-kui~=",card-flip-x"], [data-kui~=",card-flip-x,"]):not([data-kui-state]),
1665
1671
  html[data-kui-cloak] :is([data-kui~=card-flip-y], [data-kui~="card-flip-y,"], [data-kui~=",card-flip-y"], [data-kui~=",card-flip-y,"]):not([data-kui-state]),
1672
+ html[data-kui-cloak] :is([data-kui~=carousel-3d], [data-kui~="carousel-3d,"], [data-kui~=",carousel-3d"], [data-kui~=",carousel-3d,"]):not([data-kui-state]),
1673
+ html[data-kui-cloak] :is([data-kui~=carousel-3d-high], [data-kui~="carousel-3d-high,"], [data-kui~=",carousel-3d-high"], [data-kui~=",carousel-3d-high,"]):not([data-kui-state]),
1674
+ html[data-kui-cloak] :is([data-kui~=carousel-3d-inside], [data-kui~="carousel-3d-inside,"], [data-kui~=",carousel-3d-inside"], [data-kui~=",carousel-3d-inside,"]):not([data-kui-state]),
1675
+ html[data-kui-cloak] :is([data-kui~=carousel-3d-low], [data-kui~="carousel-3d-low,"], [data-kui~=",carousel-3d-low"], [data-kui~=",carousel-3d-low,"]):not([data-kui-state]),
1676
+ html[data-kui-cloak] :is([data-kui~=carousel-orbit], [data-kui~="carousel-orbit,"], [data-kui~=",carousel-orbit"], [data-kui~=",carousel-orbit,"]):not([data-kui-state]),
1677
+ html[data-kui-cloak] :is([data-kui~=carousel-stack], [data-kui~="carousel-stack,"], [data-kui~=",carousel-stack"], [data-kui~=",carousel-stack,"]):not([data-kui-state]),
1666
1678
  html[data-kui-cloak] :is([data-kui~=chart-bar-grow], [data-kui~="chart-bar-grow,"], [data-kui~=",chart-bar-grow"], [data-kui~=",chart-bar-grow,"]):not([data-kui-state]),
1667
1679
  html[data-kui-cloak] :is([data-kui~=curtain-reveal], [data-kui~="curtain-reveal,"], [data-kui~=",curtain-reveal"], [data-kui~=",curtain-reveal,"]):not([data-kui-state]),
1668
1680
  html[data-kui-cloak] :is([data-kui~=fade-blur-in], [data-kui~="fade-blur-in,"], [data-kui~=",fade-blur-in"], [data-kui~=",fade-blur-in,"]):not([data-kui-state]),
@@ -6222,7 +6234,11 @@
6222
6234
  box-sizing: border-box;
6223
6235
  margin: 0;
6224
6236
  border: 0;
6225
- padding: clamp(1rem, 4vw, 3rem);
6237
+ --kui-lightbox-pad: clamp(1rem, 4vw, 3rem);
6238
+ --kui-lightbox-edge: clamp(0.75rem, 2vw, 1.25rem);
6239
+ --kui-lightbox-arrow-size: 44px;
6240
+ --kui-lightbox-nav-room: max(0px, calc(var(--kui-lightbox-edge) + var(--kui-lightbox-arrow-size) + 0.5rem - var(--kui-lightbox-pad)));
6241
+ padding: var(--kui-lightbox-pad);
6226
6242
  overflow: auto;
6227
6243
  overscroll-behavior: contain;
6228
6244
  display: grid;
@@ -6323,8 +6339,8 @@
6323
6339
  }
6324
6340
  .kui-lightbox-close {
6325
6341
  position: fixed;
6326
- inset-block-start: clamp(0.75rem, 2vw, 1.25rem);
6327
- inset-inline-end: clamp(0.75rem, 2vw, 1.25rem);
6342
+ inset-block-start: calc(var(--kui-lightbox-edge) + env(safe-area-inset-top, 0px));
6343
+ inset-inline-end: calc(var(--kui-lightbox-edge) + env(safe-area-inset-right, 0px));
6328
6344
  z-index: 1;
6329
6345
  inline-size: 40px;
6330
6346
  block-size: 40px;
@@ -6332,17 +6348,90 @@
6332
6348
  }
6333
6349
  .kui-lightbox-prev,
6334
6350
  .kui-lightbox-next {
6351
+ display: grid;
6352
+ place-items: center;
6353
+ padding: 0;
6354
+ inline-size: var(--kui-lightbox-arrow-size);
6355
+ block-size: var(--kui-lightbox-arrow-size);
6356
+ border-color: rgb(255 255 255 / 0.18);
6357
+ color: var(--kui-lightbox-arrow-fg, #e4f222);
6358
+ background: var(--kui-lightbox-arrow-bg, #000);
6359
+ transition: transform 160ms ease;
6360
+ }
6361
+ .kui-lightbox-prev svg,
6362
+ .kui-lightbox-next svg {
6363
+ inline-size: 22px;
6364
+ block-size: 22px;
6365
+ fill: none;
6366
+ stroke: currentColor;
6367
+ stroke-width: 2.75;
6368
+ stroke-linecap: round;
6369
+ stroke-linejoin: round;
6370
+ }
6371
+ .kui-lightbox-prev:hover,
6372
+ .kui-lightbox-next:hover {
6373
+ transform: scale(1.08);
6374
+ }
6375
+ @media (prefers-reduced-motion: reduce) {
6376
+ .kui-lightbox-prev,
6377
+ .kui-lightbox-next {
6378
+ transition: none;
6379
+ }
6380
+ }
6381
+ .kui-lightbox-nav {
6335
6382
  position: fixed;
6336
- inset-block-start: 50%;
6337
- inline-size: 40px;
6338
- block-size: 40px;
6339
- font-size: 2rem;
6383
+ z-index: 1;
6384
+ display: flex;
6385
+ align-items: center;
6386
+ direction: ltr;
6387
+ gap: var(--kui-lightbox-arrow-gap, 0.5rem);
6388
+ inset: var(--kui-lightbox-nav-top, auto) var(--kui-lightbox-nav-right, auto) var(--kui-lightbox-nav-bottom, auto) var(--kui-lightbox-nav-left, auto);
6340
6389
  }
6341
- .kui-lightbox-prev {
6342
- inset-inline-start: 0.75rem;
6390
+ .kui-lightbox-nav--bottom-right {
6391
+ bottom: var(--kui-lightbox-nav-bottom, calc(var(--kui-lightbox-edge) + env(safe-area-inset-bottom, 0px)));
6392
+ right: var(--kui-lightbox-nav-right, calc(var(--kui-lightbox-edge) + env(safe-area-inset-right, 0px)));
6343
6393
  }
6344
- .kui-lightbox-next {
6345
- inset-inline-end: 0.75rem;
6394
+ .kui-lightbox-nav--bottom-left {
6395
+ bottom: var(--kui-lightbox-nav-bottom, calc(var(--kui-lightbox-edge) + env(safe-area-inset-bottom, 0px)));
6396
+ left: var(--kui-lightbox-nav-left, calc(var(--kui-lightbox-edge) + env(safe-area-inset-left, 0px)));
6397
+ }
6398
+ .kui-lightbox-nav--bottom {
6399
+ bottom: var(--kui-lightbox-nav-bottom, calc(var(--kui-lightbox-edge) + env(safe-area-inset-bottom, 0px)));
6400
+ left: 50%;
6401
+ translate: -50% 0;
6402
+ }
6403
+ .kui-lightbox-nav--bottom-apart {
6404
+ bottom: var(--kui-lightbox-nav-bottom, calc(var(--kui-lightbox-edge) + env(safe-area-inset-bottom, 0px)));
6405
+ left: var(--kui-lightbox-nav-left, calc(var(--kui-lightbox-edge) + env(safe-area-inset-left, 0px)));
6406
+ right: var(--kui-lightbox-nav-right, calc(var(--kui-lightbox-edge) + env(safe-area-inset-right, 0px)));
6407
+ justify-content: space-between;
6408
+ pointer-events: none;
6409
+ }
6410
+ .kui-lightbox-nav--top-left {
6411
+ top: var(--kui-lightbox-nav-top, calc(var(--kui-lightbox-edge) + env(safe-area-inset-top, 0px) - 2px));
6412
+ left: var(--kui-lightbox-nav-left, calc(var(--kui-lightbox-edge) + env(safe-area-inset-left, 0px)));
6413
+ }
6414
+ .kui-lightbox-nav--top-right {
6415
+ top: var(--kui-lightbox-nav-top, calc(var(--kui-lightbox-edge) + env(safe-area-inset-top, 0px) - 2px));
6416
+ right: var(--kui-lightbox-nav-right, calc(var(--kui-lightbox-edge) + env(safe-area-inset-right, 0px) + 40px + 0.5rem));
6417
+ }
6418
+ .kui-lightbox-nav--sides {
6419
+ top: 50%;
6420
+ translate: 0 -50%;
6421
+ left: var(--kui-lightbox-nav-left, calc(var(--kui-lightbox-edge) + env(safe-area-inset-left, 0px)));
6422
+ right: var(--kui-lightbox-nav-right, calc(var(--kui-lightbox-edge) + env(safe-area-inset-right, 0px)));
6423
+ justify-content: space-between;
6424
+ pointer-events: none;
6425
+ }
6426
+ .kui-lightbox-nav--bottom-apart > button,
6427
+ .kui-lightbox-nav--sides > button {
6428
+ pointer-events: auto;
6429
+ }
6430
+ .kui-lightbox-gallery:has(> [class*=kui-lightbox-nav--bottom]) {
6431
+ padding-block-end: calc(var(--kui-lightbox-nav-room) + env(safe-area-inset-bottom, 0px));
6432
+ }
6433
+ .kui-lightbox-gallery:has(> [class*=kui-lightbox-nav--top]) {
6434
+ padding-block-start: calc(var(--kui-lightbox-nav-room) + env(safe-area-inset-top, 0px));
6346
6435
  }
6347
6436
  .kui-lightbox-counter {
6348
6437
  font-size: 0.85rem;
package/dist/kuinetic.js CHANGED
@@ -15117,7 +15117,8 @@ var kuinetic = (() => {
15117
15117
  name: "carousel-stack",
15118
15118
  primitive: "spatial-stack",
15119
15119
  requiresOwnSubtree: true,
15120
- phase: "idle"
15120
+ phase: "idle",
15121
+ cloak: true
15121
15122
  }
15122
15123
  ];
15123
15124
 
@@ -15343,21 +15344,24 @@ var kuinetic = (() => {
15343
15344
  primitive: "spatial-ring",
15344
15345
  params: { tilt: "12deg" },
15345
15346
  requiresOwnSubtree: true,
15346
- phase: "idle"
15347
+ phase: "idle",
15348
+ cloak: true
15347
15349
  },
15348
15350
  {
15349
15351
  name: "carousel-3d-high",
15350
15352
  primitive: "spatial-ring",
15351
15353
  params: { tilt: "30deg", perspective: "1200px" },
15352
15354
  requiresOwnSubtree: true,
15353
- phase: "idle"
15355
+ phase: "idle",
15356
+ cloak: true
15354
15357
  },
15355
15358
  {
15356
15359
  name: "carousel-3d-low",
15357
15360
  primitive: "spatial-ring",
15358
15361
  params: { tilt: "-18deg", perspective: "1800px" },
15359
15362
  requiresOwnSubtree: true,
15360
- phase: "idle"
15363
+ phase: "idle",
15364
+ cloak: true
15361
15365
  },
15362
15366
  /*
15363
15367
  * The concave name. `arc:120deg` is the default the outside names cannot want and this one cannot
@@ -15372,7 +15376,8 @@ var kuinetic = (() => {
15372
15376
  primitive: "spatial-ring",
15373
15377
  params: { arc: "120deg", facing: "camera", perspective: "900px" },
15374
15378
  requiresOwnSubtree: true,
15375
- phase: "idle"
15379
+ phase: "idle",
15380
+ cloak: true
15376
15381
  },
15377
15382
  /*
15378
15383
  * The flat ring: cards on a clock face around whatever sits in the middle of the host (a word, a
@@ -15393,7 +15398,8 @@ var kuinetic = (() => {
15393
15398
  primitive: "spatial-ring",
15394
15399
  params: { plane: "screen", facing: "camera" },
15395
15400
  requiresOwnSubtree: true,
15396
- phase: "idle"
15401
+ phase: "idle",
15402
+ cloak: true
15397
15403
  }
15398
15404
  ];
15399
15405
  function registerCarousel(registry) {
@@ -16174,7 +16180,14 @@ var kuinetic = (() => {
16174
16180
  ease: { type: "easing", default: DEFAULT_EASE, cssProperty: "--kui-lightbox-ease" },
16175
16181
  loop: { type: "keyword", default: "true", cssProperty: "--kui-lightbox-loop", keywords: ["true", "false"] },
16176
16182
  aspect: { type: "keyword", default: "", cssProperty: "--kui-lightbox-aspect", keywords: ["wide", "tall", "square"] },
16177
- caption: { type: "keyword", default: "figcaption", cssProperty: "--kui-lightbox-caption", keywords: ["figcaption", "alt", "title", "none"] }
16183
+ caption: { type: "keyword", default: "figcaption", cssProperty: "--kui-lightbox-caption", keywords: ["figcaption", "alt", "title", "none"] },
16184
+ arrows: {
16185
+ type: "keyword",
16186
+ default: "bottom-right",
16187
+ cssProperty: "--kui-lightbox-arrows",
16188
+ keywords: ["bottom-right", "bottom-left", "bottom", "bottom-apart", "top-right", "top-left", "sides"]
16189
+ },
16190
+ "arrow-gap": { type: "length", default: "", cssProperty: "--kui-lightbox-arrow-gap" }
16178
16191
  };
16179
16192
  function defaultTargets(el, media) {
16180
16193
  if (el.matches("a[href]") || media !== "video" && el.matches("img")) return [el];
@@ -16389,6 +16402,17 @@ var kuinetic = (() => {
16389
16402
  if (kinds.size > 1) return { noun: "item", label: "Media viewer" };
16390
16403
  return kinds.has("video") ? { noun: "video", label: "Video viewer" } : { noun: "image", label: "Image viewer" };
16391
16404
  }
16405
+ var SVG_NS = "http://www.w3.org/2000/svg";
16406
+ function chevron(doc, path2) {
16407
+ const svg = doc.createElementNS(SVG_NS, "svg");
16408
+ svg.setAttribute("viewBox", "0 0 24 24");
16409
+ svg.setAttribute("aria-hidden", "true");
16410
+ svg.setAttribute("focusable", "false");
16411
+ const stroke = doc.createElementNS(SVG_NS, "path");
16412
+ stroke.setAttribute("d", path2);
16413
+ svg.append(stroke);
16414
+ return svg;
16415
+ }
16392
16416
  function galleryContent(items, initial, options) {
16393
16417
  const doc = items[initial].trigger.ownerDocument;
16394
16418
  const box = doc.createElement("div");
@@ -16405,8 +16429,8 @@ var kuinetic = (() => {
16405
16429
  const previous = doc.createElement("button");
16406
16430
  const next = doc.createElement("button");
16407
16431
  previous.type = next.type = "button";
16408
- previous.textContent = "\u2039";
16409
- next.textContent = "\u203A";
16432
+ previous.append(chevron(doc, "M15 5l-7 7 7 7"));
16433
+ next.append(chevron(doc, "M9 5l7 7-7 7"));
16410
16434
  const { noun, label } = vocabulary(items);
16411
16435
  previous.setAttribute("aria-label", `Previous ${noun}`);
16412
16436
  next.setAttribute("aria-label", `Next ${noun}`);
@@ -16426,7 +16450,11 @@ var kuinetic = (() => {
16426
16450
  players: /* @__PURE__ */ new Map()
16427
16451
  };
16428
16452
  if (items.length > 1) {
16429
- box.append(previous, next, counter);
16453
+ const nav = doc.createElement("div");
16454
+ nav.className = `kui-lightbox-nav kui-lightbox-nav--${options.arrows}`;
16455
+ if (options.arrowGap) nav.style.setProperty("--kui-lightbox-arrow-gap", options.arrowGap);
16456
+ nav.append(previous, next);
16457
+ box.append(nav, counter);
16430
16458
  previous.addEventListener("click", () => clickGallery(state, -1, previous));
16431
16459
  next.addEventListener("click", () => clickGallery(state, 1, next));
16432
16460
  }
@@ -16440,8 +16468,9 @@ var kuinetic = (() => {
16440
16468
  reducedMotion,
16441
16469
  node: box,
16442
16470
  label,
16443
- // The media and the controls keep the viewer open; the empty figure around them closes it.
16444
- inside: (target) => box.contains(target) && target.closest("img, video, iframe, button") !== null,
16471
+ // The media and the controls (the arrow group included, so a click in the gap between the
16472
+ // arrows is not a close) keep the viewer open; the empty figure around them closes it.
16473
+ inside: (target) => box.contains(target) && target.closest("img, video, iframe, button, .kui-lightbox-nav") !== null,
16445
16474
  onClose: () => {
16446
16475
  unswipe?.();
16447
16476
  closeViewer(state);
@@ -16507,7 +16536,9 @@ var kuinetic = (() => {
16507
16536
  ease: DEFAULT_EASE,
16508
16537
  reducedMotion,
16509
16538
  loop: true,
16510
- aspect: ""
16539
+ aspect: "",
16540
+ arrows: "bottom-right",
16541
+ arrowGap: ""
16511
16542
  };
16512
16543
  const turnedAway = (card) => card.getAttribute("data-kui-ring-face") === "back";
16513
16544
  const openAt2 = (pick, faceChecked = false) => {
@@ -16570,7 +16601,13 @@ var kuinetic = (() => {
16570
16601
  };
16571
16602
  const controller = new AbortController();
16572
16603
  const shell = acquireModalShell(ctx.doc);
16573
- const options = { ...modalOptions(params, ctx), loop: params.is("loop"), aspect: params.text("aspect") };
16604
+ const options = {
16605
+ ...modalOptions(params, ctx),
16606
+ loop: params.is("loop"),
16607
+ aspect: params.text("aspect"),
16608
+ arrows: params.text("arrows", "bottom-right"),
16609
+ arrowGap: params.text("arrow-gap")
16610
+ };
16574
16611
  const restore = wireTriggers(triggers, {
16575
16612
  shell,
16576
16613
  options,