@patternmode/aperto 0.1.1 → 0.1.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.
package/dist/index.js CHANGED
@@ -440,11 +440,28 @@ function renderExpandedMedia(item, renderImage, renderVideo) {
440
440
  };
441
441
  return (renderVideo ?? renderDefaultVideo)(videoProps);
442
442
  }
443
- function renderTransitionMedia(item) {
443
+ function renderTransitionMedia(item, renderImage, renderVideo) {
444
444
  if (item.type === "image") {
445
- return /* @__PURE__ */ jsx7("img", { alt: "", src: item.src });
445
+ const imageProps = {
446
+ alt: item.alt,
447
+ height: item.height,
448
+ item,
449
+ src: item.src,
450
+ variant: "expanded",
451
+ width: item.width
452
+ };
453
+ return (renderImage ?? renderDefaultImage)(imageProps);
446
454
  }
447
- return /* @__PURE__ */ jsx7("img", { alt: "", src: item.poster ?? item.thumbnailSrc });
455
+ const videoProps = {
456
+ "aria-label": item.alt ?? item.title ?? "Video",
457
+ height: item.height,
458
+ item,
459
+ poster: item.poster,
460
+ src: item.src,
461
+ variant: "expanded",
462
+ width: item.width
463
+ };
464
+ return (renderVideo ?? renderDefaultVideo)(videoProps);
448
465
  }
449
466
 
450
467
  // src/expanded-media-stage.tsx
@@ -587,6 +604,8 @@ function transitionDurationMs(transition) {
587
604
  }
588
605
  function ApertoMediaTransitionClone({
589
606
  onComplete,
607
+ renderImage,
608
+ renderVideo,
590
609
  transition
591
610
  }) {
592
611
  const ctx = useApertoContext();
@@ -607,6 +626,7 @@ function ApertoMediaTransitionClone({
607
626
  motion4.div,
608
627
  {
609
628
  animate: rectTarget(transition.to),
629
+ "aria-hidden": "true",
610
630
  "data-slot": "aperto-transition-media",
611
631
  initial: rectTarget(transition.from),
612
632
  style: {
@@ -618,7 +638,7 @@ function ApertoMediaTransitionClone({
618
638
  zIndex: 1002
619
639
  },
620
640
  transition: ctx.preset.transition,
621
- children: renderTransitionMedia(transition.item)
641
+ children: renderTransitionMedia(transition.item, renderImage, renderVideo)
622
642
  }
623
643
  );
624
644
  }
@@ -756,6 +776,13 @@ function ApertoGroup({
756
776
  });
757
777
  });
758
778
  }, [activeMedia, closing, index, open]);
779
+ const handleCloseAutoFocus = useCallback3(
780
+ (event) => {
781
+ event.preventDefault();
782
+ thumbnailRefs.current.get(index)?.focus({ preventScroll: true });
783
+ },
784
+ [index]
785
+ );
759
786
  const handleMediaTransitionComplete = useCallback3(() => {
760
787
  if (mediaTransition?.phase === "closing") {
761
788
  setOpen(false);
@@ -833,6 +860,16 @@ function ApertoGroup({
833
860
  },
834
861
  [goToNext, goToPrevious]
835
862
  );
863
+ const expandedMediaStyle = useMemo2(() => {
864
+ if (!activeMedia?.width || !activeMedia.height) {
865
+ return void 0;
866
+ }
867
+ return {
868
+ "--aperto-expanded-aspect-ratio": `${activeMedia.width} / ${activeMedia.height}`,
869
+ "--aperto-expanded-aspect-ratio-height": activeMedia.height,
870
+ "--aperto-expanded-aspect-ratio-width": activeMedia.width
871
+ };
872
+ }, [activeMedia?.height, activeMedia?.width]);
836
873
  return /* @__PURE__ */ jsx10(ApertoGroupContext.Provider, { value, children: /* @__PURE__ */ jsxs(
837
874
  ApertoRoot,
838
875
  {
@@ -849,61 +886,70 @@ function ApertoGroup({
849
886
  {
850
887
  className: classNames?.content,
851
888
  "data-aperto-transition": mediaTransition?.phase,
889
+ onCloseAutoFocus: handleCloseAutoFocus,
852
890
  onKeyDown: hasNavigation ? handleContentKeyDown : void 0,
853
891
  sharedLayoutId: false,
854
892
  ...getDescriptionProps(activeMedia),
855
893
  children: [
856
- /* @__PURE__ */ jsxs("div", { "data-slot": "aperto-media", ref: setExpandedMediaNode, children: [
857
- /* @__PURE__ */ jsx10(
858
- ApertoExpandedMediaStage,
859
- {
860
- direction: navigationDirection,
861
- index,
862
- item: activeMedia,
863
- navigationMotion,
864
- renderImage,
865
- renderVideo
866
- }
867
- ),
868
- hasNavigation ? /* @__PURE__ */ jsxs(Fragment, { children: [
869
- /* @__PURE__ */ jsx10(
870
- "button",
871
- {
872
- "aria-label": "Previous media",
873
- className: classNames?.previousButton,
874
- "data-slot": "aperto-previous-button",
875
- onClick: goToPrevious,
876
- type: "button",
877
- children: /* @__PURE__ */ jsx10(
878
- ChevronLeft,
894
+ /* @__PURE__ */ jsxs(
895
+ "div",
896
+ {
897
+ "data-slot": "aperto-media",
898
+ ref: setExpandedMediaNode,
899
+ style: expandedMediaStyle,
900
+ children: [
901
+ /* @__PURE__ */ jsx10(
902
+ ApertoExpandedMediaStage,
903
+ {
904
+ direction: navigationDirection,
905
+ index,
906
+ item: activeMedia,
907
+ navigationMotion,
908
+ renderImage,
909
+ renderVideo
910
+ }
911
+ ),
912
+ hasNavigation ? /* @__PURE__ */ jsxs(Fragment, { children: [
913
+ /* @__PURE__ */ jsx10(
914
+ "button",
879
915
  {
880
- "aria-hidden": "true",
881
- size: 18,
882
- strokeWidth: 2
916
+ "aria-label": "Previous media",
917
+ className: classNames?.previousButton,
918
+ "data-slot": "aperto-previous-button",
919
+ onClick: goToPrevious,
920
+ type: "button",
921
+ children: /* @__PURE__ */ jsx10(
922
+ ChevronLeft,
923
+ {
924
+ "aria-hidden": "true",
925
+ size: 18,
926
+ strokeWidth: 2
927
+ }
928
+ )
883
929
  }
884
- )
885
- }
886
- ),
887
- /* @__PURE__ */ jsx10(
888
- "button",
889
- {
890
- "aria-label": "Next media",
891
- className: classNames?.nextButton,
892
- "data-slot": "aperto-next-button",
893
- onClick: goToNext,
894
- type: "button",
895
- children: /* @__PURE__ */ jsx10(
896
- ChevronRight,
930
+ ),
931
+ /* @__PURE__ */ jsx10(
932
+ "button",
897
933
  {
898
- "aria-hidden": "true",
899
- size: 18,
900
- strokeWidth: 2
934
+ "aria-label": "Next media",
935
+ className: classNames?.nextButton,
936
+ "data-slot": "aperto-next-button",
937
+ onClick: goToNext,
938
+ type: "button",
939
+ children: /* @__PURE__ */ jsx10(
940
+ ChevronRight,
941
+ {
942
+ "aria-hidden": "true",
943
+ size: 18,
944
+ strokeWidth: 2
945
+ }
946
+ )
901
947
  }
902
948
  )
903
- }
904
- )
905
- ] }) : null
906
- ] }),
949
+ ] }) : null
950
+ ]
951
+ }
952
+ ),
907
953
  /* @__PURE__ */ jsx10(ApertoTitle, { children: activeMedia.title ?? getMediaLabel(activeMedia) }),
908
954
  activeMedia.description ? /* @__PURE__ */ jsx10(ApertoDescription, { children: activeMedia.description }) : null,
909
955
  hasNavigation ? /* @__PURE__ */ jsxs("div", { className: classNames?.counter, "data-slot": "aperto-counter", children: [
@@ -929,6 +975,8 @@ function ApertoGroup({
929
975
  ApertoMediaTransitionClone,
930
976
  {
931
977
  onComplete: handleMediaTransitionComplete,
978
+ renderImage,
979
+ renderVideo,
932
980
  transition: mediaTransition
933
981
  }
934
982
  )
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/Aperto/ApertoGroup.tsx","../src/aperto-content.tsx","../src/context.ts","../src/physics.ts","../src/motion-tokens.ts","../src/presets.ts","../src/aperto-description.tsx","../src/aperto-group-context.ts","../src/aperto-overlay.tsx","../src/aperto-portal.tsx","../src/aperto-root.tsx","../src/aperto-title.tsx","../src/expanded-media-stage.tsx","../src/media-rendering.tsx","../src/media-transition.tsx","../src/Aperto/ApertoKeyboard.ts","../src/aperto-close.tsx","../src/aperto-trigger.tsx","../src/Aperto/ApertoSingle.tsx","../src/Aperto/ApertoThumbnail.tsx","../src/index.ts"],"sourcesContent":["\"use client\";\n\nimport { ChevronLeft, ChevronRight, X } from \"lucide-react\";\nimport {\n\ttype KeyboardEvent,\n\tuseCallback,\n\tuseId,\n\tuseLayoutEffect,\n\tuseMemo,\n\tuseRef,\n\tuseState,\n} from \"react\";\nimport { flushSync } from \"react-dom\";\n\nimport { ApertoContent } from \"../aperto-content\";\nimport { ApertoDescription } from \"../aperto-description\";\nimport { ApertoGroupContext } from \"../aperto-group-context\";\nimport { ApertoOverlay } from \"../aperto-overlay\";\nimport { ApertoPortal } from \"../aperto-portal\";\nimport { ApertoRoot } from \"../aperto-root\";\nimport { ApertoTitle } from \"../aperto-title\";\nimport {\n\tApertoExpandedMediaStage,\n\ttype NavigationDirection,\n} from \"../expanded-media-stage\";\nimport { getDescriptionProps, getMediaLabel } from \"../media-rendering\";\nimport {\n\ttype ApertoMediaTransition,\n\tApertoMediaTransitionClone,\n\trectFromElement,\n} from \"../media-transition\";\nimport { shouldIgnoreKeyboardNavigationTarget } from \"./ApertoKeyboard\";\nimport type { ApertoGroupProps } from \"./ApertoTypes\";\n\nexport function ApertoGroup({\n\tchildren,\n\tclassNames,\n\tdismissible,\n\tindex: controlledIndex,\n\tinitialIndex = 0,\n\tmedia,\n\tmotion: motionProp,\n\tnavigationMotion = \"glide\",\n\tonIndexChange,\n\trenderImage,\n\trenderVideo,\n}: ApertoGroupProps) {\n\tconst generatedId = useId();\n\tconst [internalIndex, setInternalIndex] = useState(initialIndex);\n\tconst [open, setOpen] = useState(false);\n\tconst [closing, setClosing] = useState(false);\n\tconst [mediaTransition, setMediaTransition] =\n\t\tuseState<ApertoMediaTransition | null>(null);\n\tconst [navigationDirection, setNavigationDirection] =\n\t\tuseState<NavigationDirection>(0);\n\tconst isControlled = controlledIndex !== undefined;\n\tconst index = isControlled ? controlledIndex : internalIndex;\n\tconst activeMedia = media[index] ?? media[0];\n\tconst [layoutSourceIndex, setLayoutSourceIndex] = useState(index);\n\tconst expandedMediaRef = useRef<HTMLDivElement | null>(null);\n\tconst thumbnailRefs = useRef(new Map<number, HTMLButtonElement>());\n\tconst sharedLayoutIdForIndex = useCallback(\n\t\t(nextIndex: number) => `aperto-group-${generatedId}-${nextIndex}-shared`,\n\t\t[generatedId],\n\t);\n\tconst sharedLayoutId = sharedLayoutIdForIndex(layoutSourceIndex);\n\tconst measureOpeningTarget = useCallback((node: HTMLDivElement) => {\n\t\tconst targetRect = rectFromElement(node);\n\t\tif (!targetRect) {\n\t\t\treturn;\n\t\t}\n\n\t\tsetMediaTransition((current) => {\n\t\t\tif (current?.phase !== \"opening\" || current.to) {\n\t\t\t\treturn current;\n\t\t\t}\n\t\t\treturn { ...current, to: targetRect };\n\t\t});\n\t}, []);\n\tconst setExpandedMediaNode = useCallback(\n\t\t(node: HTMLDivElement | null) => {\n\t\t\texpandedMediaRef.current = node;\n\t\t\tif (node) {\n\t\t\t\tmeasureOpeningTarget(node);\n\t\t\t}\n\t\t},\n\t\t[measureOpeningTarget],\n\t);\n\n\tconst registerThumbnail = useCallback(\n\t\t(thumbIndex: number, node: HTMLButtonElement | null) => {\n\t\t\tif (node) {\n\t\t\t\tthumbnailRefs.current.set(thumbIndex, node);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthumbnailRefs.current.delete(thumbIndex);\n\t\t},\n\t\t[],\n\t);\n\n\tuseLayoutEffect(() => {\n\t\tif (\n\t\t\tmediaTransition?.phase !== \"opening\" ||\n\t\t\tmediaTransition.to ||\n\t\t\t!expandedMediaRef.current\n\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\tmeasureOpeningTarget(expandedMediaRef.current);\n\t}, [measureOpeningTarget, mediaTransition]);\n\n\tconst setIndex = useCallback(\n\t\t(nextIndex: number) => {\n\t\t\tif (!isControlled) {\n\t\t\t\tsetInternalIndex(nextIndex);\n\t\t\t}\n\t\t\tonIndexChange?.(nextIndex);\n\t\t},\n\t\t[isControlled, onIndexChange],\n\t);\n\n\tconst openAtIndex = useCallback(\n\t\t(thumbIndex: number) => {\n\t\t\tconst sourceRect = rectFromElement(\n\t\t\t\tthumbnailRefs.current.get(thumbIndex) ?? null,\n\t\t\t);\n\t\t\tconst item = media[thumbIndex];\n\n\t\t\tflushSync(() => {\n\t\t\t\tsetClosing(false);\n\t\t\t\tsetMediaTransition(\n\t\t\t\t\tsourceRect && item\n\t\t\t\t\t\t? { from: sourceRect, item, phase: \"opening\" }\n\t\t\t\t\t\t: null,\n\t\t\t\t);\n\t\t\t\tsetNavigationDirection(0);\n\t\t\t\tsetLayoutSourceIndex(thumbIndex);\n\t\t\t\tsetIndex(thumbIndex);\n\t\t\t\tsetOpen(true);\n\t\t\t});\n\t\t},\n\t\t[media, setIndex],\n\t);\n\n\tconst startClose = useCallback(() => {\n\t\tif (!open || closing) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst sourceRect = rectFromElement(expandedMediaRef.current);\n\t\tconst targetRect = rectFromElement(\n\t\t\tthumbnailRefs.current.get(index) ?? null,\n\t\t);\n\n\t\tif (!activeMedia || !sourceRect || !targetRect) {\n\t\t\tsetMediaTransition(null);\n\t\t\tsetClosing(false);\n\t\t\tsetOpen(false);\n\t\t\treturn;\n\t\t}\n\n\t\tflushSync(() => {\n\t\t\tsetClosing(true);\n\t\t\tsetMediaTransition({\n\t\t\t\tfrom: sourceRect,\n\t\t\t\titem: activeMedia,\n\t\t\t\tphase: \"closing\",\n\t\t\t\tto: targetRect,\n\t\t\t});\n\t\t});\n\t}, [activeMedia, closing, index, open]);\n\n\tconst handleMediaTransitionComplete = useCallback(() => {\n\t\tif (mediaTransition?.phase === \"closing\") {\n\t\t\tsetOpen(false);\n\t\t\tsetClosing(false);\n\t\t}\n\t\tsetMediaTransition(null);\n\t}, [mediaTransition?.phase]);\n\n\tconst handleOpenChange = useCallback(\n\t\t(nextOpen: boolean) => {\n\t\t\tif (nextOpen) {\n\t\t\t\tsetClosing(false);\n\t\t\t\tsetOpen(true);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tstartClose();\n\t\t},\n\t\t[startClose],\n\t);\n\n\tconst value = useMemo(\n\t\t() => ({\n\t\t\tclassNames,\n\t\t\tindex,\n\t\t\tmedia,\n\t\t\topen,\n\t\t\topenAtIndex,\n\t\t\tregisterThumbnail,\n\t\t\trenderImage,\n\t\t\trenderVideo,\n\t\t\tsetIndex,\n\t\t\tsharedLayoutId,\n\t\t\tsharedLayoutIdForIndex,\n\t\t}),\n\t\t[\n\t\t\tclassNames,\n\t\t\tindex,\n\t\t\tmedia,\n\t\t\topen,\n\t\t\topenAtIndex,\n\t\t\tregisterThumbnail,\n\t\t\trenderImage,\n\t\t\trenderVideo,\n\t\t\tsetIndex,\n\t\t\tsharedLayoutId,\n\t\t\tsharedLayoutIdForIndex,\n\t\t],\n\t);\n\tconst hasNavigation = media.length > 1;\n\tconst navigateToIndex = useCallback(\n\t\t(nextIndex: number, direction: NavigationDirection) => {\n\t\t\tsetNavigationDirection(direction);\n\t\t\tsetLayoutSourceIndex(nextIndex);\n\t\t\tsetIndex(nextIndex);\n\t\t},\n\t\t[setIndex],\n\t);\n\tconst goToPrevious = useCallback(() => {\n\t\tnavigateToIndex((index - 1 + media.length) % media.length, -1);\n\t}, [index, media.length, navigateToIndex]);\n\tconst goToNext = useCallback(() => {\n\t\tnavigateToIndex((index + 1) % media.length, 1);\n\t}, [index, media.length, navigateToIndex]);\n\tconst handleContentKeyDown = useCallback(\n\t\t(event: KeyboardEvent<HTMLDivElement>) => {\n\t\t\tif (\n\t\t\t\tevent.defaultPrevented ||\n\t\t\t\tevent.altKey ||\n\t\t\t\tevent.ctrlKey ||\n\t\t\t\tevent.metaKey ||\n\t\t\t\tshouldIgnoreKeyboardNavigationTarget(event.target)\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (event.key === \"ArrowLeft\") {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tgoToPrevious();\n\t\t\t}\n\n\t\t\tif (event.key === \"ArrowRight\") {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tgoToNext();\n\t\t\t}\n\t\t},\n\t\t[goToNext, goToPrevious],\n\t);\n\n\treturn (\n\t\t<ApertoGroupContext.Provider value={value}>\n\t\t\t<ApertoRoot\n\t\t\t\tdismissible={dismissible}\n\t\t\t\tmotion={motionProp}\n\t\t\t\tonOpenChange={handleOpenChange}\n\t\t\t\topen={open}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t\t{activeMedia ? (\n\t\t\t\t\t<ApertoPortal>\n\t\t\t\t\t\t<ApertoOverlay className={classNames?.overlay} fadeOut={closing} />\n\t\t\t\t\t\t<ApertoContent\n\t\t\t\t\t\t\tclassName={classNames?.content}\n\t\t\t\t\t\t\tdata-aperto-transition={mediaTransition?.phase}\n\t\t\t\t\t\t\tonKeyDown={hasNavigation ? handleContentKeyDown : undefined}\n\t\t\t\t\t\t\tsharedLayoutId={false}\n\t\t\t\t\t\t\t{...getDescriptionProps(activeMedia)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div data-slot=\"aperto-media\" ref={setExpandedMediaNode}>\n\t\t\t\t\t\t\t\t<ApertoExpandedMediaStage\n\t\t\t\t\t\t\t\t\tdirection={navigationDirection}\n\t\t\t\t\t\t\t\t\tindex={index}\n\t\t\t\t\t\t\t\t\titem={activeMedia}\n\t\t\t\t\t\t\t\t\tnavigationMotion={navigationMotion}\n\t\t\t\t\t\t\t\t\trenderImage={renderImage}\n\t\t\t\t\t\t\t\t\trenderVideo={renderVideo}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t{hasNavigation ? (\n\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\taria-label=\"Previous media\"\n\t\t\t\t\t\t\t\t\t\t\tclassName={classNames?.previousButton}\n\t\t\t\t\t\t\t\t\t\t\tdata-slot=\"aperto-previous-button\"\n\t\t\t\t\t\t\t\t\t\t\tonClick={goToPrevious}\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<ChevronLeft\n\t\t\t\t\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\t\t\t\t\tsize={18}\n\t\t\t\t\t\t\t\t\t\t\t\tstrokeWidth={2}\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\taria-label=\"Next media\"\n\t\t\t\t\t\t\t\t\t\t\tclassName={classNames?.nextButton}\n\t\t\t\t\t\t\t\t\t\t\tdata-slot=\"aperto-next-button\"\n\t\t\t\t\t\t\t\t\t\t\tonClick={goToNext}\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<ChevronRight\n\t\t\t\t\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\t\t\t\t\tsize={18}\n\t\t\t\t\t\t\t\t\t\t\t\tstrokeWidth={2}\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<ApertoTitle>\n\t\t\t\t\t\t\t\t{activeMedia.title ?? getMediaLabel(activeMedia)}\n\t\t\t\t\t\t\t</ApertoTitle>\n\t\t\t\t\t\t\t{activeMedia.description ? (\n\t\t\t\t\t\t\t\t<ApertoDescription>{activeMedia.description}</ApertoDescription>\n\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t{hasNavigation ? (\n\t\t\t\t\t\t\t\t<div className={classNames?.counter} data-slot=\"aperto-counter\">\n\t\t\t\t\t\t\t\t\t{index + 1} / {media.length}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\taria-label=\"Close\"\n\t\t\t\t\t\t\t\tclassName={classNames?.closeButton}\n\t\t\t\t\t\t\t\tdata-slot=\"aperto-close\"\n\t\t\t\t\t\t\t\tonClick={startClose}\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<X aria-hidden=\"true\" size={17} strokeWidth={2} />\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</ApertoContent>\n\t\t\t\t\t\t<ApertoMediaTransitionClone\n\t\t\t\t\t\t\tonComplete={handleMediaTransitionComplete}\n\t\t\t\t\t\t\ttransition={mediaTransition}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</ApertoPortal>\n\t\t\t\t) : null}\n\t\t\t</ApertoRoot>\n\t\t</ApertoGroupContext.Provider>\n\t);\n}\n","\"use client\";\n\nimport * as Dialog from \"@radix-ui/react-dialog\";\nimport {\n\ttype MotionStyle,\n\tmotion,\n\ttype PanInfo,\n\tuseMotionValue,\n\tuseSpring,\n\tuseTransform,\n} from \"motion/react\";\nimport {\n\ttype ComponentPropsWithoutRef,\n\tforwardRef,\n\tuseCallback,\n\tuseMemo,\n\tuseState,\n} from \"react\";\n\nimport { useApertoContext } from \"./context\";\nimport {\n\tcalculateResistance,\n\tDEFAULT_DISTANCE_THRESHOLD,\n\tDEFAULT_VELOCITY_THRESHOLD,\n\tOPACITY_INPUT,\n\tOPACITY_OUTPUT,\n\tSCALE_INPUT,\n\tSCALE_OUTPUT,\n} from \"./physics\";\nimport { getDragSpring, resolvePreset } from \"./presets\";\nimport type { DismissibleConfig, MotionPresetName } from \"./types\";\n\nexport interface ApertoContentProps\n\textends Omit<\n\t\tComponentPropsWithoutRef<typeof Dialog.Content>,\n\t\t\"asChild\" | \"forceMount\"\n\t> {\n\t/** Motion preset override for this content panel, independent of the root preset. */\n\tmotion?: MotionPresetName;\n\t/** Built-in positioning strategy. Use \"none\" for custom primitive compositions. */\n\tplacement?: \"center\" | \"none\";\n\t/** Internal shared layout ID override for grouped media. */\n\tsharedLayoutId?: string | false;\n}\n\nconst ApertoContent = forwardRef<HTMLDivElement, ApertoContentProps>(\n\t(\n\t\t{\n\t\t\tchildren,\n\t\t\tclassName,\n\t\t\tmotion: motionOverride,\n\t\t\tplacement = \"center\",\n\t\t\tsharedLayoutId,\n\t\t\tstyle,\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst ctx = useApertoContext();\n\t\tconst [isDragging, setIsDragging] = useState(false);\n\t\tconst resolved = resolvePreset(\n\t\t\t\"content\",\n\t\t\tmotionOverride,\n\t\t\tctx.presetName,\n\t\t\tctx.variants,\n\t\t\tctx.reduceMotion,\n\t\t);\n\n\t\tconst contentLayoutId =\n\t\t\tsharedLayoutId === false\n\t\t\t\t? undefined\n\t\t\t\t: (sharedLayoutId ?? `${ctx.layoutId}-shared`);\n\n\t\tconst dragSpring = getDragSpring(resolved);\n\t\tconst isDismissible = ctx.dismissible !== false;\n\n\t\tconst dismissConfig: DismissibleConfig =\n\t\t\ttypeof ctx.dismissible === \"object\" ? ctx.dismissible : {};\n\t\tconst distanceThreshold =\n\t\t\tdismissConfig.threshold ?? DEFAULT_DISTANCE_THRESHOLD;\n\t\tconst velocityThreshold =\n\t\t\tdismissConfig.velocity ?? DEFAULT_VELOCITY_THRESHOLD;\n\n\t\tconst dragX = useMotionValue(0);\n\t\tconst dragY = useMotionValue(0);\n\t\tconst springX = useSpring(dragX, dragSpring);\n\t\tconst springY = useSpring(dragY, dragSpring);\n\n\t\tconst distance = useTransform(() =>\n\t\t\tMath.hypot(springX.get(), springY.get()),\n\t\t);\n\t\tconst scaleMotion = useTransform(distance, SCALE_INPUT, SCALE_OUTPUT);\n\t\tconst opacityMotion = useTransform(distance, OPACITY_INPUT, OPACITY_OUTPUT);\n\t\tconst resistance = useTransform(distance, calculateResistance);\n\n\t\tconst handleDrag = useCallback(\n\t\t\t(_event: MouseEvent | TouchEvent | PointerEvent, info: PanInfo) => {\n\t\t\t\tif (!isDragging) {\n\t\t\t\t\tsetIsDragging(true);\n\t\t\t\t}\n\t\t\t\tconst r = resistance.get();\n\t\t\t\tdragX.set(info.offset.x * r);\n\t\t\t\tdragY.set(info.offset.y * r);\n\t\t\t},\n\t\t\t[dragX, dragY, isDragging, resistance],\n\t\t);\n\n\t\tconst handleDragEnd = useCallback(\n\t\t\t(_event: MouseEvent | TouchEvent | PointerEvent, info: PanInfo) => {\n\t\t\t\tsetIsDragging(false);\n\t\t\t\tconst speed = Math.hypot(info.velocity.x, info.velocity.y);\n\t\t\t\tconst dist = Math.hypot(info.offset.x, info.offset.y);\n\n\t\t\t\tif (speed > velocityThreshold || dist > distanceThreshold) {\n\t\t\t\t\tctx.onOpenChange(false);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tdragX.set(0);\n\t\t\t\tdragY.set(0);\n\t\t\t},\n\t\t\t[ctx.onOpenChange, distanceThreshold, dragX, dragY, velocityThreshold],\n\t\t);\n\n\t\tconst motionStyle = useMemo(\n\t\t\t(): MotionStyle => ({\n\t\t\t\tcursor: isDragging ? \"grabbing\" : isDismissible ? \"grab\" : undefined,\n\t\t\t\topacity: opacityMotion,\n\t\t\t\tscale: scaleMotion,\n\t\t\t\tx: springX,\n\t\t\t\ty: springY,\n\t\t\t\t...(placement === \"center\"\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tleft: \"50%\",\n\t\t\t\t\t\t\ttop: \"50%\",\n\t\t\t\t\t\t\ttranslate: \"-50% -50%\",\n\t\t\t\t\t\t}\n\t\t\t\t\t: {}),\n\t\t\t\t...style,\n\t\t\t}),\n\t\t\t[\n\t\t\t\tisDismissible,\n\t\t\t\tisDragging,\n\t\t\t\topacityMotion,\n\t\t\t\tplacement,\n\t\t\t\tscaleMotion,\n\t\t\t\tspringX,\n\t\t\t\tspringY,\n\t\t\t\tstyle,\n\t\t\t],\n\t\t);\n\n\t\treturn (\n\t\t\t<Dialog.Content asChild forceMount {...props}>\n\t\t\t\t<motion.div\n\t\t\t\t\tclassName={className}\n\t\t\t\t\tdata-slot=\"aperto-content\"\n\t\t\t\t\tdrag={isDismissible}\n\t\t\t\t\tdragConstraints={{ bottom: 0, left: 0, right: 0, top: 0 }}\n\t\t\t\t\tdragElastic={0}\n\t\t\t\t\tdragMomentum={false}\n\t\t\t\t\tdragSnapToOrigin\n\t\t\t\t\tlayout={contentLayoutId ? true : undefined}\n\t\t\t\t\tlayoutId={contentLayoutId}\n\t\t\t\t\tonDrag={isDismissible ? handleDrag : undefined}\n\t\t\t\t\tonDragEnd={isDismissible ? handleDragEnd : undefined}\n\t\t\t\t\tref={ref}\n\t\t\t\t\tstyle={motionStyle}\n\t\t\t\t\ttransition={resolved.transition}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</motion.div>\n\t\t\t</Dialog.Content>\n\t\t);\n\t},\n);\n\nApertoContent.displayName = \"ApertoContent\";\n\nexport { ApertoContent };\n","\"use client\";\n\nimport { createContext, useContext } from \"react\";\nimport type { ApertoContextValue } from \"./types\";\n\nexport const ApertoContext = createContext<ApertoContextValue | null>(null);\n\nexport function useApertoContext(): ApertoContextValue {\n\tconst ctx = useContext(ApertoContext);\n\tif (!ctx) {\n\t\tthrow new Error(\"Aperto components must be used within <Aperto.Root>\");\n\t}\n\treturn ctx;\n}\n","/**\n * Drag physics utilities.\n *\n * The logarithmic resistance function creates a rubber-band feel:\n * initial movement is free, but gets progressively harder the further\n * you drag. Combined with spring-smoothed motion values, this produces\n * a natural, elastic gesture.\n */\n\nconst RESISTANCE_DIVISOR = 20;\nconst RESISTANCE_SCALE = 4;\nconst RESISTANCE_MIN = 0.1;\n\n/**\n * Logarithmic resistance — decelerates drag progressively.\n * Returns a multiplier between RESISTANCE_MIN and 1.0.\n *\n * At distance 0: returns 1.0 (full movement)\n * At distance 50: returns ~0.77\n * At distance 100: returns ~0.58\n * At distance 200: returns ~0.42\n */\nexport function calculateResistance(distance: number): number {\n\treturn Math.max(\n\t\tRESISTANCE_MIN,\n\t\t1 - Math.log(distance / RESISTANCE_DIVISOR + 1) / RESISTANCE_SCALE,\n\t);\n}\n\n/** Scale mapping: distance → visual scale (1.0 → 0.95) */\nexport const SCALE_INPUT = [0, 50, 100];\nexport const SCALE_OUTPUT = [1, 0.98, 0.95];\n\n/** Opacity mapping: distance → visual opacity (1.0 → 0.96) */\nexport const OPACITY_INPUT = [0, 80];\nexport const OPACITY_OUTPUT = [1, 0.96];\n\n/** Default dismissal thresholds */\nexport const DEFAULT_DISTANCE_THRESHOLD = 100;\nexport const DEFAULT_VELOCITY_THRESHOLD = 500;\n","import type { Easing } from \"motion/react\";\n\nexport const durations = {\n\tsnappy: 0.22,\n\tmoderate: 0.4,\n} as const;\n\nexport const easings = {\n\tcustomGentle: [0.25, 0.1, 0.12, 1],\n\tsnappy: [0.22, 1, 0.36, 1],\n} satisfies Record<string, Easing>;\n\nexport const springs = {\n\tbouncy: { stiffness: 260, damping: 12, mass: 1 },\n\tnatural: { stiffness: 200, damping: 20, mass: 1 },\n\tsnappy: { stiffness: 400, damping: 28, mass: 0.8 },\n\tstiff: { stiffness: 500, damping: 30, mass: 1 },\n} as const;\n","import { durations, easings, springs } from \"./motion-tokens\";\nimport type {\n\tDragSpringConfig,\n\tMotionPreset,\n\tMotionPresetName,\n\tMotionVariants,\n} from \"./types\";\n\n/**\n * Motion presets — each bundles transition timing AND drag physics\n * so \"snappy\" feels snappy everywhere: open, close, and drag.\n *\n * Curves and springs are local copies of the Howells motion tokens so the\n * published package has no private workspace runtime dependencies.\n */\nexport const PRESETS: Record<MotionPresetName, MotionPreset> = {\n\tsnappy: {\n\t\ttransition: { ease: easings.snappy, duration: durations.snappy },\n\t\tdrag: {\n\t\t\tstiffness: springs.stiff.stiffness,\n\t\t\tdamping: springs.stiff.damping,\n\t\t\trestDelta: 0.01,\n\t\t},\n\t},\n\tsmooth: {\n\t\ttransition: { ease: easings.customGentle, duration: durations.moderate },\n\t\tdrag: {\n\t\t\tstiffness: springs.natural.stiffness,\n\t\t\tdamping: springs.natural.damping,\n\t\t\trestDelta: 0.01,\n\t\t},\n\t},\n\tbouncy: {\n\t\ttransition: {\n\t\t\ttype: \"spring\",\n\t\t\tstiffness: springs.bouncy.stiffness,\n\t\t\tdamping: springs.bouncy.damping,\n\t\t\tmass: springs.bouncy.mass,\n\t\t},\n\t\tdrag: {\n\t\t\tstiffness: springs.snappy.stiffness,\n\t\t\tdamping: springs.snappy.damping,\n\t\t\trestDelta: 0.01,\n\t\t},\n\t},\n\treduced: {\n\t\ttransition: { ease: \"linear\", duration: 0.01 },\n\t\tdrag: { stiffness: 1000, damping: 50, restDelta: 0.1 },\n\t},\n};\n\ntype ComponentType = \"trigger\" | \"content\" | \"backdrop\";\n\n/**\n * Three-level motion resolution:\n * 1. Component-level override (highest)\n * 2. Per-component variant from Root\n * 3. Global preset from Root (lowest)\n *\n * If `prefers-reduced-motion` is active, always returns \"reduced\".\n */\nexport function resolvePreset(\n\tcomponentType: ComponentType,\n\tcomponentMotion: MotionPresetName | undefined,\n\tglobalPreset: MotionPresetName,\n\tvariants: MotionVariants | undefined,\n\treduceMotion: boolean,\n): MotionPreset {\n\tif (reduceMotion) {\n\t\treturn PRESETS.reduced;\n\t}\n\n\t// 1. Component-level override\n\tif (componentMotion) {\n\t\treturn PRESETS[componentMotion];\n\t}\n\n\t// 2. Per-component variant\n\tif (variants?.[componentType]) {\n\t\treturn PRESETS[variants[componentType]];\n\t}\n\n\t// 3. Global preset\n\treturn PRESETS[globalPreset];\n}\n\n/** Extract the drag spring config from a preset */\nexport function getDragSpring(preset: MotionPreset): DragSpringConfig {\n\treturn preset.drag;\n}\n","\"use client\";\n\nimport * as Dialog from \"@radix-ui/react-dialog\";\nimport { type ComponentPropsWithoutRef, forwardRef } from \"react\";\n\nconst ApertoDescription = forwardRef<\n\tHTMLParagraphElement,\n\tComponentPropsWithoutRef<typeof Dialog.Description>\n>((props, ref) => {\n\treturn (\n\t\t<Dialog.Description data-slot=\"aperto-description\" ref={ref} {...props} />\n\t);\n});\n\nApertoDescription.displayName = \"ApertoDescription\";\n\nexport { ApertoDescription };\n","import { createContext, useContext } from \"react\";\nimport type {\n\tApertoClassNames,\n\tApertoMediaItem,\n\tRenderImage,\n\tRenderVideo,\n} from \"./types\";\n\nexport interface ApertoGroupContextValue {\n\tclassNames?: ApertoClassNames;\n\tindex: number;\n\tmedia: ApertoMediaItem[];\n\topen: boolean;\n\topenAtIndex: (index: number) => void;\n\tregisterThumbnail: (index: number, node: HTMLButtonElement | null) => void;\n\trenderImage?: RenderImage;\n\trenderVideo?: RenderVideo;\n\tsetIndex: (index: number) => void;\n\tsharedLayoutId: string;\n\tsharedLayoutIdForIndex: (index: number) => string;\n}\n\nexport const ApertoGroupContext = createContext<ApertoGroupContextValue | null>(\n\tnull,\n);\n\nexport function useApertoGroup(): ApertoGroupContextValue {\n\tconst ctx = useContext(ApertoGroupContext);\n\tif (!ctx) {\n\t\tthrow new Error(\"Aperto.Thumbnail must be used within <Aperto.Group>\");\n\t}\n\treturn ctx;\n}\n","\"use client\";\n\nimport * as Dialog from \"@radix-ui/react-dialog\";\nimport { motion, type Transition } from \"motion/react\";\nimport { forwardRef } from \"react\";\n\nimport { useApertoContext } from \"./context\";\nimport { easings } from \"./motion-tokens\";\n\nexport interface ApertoOverlayProps {\n\tclassName?: string;\n\t/** Internal flag used to fade the overlay during measured close transitions. */\n\tfadeOut?: boolean;\n\tstyle?: React.CSSProperties;\n}\n\n/** Overlay always fades gently regardless of the content's motion preset. */\nconst OVERLAY_TRANSITION: Transition = {\n\tduration: 0.3,\n\tease: easings.customGentle,\n};\n\nconst OVERLAY_TRANSITION_REDUCED: Transition = {\n\tduration: 0.01,\n\tease: \"linear\",\n};\n\nconst ApertoOverlay = forwardRef<HTMLDivElement, ApertoOverlayProps>(\n\t({ className, fadeOut, style }, ref) => {\n\t\tconst ctx = useApertoContext();\n\t\tconst transition = ctx.reduceMotion\n\t\t\t? OVERLAY_TRANSITION_REDUCED\n\t\t\t: OVERLAY_TRANSITION;\n\n\t\treturn (\n\t\t\t<Dialog.Overlay asChild forceMount>\n\t\t\t\t<motion.div\n\t\t\t\t\tanimate={{ opacity: fadeOut ? 0 : 1 }}\n\t\t\t\t\tclassName={className}\n\t\t\t\t\tdata-slot=\"aperto-overlay\"\n\t\t\t\t\texit={{ opacity: 0 }}\n\t\t\t\t\tinitial={{ opacity: 0 }}\n\t\t\t\t\tref={ref}\n\t\t\t\t\tstyle={style}\n\t\t\t\t\ttransition={transition}\n\t\t\t\t/>\n\t\t\t</Dialog.Overlay>\n\t\t);\n\t},\n);\n\nApertoOverlay.displayName = \"ApertoOverlay\";\n\nexport { ApertoOverlay };\n","\"use client\";\n\nimport * as Dialog from \"@radix-ui/react-dialog\";\nimport { AnimatePresence } from \"motion/react\";\nimport type { ReactNode } from \"react\";\n\nimport { useApertoContext } from \"./context\";\n\nexport interface ApertoPortalProps {\n\tchildren: ReactNode;\n\t/** Container element for the portal (default: document.body) */\n\tcontainer?: HTMLElement;\n}\n\nfunction ApertoPortal({ children, container }: ApertoPortalProps) {\n\tconst { open } = useApertoContext();\n\n\treturn (\n\t\t<AnimatePresence>\n\t\t\t{open && (\n\t\t\t\t<Dialog.Portal container={container} forceMount>\n\t\t\t\t\t{children}\n\t\t\t\t</Dialog.Portal>\n\t\t\t)}\n\t\t</AnimatePresence>\n\t);\n}\n\nexport { ApertoPortal };\n","\"use client\";\n\nimport * as Dialog from \"@radix-ui/react-dialog\";\nimport { LayoutGroup, useReducedMotion } from \"motion/react\";\nimport {\n\ttype ComponentPropsWithoutRef,\n\ttype ReactNode,\n\tuseCallback,\n\tuseId,\n\tuseState,\n} from \"react\";\n\nimport { ApertoContext } from \"./context\";\nimport { PRESETS } from \"./presets\";\nimport type {\n\tDismissibleConfig,\n\tMotionPresetName,\n\tMotionVariants,\n} from \"./types\";\n\nexport interface ApertoRootProps\n\textends Omit<\n\t\tComponentPropsWithoutRef<typeof Dialog.Root>,\n\t\t\"open\" | \"onOpenChange\"\n\t> {\n\tchildren: ReactNode;\n\t/** Whether dragging can dismiss the content (default: true) */\n\tdismissible?: boolean | DismissibleConfig;\n\t/** Layout ID for shared element transition (auto-generated if omitted) */\n\tlayoutId?: string;\n\t/** Motion preset or per-component variants */\n\tmotion?: MotionPresetName | MotionVariants;\n\t/** Controlled open state */\n\topen?: boolean;\n\t/** Callback when open state changes */\n\tonOpenChange?: (open: boolean) => void;\n\t/** Force reduced motion regardless of system preference */\n\treduceMotion?: boolean;\n}\n\nfunction ApertoRoot({\n\tchildren,\n\tdismissible = true,\n\tlayoutId: layoutIdProp,\n\tmotion: motionProp = \"smooth\",\n\topen: controlledOpen,\n\tonOpenChange: controlledOnOpenChange,\n\treduceMotion: reduceMotionProp,\n\t...dialogProps\n}: ApertoRootProps) {\n\tconst generatedId = useId();\n\tconst layoutId = layoutIdProp ?? `aperto-${generatedId}`;\n\tconst systemReducedMotion = useReducedMotion() ?? false;\n\tconst shouldReduce = reduceMotionProp ?? systemReducedMotion;\n\n\t// Uncontrolled state fallback\n\tconst [internalOpen, setInternalOpen] = useState(false);\n\tconst isControlled = controlledOpen !== undefined;\n\tconst open = isControlled ? controlledOpen : internalOpen;\n\n\tconst onOpenChange = useCallback(\n\t\t(nextOpen: boolean) => {\n\t\t\tif (!isControlled) {\n\t\t\t\tsetInternalOpen(nextOpen);\n\t\t\t}\n\t\t\tcontrolledOnOpenChange?.(nextOpen);\n\t\t},\n\t\t[isControlled, controlledOnOpenChange],\n\t);\n\n\t// Resolve global preset name\n\tconst globalPresetName: MotionPresetName =\n\t\ttypeof motionProp === \"string\" ? motionProp : \"smooth\";\n\tconst variants: MotionVariants | undefined =\n\t\ttypeof motionProp === \"object\" ? motionProp : undefined;\n\n\tconst presetName: MotionPresetName = shouldReduce\n\t\t? \"reduced\"\n\t\t: globalPresetName;\n\tconst preset = PRESETS[presetName];\n\n\treturn (\n\t\t<ApertoContext.Provider\n\t\t\tvalue={{\n\t\t\t\tdismissible,\n\t\t\t\tlayoutId,\n\t\t\t\tonOpenChange,\n\t\t\t\topen,\n\t\t\t\tpreset,\n\t\t\t\tpresetName,\n\t\t\t\treduceMotion: shouldReduce,\n\t\t\t\tvariants,\n\t\t\t}}\n\t\t>\n\t\t\t<Dialog.Root onOpenChange={onOpenChange} open={open} {...dialogProps}>\n\t\t\t\t<LayoutGroup id={layoutId}>{children}</LayoutGroup>\n\t\t\t</Dialog.Root>\n\t\t</ApertoContext.Provider>\n\t);\n}\n\nexport { ApertoRoot };\n","\"use client\";\n\nimport * as Dialog from \"@radix-ui/react-dialog\";\nimport { type ComponentPropsWithoutRef, forwardRef } from \"react\";\n\nconst ApertoTitle = forwardRef<\n\tHTMLHeadingElement,\n\tComponentPropsWithoutRef<typeof Dialog.Title>\n>((props, ref) => {\n\treturn <Dialog.Title data-slot=\"aperto-title\" ref={ref} {...props} />;\n});\n\nApertoTitle.displayName = \"ApertoTitle\";\n\nexport { ApertoTitle };\n","import {\n\tAnimatePresence,\n\tmotion,\n\ttype TargetAndTransition,\n\ttype Transition,\n} from \"motion/react\";\nimport { useApertoContext } from \"./context\";\nimport { getMediaKey, renderExpandedMedia } from \"./media-rendering\";\nimport type {\n\tApertoMediaItem,\n\tNavigationMotionPresetName,\n\tRenderImage,\n\tRenderVideo,\n} from \"./types\";\n\nexport type NavigationDirection = -1 | 0 | 1;\n\ninterface NavigationMotionPreset {\n\toffset: number;\n\tscale: number;\n\ttransition: Transition;\n}\n\ninterface NavigationAnimationCustom {\n\tdirection: NavigationDirection;\n\toffset: number;\n\tscale: number;\n}\n\nconst NAVIGATION_MOTION_PRESETS: Record<\n\tNavigationMotionPresetName,\n\tNavigationMotionPreset\n> = {\n\tfloat: {\n\t\toffset: 96,\n\t\tscale: 0.97,\n\t\ttransition: {\n\t\t\topacity: { duration: 0.34, ease: [0.45, 0, 0.2, 1] },\n\t\t\tscale: { damping: 26, mass: 1.15, stiffness: 80, type: \"spring\" },\n\t\t\tx: { damping: 26, mass: 1.15, stiffness: 80, type: \"spring\" },\n\t\t},\n\t},\n\tglide: {\n\t\toffset: 58,\n\t\tscale: 0.984,\n\t\ttransition: {\n\t\t\topacity: { duration: 0.24, ease: [0.4, 0, 0.2, 1] },\n\t\t\tscale: { damping: 28, mass: 0.95, stiffness: 150, type: \"spring\" },\n\t\t\tx: { damping: 28, mass: 0.95, stiffness: 150, type: \"spring\" },\n\t\t},\n\t},\n\tsnap: {\n\t\toffset: 38,\n\t\tscale: 0.996,\n\t\ttransition: {\n\t\t\topacity: { duration: 0.12, ease: [0.2, 0, 0, 1] },\n\t\t\tscale: { damping: 34, mass: 0.7, stiffness: 420, type: \"spring\" },\n\t\t\tx: { damping: 34, mass: 0.7, stiffness: 420, type: \"spring\" },\n\t\t},\n\t},\n};\n\nconst REDUCED_EXPANDED_MEDIA_TRANSITION: Transition = {\n\tduration: 0.12,\n\tease: \"linear\",\n};\n\nconst expandedMediaVariants = {\n\tcenter: {\n\t\topacity: 1,\n\t\tscale: 1,\n\t\tx: 0,\n\t},\n\tenter: ({\n\t\tdirection,\n\t\toffset,\n\t\tscale,\n\t}: NavigationAnimationCustom): TargetAndTransition => ({\n\t\topacity: 0,\n\t\tscale: direction === 0 ? 1 : scale,\n\t\tx: direction * offset,\n\t}),\n\texit: ({\n\t\tdirection,\n\t\toffset,\n\t\tscale,\n\t}: NavigationAnimationCustom): TargetAndTransition => ({\n\t\topacity: 0,\n\t\tscale: direction === 0 ? 1 : scale,\n\t\tx: direction * -offset,\n\t}),\n};\n\nconst reducedExpandedMediaVariants = {\n\tcenter: {\n\t\topacity: 1,\n\t\tx: 0,\n\t},\n\tenter: {\n\t\topacity: 0,\n\t\tx: 0,\n\t},\n\texit: {\n\t\topacity: 0,\n\t\tx: 0,\n\t},\n};\n\nexport function ApertoExpandedMediaStage({\n\tdirection,\n\tindex,\n\titem,\n\tnavigationMotion,\n\trenderImage,\n\trenderVideo,\n}: {\n\tdirection: NavigationDirection;\n\tindex: number;\n\titem: ApertoMediaItem;\n\tnavigationMotion: NavigationMotionPresetName;\n\trenderImage?: RenderImage;\n\trenderVideo?: RenderVideo;\n}) {\n\tconst ctx = useApertoContext();\n\tconst preset = NAVIGATION_MOTION_PRESETS[navigationMotion];\n\tconst transition = ctx.reduceMotion\n\t\t? REDUCED_EXPANDED_MEDIA_TRANSITION\n\t\t: preset.transition;\n\tconst variants = ctx.reduceMotion\n\t\t? reducedExpandedMediaVariants\n\t\t: expandedMediaVariants;\n\tconst animationCustom: NavigationAnimationCustom = {\n\t\tdirection,\n\t\toffset: preset.offset,\n\t\tscale: preset.scale,\n\t};\n\n\treturn (\n\t\t<AnimatePresence custom={animationCustom} initial={false} mode=\"sync\">\n\t\t\t<motion.div\n\t\t\t\tanimate=\"center\"\n\t\t\t\tcustom={animationCustom}\n\t\t\t\tdata-navigation-direction={direction}\n\t\t\t\tdata-navigation-motion={navigationMotion}\n\t\t\t\tdata-slot=\"aperto-media-stage\"\n\t\t\t\texit=\"exit\"\n\t\t\t\tinitial=\"enter\"\n\t\t\t\tkey={getMediaKey(item, index)}\n\t\t\t\ttransition={transition}\n\t\t\t\tvariants={variants}\n\t\t\t>\n\t\t\t\t{renderExpandedMedia(item, renderImage, renderVideo)}\n\t\t\t</motion.div>\n\t\t</AnimatePresence>\n\t);\n}\n","import type { ReactNode } from \"react\";\nimport type { ApertoMediaItem, RenderImage, RenderVideo } from \"./types\";\n\nexport function getMediaLabel(item: ApertoMediaItem): string {\n\treturn item.title ?? item.alt ?? \"media\";\n}\n\nexport function getMediaKey(item: ApertoMediaItem, index: number): string {\n\treturn item.id ?? `${item.type}:${item.src}:${index}`;\n}\n\nexport function getDescriptionProps(item: ApertoMediaItem): {\n\t\"aria-describedby\"?: undefined;\n} {\n\treturn item.description ? {} : { \"aria-describedby\": undefined };\n}\n\nfunction renderDefaultImage(props: Parameters<RenderImage>[0]): ReactNode {\n\tconst { item: _item, variant: _variant, ...imageProps } = props;\n\treturn <img {...imageProps} alt={imageProps.alt ?? \"\"} />;\n}\n\nfunction renderDefaultVideo(props: Parameters<RenderVideo>[0]): ReactNode {\n\tconst { item: _item, variant, ...videoProps } = props;\n\tif (variant === \"thumbnail\") {\n\t\treturn (\n\t\t\t<img alt={videoProps[\"aria-label\"] ?? \"\"} src={props.item.thumbnailSrc} />\n\t\t);\n\t}\n\treturn <video {...videoProps} />;\n}\n\nexport function renderThumbnail(\n\titem: ApertoMediaItem,\n\trenderImage?: RenderImage,\n\trenderVideo?: RenderVideo,\n): ReactNode {\n\tif (item.type === \"image\") {\n\t\tconst imageProps: Parameters<RenderImage>[0] = {\n\t\t\talt: \"\",\n\t\t\theight: item.height,\n\t\t\titem,\n\t\t\tsrc: item.thumbnailSrc ?? item.src,\n\t\t\tvariant: \"thumbnail\",\n\t\t\twidth: item.width,\n\t\t};\n\t\treturn (renderImage ?? renderDefaultImage)(imageProps);\n\t}\n\n\tconst videoProps: Parameters<RenderVideo>[0] = {\n\t\t\"aria-label\": item.alt ?? item.title ?? \"Video thumbnail\",\n\t\theight: item.height,\n\t\titem,\n\t\tposter: item.poster,\n\t\tsrc: item.thumbnailSrc,\n\t\tvariant: \"thumbnail\",\n\t\twidth: item.width,\n\t};\n\treturn (renderVideo ?? renderDefaultVideo)(videoProps);\n}\n\nexport function renderExpandedMedia(\n\titem: ApertoMediaItem,\n\trenderImage?: RenderImage,\n\trenderVideo?: RenderVideo,\n): ReactNode {\n\tif (item.type === \"image\") {\n\t\tconst imageProps: Parameters<RenderImage>[0] = {\n\t\t\talt: item.alt,\n\t\t\theight: item.height,\n\t\t\titem,\n\t\t\tsrc: item.src,\n\t\t\tvariant: \"expanded\",\n\t\t\twidth: item.width,\n\t\t};\n\t\treturn (renderImage ?? renderDefaultImage)(imageProps);\n\t}\n\n\tconst videoProps: Parameters<RenderVideo>[0] = {\n\t\t\"aria-label\": item.alt ?? item.title ?? \"Video\",\n\t\tcontrols: true,\n\t\theight: item.height,\n\t\titem,\n\t\tposter: item.poster,\n\t\tsrc: item.src,\n\t\tvariant: \"expanded\",\n\t\twidth: item.width,\n\t};\n\treturn (renderVideo ?? renderDefaultVideo)(videoProps);\n}\n\nexport function renderTransitionMedia(item: ApertoMediaItem): ReactNode {\n\tif (item.type === \"image\") {\n\t\treturn <img alt=\"\" src={item.src} />;\n\t}\n\n\treturn <img alt=\"\" src={item.poster ?? item.thumbnailSrc} />;\n}\n","import {\n\tmotion,\n\ttype TargetAndTransition,\n\ttype Transition,\n} from \"motion/react\";\nimport { useEffect } from \"react\";\nimport { useApertoContext } from \"./context\";\nimport { renderTransitionMedia } from \"./media-rendering\";\nimport type { ApertoMediaItem } from \"./types\";\n\nexport interface ApertoRect {\n\theight: number;\n\tleft: number;\n\ttop: number;\n\twidth: number;\n}\n\nexport interface ApertoMediaTransition {\n\tfrom: ApertoRect;\n\titem: ApertoMediaItem;\n\tphase: \"opening\" | \"closing\";\n\tto?: ApertoRect;\n}\n\nexport function rectFromElement(element: Element | null): ApertoRect | null {\n\tif (!element) {\n\t\treturn null;\n\t}\n\n\tconst rect = element.getBoundingClientRect();\n\treturn {\n\t\theight: rect.height,\n\t\tleft: rect.left,\n\t\ttop: rect.top,\n\t\twidth: rect.width,\n\t};\n}\n\nfunction rectTarget(rect: ApertoRect): TargetAndTransition {\n\treturn {\n\t\theight: rect.height,\n\t\tleft: rect.left,\n\t\ttop: rect.top,\n\t\twidth: rect.width,\n\t};\n}\n\nfunction transitionDurationMs(transition: Transition): number {\n\treturn typeof transition.duration === \"number\"\n\t\t? transition.duration * 1000\n\t\t: 450;\n}\n\nexport function ApertoMediaTransitionClone({\n\tonComplete,\n\ttransition,\n}: {\n\tonComplete: () => void;\n\ttransition: ApertoMediaTransition | null;\n}) {\n\tconst ctx = useApertoContext();\n\n\tuseEffect(() => {\n\t\tif (!transition?.to) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst timer = setTimeout(\n\t\t\tonComplete,\n\t\t\ttransitionDurationMs(ctx.preset.transition),\n\t\t);\n\t\treturn () => clearTimeout(timer);\n\t}, [ctx.preset.transition, onComplete, transition]);\n\n\tif (!transition?.to) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<motion.div\n\t\t\tanimate={rectTarget(transition.to)}\n\t\t\tdata-slot=\"aperto-transition-media\"\n\t\t\tinitial={rectTarget(transition.from)}\n\t\t\tstyle={{\n\t\t\t\tborderRadius: \"var(--aperto-radius, 0.5rem)\",\n\t\t\t\toverflow: \"hidden\",\n\t\t\t\tpointerEvents: \"none\",\n\t\t\t\tposition: \"fixed\",\n\t\t\t\twillChange: \"left, top, width, height\",\n\t\t\t\tzIndex: 1002,\n\t\t\t}}\n\t\t\ttransition={ctx.preset.transition}\n\t\t>\n\t\t\t{renderTransitionMedia(transition.item)}\n\t\t</motion.div>\n\t);\n}\n","export function shouldIgnoreKeyboardNavigationTarget(\n\ttarget: EventTarget | null,\n): boolean {\n\tif (!(target instanceof Element)) {\n\t\treturn false;\n\t}\n\n\treturn (\n\t\t(target as HTMLElement).isContentEditable ||\n\t\tBoolean(\n\t\t\ttarget.closest(\n\t\t\t\t'input, textarea, select, [contenteditable]:not([contenteditable=\"false\"]), [role=\"textbox\"], audio, video',\n\t\t\t),\n\t\t)\n\t);\n}\n","\"use client\";\n\nimport * as Dialog from \"@radix-ui/react-dialog\";\nimport { X } from \"lucide-react\";\nimport { type ComponentPropsWithoutRef, forwardRef } from \"react\";\n\nconst ApertoClose = forwardRef<\n\tHTMLButtonElement,\n\tComponentPropsWithoutRef<typeof Dialog.Close>\n>(({ children, ...props }, ref) => {\n\treturn (\n\t\t<Dialog.Close data-slot=\"aperto-close\" ref={ref} {...props}>\n\t\t\t{children ?? <X aria-hidden=\"true\" size={17} strokeWidth={2} />}\n\t\t</Dialog.Close>\n\t);\n});\n\nApertoClose.displayName = \"ApertoClose\";\n\nexport { ApertoClose };\n","\"use client\";\n\nimport * as Dialog from \"@radix-ui/react-dialog\";\nimport { motion } from \"motion/react\";\nimport {\n\ttype ComponentPropsWithoutRef,\n\tforwardRef,\n\tuseCallback,\n\tuseEffect,\n\tuseState,\n} from \"react\";\n\nimport { useApertoContext } from \"./context\";\nimport { resolvePreset } from \"./presets\";\nimport type { MotionPresetName } from \"./types\";\n\nconst TRIGGER_OPEN_Z_INDEX = 1000;\n\nexport interface ApertoTriggerProps\n\textends ComponentPropsWithoutRef<typeof Dialog.Trigger> {\n\t/** Internal flag used by grouped thumbnails to raise only the active trigger. */\n\tactive?: boolean;\n\t/** Override motion preset for this trigger */\n\tmotion?: MotionPresetName;\n\t/** Internal shared layout ID override for grouped thumbnails. */\n\tsharedLayoutId?: string | false;\n}\n\nconst ApertoTrigger = forwardRef<HTMLButtonElement, ApertoTriggerProps>(\n\t(\n\t\t{ active, children, motion: motionOverride, sharedLayoutId, ...props },\n\t\tref,\n\t) => {\n\t\tconst ctx = useApertoContext();\n\t\tconst shouldRaise = ctx.open && (active ?? true);\n\t\tconst [zIndex, setZIndex] = useState(\n\t\t\tshouldRaise ? TRIGGER_OPEN_Z_INDEX : 0,\n\t\t);\n\n\t\tuseEffect(() => {\n\t\t\tif (shouldRaise) {\n\t\t\t\tsetZIndex(TRIGGER_OPEN_Z_INDEX);\n\t\t\t} else if (ctx.open) {\n\t\t\t\tsetZIndex(0);\n\t\t\t}\n\t\t}, [ctx.open, shouldRaise]);\n\n\t\tconst handleLayoutAnimationComplete = useCallback(() => {\n\t\t\tif (!shouldRaise) {\n\t\t\t\tsetZIndex(0);\n\t\t\t}\n\t\t}, [shouldRaise]);\n\n\t\tconst resolved = resolvePreset(\n\t\t\t\"trigger\",\n\t\t\tmotionOverride,\n\t\t\tctx.presetName,\n\t\t\tctx.variants,\n\t\t\tctx.reduceMotion,\n\t\t);\n\t\tconst layoutId =\n\t\t\tsharedLayoutId === false\n\t\t\t\t? undefined\n\t\t\t\t: (sharedLayoutId ?? `${ctx.layoutId}-shared`);\n\n\t\treturn (\n\t\t\t<Dialog.Trigger asChild ref={ref} {...props}>\n\t\t\t\t<motion.button\n\t\t\t\t\tdata-aperto-active={shouldRaise ? \"\" : undefined}\n\t\t\t\t\tdata-slot=\"aperto-trigger\"\n\t\t\t\t\tkey={layoutId ?? \"unshared\"}\n\t\t\t\t\tlayout\n\t\t\t\t\tlayoutCrossfade={false}\n\t\t\t\t\tlayoutId={layoutId}\n\t\t\t\t\tonLayoutAnimationComplete={handleLayoutAnimationComplete}\n\t\t\t\t\tstyle={{ zIndex }}\n\t\t\t\t\ttransition={resolved.transition}\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</motion.button>\n\t\t\t</Dialog.Trigger>\n\t\t);\n\t},\n);\n\nApertoTrigger.displayName = \"ApertoTrigger\";\n\nexport { ApertoTrigger };\n","\"use client\";\n\nimport { ApertoClose } from \"../aperto-close\";\nimport { ApertoContent } from \"../aperto-content\";\nimport { ApertoDescription } from \"../aperto-description\";\nimport { ApertoOverlay } from \"../aperto-overlay\";\nimport { ApertoPortal } from \"../aperto-portal\";\nimport { ApertoRoot } from \"../aperto-root\";\nimport { ApertoTitle } from \"../aperto-title\";\nimport { ApertoTrigger } from \"../aperto-trigger\";\nimport {\n\tgetDescriptionProps,\n\tgetMediaLabel,\n\trenderExpandedMedia,\n\trenderThumbnail,\n} from \"../media-rendering\";\nimport type { ApertoProps } from \"./ApertoTypes\";\n\nexport function ApertoSingle({\n\tclassNames,\n\tdismissible,\n\tmedia,\n\trenderImage,\n\trenderVideo,\n}: ApertoProps) {\n\tconst label = getMediaLabel(media);\n\tconst title = media.title ?? label;\n\n\treturn (\n\t\t<ApertoRoot dismissible={dismissible}>\n\t\t\t<ApertoTrigger\n\t\t\t\taria-label={`Open ${label}`}\n\t\t\t\tclassName={classNames?.thumbnail}\n\t\t\t>\n\t\t\t\t{renderThumbnail(media, renderImage, renderVideo)}\n\t\t\t</ApertoTrigger>\n\t\t\t<ApertoPortal>\n\t\t\t\t<ApertoOverlay className={classNames?.overlay} />\n\t\t\t\t<ApertoContent\n\t\t\t\t\tclassName={classNames?.content}\n\t\t\t\t\t{...getDescriptionProps(media)}\n\t\t\t\t>\n\t\t\t\t\t{renderExpandedMedia(media, renderImage, renderVideo)}\n\t\t\t\t\t<ApertoTitle>{title}</ApertoTitle>\n\t\t\t\t\t{media.description ? (\n\t\t\t\t\t\t<ApertoDescription>{media.description}</ApertoDescription>\n\t\t\t\t\t) : null}\n\t\t\t\t\t<ApertoClose\n\t\t\t\t\t\taria-label=\"Close\"\n\t\t\t\t\t\tclassName={classNames?.closeButton}\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t/>\n\t\t\t\t</ApertoContent>\n\t\t\t</ApertoPortal>\n\t\t</ApertoRoot>\n\t);\n}\n","\"use client\";\n\nimport { useApertoGroup } from \"../aperto-group-context\";\nimport { ApertoTrigger } from \"../aperto-trigger\";\nimport { getMediaLabel, renderThumbnail } from \"../media-rendering\";\nimport type { ApertoThumbnailProps } from \"./ApertoTypes\";\n\nexport function ApertoThumbnail({\n\tchildren,\n\tclassName,\n\tindex,\n}: ApertoThumbnailProps) {\n\tconst group = useApertoGroup();\n\tconst media = group.media[index];\n\n\tif (!media) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<ApertoTrigger\n\t\t\tactive={group.index === index}\n\t\t\taria-label={`Open ${getMediaLabel(media)}`}\n\t\t\tclassName={className ?? group.classNames?.thumbnail}\n\t\t\tonClick={() => group.openAtIndex(index)}\n\t\t\tref={(node) => group.registerThumbnail(index, node)}\n\t\t\tsharedLayoutId={false}\n\t\t>\n\t\t\t{children ?? renderThumbnail(media, group.renderImage, group.renderVideo)}\n\t\t</ApertoTrigger>\n\t);\n}\n","\"use client\";\n\n/**\n * @patternmode/aperto\n *\n * Opinionated thumbnail-to-expanded media transitions.\n * Built on Radix Dialog + Motion.\n *\n * Inspired by Cambio (https://github.com/raphaelsalaja/cambio)\n * by Raphael Salaja.\n *\n * @example\n * ```tsx\n * import { Aperto } from \"@patternmode/aperto\";\n *\n * import { Aperto } from \"@patternmode/aperto\";\n * import \"@patternmode/aperto/styles.css\";\n *\n * <Aperto.Group media={media}>\n * {media.map((item, index) => (\n * <Aperto.Thumbnail key={item.id ?? item.src} index={index} />\n * ))}\n * </Aperto.Group>\n * ```\n */\n\nimport {\n\tApertoGroup,\n\ttype ApertoGroupProps,\n\ttype ApertoProps,\n\tApertoSingle,\n\tApertoThumbnail,\n\ttype ApertoThumbnailProps,\n} from \"./aperto\";\nimport { ApertoClose } from \"./aperto-close\";\nimport { ApertoContent, type ApertoContentProps } from \"./aperto-content\";\nimport { ApertoDescription } from \"./aperto-description\";\nimport { ApertoOverlay, type ApertoOverlayProps } from \"./aperto-overlay\";\nimport { ApertoPortal, type ApertoPortalProps } from \"./aperto-portal\";\nimport { ApertoRoot, type ApertoRootProps } from \"./aperto-root\";\nimport { ApertoTitle } from \"./aperto-title\";\nimport { ApertoTrigger, type ApertoTriggerProps } from \"./aperto-trigger\";\n\n/** Lower-level compound component namespace for advanced composition. */\nconst ApertoPrimitive = {\n\tClose: ApertoClose,\n\tContent: ApertoContent,\n\tDescription: ApertoDescription,\n\tOverlay: ApertoOverlay,\n\tPortal: ApertoPortal,\n\tRoot: ApertoRoot,\n\tTitle: ApertoTitle,\n\tTrigger: ApertoTrigger,\n};\n\n/** Primary media-first component namespace. */\nconst Aperto = Object.assign(ApertoSingle, {\n\tGroup: ApertoGroup,\n\tPrimitive: ApertoPrimitive,\n\tThumbnail: ApertoThumbnail,\n});\n\n// Preset system\nexport { PRESETS, resolvePreset } from \"./presets\";\n// Types\nexport type {\n\tApertoClassNames,\n\tApertoImageItem,\n\tApertoMediaItem,\n\tApertoVideoItem,\n\tDismissibleConfig,\n\tDragSpringConfig,\n\tMotionPreset,\n\tMotionPresetName,\n\tMotionProp,\n\tMotionVariants,\n\tNavigationMotionPresetName,\n\tRenderImage,\n\tRenderVideo,\n} from \"./types\";\n// Named exports for tree-shaking\nexport {\n\tAperto,\n\tApertoClose,\n\tApertoContent,\n\ttype ApertoContentProps,\n\tApertoDescription,\n\tApertoGroup,\n\ttype ApertoGroupProps,\n\tApertoOverlay,\n\ttype ApertoOverlayProps,\n\tApertoPortal,\n\ttype ApertoPortalProps,\n\tApertoPrimitive,\n\ttype ApertoProps,\n\tApertoRoot,\n\ttype ApertoRootProps,\n\tApertoThumbnail,\n\ttype ApertoThumbnailProps,\n\tApertoTitle,\n\tApertoTrigger,\n\ttype ApertoTriggerProps,\n};\n"],"mappings":"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","names":["useCallback","useId","useMemo","useState","Dialog","forwardRef","jsx","createContext","useContext","Dialog","motion","forwardRef","jsx","forwardRef","motion","Dialog","jsx","Dialog","useCallback","useState","jsx","useState","useCallback","Dialog","forwardRef","jsx","AnimatePresence","motion","jsx","jsx","AnimatePresence","motion","motion","jsx","motion","jsx","useId","useState","useCallback","useMemo","Dialog","X","forwardRef","jsx","Dialog","motion","forwardRef","useCallback","useEffect","useState","jsx","forwardRef","useState","useEffect","useCallback","motion","jsx","jsxs","jsx"]}
1
+ {"version":3,"sources":["../src/Aperto/ApertoGroup.tsx","../src/aperto-content.tsx","../src/context.ts","../src/physics.ts","../src/motion-tokens.ts","../src/presets.ts","../src/aperto-description.tsx","../src/aperto-group-context.ts","../src/aperto-overlay.tsx","../src/aperto-portal.tsx","../src/aperto-root.tsx","../src/aperto-title.tsx","../src/expanded-media-stage.tsx","../src/media-rendering.tsx","../src/media-transition.tsx","../src/Aperto/ApertoKeyboard.ts","../src/aperto-close.tsx","../src/aperto-trigger.tsx","../src/Aperto/ApertoSingle.tsx","../src/Aperto/ApertoThumbnail.tsx","../src/index.ts"],"sourcesContent":["\"use client\";\n\nimport { ChevronLeft, ChevronRight, X } from \"lucide-react\";\nimport {\n\ttype CSSProperties,\n\ttype KeyboardEvent,\n\tuseCallback,\n\tuseId,\n\tuseLayoutEffect,\n\tuseMemo,\n\tuseRef,\n\tuseState,\n} from \"react\";\nimport { flushSync } from \"react-dom\";\n\nimport { ApertoContent } from \"../aperto-content\";\nimport { ApertoDescription } from \"../aperto-description\";\nimport { ApertoGroupContext } from \"../aperto-group-context\";\nimport { ApertoOverlay } from \"../aperto-overlay\";\nimport { ApertoPortal } from \"../aperto-portal\";\nimport { ApertoRoot } from \"../aperto-root\";\nimport { ApertoTitle } from \"../aperto-title\";\nimport {\n\tApertoExpandedMediaStage,\n\ttype NavigationDirection,\n} from \"../expanded-media-stage\";\nimport { getDescriptionProps, getMediaLabel } from \"../media-rendering\";\nimport {\n\ttype ApertoMediaTransition,\n\tApertoMediaTransitionClone,\n\trectFromElement,\n} from \"../media-transition\";\nimport { shouldIgnoreKeyboardNavigationTarget } from \"./ApertoKeyboard\";\nimport type { ApertoGroupProps } from \"./ApertoTypes\";\n\nexport function ApertoGroup({\n\tchildren,\n\tclassNames,\n\tdismissible,\n\tindex: controlledIndex,\n\tinitialIndex = 0,\n\tmedia,\n\tmotion: motionProp,\n\tnavigationMotion = \"glide\",\n\tonIndexChange,\n\trenderImage,\n\trenderVideo,\n}: ApertoGroupProps) {\n\tconst generatedId = useId();\n\tconst [internalIndex, setInternalIndex] = useState(initialIndex);\n\tconst [open, setOpen] = useState(false);\n\tconst [closing, setClosing] = useState(false);\n\tconst [mediaTransition, setMediaTransition] =\n\t\tuseState<ApertoMediaTransition | null>(null);\n\tconst [navigationDirection, setNavigationDirection] =\n\t\tuseState<NavigationDirection>(0);\n\tconst isControlled = controlledIndex !== undefined;\n\tconst index = isControlled ? controlledIndex : internalIndex;\n\tconst activeMedia = media[index] ?? media[0];\n\tconst [layoutSourceIndex, setLayoutSourceIndex] = useState(index);\n\tconst expandedMediaRef = useRef<HTMLDivElement | null>(null);\n\tconst thumbnailRefs = useRef(new Map<number, HTMLButtonElement>());\n\tconst sharedLayoutIdForIndex = useCallback(\n\t\t(nextIndex: number) => `aperto-group-${generatedId}-${nextIndex}-shared`,\n\t\t[generatedId],\n\t);\n\tconst sharedLayoutId = sharedLayoutIdForIndex(layoutSourceIndex);\n\tconst measureOpeningTarget = useCallback((node: HTMLDivElement) => {\n\t\tconst targetRect = rectFromElement(node);\n\t\tif (!targetRect) {\n\t\t\treturn;\n\t\t}\n\n\t\tsetMediaTransition((current) => {\n\t\t\tif (current?.phase !== \"opening\" || current.to) {\n\t\t\t\treturn current;\n\t\t\t}\n\t\t\treturn { ...current, to: targetRect };\n\t\t});\n\t}, []);\n\tconst setExpandedMediaNode = useCallback(\n\t\t(node: HTMLDivElement | null) => {\n\t\t\texpandedMediaRef.current = node;\n\t\t\tif (node) {\n\t\t\t\tmeasureOpeningTarget(node);\n\t\t\t}\n\t\t},\n\t\t[measureOpeningTarget],\n\t);\n\n\tconst registerThumbnail = useCallback(\n\t\t(thumbIndex: number, node: HTMLButtonElement | null) => {\n\t\t\tif (node) {\n\t\t\t\tthumbnailRefs.current.set(thumbIndex, node);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthumbnailRefs.current.delete(thumbIndex);\n\t\t},\n\t\t[],\n\t);\n\n\tuseLayoutEffect(() => {\n\t\tif (\n\t\t\tmediaTransition?.phase !== \"opening\" ||\n\t\t\tmediaTransition.to ||\n\t\t\t!expandedMediaRef.current\n\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\tmeasureOpeningTarget(expandedMediaRef.current);\n\t}, [measureOpeningTarget, mediaTransition]);\n\n\tconst setIndex = useCallback(\n\t\t(nextIndex: number) => {\n\t\t\tif (!isControlled) {\n\t\t\t\tsetInternalIndex(nextIndex);\n\t\t\t}\n\t\t\tonIndexChange?.(nextIndex);\n\t\t},\n\t\t[isControlled, onIndexChange],\n\t);\n\n\tconst openAtIndex = useCallback(\n\t\t(thumbIndex: number) => {\n\t\t\tconst sourceRect = rectFromElement(\n\t\t\t\tthumbnailRefs.current.get(thumbIndex) ?? null,\n\t\t\t);\n\t\t\tconst item = media[thumbIndex];\n\n\t\t\tflushSync(() => {\n\t\t\t\tsetClosing(false);\n\t\t\t\tsetMediaTransition(\n\t\t\t\t\tsourceRect && item\n\t\t\t\t\t\t? { from: sourceRect, item, phase: \"opening\" }\n\t\t\t\t\t\t: null,\n\t\t\t\t);\n\t\t\t\tsetNavigationDirection(0);\n\t\t\t\tsetLayoutSourceIndex(thumbIndex);\n\t\t\t\tsetIndex(thumbIndex);\n\t\t\t\tsetOpen(true);\n\t\t\t});\n\t\t},\n\t\t[media, setIndex],\n\t);\n\n\tconst startClose = useCallback(() => {\n\t\tif (!open || closing) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst sourceRect = rectFromElement(expandedMediaRef.current);\n\t\tconst targetRect = rectFromElement(\n\t\t\tthumbnailRefs.current.get(index) ?? null,\n\t\t);\n\n\t\tif (!activeMedia || !sourceRect || !targetRect) {\n\t\t\tsetMediaTransition(null);\n\t\t\tsetClosing(false);\n\t\t\tsetOpen(false);\n\t\t\treturn;\n\t\t}\n\n\t\tflushSync(() => {\n\t\t\tsetClosing(true);\n\t\t\tsetMediaTransition({\n\t\t\t\tfrom: sourceRect,\n\t\t\t\titem: activeMedia,\n\t\t\t\tphase: \"closing\",\n\t\t\t\tto: targetRect,\n\t\t\t});\n\t\t});\n\t}, [activeMedia, closing, index, open]);\n\n\tconst handleCloseAutoFocus = useCallback(\n\t\t(event: Event) => {\n\t\t\tevent.preventDefault();\n\t\t\tthumbnailRefs.current.get(index)?.focus({ preventScroll: true });\n\t\t},\n\t\t[index],\n\t);\n\n\tconst handleMediaTransitionComplete = useCallback(() => {\n\t\tif (mediaTransition?.phase === \"closing\") {\n\t\t\tsetOpen(false);\n\t\t\tsetClosing(false);\n\t\t}\n\t\tsetMediaTransition(null);\n\t}, [mediaTransition?.phase]);\n\n\tconst handleOpenChange = useCallback(\n\t\t(nextOpen: boolean) => {\n\t\t\tif (nextOpen) {\n\t\t\t\tsetClosing(false);\n\t\t\t\tsetOpen(true);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tstartClose();\n\t\t},\n\t\t[startClose],\n\t);\n\n\tconst value = useMemo(\n\t\t() => ({\n\t\t\tclassNames,\n\t\t\tindex,\n\t\t\tmedia,\n\t\t\topen,\n\t\t\topenAtIndex,\n\t\t\tregisterThumbnail,\n\t\t\trenderImage,\n\t\t\trenderVideo,\n\t\t\tsetIndex,\n\t\t\tsharedLayoutId,\n\t\t\tsharedLayoutIdForIndex,\n\t\t}),\n\t\t[\n\t\t\tclassNames,\n\t\t\tindex,\n\t\t\tmedia,\n\t\t\topen,\n\t\t\topenAtIndex,\n\t\t\tregisterThumbnail,\n\t\t\trenderImage,\n\t\t\trenderVideo,\n\t\t\tsetIndex,\n\t\t\tsharedLayoutId,\n\t\t\tsharedLayoutIdForIndex,\n\t\t],\n\t);\n\tconst hasNavigation = media.length > 1;\n\tconst navigateToIndex = useCallback(\n\t\t(nextIndex: number, direction: NavigationDirection) => {\n\t\t\tsetNavigationDirection(direction);\n\t\t\tsetLayoutSourceIndex(nextIndex);\n\t\t\tsetIndex(nextIndex);\n\t\t},\n\t\t[setIndex],\n\t);\n\tconst goToPrevious = useCallback(() => {\n\t\tnavigateToIndex((index - 1 + media.length) % media.length, -1);\n\t}, [index, media.length, navigateToIndex]);\n\tconst goToNext = useCallback(() => {\n\t\tnavigateToIndex((index + 1) % media.length, 1);\n\t}, [index, media.length, navigateToIndex]);\n\tconst handleContentKeyDown = useCallback(\n\t\t(event: KeyboardEvent<HTMLDivElement>) => {\n\t\t\tif (\n\t\t\t\tevent.defaultPrevented ||\n\t\t\t\tevent.altKey ||\n\t\t\t\tevent.ctrlKey ||\n\t\t\t\tevent.metaKey ||\n\t\t\t\tshouldIgnoreKeyboardNavigationTarget(event.target)\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (event.key === \"ArrowLeft\") {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tgoToPrevious();\n\t\t\t}\n\n\t\t\tif (event.key === \"ArrowRight\") {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tgoToNext();\n\t\t\t}\n\t\t},\n\t\t[goToNext, goToPrevious],\n\t);\n\tconst expandedMediaStyle = useMemo((): CSSProperties | undefined => {\n\t\tif (!activeMedia?.width || !activeMedia.height) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\treturn {\n\t\t\t\"--aperto-expanded-aspect-ratio\": `${activeMedia.width} / ${activeMedia.height}`,\n\t\t\t\"--aperto-expanded-aspect-ratio-height\": activeMedia.height,\n\t\t\t\"--aperto-expanded-aspect-ratio-width\": activeMedia.width,\n\t\t} as CSSProperties;\n\t}, [activeMedia?.height, activeMedia?.width]);\n\n\treturn (\n\t\t<ApertoGroupContext.Provider value={value}>\n\t\t\t<ApertoRoot\n\t\t\t\tdismissible={dismissible}\n\t\t\t\tmotion={motionProp}\n\t\t\t\tonOpenChange={handleOpenChange}\n\t\t\t\topen={open}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t\t{activeMedia ? (\n\t\t\t\t\t<ApertoPortal>\n\t\t\t\t\t\t<ApertoOverlay className={classNames?.overlay} fadeOut={closing} />\n\t\t\t\t\t\t<ApertoContent\n\t\t\t\t\t\t\tclassName={classNames?.content}\n\t\t\t\t\t\t\tdata-aperto-transition={mediaTransition?.phase}\n\t\t\t\t\t\t\tonCloseAutoFocus={handleCloseAutoFocus}\n\t\t\t\t\t\t\tonKeyDown={hasNavigation ? handleContentKeyDown : undefined}\n\t\t\t\t\t\t\tsharedLayoutId={false}\n\t\t\t\t\t\t\t{...getDescriptionProps(activeMedia)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tdata-slot=\"aperto-media\"\n\t\t\t\t\t\t\t\tref={setExpandedMediaNode}\n\t\t\t\t\t\t\t\tstyle={expandedMediaStyle}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<ApertoExpandedMediaStage\n\t\t\t\t\t\t\t\t\tdirection={navigationDirection}\n\t\t\t\t\t\t\t\t\tindex={index}\n\t\t\t\t\t\t\t\t\titem={activeMedia}\n\t\t\t\t\t\t\t\t\tnavigationMotion={navigationMotion}\n\t\t\t\t\t\t\t\t\trenderImage={renderImage}\n\t\t\t\t\t\t\t\t\trenderVideo={renderVideo}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t{hasNavigation ? (\n\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\taria-label=\"Previous media\"\n\t\t\t\t\t\t\t\t\t\t\tclassName={classNames?.previousButton}\n\t\t\t\t\t\t\t\t\t\t\tdata-slot=\"aperto-previous-button\"\n\t\t\t\t\t\t\t\t\t\t\tonClick={goToPrevious}\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<ChevronLeft\n\t\t\t\t\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\t\t\t\t\tsize={18}\n\t\t\t\t\t\t\t\t\t\t\t\tstrokeWidth={2}\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\taria-label=\"Next media\"\n\t\t\t\t\t\t\t\t\t\t\tclassName={classNames?.nextButton}\n\t\t\t\t\t\t\t\t\t\t\tdata-slot=\"aperto-next-button\"\n\t\t\t\t\t\t\t\t\t\t\tonClick={goToNext}\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<ChevronRight\n\t\t\t\t\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\t\t\t\t\tsize={18}\n\t\t\t\t\t\t\t\t\t\t\t\tstrokeWidth={2}\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<ApertoTitle>\n\t\t\t\t\t\t\t\t{activeMedia.title ?? getMediaLabel(activeMedia)}\n\t\t\t\t\t\t\t</ApertoTitle>\n\t\t\t\t\t\t\t{activeMedia.description ? (\n\t\t\t\t\t\t\t\t<ApertoDescription>{activeMedia.description}</ApertoDescription>\n\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t{hasNavigation ? (\n\t\t\t\t\t\t\t\t<div className={classNames?.counter} data-slot=\"aperto-counter\">\n\t\t\t\t\t\t\t\t\t{index + 1} / {media.length}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\taria-label=\"Close\"\n\t\t\t\t\t\t\t\tclassName={classNames?.closeButton}\n\t\t\t\t\t\t\t\tdata-slot=\"aperto-close\"\n\t\t\t\t\t\t\t\tonClick={startClose}\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<X aria-hidden=\"true\" size={17} strokeWidth={2} />\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</ApertoContent>\n\t\t\t\t\t\t<ApertoMediaTransitionClone\n\t\t\t\t\t\t\tonComplete={handleMediaTransitionComplete}\n\t\t\t\t\t\t\trenderImage={renderImage}\n\t\t\t\t\t\t\trenderVideo={renderVideo}\n\t\t\t\t\t\t\ttransition={mediaTransition}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</ApertoPortal>\n\t\t\t\t) : null}\n\t\t\t</ApertoRoot>\n\t\t</ApertoGroupContext.Provider>\n\t);\n}\n","\"use client\";\n\nimport * as Dialog from \"@radix-ui/react-dialog\";\nimport {\n\ttype MotionStyle,\n\tmotion,\n\ttype PanInfo,\n\tuseMotionValue,\n\tuseSpring,\n\tuseTransform,\n} from \"motion/react\";\nimport {\n\ttype ComponentPropsWithoutRef,\n\tforwardRef,\n\tuseCallback,\n\tuseMemo,\n\tuseState,\n} from \"react\";\n\nimport { useApertoContext } from \"./context\";\nimport {\n\tcalculateResistance,\n\tDEFAULT_DISTANCE_THRESHOLD,\n\tDEFAULT_VELOCITY_THRESHOLD,\n\tOPACITY_INPUT,\n\tOPACITY_OUTPUT,\n\tSCALE_INPUT,\n\tSCALE_OUTPUT,\n} from \"./physics\";\nimport { getDragSpring, resolvePreset } from \"./presets\";\nimport type { DismissibleConfig, MotionPresetName } from \"./types\";\n\nexport interface ApertoContentProps\n\textends Omit<\n\t\tComponentPropsWithoutRef<typeof Dialog.Content>,\n\t\t\"asChild\" | \"forceMount\"\n\t> {\n\t/** Motion preset override for this content panel, independent of the root preset. */\n\tmotion?: MotionPresetName;\n\t/** Built-in positioning strategy. Use \"none\" for custom primitive compositions. */\n\tplacement?: \"center\" | \"none\";\n\t/** Internal shared layout ID override for grouped media. */\n\tsharedLayoutId?: string | false;\n}\n\nconst ApertoContent = forwardRef<HTMLDivElement, ApertoContentProps>(\n\t(\n\t\t{\n\t\t\tchildren,\n\t\t\tclassName,\n\t\t\tmotion: motionOverride,\n\t\t\tplacement = \"center\",\n\t\t\tsharedLayoutId,\n\t\t\tstyle,\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst ctx = useApertoContext();\n\t\tconst [isDragging, setIsDragging] = useState(false);\n\t\tconst resolved = resolvePreset(\n\t\t\t\"content\",\n\t\t\tmotionOverride,\n\t\t\tctx.presetName,\n\t\t\tctx.variants,\n\t\t\tctx.reduceMotion,\n\t\t);\n\n\t\tconst contentLayoutId =\n\t\t\tsharedLayoutId === false\n\t\t\t\t? undefined\n\t\t\t\t: (sharedLayoutId ?? `${ctx.layoutId}-shared`);\n\n\t\tconst dragSpring = getDragSpring(resolved);\n\t\tconst isDismissible = ctx.dismissible !== false;\n\n\t\tconst dismissConfig: DismissibleConfig =\n\t\t\ttypeof ctx.dismissible === \"object\" ? ctx.dismissible : {};\n\t\tconst distanceThreshold =\n\t\t\tdismissConfig.threshold ?? DEFAULT_DISTANCE_THRESHOLD;\n\t\tconst velocityThreshold =\n\t\t\tdismissConfig.velocity ?? DEFAULT_VELOCITY_THRESHOLD;\n\n\t\tconst dragX = useMotionValue(0);\n\t\tconst dragY = useMotionValue(0);\n\t\tconst springX = useSpring(dragX, dragSpring);\n\t\tconst springY = useSpring(dragY, dragSpring);\n\n\t\tconst distance = useTransform(() =>\n\t\t\tMath.hypot(springX.get(), springY.get()),\n\t\t);\n\t\tconst scaleMotion = useTransform(distance, SCALE_INPUT, SCALE_OUTPUT);\n\t\tconst opacityMotion = useTransform(distance, OPACITY_INPUT, OPACITY_OUTPUT);\n\t\tconst resistance = useTransform(distance, calculateResistance);\n\n\t\tconst handleDrag = useCallback(\n\t\t\t(_event: MouseEvent | TouchEvent | PointerEvent, info: PanInfo) => {\n\t\t\t\tif (!isDragging) {\n\t\t\t\t\tsetIsDragging(true);\n\t\t\t\t}\n\t\t\t\tconst r = resistance.get();\n\t\t\t\tdragX.set(info.offset.x * r);\n\t\t\t\tdragY.set(info.offset.y * r);\n\t\t\t},\n\t\t\t[dragX, dragY, isDragging, resistance],\n\t\t);\n\n\t\tconst handleDragEnd = useCallback(\n\t\t\t(_event: MouseEvent | TouchEvent | PointerEvent, info: PanInfo) => {\n\t\t\t\tsetIsDragging(false);\n\t\t\t\tconst speed = Math.hypot(info.velocity.x, info.velocity.y);\n\t\t\t\tconst dist = Math.hypot(info.offset.x, info.offset.y);\n\n\t\t\t\tif (speed > velocityThreshold || dist > distanceThreshold) {\n\t\t\t\t\tctx.onOpenChange(false);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tdragX.set(0);\n\t\t\t\tdragY.set(0);\n\t\t\t},\n\t\t\t[ctx.onOpenChange, distanceThreshold, dragX, dragY, velocityThreshold],\n\t\t);\n\n\t\tconst motionStyle = useMemo(\n\t\t\t(): MotionStyle => ({\n\t\t\t\tcursor: isDragging ? \"grabbing\" : isDismissible ? \"grab\" : undefined,\n\t\t\t\topacity: opacityMotion,\n\t\t\t\tscale: scaleMotion,\n\t\t\t\tx: springX,\n\t\t\t\ty: springY,\n\t\t\t\t...(placement === \"center\"\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tleft: \"50%\",\n\t\t\t\t\t\t\ttop: \"50%\",\n\t\t\t\t\t\t\ttranslate: \"-50% -50%\",\n\t\t\t\t\t\t}\n\t\t\t\t\t: {}),\n\t\t\t\t...style,\n\t\t\t}),\n\t\t\t[\n\t\t\t\tisDismissible,\n\t\t\t\tisDragging,\n\t\t\t\topacityMotion,\n\t\t\t\tplacement,\n\t\t\t\tscaleMotion,\n\t\t\t\tspringX,\n\t\t\t\tspringY,\n\t\t\t\tstyle,\n\t\t\t],\n\t\t);\n\n\t\treturn (\n\t\t\t<Dialog.Content asChild forceMount {...props}>\n\t\t\t\t<motion.div\n\t\t\t\t\tclassName={className}\n\t\t\t\t\tdata-slot=\"aperto-content\"\n\t\t\t\t\tdrag={isDismissible}\n\t\t\t\t\tdragConstraints={{ bottom: 0, left: 0, right: 0, top: 0 }}\n\t\t\t\t\tdragElastic={0}\n\t\t\t\t\tdragMomentum={false}\n\t\t\t\t\tdragSnapToOrigin\n\t\t\t\t\tlayout={contentLayoutId ? true : undefined}\n\t\t\t\t\tlayoutId={contentLayoutId}\n\t\t\t\t\tonDrag={isDismissible ? handleDrag : undefined}\n\t\t\t\t\tonDragEnd={isDismissible ? handleDragEnd : undefined}\n\t\t\t\t\tref={ref}\n\t\t\t\t\tstyle={motionStyle}\n\t\t\t\t\ttransition={resolved.transition}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</motion.div>\n\t\t\t</Dialog.Content>\n\t\t);\n\t},\n);\n\nApertoContent.displayName = \"ApertoContent\";\n\nexport { ApertoContent };\n","\"use client\";\n\nimport { createContext, useContext } from \"react\";\nimport type { ApertoContextValue } from \"./types\";\n\nexport const ApertoContext = createContext<ApertoContextValue | null>(null);\n\nexport function useApertoContext(): ApertoContextValue {\n\tconst ctx = useContext(ApertoContext);\n\tif (!ctx) {\n\t\tthrow new Error(\"Aperto components must be used within <Aperto.Root>\");\n\t}\n\treturn ctx;\n}\n","/**\n * Drag physics utilities.\n *\n * The logarithmic resistance function creates a rubber-band feel:\n * initial movement is free, but gets progressively harder the further\n * you drag. Combined with spring-smoothed motion values, this produces\n * a natural, elastic gesture.\n */\n\nconst RESISTANCE_DIVISOR = 20;\nconst RESISTANCE_SCALE = 4;\nconst RESISTANCE_MIN = 0.1;\n\n/**\n * Logarithmic resistance — decelerates drag progressively.\n * Returns a multiplier between RESISTANCE_MIN and 1.0.\n *\n * At distance 0: returns 1.0 (full movement)\n * At distance 50: returns ~0.77\n * At distance 100: returns ~0.58\n * At distance 200: returns ~0.42\n */\nexport function calculateResistance(distance: number): number {\n\treturn Math.max(\n\t\tRESISTANCE_MIN,\n\t\t1 - Math.log(distance / RESISTANCE_DIVISOR + 1) / RESISTANCE_SCALE,\n\t);\n}\n\n/** Scale mapping: distance → visual scale (1.0 → 0.95) */\nexport const SCALE_INPUT = [0, 50, 100];\nexport const SCALE_OUTPUT = [1, 0.98, 0.95];\n\n/** Opacity mapping: distance → visual opacity (1.0 → 0.96) */\nexport const OPACITY_INPUT = [0, 80];\nexport const OPACITY_OUTPUT = [1, 0.96];\n\n/** Default dismissal thresholds */\nexport const DEFAULT_DISTANCE_THRESHOLD = 100;\nexport const DEFAULT_VELOCITY_THRESHOLD = 500;\n","import type { Easing } from \"motion/react\";\n\nexport const durations = {\n\tsnappy: 0.22,\n\tmoderate: 0.4,\n} as const;\n\nexport const easings = {\n\tcustomGentle: [0.25, 0.1, 0.12, 1],\n\tsnappy: [0.22, 1, 0.36, 1],\n} satisfies Record<string, Easing>;\n\nexport const springs = {\n\tbouncy: { stiffness: 260, damping: 12, mass: 1 },\n\tnatural: { stiffness: 200, damping: 20, mass: 1 },\n\tsnappy: { stiffness: 400, damping: 28, mass: 0.8 },\n\tstiff: { stiffness: 500, damping: 30, mass: 1 },\n} as const;\n","import { durations, easings, springs } from \"./motion-tokens\";\nimport type {\n\tDragSpringConfig,\n\tMotionPreset,\n\tMotionPresetName,\n\tMotionVariants,\n} from \"./types\";\n\n/**\n * Motion presets — each bundles transition timing AND drag physics\n * so \"snappy\" feels snappy everywhere: open, close, and drag.\n *\n * Curves and springs are local copies of the Howells motion tokens so the\n * published package has no private workspace runtime dependencies.\n */\nexport const PRESETS: Record<MotionPresetName, MotionPreset> = {\n\tsnappy: {\n\t\ttransition: { ease: easings.snappy, duration: durations.snappy },\n\t\tdrag: {\n\t\t\tstiffness: springs.stiff.stiffness,\n\t\t\tdamping: springs.stiff.damping,\n\t\t\trestDelta: 0.01,\n\t\t},\n\t},\n\tsmooth: {\n\t\ttransition: { ease: easings.customGentle, duration: durations.moderate },\n\t\tdrag: {\n\t\t\tstiffness: springs.natural.stiffness,\n\t\t\tdamping: springs.natural.damping,\n\t\t\trestDelta: 0.01,\n\t\t},\n\t},\n\tbouncy: {\n\t\ttransition: {\n\t\t\ttype: \"spring\",\n\t\t\tstiffness: springs.bouncy.stiffness,\n\t\t\tdamping: springs.bouncy.damping,\n\t\t\tmass: springs.bouncy.mass,\n\t\t},\n\t\tdrag: {\n\t\t\tstiffness: springs.snappy.stiffness,\n\t\t\tdamping: springs.snappy.damping,\n\t\t\trestDelta: 0.01,\n\t\t},\n\t},\n\treduced: {\n\t\ttransition: { ease: \"linear\", duration: 0.01 },\n\t\tdrag: { stiffness: 1000, damping: 50, restDelta: 0.1 },\n\t},\n};\n\ntype ComponentType = \"trigger\" | \"content\" | \"backdrop\";\n\n/**\n * Three-level motion resolution:\n * 1. Component-level override (highest)\n * 2. Per-component variant from Root\n * 3. Global preset from Root (lowest)\n *\n * If `prefers-reduced-motion` is active, always returns \"reduced\".\n */\nexport function resolvePreset(\n\tcomponentType: ComponentType,\n\tcomponentMotion: MotionPresetName | undefined,\n\tglobalPreset: MotionPresetName,\n\tvariants: MotionVariants | undefined,\n\treduceMotion: boolean,\n): MotionPreset {\n\tif (reduceMotion) {\n\t\treturn PRESETS.reduced;\n\t}\n\n\t// 1. Component-level override\n\tif (componentMotion) {\n\t\treturn PRESETS[componentMotion];\n\t}\n\n\t// 2. Per-component variant\n\tif (variants?.[componentType]) {\n\t\treturn PRESETS[variants[componentType]];\n\t}\n\n\t// 3. Global preset\n\treturn PRESETS[globalPreset];\n}\n\n/** Extract the drag spring config from a preset */\nexport function getDragSpring(preset: MotionPreset): DragSpringConfig {\n\treturn preset.drag;\n}\n","\"use client\";\n\nimport * as Dialog from \"@radix-ui/react-dialog\";\nimport { type ComponentPropsWithoutRef, forwardRef } from \"react\";\n\nconst ApertoDescription = forwardRef<\n\tHTMLParagraphElement,\n\tComponentPropsWithoutRef<typeof Dialog.Description>\n>((props, ref) => {\n\treturn (\n\t\t<Dialog.Description data-slot=\"aperto-description\" ref={ref} {...props} />\n\t);\n});\n\nApertoDescription.displayName = \"ApertoDescription\";\n\nexport { ApertoDescription };\n","import { createContext, useContext } from \"react\";\nimport type {\n\tApertoClassNames,\n\tApertoMediaItem,\n\tRenderImage,\n\tRenderVideo,\n} from \"./types\";\n\nexport interface ApertoGroupContextValue {\n\tclassNames?: ApertoClassNames;\n\tindex: number;\n\tmedia: ApertoMediaItem[];\n\topen: boolean;\n\topenAtIndex: (index: number) => void;\n\tregisterThumbnail: (index: number, node: HTMLButtonElement | null) => void;\n\trenderImage?: RenderImage;\n\trenderVideo?: RenderVideo;\n\tsetIndex: (index: number) => void;\n\tsharedLayoutId: string;\n\tsharedLayoutIdForIndex: (index: number) => string;\n}\n\nexport const ApertoGroupContext = createContext<ApertoGroupContextValue | null>(\n\tnull,\n);\n\nexport function useApertoGroup(): ApertoGroupContextValue {\n\tconst ctx = useContext(ApertoGroupContext);\n\tif (!ctx) {\n\t\tthrow new Error(\"Aperto.Thumbnail must be used within <Aperto.Group>\");\n\t}\n\treturn ctx;\n}\n","\"use client\";\n\nimport * as Dialog from \"@radix-ui/react-dialog\";\nimport { motion, type Transition } from \"motion/react\";\nimport { forwardRef } from \"react\";\n\nimport { useApertoContext } from \"./context\";\nimport { easings } from \"./motion-tokens\";\n\nexport interface ApertoOverlayProps {\n\tclassName?: string;\n\t/** Internal flag used to fade the overlay during measured close transitions. */\n\tfadeOut?: boolean;\n\tstyle?: React.CSSProperties;\n}\n\n/** Overlay always fades gently regardless of the content's motion preset. */\nconst OVERLAY_TRANSITION: Transition = {\n\tduration: 0.3,\n\tease: easings.customGentle,\n};\n\nconst OVERLAY_TRANSITION_REDUCED: Transition = {\n\tduration: 0.01,\n\tease: \"linear\",\n};\n\nconst ApertoOverlay = forwardRef<HTMLDivElement, ApertoOverlayProps>(\n\t({ className, fadeOut, style }, ref) => {\n\t\tconst ctx = useApertoContext();\n\t\tconst transition = ctx.reduceMotion\n\t\t\t? OVERLAY_TRANSITION_REDUCED\n\t\t\t: OVERLAY_TRANSITION;\n\n\t\treturn (\n\t\t\t<Dialog.Overlay asChild forceMount>\n\t\t\t\t<motion.div\n\t\t\t\t\tanimate={{ opacity: fadeOut ? 0 : 1 }}\n\t\t\t\t\tclassName={className}\n\t\t\t\t\tdata-slot=\"aperto-overlay\"\n\t\t\t\t\texit={{ opacity: 0 }}\n\t\t\t\t\tinitial={{ opacity: 0 }}\n\t\t\t\t\tref={ref}\n\t\t\t\t\tstyle={style}\n\t\t\t\t\ttransition={transition}\n\t\t\t\t/>\n\t\t\t</Dialog.Overlay>\n\t\t);\n\t},\n);\n\nApertoOverlay.displayName = \"ApertoOverlay\";\n\nexport { ApertoOverlay };\n","\"use client\";\n\nimport * as Dialog from \"@radix-ui/react-dialog\";\nimport { AnimatePresence } from \"motion/react\";\nimport type { ReactNode } from \"react\";\n\nimport { useApertoContext } from \"./context\";\n\nexport interface ApertoPortalProps {\n\tchildren: ReactNode;\n\t/** Container element for the portal (default: document.body) */\n\tcontainer?: HTMLElement;\n}\n\nfunction ApertoPortal({ children, container }: ApertoPortalProps) {\n\tconst { open } = useApertoContext();\n\n\treturn (\n\t\t<AnimatePresence>\n\t\t\t{open && (\n\t\t\t\t<Dialog.Portal container={container} forceMount>\n\t\t\t\t\t{children}\n\t\t\t\t</Dialog.Portal>\n\t\t\t)}\n\t\t</AnimatePresence>\n\t);\n}\n\nexport { ApertoPortal };\n","\"use client\";\n\nimport * as Dialog from \"@radix-ui/react-dialog\";\nimport { LayoutGroup, useReducedMotion } from \"motion/react\";\nimport {\n\ttype ComponentPropsWithoutRef,\n\ttype ReactNode,\n\tuseCallback,\n\tuseId,\n\tuseState,\n} from \"react\";\n\nimport { ApertoContext } from \"./context\";\nimport { PRESETS } from \"./presets\";\nimport type {\n\tDismissibleConfig,\n\tMotionPresetName,\n\tMotionVariants,\n} from \"./types\";\n\nexport interface ApertoRootProps\n\textends Omit<\n\t\tComponentPropsWithoutRef<typeof Dialog.Root>,\n\t\t\"open\" | \"onOpenChange\"\n\t> {\n\tchildren: ReactNode;\n\t/** Whether dragging can dismiss the content (default: true) */\n\tdismissible?: boolean | DismissibleConfig;\n\t/** Layout ID for shared element transition (auto-generated if omitted) */\n\tlayoutId?: string;\n\t/** Motion preset or per-component variants */\n\tmotion?: MotionPresetName | MotionVariants;\n\t/** Controlled open state */\n\topen?: boolean;\n\t/** Callback when open state changes */\n\tonOpenChange?: (open: boolean) => void;\n\t/** Force reduced motion regardless of system preference */\n\treduceMotion?: boolean;\n}\n\nfunction ApertoRoot({\n\tchildren,\n\tdismissible = true,\n\tlayoutId: layoutIdProp,\n\tmotion: motionProp = \"smooth\",\n\topen: controlledOpen,\n\tonOpenChange: controlledOnOpenChange,\n\treduceMotion: reduceMotionProp,\n\t...dialogProps\n}: ApertoRootProps) {\n\tconst generatedId = useId();\n\tconst layoutId = layoutIdProp ?? `aperto-${generatedId}`;\n\tconst systemReducedMotion = useReducedMotion() ?? false;\n\tconst shouldReduce = reduceMotionProp ?? systemReducedMotion;\n\n\t// Uncontrolled state fallback\n\tconst [internalOpen, setInternalOpen] = useState(false);\n\tconst isControlled = controlledOpen !== undefined;\n\tconst open = isControlled ? controlledOpen : internalOpen;\n\n\tconst onOpenChange = useCallback(\n\t\t(nextOpen: boolean) => {\n\t\t\tif (!isControlled) {\n\t\t\t\tsetInternalOpen(nextOpen);\n\t\t\t}\n\t\t\tcontrolledOnOpenChange?.(nextOpen);\n\t\t},\n\t\t[isControlled, controlledOnOpenChange],\n\t);\n\n\t// Resolve global preset name\n\tconst globalPresetName: MotionPresetName =\n\t\ttypeof motionProp === \"string\" ? motionProp : \"smooth\";\n\tconst variants: MotionVariants | undefined =\n\t\ttypeof motionProp === \"object\" ? motionProp : undefined;\n\n\tconst presetName: MotionPresetName = shouldReduce\n\t\t? \"reduced\"\n\t\t: globalPresetName;\n\tconst preset = PRESETS[presetName];\n\n\treturn (\n\t\t<ApertoContext.Provider\n\t\t\tvalue={{\n\t\t\t\tdismissible,\n\t\t\t\tlayoutId,\n\t\t\t\tonOpenChange,\n\t\t\t\topen,\n\t\t\t\tpreset,\n\t\t\t\tpresetName,\n\t\t\t\treduceMotion: shouldReduce,\n\t\t\t\tvariants,\n\t\t\t}}\n\t\t>\n\t\t\t<Dialog.Root onOpenChange={onOpenChange} open={open} {...dialogProps}>\n\t\t\t\t<LayoutGroup id={layoutId}>{children}</LayoutGroup>\n\t\t\t</Dialog.Root>\n\t\t</ApertoContext.Provider>\n\t);\n}\n\nexport { ApertoRoot };\n","\"use client\";\n\nimport * as Dialog from \"@radix-ui/react-dialog\";\nimport { type ComponentPropsWithoutRef, forwardRef } from \"react\";\n\nconst ApertoTitle = forwardRef<\n\tHTMLHeadingElement,\n\tComponentPropsWithoutRef<typeof Dialog.Title>\n>((props, ref) => {\n\treturn <Dialog.Title data-slot=\"aperto-title\" ref={ref} {...props} />;\n});\n\nApertoTitle.displayName = \"ApertoTitle\";\n\nexport { ApertoTitle };\n","import {\n\tAnimatePresence,\n\tmotion,\n\ttype TargetAndTransition,\n\ttype Transition,\n} from \"motion/react\";\nimport { useApertoContext } from \"./context\";\nimport { getMediaKey, renderExpandedMedia } from \"./media-rendering\";\nimport type {\n\tApertoMediaItem,\n\tNavigationMotionPresetName,\n\tRenderImage,\n\tRenderVideo,\n} from \"./types\";\n\nexport type NavigationDirection = -1 | 0 | 1;\n\ninterface NavigationMotionPreset {\n\toffset: number;\n\tscale: number;\n\ttransition: Transition;\n}\n\ninterface NavigationAnimationCustom {\n\tdirection: NavigationDirection;\n\toffset: number;\n\tscale: number;\n}\n\nconst NAVIGATION_MOTION_PRESETS: Record<\n\tNavigationMotionPresetName,\n\tNavigationMotionPreset\n> = {\n\tfloat: {\n\t\toffset: 96,\n\t\tscale: 0.97,\n\t\ttransition: {\n\t\t\topacity: { duration: 0.34, ease: [0.45, 0, 0.2, 1] },\n\t\t\tscale: { damping: 26, mass: 1.15, stiffness: 80, type: \"spring\" },\n\t\t\tx: { damping: 26, mass: 1.15, stiffness: 80, type: \"spring\" },\n\t\t},\n\t},\n\tglide: {\n\t\toffset: 58,\n\t\tscale: 0.984,\n\t\ttransition: {\n\t\t\topacity: { duration: 0.24, ease: [0.4, 0, 0.2, 1] },\n\t\t\tscale: { damping: 28, mass: 0.95, stiffness: 150, type: \"spring\" },\n\t\t\tx: { damping: 28, mass: 0.95, stiffness: 150, type: \"spring\" },\n\t\t},\n\t},\n\tsnap: {\n\t\toffset: 38,\n\t\tscale: 0.996,\n\t\ttransition: {\n\t\t\topacity: { duration: 0.12, ease: [0.2, 0, 0, 1] },\n\t\t\tscale: { damping: 34, mass: 0.7, stiffness: 420, type: \"spring\" },\n\t\t\tx: { damping: 34, mass: 0.7, stiffness: 420, type: \"spring\" },\n\t\t},\n\t},\n};\n\nconst REDUCED_EXPANDED_MEDIA_TRANSITION: Transition = {\n\tduration: 0.12,\n\tease: \"linear\",\n};\n\nconst expandedMediaVariants = {\n\tcenter: {\n\t\topacity: 1,\n\t\tscale: 1,\n\t\tx: 0,\n\t},\n\tenter: ({\n\t\tdirection,\n\t\toffset,\n\t\tscale,\n\t}: NavigationAnimationCustom): TargetAndTransition => ({\n\t\topacity: 0,\n\t\tscale: direction === 0 ? 1 : scale,\n\t\tx: direction * offset,\n\t}),\n\texit: ({\n\t\tdirection,\n\t\toffset,\n\t\tscale,\n\t}: NavigationAnimationCustom): TargetAndTransition => ({\n\t\topacity: 0,\n\t\tscale: direction === 0 ? 1 : scale,\n\t\tx: direction * -offset,\n\t}),\n};\n\nconst reducedExpandedMediaVariants = {\n\tcenter: {\n\t\topacity: 1,\n\t\tx: 0,\n\t},\n\tenter: {\n\t\topacity: 0,\n\t\tx: 0,\n\t},\n\texit: {\n\t\topacity: 0,\n\t\tx: 0,\n\t},\n};\n\nexport function ApertoExpandedMediaStage({\n\tdirection,\n\tindex,\n\titem,\n\tnavigationMotion,\n\trenderImage,\n\trenderVideo,\n}: {\n\tdirection: NavigationDirection;\n\tindex: number;\n\titem: ApertoMediaItem;\n\tnavigationMotion: NavigationMotionPresetName;\n\trenderImage?: RenderImage;\n\trenderVideo?: RenderVideo;\n}) {\n\tconst ctx = useApertoContext();\n\tconst preset = NAVIGATION_MOTION_PRESETS[navigationMotion];\n\tconst transition = ctx.reduceMotion\n\t\t? REDUCED_EXPANDED_MEDIA_TRANSITION\n\t\t: preset.transition;\n\tconst variants = ctx.reduceMotion\n\t\t? reducedExpandedMediaVariants\n\t\t: expandedMediaVariants;\n\tconst animationCustom: NavigationAnimationCustom = {\n\t\tdirection,\n\t\toffset: preset.offset,\n\t\tscale: preset.scale,\n\t};\n\n\treturn (\n\t\t<AnimatePresence custom={animationCustom} initial={false} mode=\"sync\">\n\t\t\t<motion.div\n\t\t\t\tanimate=\"center\"\n\t\t\t\tcustom={animationCustom}\n\t\t\t\tdata-navigation-direction={direction}\n\t\t\t\tdata-navigation-motion={navigationMotion}\n\t\t\t\tdata-slot=\"aperto-media-stage\"\n\t\t\t\texit=\"exit\"\n\t\t\t\tinitial=\"enter\"\n\t\t\t\tkey={getMediaKey(item, index)}\n\t\t\t\ttransition={transition}\n\t\t\t\tvariants={variants}\n\t\t\t>\n\t\t\t\t{renderExpandedMedia(item, renderImage, renderVideo)}\n\t\t\t</motion.div>\n\t\t</AnimatePresence>\n\t);\n}\n","import type { ReactNode } from \"react\";\nimport type { ApertoMediaItem, RenderImage, RenderVideo } from \"./types\";\n\nexport function getMediaLabel(item: ApertoMediaItem): string {\n\treturn item.title ?? item.alt ?? \"media\";\n}\n\nexport function getMediaKey(item: ApertoMediaItem, index: number): string {\n\treturn item.id ?? `${item.type}:${item.src}:${index}`;\n}\n\nexport function getDescriptionProps(item: ApertoMediaItem): {\n\t\"aria-describedby\"?: undefined;\n} {\n\treturn item.description ? {} : { \"aria-describedby\": undefined };\n}\n\nfunction renderDefaultImage(props: Parameters<RenderImage>[0]): ReactNode {\n\tconst { item: _item, variant: _variant, ...imageProps } = props;\n\treturn <img {...imageProps} alt={imageProps.alt ?? \"\"} />;\n}\n\nfunction renderDefaultVideo(props: Parameters<RenderVideo>[0]): ReactNode {\n\tconst { item: _item, variant, ...videoProps } = props;\n\tif (variant === \"thumbnail\") {\n\t\treturn (\n\t\t\t<img alt={videoProps[\"aria-label\"] ?? \"\"} src={props.item.thumbnailSrc} />\n\t\t);\n\t}\n\treturn <video {...videoProps} />;\n}\n\nexport function renderThumbnail(\n\titem: ApertoMediaItem,\n\trenderImage?: RenderImage,\n\trenderVideo?: RenderVideo,\n): ReactNode {\n\tif (item.type === \"image\") {\n\t\tconst imageProps: Parameters<RenderImage>[0] = {\n\t\t\talt: \"\",\n\t\t\theight: item.height,\n\t\t\titem,\n\t\t\tsrc: item.thumbnailSrc ?? item.src,\n\t\t\tvariant: \"thumbnail\",\n\t\t\twidth: item.width,\n\t\t};\n\t\treturn (renderImage ?? renderDefaultImage)(imageProps);\n\t}\n\n\tconst videoProps: Parameters<RenderVideo>[0] = {\n\t\t\"aria-label\": item.alt ?? item.title ?? \"Video thumbnail\",\n\t\theight: item.height,\n\t\titem,\n\t\tposter: item.poster,\n\t\tsrc: item.thumbnailSrc,\n\t\tvariant: \"thumbnail\",\n\t\twidth: item.width,\n\t};\n\treturn (renderVideo ?? renderDefaultVideo)(videoProps);\n}\n\nexport function renderExpandedMedia(\n\titem: ApertoMediaItem,\n\trenderImage?: RenderImage,\n\trenderVideo?: RenderVideo,\n): ReactNode {\n\tif (item.type === \"image\") {\n\t\tconst imageProps: Parameters<RenderImage>[0] = {\n\t\t\talt: item.alt,\n\t\t\theight: item.height,\n\t\t\titem,\n\t\t\tsrc: item.src,\n\t\t\tvariant: \"expanded\",\n\t\t\twidth: item.width,\n\t\t};\n\t\treturn (renderImage ?? renderDefaultImage)(imageProps);\n\t}\n\n\tconst videoProps: Parameters<RenderVideo>[0] = {\n\t\t\"aria-label\": item.alt ?? item.title ?? \"Video\",\n\t\tcontrols: true,\n\t\theight: item.height,\n\t\titem,\n\t\tposter: item.poster,\n\t\tsrc: item.src,\n\t\tvariant: \"expanded\",\n\t\twidth: item.width,\n\t};\n\treturn (renderVideo ?? renderDefaultVideo)(videoProps);\n}\n\nexport function renderTransitionMedia(\n\titem: ApertoMediaItem,\n\trenderImage?: RenderImage,\n\trenderVideo?: RenderVideo,\n): ReactNode {\n\tif (item.type === \"image\") {\n\t\tconst imageProps: Parameters<RenderImage>[0] = {\n\t\t\talt: item.alt,\n\t\t\theight: item.height,\n\t\t\titem,\n\t\t\tsrc: item.src,\n\t\t\tvariant: \"expanded\",\n\t\t\twidth: item.width,\n\t\t};\n\t\treturn (renderImage ?? renderDefaultImage)(imageProps);\n\t}\n\n\tconst videoProps: Parameters<RenderVideo>[0] = {\n\t\t\"aria-label\": item.alt ?? item.title ?? \"Video\",\n\t\theight: item.height,\n\t\titem,\n\t\tposter: item.poster,\n\t\tsrc: item.src,\n\t\tvariant: \"expanded\",\n\t\twidth: item.width,\n\t};\n\treturn (renderVideo ?? renderDefaultVideo)(videoProps);\n}\n","import {\n\tmotion,\n\ttype TargetAndTransition,\n\ttype Transition,\n} from \"motion/react\";\nimport { useEffect } from \"react\";\nimport { useApertoContext } from \"./context\";\nimport { renderTransitionMedia } from \"./media-rendering\";\nimport type { ApertoMediaItem, RenderImage, RenderVideo } from \"./types\";\n\nexport interface ApertoRect {\n\theight: number;\n\tleft: number;\n\ttop: number;\n\twidth: number;\n}\n\nexport interface ApertoMediaTransition {\n\tfrom: ApertoRect;\n\titem: ApertoMediaItem;\n\tphase: \"opening\" | \"closing\";\n\tto?: ApertoRect;\n}\n\nexport function rectFromElement(element: Element | null): ApertoRect | null {\n\tif (!element) {\n\t\treturn null;\n\t}\n\n\tconst rect = element.getBoundingClientRect();\n\treturn {\n\t\theight: rect.height,\n\t\tleft: rect.left,\n\t\ttop: rect.top,\n\t\twidth: rect.width,\n\t};\n}\n\nfunction rectTarget(rect: ApertoRect): TargetAndTransition {\n\treturn {\n\t\theight: rect.height,\n\t\tleft: rect.left,\n\t\ttop: rect.top,\n\t\twidth: rect.width,\n\t};\n}\n\nfunction transitionDurationMs(transition: Transition): number {\n\treturn typeof transition.duration === \"number\"\n\t\t? transition.duration * 1000\n\t\t: 450;\n}\n\nexport function ApertoMediaTransitionClone({\n\tonComplete,\n\trenderImage,\n\trenderVideo,\n\ttransition,\n}: {\n\tonComplete: () => void;\n\trenderImage?: RenderImage;\n\trenderVideo?: RenderVideo;\n\ttransition: ApertoMediaTransition | null;\n}) {\n\tconst ctx = useApertoContext();\n\n\tuseEffect(() => {\n\t\tif (!transition?.to) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst timer = setTimeout(\n\t\t\tonComplete,\n\t\t\ttransitionDurationMs(ctx.preset.transition),\n\t\t);\n\t\treturn () => clearTimeout(timer);\n\t}, [ctx.preset.transition, onComplete, transition]);\n\n\tif (!transition?.to) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<motion.div\n\t\t\tanimate={rectTarget(transition.to)}\n\t\t\taria-hidden=\"true\"\n\t\t\tdata-slot=\"aperto-transition-media\"\n\t\t\tinitial={rectTarget(transition.from)}\n\t\t\tstyle={{\n\t\t\t\tborderRadius: \"var(--aperto-radius, 0.5rem)\",\n\t\t\t\toverflow: \"hidden\",\n\t\t\t\tpointerEvents: \"none\",\n\t\t\t\tposition: \"fixed\",\n\t\t\t\twillChange: \"left, top, width, height\",\n\t\t\t\tzIndex: 1002,\n\t\t\t}}\n\t\t\ttransition={ctx.preset.transition}\n\t\t>\n\t\t\t{renderTransitionMedia(transition.item, renderImage, renderVideo)}\n\t\t</motion.div>\n\t);\n}\n","export function shouldIgnoreKeyboardNavigationTarget(\n\ttarget: EventTarget | null,\n): boolean {\n\tif (!(target instanceof Element)) {\n\t\treturn false;\n\t}\n\n\treturn (\n\t\t(target as HTMLElement).isContentEditable ||\n\t\tBoolean(\n\t\t\ttarget.closest(\n\t\t\t\t'input, textarea, select, [contenteditable]:not([contenteditable=\"false\"]), [role=\"textbox\"], audio, video',\n\t\t\t),\n\t\t)\n\t);\n}\n","\"use client\";\n\nimport * as Dialog from \"@radix-ui/react-dialog\";\nimport { X } from \"lucide-react\";\nimport { type ComponentPropsWithoutRef, forwardRef } from \"react\";\n\nconst ApertoClose = forwardRef<\n\tHTMLButtonElement,\n\tComponentPropsWithoutRef<typeof Dialog.Close>\n>(({ children, ...props }, ref) => {\n\treturn (\n\t\t<Dialog.Close data-slot=\"aperto-close\" ref={ref} {...props}>\n\t\t\t{children ?? <X aria-hidden=\"true\" size={17} strokeWidth={2} />}\n\t\t</Dialog.Close>\n\t);\n});\n\nApertoClose.displayName = \"ApertoClose\";\n\nexport { ApertoClose };\n","\"use client\";\n\nimport * as Dialog from \"@radix-ui/react-dialog\";\nimport { motion } from \"motion/react\";\nimport {\n\ttype ComponentPropsWithoutRef,\n\tforwardRef,\n\tuseCallback,\n\tuseEffect,\n\tuseState,\n} from \"react\";\n\nimport { useApertoContext } from \"./context\";\nimport { resolvePreset } from \"./presets\";\nimport type { MotionPresetName } from \"./types\";\n\nconst TRIGGER_OPEN_Z_INDEX = 1000;\n\nexport interface ApertoTriggerProps\n\textends ComponentPropsWithoutRef<typeof Dialog.Trigger> {\n\t/** Internal flag used by grouped thumbnails to raise only the active trigger. */\n\tactive?: boolean;\n\t/** Override motion preset for this trigger */\n\tmotion?: MotionPresetName;\n\t/** Internal shared layout ID override for grouped thumbnails. */\n\tsharedLayoutId?: string | false;\n}\n\nconst ApertoTrigger = forwardRef<HTMLButtonElement, ApertoTriggerProps>(\n\t(\n\t\t{ active, children, motion: motionOverride, sharedLayoutId, ...props },\n\t\tref,\n\t) => {\n\t\tconst ctx = useApertoContext();\n\t\tconst shouldRaise = ctx.open && (active ?? true);\n\t\tconst [zIndex, setZIndex] = useState(\n\t\t\tshouldRaise ? TRIGGER_OPEN_Z_INDEX : 0,\n\t\t);\n\n\t\tuseEffect(() => {\n\t\t\tif (shouldRaise) {\n\t\t\t\tsetZIndex(TRIGGER_OPEN_Z_INDEX);\n\t\t\t} else if (ctx.open) {\n\t\t\t\tsetZIndex(0);\n\t\t\t}\n\t\t}, [ctx.open, shouldRaise]);\n\n\t\tconst handleLayoutAnimationComplete = useCallback(() => {\n\t\t\tif (!shouldRaise) {\n\t\t\t\tsetZIndex(0);\n\t\t\t}\n\t\t}, [shouldRaise]);\n\n\t\tconst resolved = resolvePreset(\n\t\t\t\"trigger\",\n\t\t\tmotionOverride,\n\t\t\tctx.presetName,\n\t\t\tctx.variants,\n\t\t\tctx.reduceMotion,\n\t\t);\n\t\tconst layoutId =\n\t\t\tsharedLayoutId === false\n\t\t\t\t? undefined\n\t\t\t\t: (sharedLayoutId ?? `${ctx.layoutId}-shared`);\n\n\t\treturn (\n\t\t\t<Dialog.Trigger asChild ref={ref} {...props}>\n\t\t\t\t<motion.button\n\t\t\t\t\tdata-aperto-active={shouldRaise ? \"\" : undefined}\n\t\t\t\t\tdata-slot=\"aperto-trigger\"\n\t\t\t\t\tkey={layoutId ?? \"unshared\"}\n\t\t\t\t\tlayout\n\t\t\t\t\tlayoutCrossfade={false}\n\t\t\t\t\tlayoutId={layoutId}\n\t\t\t\t\tonLayoutAnimationComplete={handleLayoutAnimationComplete}\n\t\t\t\t\tstyle={{ zIndex }}\n\t\t\t\t\ttransition={resolved.transition}\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</motion.button>\n\t\t\t</Dialog.Trigger>\n\t\t);\n\t},\n);\n\nApertoTrigger.displayName = \"ApertoTrigger\";\n\nexport { ApertoTrigger };\n","\"use client\";\n\nimport { ApertoClose } from \"../aperto-close\";\nimport { ApertoContent } from \"../aperto-content\";\nimport { ApertoDescription } from \"../aperto-description\";\nimport { ApertoOverlay } from \"../aperto-overlay\";\nimport { ApertoPortal } from \"../aperto-portal\";\nimport { ApertoRoot } from \"../aperto-root\";\nimport { ApertoTitle } from \"../aperto-title\";\nimport { ApertoTrigger } from \"../aperto-trigger\";\nimport {\n\tgetDescriptionProps,\n\tgetMediaLabel,\n\trenderExpandedMedia,\n\trenderThumbnail,\n} from \"../media-rendering\";\nimport type { ApertoProps } from \"./ApertoTypes\";\n\nexport function ApertoSingle({\n\tclassNames,\n\tdismissible,\n\tmedia,\n\trenderImage,\n\trenderVideo,\n}: ApertoProps) {\n\tconst label = getMediaLabel(media);\n\tconst title = media.title ?? label;\n\n\treturn (\n\t\t<ApertoRoot dismissible={dismissible}>\n\t\t\t<ApertoTrigger\n\t\t\t\taria-label={`Open ${label}`}\n\t\t\t\tclassName={classNames?.thumbnail}\n\t\t\t>\n\t\t\t\t{renderThumbnail(media, renderImage, renderVideo)}\n\t\t\t</ApertoTrigger>\n\t\t\t<ApertoPortal>\n\t\t\t\t<ApertoOverlay className={classNames?.overlay} />\n\t\t\t\t<ApertoContent\n\t\t\t\t\tclassName={classNames?.content}\n\t\t\t\t\t{...getDescriptionProps(media)}\n\t\t\t\t>\n\t\t\t\t\t{renderExpandedMedia(media, renderImage, renderVideo)}\n\t\t\t\t\t<ApertoTitle>{title}</ApertoTitle>\n\t\t\t\t\t{media.description ? (\n\t\t\t\t\t\t<ApertoDescription>{media.description}</ApertoDescription>\n\t\t\t\t\t) : null}\n\t\t\t\t\t<ApertoClose\n\t\t\t\t\t\taria-label=\"Close\"\n\t\t\t\t\t\tclassName={classNames?.closeButton}\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t/>\n\t\t\t\t</ApertoContent>\n\t\t\t</ApertoPortal>\n\t\t</ApertoRoot>\n\t);\n}\n","\"use client\";\n\nimport { useApertoGroup } from \"../aperto-group-context\";\nimport { ApertoTrigger } from \"../aperto-trigger\";\nimport { getMediaLabel, renderThumbnail } from \"../media-rendering\";\nimport type { ApertoThumbnailProps } from \"./ApertoTypes\";\n\nexport function ApertoThumbnail({\n\tchildren,\n\tclassName,\n\tindex,\n}: ApertoThumbnailProps) {\n\tconst group = useApertoGroup();\n\tconst media = group.media[index];\n\n\tif (!media) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<ApertoTrigger\n\t\t\tactive={group.index === index}\n\t\t\taria-label={`Open ${getMediaLabel(media)}`}\n\t\t\tclassName={className ?? group.classNames?.thumbnail}\n\t\t\tonClick={() => group.openAtIndex(index)}\n\t\t\tref={(node) => group.registerThumbnail(index, node)}\n\t\t\tsharedLayoutId={false}\n\t\t>\n\t\t\t{children ?? renderThumbnail(media, group.renderImage, group.renderVideo)}\n\t\t</ApertoTrigger>\n\t);\n}\n","\"use client\";\n\n/**\n * @patternmode/aperto\n *\n * Opinionated thumbnail-to-expanded media transitions.\n * Built on Radix Dialog + Motion.\n *\n * Inspired by Cambio (https://github.com/raphaelsalaja/cambio)\n * by Raphael Salaja.\n *\n * @example\n * ```tsx\n * import { Aperto } from \"@patternmode/aperto\";\n *\n * import { Aperto } from \"@patternmode/aperto\";\n * import \"@patternmode/aperto/styles.css\";\n *\n * <Aperto.Group media={media}>\n * {media.map((item, index) => (\n * <Aperto.Thumbnail key={item.id ?? item.src} index={index} />\n * ))}\n * </Aperto.Group>\n * ```\n */\n\nimport {\n\tApertoGroup,\n\ttype ApertoGroupProps,\n\ttype ApertoProps,\n\tApertoSingle,\n\tApertoThumbnail,\n\ttype ApertoThumbnailProps,\n} from \"./aperto\";\nimport { ApertoClose } from \"./aperto-close\";\nimport { ApertoContent, type ApertoContentProps } from \"./aperto-content\";\nimport { ApertoDescription } from \"./aperto-description\";\nimport { ApertoOverlay, type ApertoOverlayProps } from \"./aperto-overlay\";\nimport { ApertoPortal, type ApertoPortalProps } from \"./aperto-portal\";\nimport { ApertoRoot, type ApertoRootProps } from \"./aperto-root\";\nimport { ApertoTitle } from \"./aperto-title\";\nimport { ApertoTrigger, type ApertoTriggerProps } from \"./aperto-trigger\";\n\n/** Lower-level compound component namespace for advanced composition. */\nconst ApertoPrimitive = {\n\tClose: ApertoClose,\n\tContent: ApertoContent,\n\tDescription: ApertoDescription,\n\tOverlay: ApertoOverlay,\n\tPortal: ApertoPortal,\n\tRoot: ApertoRoot,\n\tTitle: ApertoTitle,\n\tTrigger: ApertoTrigger,\n};\n\n/** Primary media-first component namespace. */\nconst Aperto = Object.assign(ApertoSingle, {\n\tGroup: ApertoGroup,\n\tPrimitive: ApertoPrimitive,\n\tThumbnail: ApertoThumbnail,\n});\n\n// Preset system\nexport { PRESETS, resolvePreset } from \"./presets\";\n// Types\nexport type {\n\tApertoClassNames,\n\tApertoImageItem,\n\tApertoMediaItem,\n\tApertoVideoItem,\n\tDismissibleConfig,\n\tDragSpringConfig,\n\tMotionPreset,\n\tMotionPresetName,\n\tMotionProp,\n\tMotionVariants,\n\tNavigationMotionPresetName,\n\tRenderImage,\n\tRenderVideo,\n} from \"./types\";\n// Named exports for tree-shaking\nexport {\n\tAperto,\n\tApertoClose,\n\tApertoContent,\n\ttype ApertoContentProps,\n\tApertoDescription,\n\tApertoGroup,\n\ttype ApertoGroupProps,\n\tApertoOverlay,\n\ttype ApertoOverlayProps,\n\tApertoPortal,\n\ttype ApertoPortalProps,\n\tApertoPrimitive,\n\ttype ApertoProps,\n\tApertoRoot,\n\ttype ApertoRootProps,\n\tApertoThumbnail,\n\ttype ApertoThumbnailProps,\n\tApertoTitle,\n\tApertoTrigger,\n\ttype ApertoTriggerProps,\n};\n"],"mappings":"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","names":["useCallback","useId","useMemo","useState","Dialog","forwardRef","jsx","createContext","useContext","Dialog","motion","forwardRef","jsx","forwardRef","motion","Dialog","jsx","Dialog","useCallback","useState","jsx","useState","useCallback","Dialog","forwardRef","jsx","AnimatePresence","motion","jsx","jsx","AnimatePresence","motion","motion","jsx","motion","jsx","useId","useState","useCallback","useMemo","Dialog","X","forwardRef","jsx","Dialog","motion","forwardRef","useCallback","useEffect","useState","jsx","forwardRef","useState","useEffect","useCallback","motion","jsx","jsxs","jsx"]}
package/dist/styles.css CHANGED
@@ -1,2 +1,2 @@
1
1
  /*! tailwindcss v4.3.0 | MIT License | https://tailwindcss.com */
2
- @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style:solid;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-duration:initial;--tw-ease:initial;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-leading:initial;--tw-font-weight:initial;--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0}}}[data-slot=aperto-trigger]{border-radius:var(--aperto-radius,.5rem);border-style:var(--tw-border-style);padding:calc(var(--spacing,.25rem) * 0);text-align:left;--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);--tw-outline-style:none;cursor:zoom-in;transition-property:filter,transform;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function,cubic-bezier(.4, 0, .2, 1)));transition-duration:var(--tw-duration,var(--default-transition-duration,.15s));--tw-duration:.2s;--tw-ease:var(--ease-out,cubic-bezier(0, 0, .2, 1));transition-duration:.2s;transition-timing-function:var(--ease-out,cubic-bezier(0, 0, .2, 1));background-color:#0000;border-width:0;outline-style:none;display:block;position:relative;overflow:hidden}[data-slot=aperto-trigger]:hover{--tw-brightness:brightness(.96);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}[data-slot=aperto-trigger]:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);--tw-ring-color:#fffc}@supports (color:color-mix(in lab, red, red)){[data-slot=aperto-trigger]:focus-visible{--tw-ring-color:color-mix(in oklab, var(--color-white,#fff) 80%, transparent)}}[data-slot=aperto-trigger]:focus-visible{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-color:var(--color-black,#000)}[data-slot=aperto-trigger]>img,[data-slot=aperto-trigger]>video{object-fit:cover;width:100%;height:100%;display:block}[data-slot=aperto-trigger][data-aperto-active]>img,[data-slot=aperto-trigger][data-aperto-active]>video{visibility:hidden}[data-slot=aperto-overlay]{inset:calc(var(--spacing,.25rem) * 0);z-index:1000;background-color:#000c;position:fixed}@supports (color:color-mix(in lab, red, red)){[data-slot=aperto-overlay]{background-color:color-mix(in oklab, var(--color-black,#000) 80%, transparent)}}[data-slot=aperto-content]{z-index:1001;justify-content:center;align-items:center;gap:calc(var(--spacing,.25rem) * 3);border-radius:var(--aperto-radius,.5rem);width:fit-content;max-width:min(92vw,1200px);height:fit-content;max-height:min(90vh,920px);padding:calc(var(--spacing,.25rem) * 0);color:var(--color-white,#fff);--tw-outline-style:none;overscroll-behavior:contain;outline-style:none;flex-direction:column;display:flex;position:fixed;overflow:visible}[data-slot=aperto-content]>img,[data-slot=aperto-content]>video,[data-slot=aperto-content]>[data-slot=aperto-media]{border-radius:var(--aperto-radius,.5rem);object-fit:cover;aspect-ratio:var(--aperto-expanded-aspect-ratio,3 / 2);max-width:90vw;height:auto;max-height:calc(100dvh - 8rem);width:min(var(--aperto-expanded-width,76vw), calc((100dvh - 8rem) * 1.5), 1000px, 90vw);display:block}[data-slot=aperto-media]{position:relative;overflow:hidden}[data-slot=aperto-media]>img,[data-slot=aperto-media]>video,[data-slot=aperto-media-stage]>img,[data-slot=aperto-media-stage]>video,[data-slot=aperto-transition-media]>img,[data-slot=aperto-transition-media]>video{object-fit:cover;width:100%;height:100%;display:block}[data-slot=aperto-media-stage]{inset:calc(var(--spacing,.25rem) * 0);position:absolute}[data-slot=aperto-content][data-aperto-transition] [data-slot=aperto-media-stage],[data-slot=aperto-transition-media]{will-change:opacity, transform}[data-slot=aperto-content][data-aperto-transition]>*{opacity:0}@keyframes aperto-control-in{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}[data-slot=aperto-content]:not([data-aperto-transition])>[data-slot=aperto-close],[data-slot=aperto-content]:not([data-aperto-transition])>[data-slot=aperto-media]>[data-slot=aperto-previous-button],[data-slot=aperto-content]:not([data-aperto-transition])>[data-slot=aperto-media]>[data-slot=aperto-next-button]{animation:.35s cubic-bezier(.25,.1,.12,1) 80ms both aperto-control-in}[data-slot=aperto-content]:not([data-aperto-transition])>[data-slot=aperto-title],[data-slot=aperto-content]:not([data-aperto-transition])>[data-slot=aperto-description],[data-slot=aperto-content]:not([data-aperto-transition])>[data-slot=aperto-counter]{animation:.4s cubic-bezier(.25,.1,.12,1) .18s both aperto-control-in}[data-slot=aperto-title]{text-align:center;--tw-leading:var(--leading-snug,1.375);max-width:60ch;font-size:13px;line-height:var(--leading-snug,1.375);--tw-font-weight:var(--font-weight-medium,500);font-weight:var(--font-weight-medium,500);color:#ffffffe6}@supports (color:color-mix(in lab, red, red)){[data-slot=aperto-title]{color:color-mix(in oklab, var(--color-white,#fff) 90%, transparent)}}[data-slot=aperto-description]{margin-top:calc(var(--spacing,.25rem) * -1.5);text-align:center;--tw-leading:var(--leading-snug,1.375);max-width:60ch;font-size:13px;line-height:var(--leading-snug,1.375);color:#fff9}@supports (color:color-mix(in lab, red, red)){[data-slot=aperto-description]{color:color-mix(in oklab, var(--color-white,#fff) 60%, transparent)}}[data-slot=aperto-close],[data-slot=aperto-previous-button],[data-slot=aperto-next-button]{z-index:10;width:calc(var(--spacing,.25rem) * 8);height:calc(var(--spacing,.25rem) * 8);border-style:var(--tw-border-style);background-color:#ffffff1a;border-width:0;border-radius:3.40282e38px;place-items:center;display:grid;position:absolute}@supports (color:color-mix(in lab, red, red)){[data-slot=aperto-close],[data-slot=aperto-previous-button],[data-slot=aperto-next-button]{background-color:color-mix(in oklab, var(--color-white,#fff) 10%, transparent)}}[data-slot=aperto-close],[data-slot=aperto-previous-button],[data-slot=aperto-next-button]{color:#ffffffb3}@supports (color:color-mix(in lab, red, red)){[data-slot=aperto-close],[data-slot=aperto-previous-button],[data-slot=aperto-next-button]{color:color-mix(in oklab, var(--color-white,#fff) 70%, transparent)}}[data-slot=aperto-close],[data-slot=aperto-previous-button],[data-slot=aperto-next-button]{transition-property:background,color;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function,cubic-bezier(.4, 0, .2, 1)));transition-duration:var(--tw-duration,var(--default-transition-duration,.15s));--tw-duration:.15s;--tw-ease:var(--ease-out,cubic-bezier(0, 0, .2, 1));transition-duration:.15s;transition-timing-function:var(--ease-out,cubic-bezier(0, 0, .2, 1))}@media (hover:hover) and (pointer:fine){[data-slot=aperto-close]:hover,[data-slot=aperto-previous-button]:hover,[data-slot=aperto-next-button]:hover{background-color:#fff3}@supports (color:color-mix(in lab, red, red)){[data-slot=aperto-close]:hover,[data-slot=aperto-previous-button]:hover,[data-slot=aperto-next-button]:hover{background-color:color-mix(in oklab, var(--color-white,#fff) 20%, transparent)}}[data-slot=aperto-close]:hover,[data-slot=aperto-previous-button]:hover,[data-slot=aperto-next-button]:hover{color:var(--color-white,#fff)}}[data-slot=aperto-close]:focus-visible,[data-slot=aperto-previous-button]:focus-visible,[data-slot=aperto-next-button]:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);--tw-ring-color:#fff9}@supports (color:color-mix(in lab, red, red)){[data-slot=aperto-close]:focus-visible,[data-slot=aperto-previous-button]:focus-visible,[data-slot=aperto-next-button]:focus-visible{--tw-ring-color:color-mix(in oklab, var(--color-white,#fff) 60%, transparent)}}[data-slot=aperto-close]:focus-visible,[data-slot=aperto-previous-button]:focus-visible,[data-slot=aperto-next-button]:focus-visible{--tw-outline-style:none;outline-style:none}[data-slot=aperto-close]{top:calc(var(--spacing,.25rem) * 3);right:calc(var(--spacing,.25rem) * 3)}[data-slot=aperto-previous-button]{top:50%;left:calc(var(--spacing,.25rem) * 3);--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}[data-slot=aperto-next-button]{top:50%;right:calc(var(--spacing,.25rem) * 3);--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}[data-slot=aperto-close]>svg,[data-slot=aperto-previous-button]>svg,[data-slot=aperto-next-button]>svg{pointer-events:none;width:calc(var(--spacing,.25rem) * 4);height:calc(var(--spacing,.25rem) * 4)}[data-slot=aperto-counter]{background-color:#ffffff1a;border-radius:3.40282e38px}@supports (color:color-mix(in lab, red, red)){[data-slot=aperto-counter]{background-color:color-mix(in oklab, var(--color-white,#fff) 10%, transparent)}}[data-slot=aperto-counter]{padding-inline:calc(var(--spacing,.25rem) * 2.5);padding-block:calc(var(--spacing,.25rem) * .5);--tw-font-weight:var(--font-weight-medium,500);font-size:11px;font-weight:var(--font-weight-medium,500);color:#ffffff80}@supports (color:color-mix(in lab, red, red)){[data-slot=aperto-counter]{color:color-mix(in oklab, var(--color-white,#fff) 50%, transparent)}}@media (max-width:560px){[data-slot=aperto-content]{gap:calc(var(--spacing,.25rem) * 2);max-width:calc(100vw - 1rem)}[data-slot=aperto-content]>img,[data-slot=aperto-content]>video,[data-slot=aperto-content]>[data-slot=aperto-media]{width:min(100vw - 2rem,150dvh - 18rem);max-width:calc(100vw - 2rem);max-height:calc(100dvh - 12rem)}[data-slot=aperto-title],[data-slot=aperto-description]{max-width:calc(100vw - 2rem)}[data-slot=aperto-close],[data-slot=aperto-previous-button],[data-slot=aperto-next-button]{width:calc(var(--spacing,.25rem) * 11);height:calc(var(--spacing,.25rem) * 11);touch-action:manipulation}[data-slot=aperto-close]{top:calc(var(--spacing,.25rem) * 2);right:calc(var(--spacing,.25rem) * 2)}[data-slot=aperto-previous-button]{left:calc(var(--spacing,.25rem) * 2)}[data-slot=aperto-next-button]{right:calc(var(--spacing,.25rem) * 2)}}@media (prefers-reduced-motion:reduce){[data-slot=aperto-content]:not([data-aperto-transition])>*{animation:none!important}}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}
2
+ @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style:solid;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-duration:initial;--tw-ease:initial;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-leading:initial;--tw-font-weight:initial;--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0}}}[data-slot=aperto-trigger]{border-radius:var(--aperto-radius,.5rem);border-style:var(--tw-border-style);padding:calc(var(--spacing,.25rem) * 0);text-align:left;--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);--tw-outline-style:none;cursor:zoom-in;transition-property:filter,transform;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function,cubic-bezier(.4, 0, .2, 1)));transition-duration:var(--tw-duration,var(--default-transition-duration,.15s));--tw-duration:.2s;--tw-ease:var(--ease-out,cubic-bezier(0, 0, .2, 1));transition-duration:.2s;transition-timing-function:var(--ease-out,cubic-bezier(0, 0, .2, 1));background-color:#0000;border-width:0;outline-style:none;display:block;position:relative;overflow:hidden}[data-slot=aperto-trigger]:hover{--tw-brightness:brightness(.96);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}[data-slot=aperto-trigger]:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);--tw-ring-color:#fffc}@supports (color:color-mix(in lab, red, red)){[data-slot=aperto-trigger]:focus-visible{--tw-ring-color:color-mix(in oklab, var(--color-white,#fff) 80%, transparent)}}[data-slot=aperto-trigger]:focus-visible{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-color:var(--color-black,#000)}[data-slot=aperto-trigger]>img,[data-slot=aperto-trigger]>video{object-fit:cover;width:100%;height:100%;display:block}[data-slot=aperto-trigger][data-aperto-active]>img,[data-slot=aperto-trigger][data-aperto-active]>video{visibility:hidden}[data-slot=aperto-overlay]{inset:calc(var(--spacing,.25rem) * 0);z-index:1000;background-color:#000c;position:fixed}@supports (color:color-mix(in lab, red, red)){[data-slot=aperto-overlay]{background-color:color-mix(in oklab, var(--color-black,#000) 80%, transparent)}}[data-slot=aperto-content]{z-index:1001;justify-content:center;align-items:center;gap:calc(var(--spacing,.25rem) * 3);border-radius:var(--aperto-radius,.5rem);width:fit-content;max-width:min(92vw,1200px);height:fit-content;max-height:min(90vh,920px);padding:calc(var(--spacing,.25rem) * 0);color:var(--color-white,#fff);--tw-outline-style:none;overscroll-behavior:contain;outline-style:none;flex-direction:column;display:flex;position:fixed;overflow:visible}[data-slot=aperto-content]>img,[data-slot=aperto-content]>video,[data-slot=aperto-content]>[data-slot=aperto-media]{border-radius:var(--aperto-radius,.5rem);aspect-ratio:var(--aperto-expanded-aspect-ratio,3 / 2);max-width:90vw;height:auto;max-height:calc(100dvh - 8rem);width:min(var(--aperto-expanded-width,76vw), calc((100dvh - 8rem) * (var(--aperto-expanded-aspect-ratio-width,3) / var(--aperto-expanded-aspect-ratio-height,2))), 1000px, 90vw);display:block}[data-slot=aperto-media]{position:relative;overflow:hidden}[data-slot=aperto-media]>img,[data-slot=aperto-media]>video,[data-slot=aperto-media-stage]>img,[data-slot=aperto-media-stage]>video,[data-slot=aperto-transition-media]>img,[data-slot=aperto-transition-media]>video{width:100%;height:100%;display:block}[data-slot=aperto-media-stage]{inset:calc(var(--spacing,.25rem) * 0);position:absolute}[data-slot=aperto-content][data-aperto-transition] [data-slot=aperto-media-stage],[data-slot=aperto-transition-media]{will-change:opacity, transform}[data-slot=aperto-content][data-aperto-transition]>*{opacity:0}@keyframes aperto-control-in{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}[data-slot=aperto-content]:not([data-aperto-transition])>[data-slot=aperto-close],[data-slot=aperto-content]:not([data-aperto-transition])>[data-slot=aperto-media]>[data-slot=aperto-previous-button],[data-slot=aperto-content]:not([data-aperto-transition])>[data-slot=aperto-media]>[data-slot=aperto-next-button]{animation:.35s cubic-bezier(.25,.1,.12,1) 80ms both aperto-control-in}[data-slot=aperto-content]:not([data-aperto-transition])>[data-slot=aperto-title],[data-slot=aperto-content]:not([data-aperto-transition])>[data-slot=aperto-description],[data-slot=aperto-content]:not([data-aperto-transition])>[data-slot=aperto-counter]{animation:.4s cubic-bezier(.25,.1,.12,1) .18s both aperto-control-in}[data-slot=aperto-title]{text-align:center;--tw-leading:var(--leading-snug,1.375);max-width:60ch;font-size:13px;line-height:var(--leading-snug,1.375);--tw-font-weight:var(--font-weight-medium,500);font-weight:var(--font-weight-medium,500);color:#ffffffe6}@supports (color:color-mix(in lab, red, red)){[data-slot=aperto-title]{color:color-mix(in oklab, var(--color-white,#fff) 90%, transparent)}}[data-slot=aperto-description]{margin-top:calc(var(--spacing,.25rem) * -1.5);text-align:center;--tw-leading:var(--leading-snug,1.375);max-width:60ch;font-size:13px;line-height:var(--leading-snug,1.375);color:#fff9}@supports (color:color-mix(in lab, red, red)){[data-slot=aperto-description]{color:color-mix(in oklab, var(--color-white,#fff) 60%, transparent)}}[data-slot=aperto-close],[data-slot=aperto-previous-button],[data-slot=aperto-next-button]{z-index:10;width:calc(var(--spacing,.25rem) * 8);height:calc(var(--spacing,.25rem) * 8);border-style:var(--tw-border-style);background-color:#ffffff1a;border-width:0;border-radius:3.40282e38px;place-items:center;display:grid;position:absolute}@supports (color:color-mix(in lab, red, red)){[data-slot=aperto-close],[data-slot=aperto-previous-button],[data-slot=aperto-next-button]{background-color:color-mix(in oklab, var(--color-white,#fff) 10%, transparent)}}[data-slot=aperto-close],[data-slot=aperto-previous-button],[data-slot=aperto-next-button]{color:#ffffffb3}@supports (color:color-mix(in lab, red, red)){[data-slot=aperto-close],[data-slot=aperto-previous-button],[data-slot=aperto-next-button]{color:color-mix(in oklab, var(--color-white,#fff) 70%, transparent)}}[data-slot=aperto-close],[data-slot=aperto-previous-button],[data-slot=aperto-next-button]{transition-property:background,color;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function,cubic-bezier(.4, 0, .2, 1)));transition-duration:var(--tw-duration,var(--default-transition-duration,.15s));--tw-duration:.15s;--tw-ease:var(--ease-out,cubic-bezier(0, 0, .2, 1));transition-duration:.15s;transition-timing-function:var(--ease-out,cubic-bezier(0, 0, .2, 1))}@media (hover:hover) and (pointer:fine){[data-slot=aperto-close]:hover,[data-slot=aperto-previous-button]:hover,[data-slot=aperto-next-button]:hover{background-color:#fff3}@supports (color:color-mix(in lab, red, red)){[data-slot=aperto-close]:hover,[data-slot=aperto-previous-button]:hover,[data-slot=aperto-next-button]:hover{background-color:color-mix(in oklab, var(--color-white,#fff) 20%, transparent)}}[data-slot=aperto-close]:hover,[data-slot=aperto-previous-button]:hover,[data-slot=aperto-next-button]:hover{color:var(--color-white,#fff)}}[data-slot=aperto-close]:focus-visible,[data-slot=aperto-previous-button]:focus-visible,[data-slot=aperto-next-button]:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);--tw-ring-color:#fff9}@supports (color:color-mix(in lab, red, red)){[data-slot=aperto-close]:focus-visible,[data-slot=aperto-previous-button]:focus-visible,[data-slot=aperto-next-button]:focus-visible{--tw-ring-color:color-mix(in oklab, var(--color-white,#fff) 60%, transparent)}}[data-slot=aperto-close]:focus-visible,[data-slot=aperto-previous-button]:focus-visible,[data-slot=aperto-next-button]:focus-visible{--tw-outline-style:none;outline-style:none}[data-slot=aperto-close]{top:calc(var(--spacing,.25rem) * 3);right:calc(var(--spacing,.25rem) * 3)}[data-slot=aperto-previous-button]{top:50%;left:calc(var(--spacing,.25rem) * 3);--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}[data-slot=aperto-next-button]{top:50%;right:calc(var(--spacing,.25rem) * 3);--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}[data-slot=aperto-close]>svg,[data-slot=aperto-previous-button]>svg,[data-slot=aperto-next-button]>svg{pointer-events:none;width:calc(var(--spacing,.25rem) * 4);height:calc(var(--spacing,.25rem) * 4)}[data-slot=aperto-counter]{background-color:#ffffff1a;border-radius:3.40282e38px}@supports (color:color-mix(in lab, red, red)){[data-slot=aperto-counter]{background-color:color-mix(in oklab, var(--color-white,#fff) 10%, transparent)}}[data-slot=aperto-counter]{padding-inline:calc(var(--spacing,.25rem) * 2.5);padding-block:calc(var(--spacing,.25rem) * .5);--tw-font-weight:var(--font-weight-medium,500);font-size:11px;font-weight:var(--font-weight-medium,500);color:#ffffff80}@supports (color:color-mix(in lab, red, red)){[data-slot=aperto-counter]{color:color-mix(in oklab, var(--color-white,#fff) 50%, transparent)}}@media (max-width:560px){[data-slot=aperto-content]{gap:calc(var(--spacing,.25rem) * 2);max-width:calc(100vw - 1rem)}[data-slot=aperto-content]>img,[data-slot=aperto-content]>video,[data-slot=aperto-content]>[data-slot=aperto-media]{width:min(100vw - 2rem,150dvh - 18rem);max-width:calc(100vw - 2rem);max-height:calc(100dvh - 12rem)}[data-slot=aperto-title],[data-slot=aperto-description]{max-width:calc(100vw - 2rem)}[data-slot=aperto-close],[data-slot=aperto-previous-button],[data-slot=aperto-next-button]{width:calc(var(--spacing,.25rem) * 11);height:calc(var(--spacing,.25rem) * 11);touch-action:manipulation}[data-slot=aperto-close]{top:calc(var(--spacing,.25rem) * 2);right:calc(var(--spacing,.25rem) * 2)}[data-slot=aperto-previous-button]{left:calc(var(--spacing,.25rem) * 2)}[data-slot=aperto-next-button]{right:calc(var(--spacing,.25rem) * 2)}}@media (prefers-reduced-motion:reduce){[data-slot=aperto-content]:not([data-aperto-transition])>*{animation:none!important}}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@patternmode/aperto",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "description": "Opinionated, styled thumbnail-to-expanded media transitions for React.",
5
5
  "license": "MIT",
6
6
  "type": "module",